feat: WC2026 赛事 seed、生产上线初始化脚本与目录归档
重构 seed 为 WC2026 72 场小组赛与 48 强优胜盘;新增 production 模式仅保留 admin 与赛事示例;提供 prod-init-db 全量重置脚本;管理端 i18n 分包与赛事归档能力。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
65
scripts/prod-init-db.ps1
Normal file
65
scripts/prod-init-db.ps1
Normal file
@@ -0,0 +1,65 @@
|
||||
# 生产上线:清空全部业务数据,仅保留 admin + WC2026 赛事示例
|
||||
#
|
||||
# 用法(PowerShell,项目根目录):
|
||||
# $env:CONFIRM = "YES"; .\scripts\prod-init-db.ps1
|
||||
# $env:CONFIRM = "YES"; .\scripts\prod-init-db.ps1 -SkipBackup
|
||||
|
||||
param(
|
||||
[switch]$SkipBackup
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
$Root = Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Path)
|
||||
$ComposeFile = Join-Path $Root "docker-compose.prod.yml"
|
||||
$EnvFile = Join-Path $Root ".env.docker"
|
||||
|
||||
if ($env:CONFIRM -ne "YES") {
|
||||
Write-Host "错误:将删除全部业务数据,仅保留 admin 与 WC2026 赛事示例。"
|
||||
Write-Host ""
|
||||
Write-Host '确认后执行: $env:CONFIRM = "YES"; .\scripts\prod-init-db.ps1'
|
||||
exit 1
|
||||
}
|
||||
|
||||
$composeArgs = @("-f", $ComposeFile)
|
||||
if (Test-Path $EnvFile) {
|
||||
$composeArgs += @("--env-file", $EnvFile)
|
||||
}
|
||||
|
||||
Set-Location $Root
|
||||
|
||||
Write-Host "[prod-init-db] 检查容器…"
|
||||
docker compose @composeArgs ps --status running api postgres 2>$null | Out-Null
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "[prod-init-db] 请先启动 docker compose 栈"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if (-not $SkipBackup) {
|
||||
$backupDir = Join-Path $Root "backups"
|
||||
New-Item -ItemType Directory -Force -Path $backupDir | Out-Null
|
||||
$stamp = Get-Date -Format "yyyyMMdd-HHmmss"
|
||||
$backupFile = Join-Path $backupDir "thebet365-$stamp.sql"
|
||||
Write-Host "[prod-init-db] 备份 → $backupFile"
|
||||
docker compose @composeArgs exec -T postgres pg_dump -U thebet365 -d thebet365 -F p | Set-Content -Encoding utf8 $backupFile
|
||||
} else {
|
||||
Write-Host "[prod-init-db] 已跳过备份"
|
||||
}
|
||||
|
||||
Write-Host "[prod-init-db] 迁移…"
|
||||
docker compose @composeArgs exec -T api sh -c "cd /app/apps/api && npx prisma migrate deploy && npx prisma generate"
|
||||
|
||||
Write-Host "[prod-init-db] 生产模式初始化…"
|
||||
docker compose @composeArgs exec -T `
|
||||
-e INIT_DATABASE_CONFIRM=YES `
|
||||
-e ALLOW_DB_RESET=true `
|
||||
-e SEED_MODE=production `
|
||||
-e NODE_ENV=production `
|
||||
api `
|
||||
node dist/infrastructure/database/reset-and-seed-cli.js --yes --production
|
||||
|
||||
Write-Host "[prod-init-db] 清空 Redis…"
|
||||
docker compose @composeArgs exec -T redis redis-cli FLUSHALL 2>$null | Out-Null
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "[prod-init-db] 完成。管理员 admin / Admin@123,含 WC2026 赛事示例。"
|
||||
Write-Host "请将 .env.docker 中 SEED_DATABASE 设为 false 后 restart api"
|
||||
83
scripts/prod-init-db.sh
Normal file
83
scripts/prod-init-db.sh
Normal file
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env bash
|
||||
# 生产上线:清空全部业务数据,仅保留 admin + WC2026 赛事示例(无代理/玩家/充值/注单)
|
||||
#
|
||||
# 与「pnpm db:seed」的区别:
|
||||
# db:seed 增量写入,不删已有玩家、充值订单等
|
||||
# 本脚本 TRUNCATE 全部业务表 + production seed
|
||||
#
|
||||
# 用法(项目根目录,Linux 服务器):
|
||||
# chmod +x scripts/prod-init-db.sh
|
||||
# CONFIRM=YES ./scripts/prod-init-db.sh
|
||||
# CONFIRM=YES ./scripts/prod-init-db.sh --skip-backup
|
||||
#
|
||||
# 前置:docker compose -f docker-compose.prod.yml up -d 且 api/postgres 在运行
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
COMPOSE=(docker compose -f "$ROOT/docker-compose.prod.yml")
|
||||
ENV_FILE="$ROOT/.env.docker"
|
||||
SKIP_BACKUP=false
|
||||
|
||||
if [ "${CONFIRM:-}" != "YES" ]; then
|
||||
echo "错误:将删除全部业务数据(玩家、代理、充值、注单、审计等),仅保留 admin 与 WC2026 赛事示例。"
|
||||
echo ""
|
||||
echo "若已确认,请执行:"
|
||||
echo " CONFIRM=YES $0 [--skip-backup]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for arg in "$@"; do
|
||||
if [ "$arg" = "--skip-backup" ]; then
|
||||
SKIP_BACKUP=true
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -f "$ENV_FILE" ]; then
|
||||
COMPOSE+=(--env-file "$ENV_FILE")
|
||||
fi
|
||||
|
||||
cd "$ROOT"
|
||||
|
||||
echo "[prod-init-db] 检查容器…"
|
||||
"${COMPOSE[@]}" ps --status running api postgres redis >/dev/null 2>&1 || {
|
||||
echo "[prod-init-db] 请先启动: docker compose -f docker-compose.prod.yml --env-file .env.docker up -d"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if [ "$SKIP_BACKUP" = false ]; then
|
||||
BACKUP_DIR="$ROOT/backups"
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
STAMP="$(date +%Y%m%d-%H%M%S)"
|
||||
BACKUP_FILE="$BACKUP_DIR/thebet365-$STAMP.sql"
|
||||
echo "[prod-init-db] 备份 PostgreSQL → $BACKUP_FILE"
|
||||
"${COMPOSE[@]}" exec -T postgres pg_dump -U thebet365 -d thebet365 -F p > "$BACKUP_FILE"
|
||||
echo "[prod-init-db] 备份完成"
|
||||
else
|
||||
echo "[prod-init-db] 已跳过备份 (--skip-backup)"
|
||||
fi
|
||||
|
||||
echo "[prod-init-db] 执行数据库迁移…"
|
||||
"${COMPOSE[@]}" exec -T api sh -c 'cd /app/apps/api && npx prisma migrate deploy && npx prisma generate'
|
||||
|
||||
echo "[prod-init-db] 生产模式初始化(admin + WC2026 赛事)…"
|
||||
"${COMPOSE[@]}" exec -T \
|
||||
-e INIT_DATABASE_CONFIRM=YES \
|
||||
-e ALLOW_DB_RESET=true \
|
||||
-e SEED_MODE=production \
|
||||
-e NODE_ENV=production \
|
||||
api \
|
||||
node dist/infrastructure/database/reset-and-seed-cli.js --yes --production
|
||||
|
||||
echo "[prod-init-db] 清空 Redis…"
|
||||
"${COMPOSE[@]}" exec -T redis redis-cli FLUSHALL >/dev/null || true
|
||||
|
||||
echo ""
|
||||
echo "[prod-init-db] 完成。"
|
||||
echo " 管理员: admin / Admin@123(建议登录后立即修改密码)"
|
||||
echo " 赛事: WC2026 小组赛 72 场 + 48 强优胜盘"
|
||||
echo ""
|
||||
echo "后续建议:"
|
||||
echo " 1. .env.docker 中 SEED_DATABASE=false,避免重启 api 重复 seed"
|
||||
echo " 2. docker compose -f docker-compose.prod.yml --env-file .env.docker restart api"
|
||||
echo " 3. 勿长期保留 ALLOW_DB_RESET=true"
|
||||
Reference in New Issue
Block a user