Files
20260512-skg-tk/scripts/deploy-prod-safe.sh
2026-05-26 06:53:30 +08:00

77 lines
2.5 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
HOST="${HOST:-root@76.13.31.179}"
APP_DIR="${APP_DIR:-/opt/skg-marketing-studio}"
BACKUP_DIR="${BACKUP_DIR:-/opt/skg-marketing-studio-backups}"
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"
if [[ "${1:-}" == "--no-build" ]]; then
BUILD_FLAG=""
else
BUILD_FLAG="--build"
fi
echo "==> Preflight: creating remote data/env backup"
ssh "$HOST" "set -euo pipefail
cd '$APP_DIR'
mkdir -p '$BACKUP_DIR'
stamp=\$(date +%Y%m%d%H%M%S)
tar -czf '$BACKUP_DIR/skg-marketing-preserve-'\$stamp'.tgz' \
deploy/.env.production \
data/jobs \
data/asset_library \
data/prompt_library \
data/_trash \
secrets 2>/tmp/skg-backup-warnings.log || {
cat /tmp/skg-backup-warnings.log >&2 || true
exit 1
}
if docker ps --format '{{.Names}}' | grep -qx skg-marketing-postgres; then
docker exec skg-marketing-postgres sh -lc 'pg_dump -U "\$POSTGRES_USER" "\$POSTGRES_DB"' \
| gzip > '$BACKUP_DIR/skg-marketing-postgres-'\$stamp'.sql.gz'
fi
find '$BACKUP_DIR' -name 'skg-marketing-preserve-*.tgz' -type f -printf '%T@ %p\n' | sort -nr | tail -n +8 | cut -d' ' -f2- | xargs -r rm -f
find '$BACKUP_DIR' -name 'skg-marketing-postgres-*.sql.gz' -type f -printf '%T@ %p\n' | sort -nr | tail -n +8 | cut -d' ' -f2- | xargs -r rm -f
echo backup:\$(ls -t '$BACKUP_DIR'/skg-marketing-preserve-*.tgz | head -1)
"
echo "==> Syncing code with production data protected"
rsync -az --delete \
--filter='P /data/***' \
--filter='P /jobs/***' \
--filter='P /secrets/***' \
--filter='P /deploy/.env.production' \
--filter='P /api/jobs/***' \
--filter='P /api/.env' \
--filter='P /api/.env.local' \
--filter='P /api/.env.production' \
--exclude='/.git/' \
--exclude='/.memory/' \
--exclude='/.logs/' \
--exclude='/.pids/' \
--exclude='/data/' \
--exclude='/jobs/' \
--exclude='/secrets/' \
--exclude='/api/jobs/' \
--exclude='/api/.env' \
--exclude='/api/.env.local' \
--exclude='/api/.env.production' \
--exclude='/deploy/.env.production' \
--exclude='/web/node_modules/' \
--exclude='/web/.next/' \
--exclude='/web/out/' \
--exclude='/node_modules/' \
--exclude='内部分享-口播脚本.md' \
./ "$HOST:$APP_DIR/"
echo "==> Rebuilding production containers"
ssh "$HOST" "cd '$APP_DIR' && docker compose -f docker-compose.prod.yml --env-file deploy/.env.production up -d $BUILD_FLAG"
echo "==> Verifying production"
"$ROOT_DIR/scripts/verify-prod-docker.sh" "$HOST"
echo "==> Done"