登录

配置

全部配置走环境变量——没有配置表。约定、关键变量与套餐目录。

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。服务端密钥永远不进移动端。