Files
photo-live/.env.production.example-ov
T
浅念 250d4355b9 build(deploy): production images, compose stacks and 1panel guide
P5-prep Task 1(docs/plans/2026-09-21-P5-准备件.md):

- docker/server.Dockerfile:单镜像 photo-live-server 多角色(api-cn/api-ov/
  worker/sync/migrate-deploy/seed-admin,entrypoint.sh 分发;migrate-deploy
  支持 cn|ov|all 区域参数)。三阶段:全量 install(锁文件冻结)→ prisma
  generate 双库 + 逐包构建;--prod 依赖层;runtime=node:20-alpine+openssl/curl
  + 全局 prisma@5.22.0(对齐锁文件)+ 双库 client 镜像内重建(db-cn 落 pnpm
  store .prisma、db-ov 落包内 generated/)。sharp 走 musl 预编译验证通过。
- docker/web.Dockerfile + infra/deploy/nginx.conf.template:photo-live-web
  (nginx:alpine + envsubst 模板)。viewer(/,history 回退) + admin(/admin/,
  hash 路由) + /v1 反代 API_UPSTREAM(含 /v1/realtime WS 升级)+
  /assets/、/admin/assets/、/embed/v1/ immutable 长缓存(admin assets 的
  alias 前缀剥除坑已实测修复)。VITE_* 为构建期参数(VIEWER_BASE/
  EMBED_ORIGIN 随域名构建传入)。
- infra/deploy/docker-compose.cn.yml / -ov.yml:cn=api-cn+worker+sync+web,
  ov=api-ov+web-ov(核实架构:sync 仅 cn 侧,inbox/emergency 内嵌 api-ov,
  无 ov 侧 sync 进程);健康检查 /v1/health、unless-stopped、json-file
  10m×3、外部 1panel-network 复用 1Panel MySQL/Redis、SERVER_IMAGE/
  WEB_IMAGE 环境变量化镜像 tag(回滚杠杆)。
- .env.production.example-cn/-ov:生产变量全量清单(cn 25 键/ov 24 键,
  DB/Redis/OSS/SYNC/AUTH/限速/域名分组注释,源自 services+packages
  process.env 全量审计);.gitignore 放行 example,真实 .env.production-*
  永不入库。
- infra/deploy/README-1Panel.md:镜像导入双路径(save tar 导入 / 仓库 pull)、
  MySQL 建库授权 SQL(utf8mb4_0900_bin,<8.0.30 回退 utf8mb4_bin——D12)、
  Redis 连接、1Panel 编排、OpenResty 反代+证书、migrate-deploy 一次性容器、
  首次部署顺序(DB→迁移→ov 栈→cn 栈→seed→冒烟)。
- 根 package.json pnpm.onlyBuiltDependencies 增补 sharp/prisma/@prisma/
  engines/@prisma/client(镜像构建所需 install 脚本白名单)。

本地验证:两镜像构建成功(server 988MB / web 97.7MB);compose config 校验
通过;server 镜像内逐服务 require(sharp/argon2/双 Prisma client/bullmq/
ioredis)与双引擎 so.node、migrate-deploy 角色、无 .env 泄漏均实测;web 镜像
容器实测路由(viewer 回退/admin 子路径/assets 与 embed immutable/WS 代理路径
502 语义)全通过。未起真实栈(无真实 DB,符合准备件边界)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-21 01:39:55 +08:00

