docs: 正式环境双地域部署计划与验收记录

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-24 13:41:47 +08:00
parent 30a3520669
commit e5302e3929
2 changed files with 235 additions and 0 deletions
@@ -0,0 +1,62 @@
# 正式环境双地域部署 验收记录(2026-09-24)
> 对应计划:docs/plans/2026-09-24-正式环境双地域部署.md(用户确认后执行)。
> 版本:`photo-live-server:30a3520-20260924`(commit 30a3520,含 nginx entrypoint 补丁正式化);
> web 双版本 `photo-live-web:30a3520-20260924-ov` / `-cn`(VITE_VIEWER_BASE 分域构建)。
## 1. 部署形态(结果)
| 机 | 域名 | 栈 | 外网验证 |
| --- | --- | --- | --- |
| cn 101.37.116.184(Rocky 9.6, 2C/3.5G) | live-album.inside.hnxinyouhe.com | photo-live-cn:api-cn/worker/sync/web + 自管 mysql:8.4(调优)/redis:7,web@127.0.0.1:18088 | `/v1/health` ok;`/admin/` 200 |
| ov 47.254.176.10(Debian 13, 2C/7.4G) | live-album.outside.hnxinyouhe.com | photo-live-ov:api-ov/web-ov + 自管 mysql:8.4/redis:7,web@127.0.0.1:18089,mysql 公网映射 13306(等安全组) | `/v1/health` ok;根 302 |
入口:两机 1Panel OpenResty 站点(用户自建)+ Let's Encrypt 证书 + 强制 HTTPS;
反代配置确认含 Upgrade/Connection 头。SSH 通道:`photo-ov` 走 ProxyJump 跳板
8.152.213.143(ov 安全组白名单了它;cn→ov 22/443 亦可达);`photo-cn` 直连。
均用 `~/.ssh/id_ed25519`(cms-cj-deploy)。
## 2. 验证结果(全部通过)
- **prod-smoke 四点冒烟 9/9 PASS**:双端 health、真实密码登录、建时间戳相册
→ OSS presign PUT(3118B 真实上传,G1 桶凭证复用)→ complete → worker 处理 →
**cn 公开 0s 可见 → ov 公开 0s 可见(跨境 HMAC 推送端到端)**;清理软删 ✓。
- WS:`/v1/realtime` 经 OpenResty→web→api-ov 升级 101 ✓。
- CORS:第三方 Origin 无 Access-Control-Allow-Origin(收窄生效)✓。
- sync 日志:outbox batch pushed(acceptedEventIds 落 ov inbox)✓。
- 迁移:cn/ov 两库 migrate deploy 全量应用;seed-admin created admin (active) ✓。
- NTP:两机均同步(阿里云内部 NTP,HMAC ±300s 前提)✓。
## 3. 与准备件的偏差(实际落地)
1. compose 自管 mysql:8.4 + redis:7(两机 1Panel MySQL 均为 5.7.44 不满足基线),
独立桥网络 photo-net,与机上既有项目(tracker/cc-ai-kefu/cms-cj/loan-reminder 等)零接触。
2. web 回环端口 18089(ov)/18088(cn)——8089 两机都被 1Panel phpMyAdmin 占用。
3. cn mysql 调优:performance-schema=OFF + innodb-buffer-pool-size=128M
(cn 仅 3.5G 内存,栈占用实测 ~495M,available ~1.0G)。
4. ov mysql 公网映射 0.0.0.0:13306(sync 直连读库:对账+统计回传;**安全组未放行前
这两循环持续幂等重试**,内容推送走 API 443 不受影响)。
5. `docker/web.Dockerfile` 正式化 entrypoint ipv6 脚本移除(commit 30a3520;钉版本仍待办)。
## 4. 遗留与待办
- **[用户操作] ov 安全组放行 TCP/13306 ← 101.37.116.184**——放行后 sync 的
reconcile(5min 对账)与 stat return(60s 统计回传)即自愈(幂等重试中)。
- **[用户决策] cn 机 2G swap**:机器级改动经用户确认后再做(当前 1.0G available
无 swap,worker sharp 峰值有 OOM 风险;建议做)。
- **[用户操作] uniservice 首批用户同步**:12h 间隔下重启后首批要等——后台「手动同步」
按钮触发(或等定时)。
- gitea push 待令牌(本会话推送认证失败;commit 30a3520 未推送,镜像已直传服务器)。
- 服务器无源码 clone(部署走镜像传输);后续更新流程待 gitea 令牌后补 `git pull` 工作流。
- 磁盘两机均 ~85%(cn 5.6G/ov 5.7G 余)——长期扩容建议已登记。
- 既有风险提醒(未动):cn 机 1Panel MySQL 5.7 绑 0.0.0.0:3306 公网暴露,建议收口。
- 密钥管理:全部新生成(SYNC_INTERNAL_KEY/mysql×4/ADMIN_PASSWORD),本地
`.env.prod-secrets/`(gitignore)+ 两机 `.env*`(600)。ADMIN 密码建议首次登录后
经后台修改(env 值仅 seed 用)。
## 5. 运维备忘(本次新增坑位)
- cn/ov 入口均为 1Panel OpenResty 站点(用户面板管理,续期由 1Panel 负责);
容器操作走 `docker compose -f /opt/photo-live/deploy/docker-compose-{cn,ov}.yml`。
- 本机→ov 文件传输走 `scp photo-ov:`(自动过跳板);226MB 镜像包约 4 分钟。
- 重建 api 容器后 web 需一并 restart(既有坑位,本次未触发——首装 up 一次成型)。