Initial commit

This commit is contained in:
monoadmin
2026-04-10 15:36:35 -07:00
commit c284a9f7cf
8 changed files with 2567 additions and 0 deletions

100
install.sh Executable file
View File

@@ -0,0 +1,100 @@
#!/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" <<EOF
[Unit]
Description=Docker Backup Web UI
After=network.target docker.service
Wants=docker.service
[Service]
Type=simple
ExecStart=${PYTHON} ${WEBAPP_DIR}/app.py --host ${BIND} --port ${PORT}
WorkingDirectory=${WEBAPP_DIR}
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=${SERVICE_NAME}
[Install]
WantedBy=multi-user.target
EOF
ok "Service file written"
# ── Enable & start ────────────────────────────────────────────────────────────
step "Enabling and starting service…"
systemctl daemon-reload
systemctl enable "$SERVICE_NAME"
systemctl restart "$SERVICE_NAME"
# Wait a moment then check status
sleep 2
if systemctl is-active --quiet "$SERVICE_NAME"; then
ok "Service is running"
else
warn "Service may have failed — check: journalctl -u $SERVICE_NAME -n 30"
fi
# ── Summary ───────────────────────────────────────────────────────────────────
HOST_IP=$(hostname -I | awk '{print $1}')
echo ""
echo " ┌──────────────────────────────────────────────┐"
echo " │ Docker Backup UI is running │"
echo " │ │"
printf " │ Local: http://localhost:%-19s│\n" "${PORT}"
printf " │ Network: http://%-27s│\n" "${HOST_IP}:${PORT}"
echo " │ │"
echo " │ Manage service: │"
echo " │ systemctl status $SERVICE_NAME"
echo " │ systemctl stop $SERVICE_NAME"
echo " │ systemctl restart $SERVICE_NAME"
echo " │ journalctl -u $SERVICE_NAME -f │"
echo " └──────────────────────────────────────────────┘"
echo ""