登录

部署

Web 支持 Vercel、自托管 Docker 或 Cloudflare Workers;移动端用 EAS 构建。

Web 应用开箱支持三个部署目标,任选其一——之后切换也不需要改代码。

Vercel(默认)

  1. 连接仓库,项目 Root 指向 web/。
  2. 安装命令 pnpm install,构建命令 pnpm --filter web build。
  3. 按 docs/env/web.env.example 配置环境变量(含各 App 的 APP_<SLUG>_*),Preview/Production 分开设置。
  4. 在 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;只有原生依赖变化时才需要重新出原生包。