部署
Web 支持 Vercel、自托管 Docker 或 Cloudflare Workers;移动端用 EAS 构建。
Web 应用开箱支持三个部署目标,任选其一——之后切换也不需要改代码。
Vercel(默认)
- 连接仓库,项目 Root 指向
web/。 - 安装命令
pnpm install,构建命令pnpm --filter web build。 - 按
docs/env/web.env.example配置环境变量(含各 App 的APP_<SLUG>_*),Preview/Production 分开设置。 - 在 CI 中先跑数据库迁移再切流量(
pnpm --filter web db:migrate)。
Docker(自托管)
自带生产级多阶段 web/Dockerfile(deps → build → runner,Next standalone 输出,非 root 运行)。从 monorepo 根构建:
docker build -f web/Dockerfile -t zmlkit-web .
docker run --env-file web/.env.production -p 3000:3000 zmlkit-web- 构建期不需要真实密钥——占位 env 已内置,真实配置全部运行期注入。
- 前置一个反向代理(Caddy/Nginx/Traefik)负责 TLS。
Cloudflare Workers(OpenNext)
模板通过 OpenNext 适配器运行在 Workers 上——对运行时敏感的部分(密码哈希、图片处理、中间件)已做好 Workers 兼容:
cd web
cp wrangler.toml.example wrangler.toml # gitignored,填入你的账号信息
pnpm cf:build # 打包
pnpm cf:preview # 本地 workerd 预览(建议在 Linux/WSL 跑)
pnpm cf:deploy # 部署要点:
- 需要
compatibility_date >= 2025-09-01与nodejs_compat。 - 数据库用可公网 TCP 访问的托管库(Neon、Supabase、PlanetScale),建议经 Hyperdrive。
- 本地密钥放
web/.dev.vars,生产密钥用wrangler secret put。 - Workers 上不要设
REDIS_URL与SENTRY_DSN;设AI_RECONCILE_INTERVAL_MS=0,异步 AI 收尾走「厂商 webhook + 定时器调/api/ai/cron」。
Webhook 注册
部署完成后,在各支付/AI 厂商后台按 App 注册 webhook:
- Stripe / Waffo Pancake:
https://<domain>/api/billing/webhooks/{provider}/{appSlug} - Kie(异步 AI):
https://<domain>/api/ai/webhooks/kie/{appSlug}
签名密钥填入对应的 APP_<SLUG>_*_WEBHOOK_SECRET 环境变量。
移动端(EAS)
Expo 应用用 EAS profile 构建(mobile/eas.json):development(dev client)、preview、production。把 EXPO_PUBLIC_API_BASE_URL 指向已部署的 Web 地址。OTA 更新走 EAS Update;只有原生依赖变化时才需要重新出原生包。