# CF 下载部署指南给服务器 Agent

目标：服务器 Agent 从 Cloudflare 下载最新部署包，校验完整性，在服务器上启动 `bigdata.dtacloud.cn` 的生产候选环境，并完成真实链路 QA。

## 下载

当前发布包：

```bash
export PACKAGE_URL="https://dlbdi-handoff.pages.dev/dlbdi-server-agent-deploy-20260617-021738.zip"
export SHA256_URL="https://dlbdi-handoff.pages.dev/dlbdi-server-agent-deploy-20260617-021738.zip.sha256"
export SECRETS_URL="https://dlbdi-handoff.pages.dev/dlbdi-server-secrets-20260616-231709.tar.gz.enc"
export SECRETS_SHA256_URL="https://dlbdi-handoff.pages.dev/dlbdi-server-secrets-20260616-231709.tar.gz.enc.sha256"
```

下载到服务器：

```bash
mkdir -p /opt/dlbdi-release
cd /opt/dlbdi-release
curl -fL "$PACKAGE_URL" -o dlbdi-server-agent-full.zip
curl -fL "$SHA256_URL" -o dlbdi-server-agent-full.zip.sha256
sha256sum -c dlbdi-server-agent-full.zip.sha256 || shasum -a 256 -c dlbdi-server-agent-full.zip.sha256
unzip -q dlbdi-server-agent-full.zip
cd dlbdi-server-agent-full-*
```

注意：代码部署包不包含明文密钥。真实 `.env.production`、微信支付证书和告警 token 在加密密钥包里。密钥包可以公开下载，但解密密码必须通过单独安全通道发送，不能写进公开链接、日志或 Git。

## 安装加密密钥包

在项目根目录执行：

```bash
cd /opt/dlbdi-release/dlbdi-server-agent-deploy-20260617-021738
curl -fL "$SECRETS_URL" -o dlbdi-server-secrets.tar.gz.enc
curl -fL "$SECRETS_SHA256_URL" -o dlbdi-server-secrets.tar.gz.enc.sha256
sha256sum -c dlbdi-server-secrets.tar.gz.enc.sha256 || shasum -a 256 -c dlbdi-server-secrets.tar.gz.enc.sha256

read -rsp "Secrets password: " SECRETS_PASSWORD
printf '\n'
openssl enc -d -aes-256-cbc -pbkdf2 -iter 200000 \
  -in dlbdi-server-secrets.tar.gz.enc \
  -pass "pass:$SECRETS_PASSWORD" \
  | tar -xzf - --strip-components=1
unset SECRETS_PASSWORD

chmod 600 .env.production secrets/alertmanager_token secrets/wechatpay/*.pem
chmod 700 secrets secrets/wechatpay
```

## 配置

如果不用加密密钥包，才需要手动复制样例再填写真实值：

```bash
cp .env.production.example .env.production
chmod 600 .env.production
mkdir -p secrets/wechatpay
chmod 700 secrets secrets/wechatpay
```

必须确认：

```bash
node backend/scripts/production-env-audit.mjs .env.production
node scripts/audit-production-sentinels.mjs
docker compose --env-file .env.production config --quiet
```

禁止使用会输出真实插值的 `docker compose config` 日志。

## 部署

```bash
make audit-production

# 如果这是已有服务升级，先备份；全新空服务器可跳过。
make backup

# make deploy 会构建镜像、停止旧服务、跑数据库迁移、再启动新服务。
make deploy

docker compose --env-file .env.production ps
```

## 基础验收

```bash
curl -fsS https://bigdata.dtacloud.cn/api/health
curl -fsS https://bigdata.dtacloud.cn/api/health/deep
curl -fsS https://bigdata.dtacloud.cn/api/files/d1b1d1b1-2026-4000-9000-000000000001?v=original-logo >/dev/null
curl -fsS https://bigdata.dtacloud.cn/api/metrics && exit 1 || test "$?" -eq 22
```

期望：

- `/api/health` 返回 ok。
- `/api/health/deep` 中 database、sms、objectStorage、wechatPay 均为生产可用状态。
- 公网 `/api/metrics` 返回 404；Prometheus 只从内网抓取。
- 宿主机外层 nginx 负责公网 80/443；本项目 Caddy 只监听 `127.0.0.1:8082`，不做 HTTPS 和自动跳转。

## 必跑真实链路

- 管理员手机号真实短信登录。
- 小程序微信登录、绑定手机号、onboarding。
- PC 小程序码登录。
- 小程序 JSAPI 微信真实小额支付。
- PC Native 微信真实小额支付。
- 微信支付回调幂等：重复回调不重复发权益、不重复核销优惠券、不重复结算。
- 商品/CMS/Logo/专家/发票/数据服务文件上传下载。
- 核销扫码、重复扫码、错项目码、通行证补录。
- `make backup` 产物可用，并在 staging 做恢复演练。

## QA 输出

服务器 Agent 最终回复：

- 部署包文件名与 sha256。
- `.env.production` 已配置项清单，只输出 set/empty，不输出值。
- 通过项。
- 失败项：复现步骤、接口响应、日志、截图。
- 生产阻断项。
- 可延期项。
- 是否建议正式开放流量。
