香港生产部署执行手册(OneSeat)
已定案的路线
| 决策 | 结论 | 理由 |
|---|---|---|
| 地域 | 中国香港(整套:ECS + RDS + Redis) | 免 ICP 备案可立即上线;上游直连(服务器→AI 上游是请求链路的大头);一套栈兼顾大陆与亚太 |
| 数据层 | 阿里云托管:RDS PostgreSQL + Tair/Redis 标准主从 | 按 100~500 用户第二阶段建设;自动备份/PITR/切换交给云 |
| 应用 | 自有 ECS 跑 docker-compose.standalone.yml + override 单容器 | C 端 API 与管理后台是同一个 Go 二进制,拆不开也不需要拆 |
| 上游 | API 中转渠道 | 无出口 IP 风控顾虑 |
| Zeabur | testsub.zeabur.app 降级为测试环境 | 生产不放 PaaS:出口 IP 不可控、数据层无自主备份、长连接成本不可测 |
三条禁项(评估过,别再回头)
- Zeabur 应用 + 公网连自己账户的 RDS:出口 IP 属于 Zeabur、随时可能变,白名单失效即停服;且数据库开公网违反安全基线。
- Redis 走公网:并发槽位/锁/限流每请求多次往返,同 VPC 内网 p99 < 5ms 是前提。
- 数据库和应用拆在两个地方(如应用香港、库杭州):每请求跨境往返,且大陆侧域名解析需备案。
采购清单(全部:阿里云账户,中国香港,同一个「默认专有网络」VPC)
| 项 | 规格定案 | 购买入口 |
|---|---|---|
| ECS | 4C8G,g 系列独享型(避开 t 突发/e 经济共享型),可用区 D,Ubuntu 24.04,ESSD 60~100GB,公网按使用流量(峰值 100Mbps),密钥对登录,释放保护开启 | https://ecs-buy.aliyun.com/ |
| RDS | PostgreSQL 18(引擎千万别选成 MySQL),≥2C4G(预算允许上高可用系列 2C8G 跨可用区),100GB,云盘加密开启(仅创建时可开),可用区 D,仅 VPC 白名单、不开公网,自动备份保留 ≥7 天 | https://rds-buy.console.aliyun.com/ |
| Redis | 标准主从版,1GB,单分片,Redis 6/7,跨可用区,开备份,仅 VPC 白名单,确认未禁用 EVAL/EVALSHA/SCRIPT | https://kvstore-buy.console.aliyun.com/ |
| OSS | 一个 Bucket 放逻辑备份异地副本 | https://www.aliyun.com/product/oss |
付费策略:ECS 按量起步跑顺后转包月;RDS/Redis 短周期(3 个月)包月,到期前手动续(记日历),稳定后再开自动续费。
购买后立刻做:把 ECS 内网 IP 加进 RDS 和 Redis 的白名单;到控制台确认 RDS 自动备份已开启。
部署步骤(ECS 上)
配套文件在主仓库 docs/sub2api-tony/deploy-standalone/(.env 模板、override、README)。
bash
# 1. 装 Docker + Caddy 后
mkdir -p /srv/sub2api && cd /srv/sub2api
# 拷入:deploy/docker-compose.standalone.yml + deploy-standalone/{docker-compose.override.yml,.env.example}
# 2. .env:DATABASE_HOST/REDIS_HOST 填 RDS/Redis 内网地址;
# openssl rand -hex 32 生成 JWT_SECRET 与 TOTP_ENCRYPTION_KEY(终身固定,异地备份)
# BIND_HOST=127.0.0.1;连接池 DB 25/5、Redis 128/16
cp .env.example .env && vim .env && chmod 600 .env
# 3. override 里钉镜像版本(禁止 latest)后启动
docker compose -f docker-compose.standalone.yml -f docker-compose.override.yml up -d
docker compose -f docker-compose.standalone.yml -f docker-compose.override.yml logs -f sub2api # 自动迁移;找 "admin password"
curl -fsS http://127.0.0.1:8080/healthCaddy 绑 api.oneseatai.com 反代 127.0.0.1:8080(SSE/WS 注意事项见反向代理与 HTTPS)。安全组只开 22(限自己 IP)/80/443。
数据迁移(旧部署 → 香港)
- 旧部署(Zeabur/美国机)只是测试数据 → 香港全新初始化,跳过本节。
- 有真实用户/余额 → 低峰
pg_dump -Fc导出 → 导入 RDS → 起服务验证登录/Key/余额/用量。必须把旧.env的JWT_SECRET和TOTP_ENCRYPTION_KEY原样带过来(TOTP 密钥不一致 = 全员 2FA 作废)。 - Redis 不迁:全是运行时状态,新环境自动重建。
流量切换
- 香港全链路验收通过(下方清单);
api.oneseatai.comA 记录 → ECS 公网 IP;- CF Worker
wrangler.jsonc → SUB2API_ORIGIN改为https://api.oneseatai.com,在sub2api-frontend仓库npm run deploy; - 旧部署保留观察 3~7 天作回滚兜底,再降级/退掉;
- (后续)注册一个不走 Cloudflare 的备用域名指向同一台 ECS,写进用户文档作 fallback base_url。
上线验收
- [ ]
https://api.oneseatai.com/health通过;SSE 流式请求逐段返回,30 分钟长请求不断流 - [ ] 管理后台可登录(加 IP/VPN 限制),管理员开 TOTP
- [ ] 注册→充值→发请求→用量入账 全链路走通(oneseatai.com 经 CF Worker)
- [ ] RDS 手动备份一次并恢复到临时实例验证可用;OSS 每日
pg_dump定时任务就位 - [ ] 磁盘/CPU/内存/RDS 连接数/Redis 内存告警已配(阈值 60%)
- [ ]
.env密钥已异地备份;5432/6379/8080 无公网暴露