Files
zhuiguang-ai/scripts/backup-volumes.sh
T

56 lines
1.7 KiB
Bash

#!/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"