配置
全部配置走环境变量——没有配置表。约定、关键变量与套餐目录。
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。服务端密钥永远不进移动端。