Initial commit
This commit is contained in:
100
install.sh
Executable file
100
install.sh
Executable 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 ""
|
||||
Reference in New Issue
Block a user