Skip to content

部署迁移:pm2 → Docker Compose 全栈 + Cloudflare Tunnel 对外暴露 - #1

Open
AdingApkgg wants to merge 4 commits into
mainfrom
claude/naughty-meninsky-471e83
Open

部署迁移:pm2 → Docker Compose 全栈 + Cloudflare Tunnel 对外暴露#1
AdingApkgg wants to merge 4 commits into
mainfrom
claude/naughty-meninsky-471e83

Conversation

@AdingApkgg

Copy link
Copy Markdown
Owner

概述

把部署从 pm2 + 宿主机 PostgreSQL/Redis + rathole 公网机 整体迁移到 Docker Compose 全栈容器化,对外暴露改用 Cloudflare Tunnel。基于 main 的 nub 迁移 + 播放器重构合并而来,工具链全部对齐到 nub。

主要变更

容器编排(compose.yaml)

  • app + postgres + redis 全收进 compose;新增一次性 migrate 服务(nub run db:deploy = prisma db push,幂等)做建表/对齐 schema
  • 依赖编排:postgres/redis 健康 → migrate 完成 → app 健康 → cloudflared 接入
  • pg/redis 不再向宿主机暴露端口;app 仅绑 loopback 供调试

对外暴露:rathole → Cloudflare Tunnel

  • 新增 cloudflared 服务(默认启动),无需公网机 / nginx / certbot / 入站端口,TLS·HTTP3·CDN 交给 CF 边缘
  • rathole 客户端降级到 --profile rathole,保留备用(含公网机 nginx/rathole-server 配置与切回步骤)

清理

  • 移除 pm2(ecosystem.config.cjs、pm2 脚本)与应用层 systemd 依赖

让 nub Docker 构建在干净环境通过

  • next.config.tsoutput: "standalone";新增 .dockerignore/api/health 探针
  • 基础镜像 node:22-slim(glibc):Next 的 SWC 是 gnu 二进制,alpine(musl) 下缺符号 __register_atfork 无法加载
  • 新增 .npmrc trustPolicyExclude=next-auth:放行 next-auth beta(无 provenance attestation),否则 nub citrustPolicy=no-downgrade 失败
  • 构建期查库兜底:tag/[slug]generateStaticParams 加 try/catch、tagsforce-dynamic(避免 next build 静态生成时连占位 DATABASE_URL 失败)

文档

  • README / deploy/README 重写为 CF 隧道为主,含控制台配置、历史数据无损迁移 runbook、切回 rathole 方式

验证

  • docker compose config + profile 门控正确(默认起 app/cloudflared/migrate/postgres/redis;--profile rathole 才出 rathole)
  • docker build app(runner) 与 migrate(migrator) 均成功:nub ci 通过、next build 编译通过、49 个静态页生成无报错
  • ✅ 运行时冒烟:app 容器 ✓ Ready in 55ms/api/health → {"status":"ok"}

部署须知

  • .npmrc 是新增的供应链信任豁免(仅 next-auth),属已知误报;要更严可改 next-auth@<具体版本>
  • 起栈前 .env 需填 POSTGRES_PASSWORD(ASCII 强密码)、AUTH_SECRET(迁移老数据填原值)、CLOUDFLARE_TUNNEL_TOKEN
  • CF 控制台 Public Hostname 配 <域名> → http://app:1270(用 compose 服务名 app,非 127.0.0.1)

🤖 Generated with Claude Code

AdingApkgg and others added 4 commits June 27, 2026 08:49
- 移除 pm2,应用进程交给 compose 管理
- compose 收编 app/postgres/redis + 一次性 migrate 建表服务
- 对外暴露用 cloudflared(默认),rathole 降级为 --profile rathole 备用
- next standalone 产物、.dockerignore、/api/health 探针
- 文档:CF 隧道配置 + 历史数据无损迁移步骤

注:本提交基于 pnpm,随后会与 main 的 nub 迁移合并并对齐到 nub。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
# Conflicts:
#	Dockerfile
#	README.md
#	deploy/README.md
#	package.json
- 基础镜像 alpine→node:22-slim(glibc):Next SWC 是 gnu 二进制,
  musl 下缺符号(__register_atfork)无法加载
- 新增 .npmrc 带 trustPolicyExclude=next-auth:放行 next-auth beta
  (无 provenance attestation),否则 nub ci 因 trustPolicy=no-downgrade 失败
- deps 阶段 COPY .npmrc 供 nub ci 读取;runner 改用 groupadd/useradd(debian)
- 构建期查库兜底:tag/[slug] generateStaticParams 加 try/catch、
  tags 页 force-dynamic,避免 next build 静态生成时连占位 DATABASE_URL 失败

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- compose 的 cloudflared 加 profiles:["cloudflared"],默认不启动
  (rathole 之前已是 profile);默认栈只有 app+pg+redis+migrate
- 推荐用宿主机共享 cloudflared 管隧道,回源 http://localhost:1270
  (compose 已把 app 发布到 127.0.0.1:1270)
- app:1270 仅在 --profile cloudflared(隧道也在 compose 内)时使用
- README/deploy 文档同步更新,并说明 app:1270 vs localhost:1270 的坑

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant