#!/bin/bash # ============================================================================= # 追光AI 容器卷备份脚本 (在宿主机上跑) # - 把 4 个 docker 卷打包到 /home/ubuntu/zhuiguang-ai-backup/dockers/ # - 默认保留最近 7 天快照 # - 用法: bash scripts/backup-volumes.sh # ============================================================================= set -e PROJECT="/home/ubuntu/zhuiguang-ai" BACKUP_ROOT="/home/ubuntu/zhuiguang-ai-backup/dockers" STAMP=$(date +%Y%m%d-%H%M%S) BACKUP_DIR="${BACKUP_ROOT}/${STAMP}" KEEP_DAYS=7 mkdir -p "$BACKUP_DIR" echo "[backup] $(date) 开始备份容器卷到 $BACKUP_DIR" # 备份 4 个卷 for vol in zhuiguang_ai_bot_data zhuiguang_ai_bot_public zhuiguang_ai_bot_logs zhuiguang_ai_bot_prisma; do if ! docker volume inspect "$vol" >/dev/null 2>&1; then echo "[backup] WARN: 卷 $vol 不存在,跳过" continue fi echo "[backup] 备份卷 $vol ..." docker run --rm \ -v "${vol}:/src:ro" \ -v "${BACKUP_DIR}:/dst" \ alpine:3.19 \ tar czf "/dst/${vol}.tgz" -C /src . 2>&1 | tail -3 echo "[backup] -> ${vol}.tgz" done # 同时备份 .env(敏感文件单独加密存) if [ -f "$PROJECT/env/.env.production" ]; then cp "$PROJECT/env/.env.production" "${BACKUP_DIR}/.env.production" echo "[backup] .env.production 已备份" fi # 备份清单 { echo "# 备份清单 - $(date)" echo "STAMP: $STAMP" ls -lh "$BACKUP_DIR" } > "$BACKUP_DIR/INDEX.txt" echo "[backup] 完成。清单:" ls -lh "$BACKUP_DIR" # 清理 7 天前的旧备份 echo "[backup] 清理 $KEEP_DAYS 天前的旧备份 ..." find "$BACKUP_ROOT" -maxdepth 1 -type d -mtime +$KEEP_DAYS -exec rm -rf {} + 2>/dev/null || true echo "[backup] DONE"