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>
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
# .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
|
||||
Reference in New Issue
Block a user