70 lines
2.2 KiB
Bash
Executable File
70 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# Farben
|
|
GREEN="\033[0;32m"
|
|
RED="\033[0;31m"
|
|
NC="\033[0m"
|
|
|
|
log() { echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $*${NC}"; }
|
|
err() { echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] $*${NC}" 1>&2; }
|
|
|
|
ensure_command() {
|
|
local cmd="$1"
|
|
command -v "$cmd" >/dev/null 2>&1
|
|
}
|
|
|
|
bootstrap_node() {
|
|
# In non-interactive SSH sessions, node/npm might not be on PATH (e.g. nvm in .bashrc).
|
|
if ensure_command npm && ensure_command node; then
|
|
return 0
|
|
fi
|
|
if [ -s "$HOME/.nvm/nvm.sh" ]; then
|
|
# shellcheck disable=SC1090
|
|
. "$HOME/.nvm/nvm.sh"
|
|
# Prefer default alias if configured, otherwise keep current.
|
|
nvm use --silent default >/dev/null 2>&1 || true
|
|
fi
|
|
}
|
|
|
|
bootstrap_node
|
|
if ! ensure_command git; then err "git not found in PATH"; exit 127; fi
|
|
if ! ensure_command npm; then err "npm not found in PATH"; exit 127; fi
|
|
|
|
log "Fetching latest changes..."
|
|
git fetch --all --prune || { err "git fetch failed"; exit 1; }
|
|
|
|
log "Cleaning generated frontend artifacts..."
|
|
git restore -- package-lock.json package.json 2>/dev/null || true
|
|
git restore -- public/index.html 2>/dev/null || true
|
|
git clean -fd -- dist public/assets || { err "cleanup failed"; exit 1; }
|
|
|
|
log "Pulling latest changes..."
|
|
git pull --ff-only || { err "git pull failed"; exit 1; }
|
|
|
|
log "Installing dependencies..."
|
|
npm ci || npm install || { err "npm install failed"; exit 1; }
|
|
|
|
log "Building frontend..."
|
|
npm run build || { err "build failed"; exit 1; }
|
|
|
|
log "Copying dist -> public..."
|
|
mkdir -p public || true
|
|
cp -R dist/* public/ || { err "copy dist failed"; exit 1; }
|
|
|
|
log "Restarting service miriamgemeinde..."
|
|
if [ "${EUID:-$(id -u)}" -eq 0 ]; then
|
|
systemctl restart miriamgemeinde || { err "service restart failed"; exit 1; }
|
|
else
|
|
# Non-interactive deploys (CI) must not prompt for a sudo password.
|
|
# Configure on the server (recommended):
|
|
# sudo visudo -f /etc/sudoers.d/miriamgemeinde
|
|
# torsten ALL=NOPASSWD:/bin/systemctl restart miriamgemeinde,/bin/systemctl status miriamgemeinde
|
|
sudo -n systemctl restart miriamgemeinde || {
|
|
err "service restart failed (no password prompt). Configure passwordless sudo for 'systemctl restart miriamgemeinde' or run deploy as root."
|
|
exit 1
|
|
}
|
|
fi
|
|
|
|
log "Deployment completed successfully."
|