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