登入

部署

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;只有原生依賴變化時才需要重新出原生包。