250d4355b9
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>
69 lines
4.0 KiB
Bash
69 lines
4.0 KiB
Bash
# .env.production.example-cn —— 国内(cn)生产环境变量全量清单(P5-prep Task 1)。
|
||
# 复制为 infra/deploy 同目录下的 .env.production-cn(与 docker-compose.cn.yml 同层,
|
||
# env_file 相对路径即此处),逐项填值。矿来源 = services/packages 源码 process.env
|
||
# 全量审计(测试专用的 ADMIN_* 仅 seed 用;IT_USERS/EMBED_POLL_* 为开发/前端项不列)。
|
||
# 【安全】本文件只放占位符;真实文件不入 git、不进镜像(.dockerignore 拦截)。
|
||
|
||
# ── 数据库 / 缓存(1Panel 既有容器,见 infra/deploy/README-1Panel.md §2/§3)──
|
||
# host 用 1Panel 容器名(compose 挂 1panel-network)或宿主机 IP。
|
||
# 库 photo_cn:utf8mb4;库级校对 utf8mb4_0900_bin(MySQL ≥8.0.30,低版本回退
|
||
# utf8mb4_bin,见 D12——docs/plans/2026-09-17-P1a-后端核心链路.md)。账号/token
|
||
# 大小写敏感语义依赖它,勿改 _ci。connection_limit=10 是应用侧池上限约定。
|
||
DATABASE_URL_CN=mysql://photo:CHANGE_ME@1Panel-mysql-容器名或IP:3306/photo_cn?connection_limit=10
|
||
REDIS_URL_CN=redis://1Panel-redis-容器名或IP:6379
|
||
# sync 进程双库直连:cn 侧容器还要能网络可达 ov 库(跨地域公网 + 白名单 cn 服务器
|
||
# 出口 IP;生产建议 MySQL SSL 或隧道,P5 G 关口实测定案)。sync 进程(compose 服务
|
||
# sync)读取;api-cn/worker 不读此键。
|
||
DATABASE_URL_OV=mysql://photo_ov:CHANGE_ME@OV服务器IP:3306/photo_ov?connection_limit=10
|
||
|
||
# ── 对象存储(真实阿里云 OSS 私有桶,P5/G1 冒烟脚本验证后填)──
|
||
# endpoint 用「外网 Endpoint」(api-cn 服务器上传;worker 处理读原文件)。
|
||
# bucket 私有读写:一切访问走 SigV4 现签 URL(SIGNED_URL_TTL_SECONDS)。
|
||
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(viewer 图片)/ PUT(上传)凭证有效期秒(uploads/support.ts)。
|
||
SIGNED_URL_TTL_SECONDS=900
|
||
# 单文件上传上限字节(uploads/support.ts;50MB 与契约 UPLOAD_MAX_BYTES 建议值一致)。
|
||
UPLOAD_MAX_BYTES=52428800
|
||
|
||
# ── 会话 / 域名 / 网络 ──
|
||
# 会话 TTL 秒(auth.service;30 天 = 2592000)。
|
||
AUTH_SESSION_TTL_SECONDS=2592000
|
||
# CORS 放行 origin 逗号清单(configure-app.ts)。生产 = viewer/admin 的 https 域名
|
||
# 两形(有无 www);admin 与 viewer 同域走网关同源时可省。示例:
|
||
# CORS_ORIGINS=https://photo.example.cn,https://www.photo.example.cn
|
||
CORS_ORIGINS=https://CHANGE_ME_cn域名
|
||
# api-cn 容器内监听端口(main-cn.ts;compose 内固定 8080,健康检查同端口)。
|
||
PORT=8080
|
||
|
||
# ── 同步(cn→ov outbox + 对账 + 统计回传;服务间 HMAC 密钥两端一致)──
|
||
# SYNC_INTERNAL_KEY:x-sync-signature 的 HMAC-SHA256 密钥(internal-sync.ts)。
|
||
# 强随机 ≥32 字节:openssl rand -hex 32 生成;cn 的 sync 进程与 ov 的 api-ov
|
||
# (inbox + emergency 通道)必须同值。泄漏 = 可注入内容/紧急停用,妥善保管。
|
||
SYNC_INTERNAL_KEY=CHANGE_ME_openssl_rand_hex_32
|
||
# sync 进程两翼 API 基址(不含路径;容器名/域名均可,走 https 时 OV_API_URL 用域名)。
|
||
CN_API_URL=http://api-cn:8080
|
||
OV_API_URL=https://CHANGE_ME_ov域名
|
||
# 节奏参数(D11 建议初值,P5 实测冻结):批 100 条 / 推送 2s / 对账 5min / 回传 60s。
|
||
SYNC_BATCH_SIZE=100
|
||
SYNC_PUSH_INTERVAL_MS=2000
|
||
SYNC_RECONCILE_INTERVAL_MS=300000
|
||
STAT_RETURN_INTERVAL_MS=60000
|
||
|
||
# ── 用户源同步(user-sync 调度,仅 cn 装配;缺省见注释)──
|
||
# 定时同步间隔毫秒(缺省 300000=5min;user-sync.service.ts)。
|
||
SYNC_USERS_INTERVAL_MS=300000
|
||
# 每 N 批强制全量对账(游标复位;缺省 10)。
|
||
RECONCILE_EVERY_N_RUNS=10
|
||
|
||
# ── 首次部署引导(seed-admin 角色;seed-admin.ts 读,生产可移除)──
|
||
ADMIN_ACCOUNT=admin
|
||
ADMIN_PASSWORD=CHANGE_ME_强密码
|
||
|
||
# ── 日志 ──
|
||
# pino 级别(logger-options/worker/sync;生产建议 info,排障临时 debug)。
|
||
LOG_LEVEL=info
|