Files
2026-07-15 01:02:43 +02:00

93 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
INSTALL_DIR="/opt/pve-cloud-backup"
BACKEND_DIR="$INSTALL_DIR/backend"
FRONTEND_DIR="$INSTALL_DIR/frontend"
STATIC_DIR="$INSTALL_DIR/static"
DATA_DIR="$INSTALL_DIR/data"
LOG_DIR="$INSTALL_DIR/logs"
BACKUP_DIR="$DATA_DIR/update-backups"
WEB_SERVICE="pve-cloud-backup-web.service"
WORKER_SERVICE="pve-cloud-backup-worker.service"
if [[ "$(id -u)" -ne 0 ]]; then
echo "Run as root. The services need pvesh access and systemd control." >&2
exit 1
fi
if [[ ! -d "$INSTALL_DIR" ]]; then
echo "$INSTALL_DIR does not exist." >&2
exit 1
fi
command -v python3 >/dev/null || { echo "python3 is required" >&2; exit 1; }
command -v npm >/dev/null || { echo "npm is required to build the Vue frontend" >&2; exit 1; }
cd "$INSTALL_DIR"
echo "Applying PVE Cloud Backup update from $INSTALL_DIR"
mkdir -p "$BACKEND_DIR" "$FRONTEND_DIR" "$STATIC_DIR" "$DATA_DIR" "$LOG_DIR" "$BACKUP_DIR"
if [[ -f "$DATA_DIR/app.db" ]]; then
stamp="$(date -u +%Y%m%dT%H%M%SZ)"
cp -a "$DATA_DIR/app.db" "$BACKUP_DIR/app.db.$stamp"
echo "Backed up SQLite database to $BACKUP_DIR/app.db.$stamp"
fi
echo "Stopping services if they are running..."
systemctl stop "$WORKER_SERVICE" 2>/dev/null || true
systemctl stop "$WEB_SERVICE" 2>/dev/null || true
echo "Updating Python virtual environment..."
if [[ ! -x "$BACKEND_DIR/.venv/bin/python" ]]; then
python3 -m venv "$BACKEND_DIR/.venv"
fi
"$BACKEND_DIR/.venv/bin/pip" install --upgrade pip
"$BACKEND_DIR/.venv/bin/pip" install -r "$BACKEND_DIR/requirements.txt"
if [[ "${RUN_TESTS:-0}" == "1" ]]; then
echo "Running backend tests because RUN_TESTS=1..."
(cd "$BACKEND_DIR" && "$BACKEND_DIR/.venv/bin/pytest")
fi
echo "Installing frontend dependencies and building static assets..."
cd "$FRONTEND_DIR"
if [[ -f package-lock.json ]]; then
npm ci
else
npm install
fi
npm run build
echo "Running database migrations..."
cd "$BACKEND_DIR"
"$BACKEND_DIR/.venv/bin/python" -c 'from app.migrations import run_migrations; run_migrations()'
echo "Installing systemd service units..."
install -m 0644 "$INSTALL_DIR/systemd/$WEB_SERVICE" "/etc/systemd/system/$WEB_SERVICE"
install -m 0644 "$INSTALL_DIR/systemd/$WORKER_SERVICE" "/etc/systemd/system/$WORKER_SERVICE"
systemctl daemon-reload
systemctl enable "$WEB_SERVICE" "$WORKER_SERVICE" >/dev/null
echo "Starting services..."
systemctl restart "$WEB_SERVICE"
systemctl restart "$WORKER_SERVICE"
echo "Checking service state..."
systemctl is-active "$WEB_SERVICE" "$WORKER_SERVICE"
echo "Checking API health..."
for _ in {1..20}; do
if curl -fsS http://127.0.0.1:8080/api/setup/status >/dev/null; then
echo "Update applied successfully."
exit 0
fi
sleep 1
done
echo "Services started, but API health check did not respond in time." >&2
echo "Inspect with: journalctl -u $WEB_SERVICE -u $WORKER_SERVICE --no-pager -n 100" >&2
exit 1