#!/usr/bin/env bash # 备份 1Panel 管理的 Postgres(直接 docker exec 进它的容器,不依赖宿主端口) # # ./scripts/backup-db.sh # 输出 backups/db-YYYY-MM-DD-HHMMSS.sql.gz # KEEP_DAYS=7 ./scripts/backup-db.sh # 顺手删掉 7 天前的备份 # # cron(每天 4 点): # 0 4 * * * cd /opt/fashion/backend && KEEP_DAYS=7 ./scripts/backup-db.sh >> .deploy/backup.log 2>&1 set -euo pipefail cd "$(dirname "$0")/.." [ -f .env ] || { echo "!! 缺少 .env"; exit 1; } set -a; . ./.env; set +a PG_CONTAINER="${PG_CONTAINER:?PG_CONTAINER 未设置:填 .env 里那个 postgres 容器名}" KEEP_DAYS="${KEEP_DAYS:-0}" mkdir -p backups OUT="backups/db-$(date +%F-%H%M%S).sql.gz" echo "==> 备份到 $OUT" docker exec -e PGPASSWORD="${DB_PASSWORD:?DB_PASSWORD 未设置}" "$PG_CONTAINER" \ pg_dump -U "${DB_USER:-fashion}" "${DB_NAME:-fashion}" | gzip > "$OUT" echo " $(du -h "$OUT" | cut -f1)" if [ "$KEEP_DAYS" -gt 0 ]; then find backups -name 'db-*.sql.gz' -mtime +"$KEEP_DAYS" -print -delete fi echo "==> 完成"