环境变量
基于 .env.local.example 的模块化配置指南(按步骤完成)。
本页与 .env.local.example 保持一致,按模块一步一步配置。每一步都附带对应站内文档跳转,便于你在需要时深入查看细节。
配置顺序建议
建议按本页顺序执行:先完成基础连接、认证与 MUSE_SETTINGS_SECRET,再接入邮件。支付网关和 S3 凭证在后台运行时设置里填写,不写进环境变量。
启动校验
服务端环境变量会在启动时校验:src/lib/env.ts 经 src/instrumentation.ts 的 register() 调用执行。在生产运行时,缺少 BETTER_AUTH_SECRET 或 MUSE_SETTINGS_SECRET 会在启动时直接抛错,让部署快速失败(next build 与本地 dev 不受影响)。以下情况只记录非致命警告:DATABASE_CONNECTION_STRATEGY=database_url_first 但未设 DATABASE_URL、MAIL_PROVIDER=resend 但未设 RESEND_API_KEY。支付与存储凭证不在环境变量里——在 /app/admin/settings 配置。见 运行时设置。
模块配置流程
站点与数据库模块
NEXT_PUBLIC_SITE_URL="http://localhost:3000"
DATABASE_CONNECTION_STRATEGY="database_url_first"
DATABASE_URL="postgres://..."相关文档:
认证与 OAuth 模块
BETTER_AUTH_SECRET="replace-with-strong-random-secret"
MUSE_SETTINGS_SECRET="replace-with-another-strong-random-secret"
GITHUB_CLIENT_ID="..."
GITHUB_CLIENT_SECRET="..."
GOOGLE_CLIENT_ID="..."
GOOGLE_CLIENT_SECRET="..."
NEXT_PUBLIC_GOOGLE_ONE_TAP_CLIENT_ID="..."提示
BETTER_AUTH_SECRET 与 MUSE_SETTINGS_SECRET 必须替换为高强度随机值(后者至少 32 个字符);不要复用 .env.local.example 中的示例值。MUSE_SETTINGS_SECRET 用于加密后台支付与存储设置,绝不入库。
better-auth 官方提供了在线生成以及本地 bash 脚本生成两种方式:
相关文档:
人机校验模块(Turnstile / CAPTCHA)
NEXT_PUBLIC_TURNSTILE_SITE_KEY="..."
CAPTCHA_SECRET_KEY="..."说明:
NEXT_PUBLIC_*变量会暴露到浏览器,仅放可公开值。- 服务端校验密钥只放在非公开变量中。
相关文档:
计费模块(Creem / Stripe / Dodo / Waffo)
网关 API Key、webhook secret、默认网关和结账产品 ID 在后台 运行时设置(/app/admin/settings)配置,运行时不读环境变量。公开定价页使用代码里的稳定套餐 ID(pro_monthly / pro_yearly / lifetime),不依赖环境变量。
相关文档:
网关细节:
存储模块(S3 / R2)
S3 凭证与头像 bucket 在 /app/admin/settings 配置,运行时不读环境变量。
客户端拼接头像 URL 仍需要环境变量(浏览器读不到数据库):
NEXT_PUBLIC_AVATARS_PROXY_URL="https://static.example.com"相关文档:
上线前核查
发布前必须确认
不要将任何真实密钥提交到仓库。.env.local.example 只保留模板值。
生产环境已设置独立的 BETTER_AUTH_SECRET 与 MUSE_SETTINGS_SECRET(后者至少 32 个字符),不要复用示例值。
所有占位值(YOUR_* / xxx)已替换为真实配置。
本地、测试、生产环境变量分离管理,不共用密钥。
新增环境变量时,同步更新 .env.local.example 与本文档。