#!/bin/bash set -e APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" WEBAPP_DIR="$APP_DIR/webapp" SERVICE_NAME="docker-backup" SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service" PYTHON="$(which python3)" PORT="${PORT:-5999}" BIND="${BIND:-0.0.0.0}" # ── Colours ─────────────────────────────────────────────────────────────────── GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; NC='\033[0m' ok() { echo -e "${GREEN}✓${NC} $*"; } warn() { echo -e "${YELLOW}⚠${NC} $*"; } die() { echo -e "${RED}✗${NC} $*"; exit 1; } step() { echo -e "\n${YELLOW}▶${NC} $*"; } echo "" echo " Docker Backup — Install" echo " ───────────────────────" # ── Root check ──────────────────────────────────────────────────────────────── [[ $EUID -ne 0 ]] && die "Run as root (sudo $0)" # ── Python deps ─────────────────────────────────────────────────────────────── step "Checking Python dependencies…" PIP="$(which pip3 2>/dev/null || which pip 2>/dev/null || echo 'python3 -m pip')" MISSING=() for pkg in docker flask rich apscheduler paramiko; do python3 -c "import $pkg" 2>/dev/null && ok "$pkg" || MISSING+=("$pkg") done if [[ ${#MISSING[@]} -gt 0 ]]; then echo " Installing: ${MISSING[*]}" $PIP install --quiet --break-system-packages "${MISSING[@]}" 2>/dev/null || \ $PIP install --quiet "${MISSING[@]}" && ok "Packages installed" fi # ── Backup dir ──────────────────────────────────────────────────────────────── step "Creating backup directory…" BACKUP_DIR="$WEBAPP_DIR/backups" mkdir -p "$BACKUP_DIR" ok "$BACKUP_DIR" # ── Systemd service ─────────────────────────────────────────────────────────── step "Writing systemd service: $SERVICE_FILE" cat > "$SERVICE_FILE" <