#!/usr/bin/env bash # ============================================================================== # Full Server Backup Script # ============================================================================== # Discovers deployed services by scanning /opt/*/docker-compose.yml and # local service units, runs the appropriate backup script for each, then # creates a combined full-server archive. # # Usage: backup-all.sh # backup-all.sh --cold # ============================================================================== set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/common.sh" parse_args "$@" BACKUP_DIR="/opt/backup" STAMP="$(date +%Y%m%d-%H%M%S)" COLD_FLAG="" [[ "$ARG_COLD" == "1" ]] && COLD_FLAG="--cold" mkdir -p "$BACKUP_DIR" echo "" echo -e "${CYAN}══════════════════════════════════════════════${NC}" echo -e "${CYAN} Full Server Backup${NC}" echo -e "${CYAN}══════════════════════════════════════════════${NC}" if [[ -n "$COLD_FLAG" ]]; then echo -e " Mode: ${YELLOW}Cold (services will be stopped)${NC}" else echo -e " Mode: Hot (services stay running)" fi echo -e "${CYAN}══════════════════════════════════════════════${NC}" echo "" failed=0 # --- Traefik --- if [[ -d /opt/traefik ]]; then info "Backing up traefik..." "${SCRIPT_DIR}/backup-traefik.sh" $COLD_FLAG || { warn "Traefik backup failed."; (( failed++ )); } fi # --- Mattermost --- if [[ -f /opt/mattermost/docker-compose.yml ]]; then info "Backing up mattermost..." "${SCRIPT_DIR}/backup-mattermost.sh" $COLD_FLAG || { warn "Mattermost backup failed."; (( failed++ )); } fi # --- Gitea --- if [[ -f /opt/gitea/docker-compose.yml ]]; then info "Backing up gitea..." "${SCRIPT_DIR}/backup-gitea.sh" $COLD_FLAG || { warn "Gitea backup failed."; (( failed++ )); } fi # --- Hermes --- if [[ -f /opt/hermes/docker-compose.yml ]] || [[ -f /etc/systemd/system/hermes.service ]]; then info "Backing up hermes..." "${SCRIPT_DIR}/backup-hermes.sh" $COLD_FLAG || { warn "Hermes backup failed."; (( failed++ )); } fi # --- Paperclip --- if [[ -d /opt/paperclip ]]; then info "Backing up paperclip..." "${SCRIPT_DIR}/backup-paperclip.sh" $COLD_FLAG || { warn "Paperclip backup failed."; (( failed++ )); } fi # --- OpenClaw --- if [[ -d /opt/openclaw ]]; then info "Backing up openclaw..." "${SCRIPT_DIR}/backup-openclaw.sh" $COLD_FLAG || { warn "OpenClaw backup failed."; (( failed++ )); } fi # --- Open WebUI --- if [[ -f /opt/open-webui/docker-compose.yml ]]; then info "Backing up open-webui..." "${SCRIPT_DIR}/backup-open-webui.sh" $COLD_FLAG || { warn "Open WebUI backup failed."; (( failed++ )); } fi # --- AgenticSeek --- if [[ -f /opt/agenticseek/docker-compose.yml ]]; then info "Backing up agenticseek..." "${SCRIPT_DIR}/backup-agenticseek.sh" $COLD_FLAG || { warn "AgenticSeek backup failed."; (( failed++ )); } fi # --- Web instances (discover by /opt/*/docker-compose.yml with web- container) --- for dir in /opt/*/; do dir_name="$(basename "$dir")" compose="${dir}docker-compose.yml" if [[ -f "$compose" ]] && grep -q "web-${dir_name}" "$compose" 2>/dev/null; then info "Backing up web instance: ${dir_name}..." "${SCRIPT_DIR}/backup-web.sh" --dir "$dir_name" $COLD_FLAG || { warn "Web (${dir_name}) backup failed."; (( failed++ )); } fi done # --- Combined full-server archive --- FULL_BACKUP="${BACKUP_DIR}/backup-all-${STAMP}.tar.gz" info "Creating combined full-server archive..." tar czf "$FULL_BACKUP" -C / opt/ 2>/dev/null || warn "Full archive creation failed." # --- Rotate full archives (keep last 3) --- # shellcheck disable=SC2012 ls -t "${BACKUP_DIR}/backup-all-"*.tar.gz 2>/dev/null | tail -n +4 | xargs -r rm -- # --- Summary --- echo "" echo -e "${GREEN}══════════════════════════════════════════════${NC}" echo -e "${GREEN} Backup complete${NC}" echo -e "${GREEN}══════════════════════════════════════════════${NC}" if [[ -f "$FULL_BACKUP" ]]; then echo -e " Full: ${FULL_BACKUP} ($(du -h "$FULL_BACKUP" | cut -f1))" fi echo -e " Dir: ${BACKUP_DIR}/" if (( failed > 0 )); then echo -e " ${YELLOW}Warnings: ${failed} backup(s) had issues${NC}" fi echo -e "${GREEN}══════════════════════════════════════════════${NC}" echo ""