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>
58 lines
2.2 KiB
Bash
58 lines
2.2 KiB
Bash
#!/bin/sh
|
||
# docker/entrypoint.sh —— photo-live-server 单镜像多角色入口(P5-prep Task 1)。
|
||
# 用法:docker run photo-live-server[:tag] <role> [args]
|
||
# api-cn node services/api/dist/main-cn.js(国内 API:写路径 + 公开读)
|
||
# api-ov node services/api/dist/main-ov.js(海外 API:副本读 + 互动 + inbox)
|
||
# worker node services/worker/dist/main.js(sharp 变体流水线 + 发布事务)
|
||
# sync node services/sync/dist/main.js(outbox 发送 + 对账 + 统计回传,双库直连)
|
||
# migrate-deploy prisma migrate deploy(区域参数见下;一次性 docker run --rm 使用)
|
||
# seed-admin 首次部署引导:写入/确认 admin 账号(ADMIN_ACCOUNT/ADMIN_PASSWORD env)
|
||
# migrate-deploy 区域定位(cn 库 / ov 库是两份独立 schema,各自迁移):
|
||
# migrate-deploy cn | ov | all —— 显式参数优先,缺省读 MIGRATE_REGION env,再缺省 all。
|
||
# cn 侧服务器通常只需 cn;但 cn 侧 sync 进程直连 ov 库,ov 库迁移由 ov 侧执行——
|
||
# all 仅供演练环境(单机双库仿真)使用。
|
||
set -e
|
||
|
||
ROLE="${1:-api-cn}"
|
||
if [ "$#" -gt 0 ]; then shift; fi
|
||
|
||
case "$ROLE" in
|
||
api-cn)
|
||
exec node services/api/dist/main-cn.js
|
||
;;
|
||
api-ov)
|
||
exec node services/api/dist/main-ov.js
|
||
;;
|
||
worker)
|
||
exec node services/worker/dist/main.js
|
||
;;
|
||
sync)
|
||
exec node services/sync/dist/main.js
|
||
;;
|
||
seed-admin)
|
||
exec node services/api/dist/scripts/seed-admin.js
|
||
;;
|
||
migrate-deploy)
|
||
REGION="${1:-${MIGRATE_REGION:-all}}"
|
||
echo "[entrypoint] migrate-deploy region=${REGION}"
|
||
case "$REGION" in
|
||
cn|all)
|
||
echo "[entrypoint] prisma migrate deploy (db-cn: DATABASE_URL_CN)"
|
||
prisma migrate deploy --schema=packages/db-cn/prisma/schema.prisma
|
||
;;
|
||
esac
|
||
case "$REGION" in
|
||
ov|all)
|
||
echo "[entrypoint] prisma migrate deploy (db-ov: DATABASE_URL_OV)"
|
||
prisma migrate deploy --schema=packages/db-ov/prisma/schema.prisma
|
||
;;
|
||
esac
|
||
echo "[entrypoint] migrate-deploy done."
|
||
;;
|
||
*)
|
||
echo "[entrypoint] unknown role: $ROLE" >&2
|
||
echo "usage: entrypoint.sh {api-cn|api-ov|worker|sync|migrate-deploy [cn|ov|all]|seed-admin}" >&2
|
||
exit 64
|
||
;;
|
||
esac
|