mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-07-15 04:43:36 +00:00
8a4172c14d
* feat: add host list sort * feat: fixed rdp truncating (taskbar invisible unless resizing window) and improved split screen system * feat: revamp conneciton persistance system to save to backend with a new connections panel to restore old connections and view current ones. Also added new user profile toggle to reopen all tabs (saves and loads from backend). Added user profile toggle for host tray click vs hover. * feat: added WOL button, added proper use of BASE_PATH, toggles/buttons in admin/user profile now are always visible regardless of sidebar width, duplicating hosts not adding jumphost/socks5, keepalive internal not mulitplying into seconds causing a keepalive error, and finally guacamole giving 1_0_0 and 1_1_0 errors * feat: add filter host button, improve alert system UI, save sidebar width to localstorage, and fix host toolbar row overflow (add host going off screen on small sidebar width) * feat: add pin rail toggle, fix command pallete toggle not working, fixed command pallete toggling when typing in a field, made file manager not uppercase, host manager custom ports not loading, guacd hosts made on >=2.2.1, fixed host tags toggling, added reorder snippet sfeature, made snippet folder clllapse and require confimration toggle work, removed file manager color toggle, and fixed macos not displaying GUI until switching to another app and coming back, and jump host servers failing. * feat: use blacksmith caching for docker compile and improve keepalive system for ssh to all match the same implementation and use the data from the host config instead of a predefined value * feat: reset host manager state if the form is left and remove file manager color logic from the removed toggle * feat: update electron version check to use new ui * feat: improve duplication system to proplery map all fields
170 lines
5.0 KiB
Bash
170 lines
5.0 KiB
Bash
#!/bin/sh
|
|
set -e
|
|
|
|
PUID=${PUID:-1000}
|
|
PGID=${PGID:-1000}
|
|
|
|
if [ "$(id -u)" = "0" ]; then
|
|
if [ "$PUID" = "0" ]; then
|
|
echo "Running as root (PUID=0, PGID=$PGID)"
|
|
chown -R root:root /app/data /app/uploads /tmp/nginx 2>/dev/null || true
|
|
else
|
|
echo "Setting up user permissions (PUID: $PUID, PGID: $PGID)..."
|
|
|
|
groupmod -o -g "$PGID" node 2>/dev/null || true
|
|
usermod -o -u "$PUID" node 2>/dev/null || true
|
|
|
|
chown -R node:node /app/data /app/uploads /tmp/nginx 2>/dev/null || true
|
|
|
|
echo "User node is now UID: $PUID, GID: $PGID"
|
|
|
|
exec gosu node:node "$0" "$@"
|
|
fi
|
|
fi
|
|
|
|
export PORT=${PORT:-8080}
|
|
export ENABLE_SSL=${ENABLE_SSL:-false}
|
|
export SSL_PORT=${SSL_PORT:-8443}
|
|
export SSL_CERT_PATH=${SSL_CERT_PATH:-/app/data/ssl/termix.crt}
|
|
export SSL_KEY_PATH=${SSL_KEY_PATH:-/app/data/ssl/termix.key}
|
|
|
|
echo "Configuring web UI to run on port: $PORT"
|
|
|
|
if [ "$ENABLE_SSL" = "true" ]; then
|
|
echo "SSL enabled - using HTTPS configuration with redirect"
|
|
NGINX_CONF_SOURCE="/app/nginx/nginx-https.conf.template"
|
|
else
|
|
echo "SSL disabled - using HTTP-only configuration (default)"
|
|
NGINX_CONF_SOURCE="/app/nginx/nginx.conf.template"
|
|
fi
|
|
|
|
mkdir -p /tmp/nginx
|
|
envsubst '${PORT} ${SSL_PORT} ${SSL_CERT_PATH} ${SSL_KEY_PATH}' < $NGINX_CONF_SOURCE > /tmp/nginx/nginx.conf
|
|
|
|
mkdir -p /app/data /app/uploads /app/data/.opk
|
|
chmod 755 /app/data /app/uploads /app/data/.opk 2>/dev/null || true
|
|
|
|
if [ -w /app/data ]; then
|
|
echo "Data directory is writable"
|
|
else
|
|
echo "WARNING: Data directory is not writable. OPKSSH may fail."
|
|
ls -ld /app/data
|
|
fi
|
|
|
|
if [ -w /app/data/.opk ]; then
|
|
echo "OPKSSH directory is writable"
|
|
else
|
|
echo "WARNING: OPKSSH directory is not writable. OPKSSH authentication will fail."
|
|
ls -ld /app/data/.opk
|
|
fi
|
|
|
|
OPKSSH_DIR="${DATA_DIR:-/app/data}/opkssh"
|
|
if [ ! -d "$OPKSSH_DIR" ]; then
|
|
echo "WARNING: OPKSSH binary directory not found at $OPKSSH_DIR"
|
|
echo "OPKSSH will be downloaded automatically on first use."
|
|
else
|
|
echo "OPKSSH binary directory found at $OPKSSH_DIR"
|
|
fi
|
|
|
|
if [ "$ENABLE_SSL" = "true" ]; then
|
|
echo "Checking SSL certificate configuration..."
|
|
mkdir -p /app/data/ssl
|
|
chmod 755 /app/data/ssl 2>/dev/null || true
|
|
|
|
DOMAIN=${SSL_DOMAIN:-localhost}
|
|
|
|
if [ -f "/app/data/ssl/termix.crt" ] && [ -f "/app/data/ssl/termix.key" ]; then
|
|
echo "SSL certificates found, checking validity..."
|
|
|
|
if openssl x509 -in /app/data/ssl/termix.crt -checkend 2592000 -noout >/dev/null 2>&1; then
|
|
echo "SSL certificates are valid and will be reused for domain: $DOMAIN"
|
|
else
|
|
echo "SSL certificate is expired or expiring soon, regenerating..."
|
|
rm -f /app/data/ssl/termix.crt /app/data/ssl/termix.key
|
|
fi
|
|
else
|
|
echo "SSL certificates not found, will generate new ones..."
|
|
fi
|
|
|
|
if [ ! -f "/app/data/ssl/termix.crt" ] || [ ! -f "/app/data/ssl/termix.key" ]; then
|
|
echo "Generating SSL certificates for domain: $DOMAIN"
|
|
|
|
cat > /app/data/ssl/openssl.conf << EOF
|
|
[req]
|
|
default_bits = 2048
|
|
prompt = no
|
|
default_md = sha256
|
|
distinguished_name = dn
|
|
req_extensions = v3_req
|
|
|
|
[dn]
|
|
C=US
|
|
ST=State
|
|
L=City
|
|
O=Termix
|
|
OU=IT Department
|
|
CN=$DOMAIN
|
|
|
|
[v3_req]
|
|
basicConstraints = CA:FALSE
|
|
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
|
|
subjectAltName = @alt_names
|
|
|
|
[alt_names]
|
|
DNS.1 = $DOMAIN
|
|
DNS.2 = localhost
|
|
DNS.3 = 127.0.0.1
|
|
IP.1 = 127.0.0.1
|
|
IP.2 = ::1
|
|
IP.3 = 0.0.0.0
|
|
EOF
|
|
|
|
openssl genrsa -out /app/data/ssl/termix.key 2048
|
|
|
|
openssl req -new -x509 -key /app/data/ssl/termix.key -out /app/data/ssl/termix.crt -days 365 -config /app/data/ssl/openssl.conf -extensions v3_req
|
|
|
|
chmod 600 /app/data/ssl/termix.key
|
|
chmod 644 /app/data/ssl/termix.crt
|
|
|
|
rm -f /app/data/ssl/openssl.conf
|
|
|
|
echo "SSL certificates generated successfully for domain: $DOMAIN"
|
|
fi
|
|
fi
|
|
|
|
echo "Starting nginx..."
|
|
nginx -c /tmp/nginx/nginx.conf
|
|
|
|
# Inject runtime BASE_PATH into frontend if configured
|
|
if [ -n "$BASE_PATH" ]; then
|
|
echo "Injecting BASE_PATH: $BASE_PATH"
|
|
# Strip trailing slash for use as a path prefix
|
|
CLEAN_BASE_PATH="${BASE_PATH%/}"
|
|
find /app/html -name "index.html" -exec sed -i "s|window.__TERMIX_BASE_PATH__ = \"\"|window.__TERMIX_BASE_PATH__ = \"$CLEAN_BASE_PATH\"|g" {} \;
|
|
# Patch sw.js static asset paths with the base path prefix
|
|
find /app/html -name "sw.js" -exec sed -i "s|__TERMIX_SW_BASE_PATH__|$CLEAN_BASE_PATH|g" {} \;
|
|
else
|
|
# No base path - replace placeholder with empty string so paths stay absolute from root
|
|
find /app/html -name "sw.js" -exec sed -i "s|__TERMIX_SW_BASE_PATH__||g" {} \;
|
|
fi
|
|
|
|
echo "Starting backend services..."
|
|
cd /app
|
|
export NODE_ENV=production
|
|
|
|
if [ -f "package.json" ]; then
|
|
VERSION=$(grep '"version"' package.json | sed 's/.*"version": *"\([^"]*\)".*/\1/')
|
|
if [ -n "$VERSION" ]; then
|
|
export VERSION
|
|
else
|
|
echo "Warning: Could not extract version from package.json"
|
|
fi
|
|
else
|
|
echo "Warning: package.json not found"
|
|
fi
|
|
|
|
node dist/backend/backend/starter.js
|
|
|
|
echo "All services started"
|
|
|
|
tail -f /dev/null |