配置
全部配置走環境變數——沒有配置表。約定、關鍵變數與套餐目錄。
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 大寫並把-換成_。Appapp_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。服務端金鑰永遠不進移動端。