60 lines
3.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# .env.production.example-ov —— 海外(ov)生产环境变量全量清单(P5-prep Task 1)。
# 复制为与 docker-compose-ov.yml 同目录的 .env.production-ov。ov 栈只跑
# api-ov + web 两个容器(inbox/emergency 内嵌于 api-ov,sync 进程在 cn 侧——
# 架构核实见 services/api/src/app-ov.module.ts 与 services/sync/src/main.ts)。
# 【安全】只放占位符;真实文件不入 git、不进镜像。
# ── 数据库 / 缓存(OV 服务器上的 1Panel MySQL/Redis 容器)──
# 库 photo_ov:utf8mb4,库级校对 utf8mb4_0900_bin(MySQL ≥8.0.30,低版本回退
# utf8mb4_bin,同 cn 的 D12 注意项;publicToken/对象键大小写语义依赖它)。
# 注意:此库需放行 cn 服务器出口 IP 的 3306 访问(sync 进程直连取
# outbox_stat_events/副本计数),生产建议 SSL/隧道 + 白名单最小化。
DATABASE_URL_OV=mysql://photo_ov:CHANGE_ME@1Panel-mysql-容器名或IP:3306/photo_ov?connection_limit=10
# ov 互动限速(likes/visits/downloads/embed)+ WS 广播合并用 Redis(ov-redis.module)。
REDIS_URL_OV=redis://1Panel-redis-容器名或IP:6379
# ── 对象存储(与 cn 同一 OSS 私有桶:ov 只现签 GET 读 URL,无上传)──
# endpoint 用 OSS 「跨区域/外网」Endpoint,ov 服务器可达即可。
S3_ENDPOINT=https://oss-cn-hangzhou.aliyuncs.com
S3_REGION=cn-hangzhou
S3_ACCESS_KEY=CHANGE_ME_LTAI
S3_SECRET_KEY=CHANGE_ME
S3_BUCKET=photo-live-prod
# 现签 GET(公开照片 thumb/browse/banner、下载原图)凭证有效期秒。
SIGNED_URL_TTL_SECONDS=900
# ── 域名 / 网络 ──
# CORS 放行 origin(ov viewer 域名两形;viewer 与 API 同域走网关时可省)。
CORS_ORIGINS=https://CHANGE_ME_ov域名
# api-ov 容器内监听端口(main-ov.ts 读 PORT_OV;compose 内固定 8081)。
PORT_OV=8081
# ── 内部通道(inbox + emergency 共用 InternalSyncGuard 的 HMAC 密钥)──
# 与 cn 侧 SYNC_INTERNAL_KEY 同值(cn 侧 sync 发送/对账签名,ov 侧验签;
# emergency 紧急停用通道也用它——调用样例见 infra/deploy/RUNBOOK.md)。
SYNC_INTERNAL_KEY=CHANGE_ME_openssl_rand_hex_32
# ── 公开读 / 互动参数(契约默认可 env 覆盖;D07/D10/D11 建议值)──
# 热门排序快照 TTL 毫秒(public-ov;缺省 30000)。
HOT_SORT_TTL_MS=30000
# 点赞:批次幂等窗口小时 / 单会话窗口累计 delta 上限 / 单 IP 窗口累计上限 /
# likes.burst 实时合并毫秒(0=不合并)。缺省 24 / 500 / 2000 / 500。
LIKE_BATCH_WINDOW_HOURS=24
LIKE_SESSION_WINDOW_DELTA=500
LIKE_IP_WINDOW_DELTA=2000
LIKE_BURST_MERGE_MS=500
# 浏览:去重窗口分钟 / requestId 幂等保留分钟(≥窗口)/ 单 visitor+IP 每窗请求上限。
VISIT_WINDOW_MINUTES=30
VISIT_REQUEST_TTL_MINUTES=35
VISIT_WINDOW_REQUESTS=60
# 公开照片下载:单 IP 每固定窗(60s 常量 DOWNLOAD_WINDOW_SECONDS)请求上限。
DOWNLOAD_WINDOW_REQUESTS=120
# 嵌入组件公开端点限速:slotToken+IP 每固定窗请求上限 / 窗口秒(轮询 30s/次 + 重载突发)。
EMBED_WINDOW_REQUESTS=120
EMBED_WINDOW_SECONDS=60
# 互动流水清理调度间隔分钟(0=停用;超窗口 like_batches/visit_* 行回收,累计总数永不清)。
CLEANUP_INTERVAL_MINUTES=60
# ── 日志 ──
LOG_LEVEL=info