fix(installer): create dedicated nextwks service user, chown deployed files

This commit is contained in:
Claus Lohmar 2026-06-14 16:34:17 +00:00
parent e978e08424
commit 7b3ba23c82

View file

@ -13,17 +13,20 @@ warn() { echo -e "${YELLOW}$1${NC}"; }
header() { echo -e "\n${BOLD}${CYAN}$1${NC}"; } header() { echo -e "\n${BOLD}${CYAN}$1${NC}"; }
# ============================================================ # ============================================================
# USER & SUDO # SERVICE USER
# ============================================================ # ============================================================
SYS_USER="${SUDO_USER:-$USER}" SVC_USER="nextwks"
SYS_HOME=$(eval echo "~$SYS_USER") SYS_HOME="/home/${SVC_USER}"
[ "$EUID" -eq 0 ] && SUDO="" || SUDO="sudo"
if [ -z "$SUDO" ] && [ "$EUID" -ne 0 ]; then # Create service user if needed
error "This script needs root for /opt/ and systemd. Use: sudo bash install.sh" if ! id "$SVC_USER" &>/dev/null; then
exit 1 info "Creating service user: $SVC_USER"
useradd -r -s /usr/sbin/nologin -d /nonexistent "$SVC_USER" 2>/dev/null || true
fi fi
# Sudo only if not root
[ "$EUID" -eq 0 ] && SUDO="" || SUDO="sudo"
# ============================================================ # ============================================================
# PATHS # PATHS
# ============================================================ # ============================================================
@ -33,7 +36,7 @@ BIN_DIR="${INSTALL_DIR}/bin"
DATA_DIR="${INSTALL_DIR}/data" DATA_DIR="${INSTALL_DIR}/data"
STATIC_DIR="${INSTALL_DIR}/static" STATIC_DIR="${INSTALL_DIR}/static"
CONFIG_FILE="${INSTALL_DIR}/config.yaml" CONFIG_FILE="${INSTALL_DIR}/config.yaml"
ENV_FILE="${SYS_HOME}/.nextwks-env" ENV_FILE="${REPO_DIR}/.env"
AUTHELIA_DIR="/opt/authelia" AUTHELIA_DIR="/opt/authelia"
AUTHELIA_CONFIG="${AUTHELIA_DIR}/configuration.yml" AUTHELIA_CONFIG="${AUTHELIA_DIR}/configuration.yml"
SERVICE_FILE="/etc/systemd/system/nextwks.service" SERVICE_FILE="/etc/systemd/system/nextwks.service"
@ -55,15 +58,13 @@ PROXY_IP_DEFAULT="172.16.0.10"
# ============================================================ # ============================================================
REPO_URL="https://git.lohmar.co.uk/lexton-it/NextWks.git" REPO_URL="https://git.lohmar.co.uk/lexton-it/NextWks.git"
# Detect if stdin is piped (curl|bash) — save to file and re-exec # If piped from curl (no script file), save and exit
if [ ! -t 0 ] && [ -z "${NEXTWKS_REEXEC:-}" ]; then if [ ! -t 0 ] && [ ! -f "${BASH_SOURCE[0]}" ]; then
SCRIPT_FILE="/tmp/nextwks-install.sh" SCRIPT_FILE="/tmp/nextwks-install.sh"
cat > "$SCRIPT_FILE" cat > "$SCRIPT_FILE"
chmod +x "$SCRIPT_FILE" chmod +x "$SCRIPT_FILE"
echo ""
echo "Script saved to $SCRIPT_FILE" echo "Script saved to $SCRIPT_FILE"
echo "Run: bash $SCRIPT_FILE" echo "Run: bash $SCRIPT_FILE"
echo ""
exit 0 exit 0
fi fi
@ -76,7 +77,6 @@ if [ ! -f "$REPO_DIR/src/main.go" ]; then
CLONE_DIR="${SYS_HOME}/nextwks" CLONE_DIR="${SYS_HOME}/nextwks"
rm -rf "$CLONE_DIR" 2>/dev/null rm -rf "$CLONE_DIR" 2>/dev/null
git clone --depth 1 "$REPO_URL" "$CLONE_DIR" git clone --depth 1 "$REPO_URL" "$CLONE_DIR"
chown -R "$SYS_USER:$SYS_USER" "$CLONE_DIR" 2>/dev/null || true
REPO_DIR="$CLONE_DIR" REPO_DIR="$CLONE_DIR"
success "Cloned to $REPO_DIR" success "Cloned to $REPO_DIR"
fi fi
@ -91,13 +91,6 @@ FROM_ENV=false
# INTERACTIVE WIZARD # INTERACTIVE WIZARD
# ============================================================ # ============================================================
gather_inputs() { gather_inputs() {
# Load from .env if --from-env
if [ "$FROM_ENV" = true ] && [ -f "$ENV_FILE" ]; then
source "$ENV_FILE"
success "Loaded configuration from $ENV_FILE"
return
fi
echo "" echo ""
header "┌─────────────────────────────────────────┐" header "┌─────────────────────────────────────────┐"
header "│ Next Workspace — Setup Wizard │" header "│ Next Workspace — Setup Wizard │"
@ -171,7 +164,13 @@ ENVEOF
success "Settings saved to $ENV_FILE" success "Settings saved to $ENV_FILE"
} }
gather_inputs # Load env if --from-env, otherwise run interactive wizard
if [ "$FROM_ENV" = true ] && [ -f "$ENV_FILE" ]; then
source "$ENV_FILE"
success "Loaded configuration from $ENV_FILE"
else
gather_inputs
fi
# Derive domains from URLs (needed even when --from-env) # Derive domains from URLs (needed even when --from-env)
NEXTWKS_DOMAIN=$(echo "$NEXTWKS_URL" | sed 's|https\?://||;s|/.*||') NEXTWKS_DOMAIN=$(echo "$NEXTWKS_URL" | sed 's|https\?://||;s|/.*||')
@ -211,7 +210,7 @@ header "── Installing ──"
$SUDO mkdir -p "$BIN_DIR" "$DATA_DIR" "$STATIC_DIR" $SUDO mkdir -p "$BIN_DIR" "$DATA_DIR" "$STATIC_DIR"
$SUDO cp "$REPO_DIR/app/core" "$BIN_DIR/core" $SUDO cp "$REPO_DIR/app/core" "$BIN_DIR/core"
$SUDO chmod 755 "$BIN_DIR/core" $SUDO chmod 755 "$BIN_DIR/core"
$SUDO chown -R "$SYS_USER:$SYS_USER" "$DATA_DIR" 2>/dev/null || true $SUDO chown -R "$SVC_USER:$SVC_USER" "$DATA_DIR" 2>/dev/null || true
[ -d "$REPO_DIR/app/static" ] && $SUDO cp -r "$REPO_DIR/app/static"/* "$STATIC_DIR/" [ -d "$REPO_DIR/app/static" ] && $SUDO cp -r "$REPO_DIR/app/static"/* "$STATIC_DIR/"
success "Copied files to $INSTALL_DIR/" success "Copied files to $INSTALL_DIR/"
@ -253,8 +252,8 @@ session:
expiry_minutes: 60 expiry_minutes: 60
CONFIGEOF CONFIGEOF
$SUDO chmod 600 "$CONFIG_FILE" $SUDO chmod 600 "$CONFIG_FILE"
$SUDO chown "$SYS_USER:$SYS_USER" "$CONFIG_FILE" $SUDO chown "$SVC_USER:$SVC_USER" "$CONFIG_FILE"
$SUDO chown -R "$SYS_USER:$SYS_USER" "$DATA_DIR" $SUDO chown -R "$SVC_USER:$SVC_USER" "$DATA_DIR"
success "Config: $CONFIG_FILE" success "Config: $CONFIG_FILE"
# ============================================================ # ============================================================
@ -269,7 +268,7 @@ Wants=authelia.service
[Service] [Service]
Type=simple Type=simple
User=${SYS_USER} User=${SVC_USER}
WorkingDirectory=${INSTALL_DIR} WorkingDirectory=${INSTALL_DIR}
ExecStart=${BIN_DIR}/core -config ${CONFIG_FILE} ExecStart=${BIN_DIR}/core -config ${CONFIG_FILE}
Restart=always Restart=always
@ -393,6 +392,9 @@ $(echo "$OIDC_KEY" | sed 's/^/ /')
userinfo_signed_response_alg: "none" userinfo_signed_response_alg: "none"
AUTHEOF AUTHEOF
$SUDO chmod 600 "$AUTHELIA_CONFIG" $SUDO chmod 600 "$AUTHELIA_CONFIG"
$SUDO chown "$SVC_USER:$SVC_USER" "$AUTHELIA_CONFIG" "${AUTHELIA_DIR}/users_database.yml" "${AUTHELIA_DIR}/db.sqlite3" 2>/dev/null || true
# Clean up files from Authelia tar
$SUDO rm -f "${AUTHELIA_DIR}/authelia.service" "${AUTHELIA_DIR}/config.template.yml" 2>/dev/null || true
# Create initial users database # Create initial users database
if [ ! -f "${AUTHELIA_DIR}/users_database.yml" ]; then if [ ! -f "${AUTHELIA_DIR}/users_database.yml" ]; then
@ -416,7 +418,7 @@ After=network.target
[Service] [Service]
Type=simple Type=simple
User=${SYS_USER} User=${SVC_USER}
WorkingDirectory=${AUTHELIA_DIR} WorkingDirectory=${AUTHELIA_DIR}
ExecStart=${AUTHELIA_DIR}/authelia --config ${AUTHELIA_CONFIG} ExecStart=${AUTHELIA_DIR}/authelia --config ${AUTHELIA_CONFIG}
Restart=always Restart=always