登入

配置

全部配置走環境變數——沒有配置表。約定、關鍵變數與套餐目錄。

zmlkit 的所有配置都在環境變數裡——資料庫中不存任何配置。好處是可審計、多環境一致、例項間不會漂移;代價是改配置需要重新部署(或重啟 dev)。

完整參考見 docs/env/web.env.example(web)與 docs/env/mobile.env.example(mobile)。啟動時用 Zod 校驗 env,非法值直接快速失敗。

按 App 的配置約定

zmlkit 是多 App 架構:一套部署可以服務多個產品,按 app_id 隔離。配置遵循同樣的劃分:

  • 全域性變數用普通名字:OPENROUTER_API_KEY、STORAGE_BUCKET、RESEND_API_KEY。
  • 按 App 變數用 APP_<SLUG>_<NAME>,<SLUG> 是 app slug 大寫並把 - 換成 _。App app_a → APP_APP_A_STRIPE_SECRET_KEY。
  • 按 App 的值覆蓋全域性預設;不設則回落到全域性。
  • App 列表在 ENABLED_APPS(逗號分隔的 slug),且必須存在於 app 表(由 seed 建立)。

關鍵變數

  • AUTH_SECRET —— 會話/令牌簽名。用 openssl rand -base64 32 生成。必填。
  • DATABASE_URL / DATABASE_PROVIDER —— Postgres(預設)、MySQL,或本地開發用 SQLite。
  • API_BASE_URL / WEB_BASE_URL —— 絕對 URL,用於 OAuth 回撥、webhook 與 SEO(canonical/sitemap)。
  • OPENROUTER_API_KEY / KIE_API_KEY —— AI provider(全域性或按 App)。
  • WAFFO_MERCHANT_ID / WAFFO_PRIVATE_KEY —— Waffo Pancake 支付憑證,也可按 App 設定 APP_<SLUG>_WAFFO_*;WAFFO_ENVIRONMENT=test|prod 指定環境。
  • APP_<SLUG>_GOOGLE_CLIENT_ID / _SECRET(GitHub 同理)—— OAuth,按 App。
  • STORAGE_* —— S3/Cloudflare R2 桶、金鑰、endpoint、簽名 URL 有效期。
  • REDIS_URL —— 可選;啟用跨例項的分散式限流。
  • SENTRY_DSN / NEXT_PUBLIC_SENTRY_DSN —— 可選監控。

最小可啟動集:AUTH_SECRET + DATABASE_URL。每項能力(AI、支付、儲存、郵件、OAuth)只有在其金鑰存在時才啟用,可以按需逐步補齊。

不放 env 的部分:套餐目錄

產品目錄資料——套餐、價格、積分、Stripe price id、Waffo Pancake product id——是程式碼:packages/core-domain/src/plans.ts。強型別、進版本庫、web 和 mobile 共用。Waffo 商品 ID 也可透過 WAFFO_PRODUCT_IDS 按套餐代碼設定。

{ code: 'pro_monthly', kind: 'subscription', interval: 'month',
  amount: 1900, currency: 'usd', credits: 3000, creditsValidDays: 31,
  providerRefs: {
    stripe: { priceId: 'price_...' },
    waffo:  { productId: 'PROD_...' },
  } }

只有金鑰(API key、webhook 簽名金鑰)才進 env。

移動端配置

mobile/.env 只放公開的 EXPO_PUBLIC_* 值——API 基址、RevenueCat 公鑰、原生 OAuth client id。服務端金鑰永遠不進移動端。