MuseMVP 文档
快速构建

环境变量

基于 .env.local.example 的模块化配置指南(按步骤完成)。

本页与 .env.local.example 保持一致,按模块一步一步配置。每一步都附带对应站内文档跳转,便于你在需要时深入查看细节。

配置顺序建议

建议按本页顺序执行:先完成基础连接、认证与 MUSE_SETTINGS_SECRET,再接入邮件。支付网关和 S3 凭证在后台运行时设置里填写,不写进环境变量。

启动校验

服务端环境变量会在启动时校验:src/lib/env.tssrc/instrumentation.tsregister() 调用执行。在生产运行时,缺少 BETTER_AUTH_SECRETMUSE_SETTINGS_SECRET 会在启动时直接抛错,让部署快速失败(next build 与本地 dev 不受影响)。以下情况只记录非致命警告:DATABASE_CONNECTION_STRATEGY=database_url_first 但未设 DATABASE_URLMAIL_PROVIDER=resend 但未设 RESEND_API_KEY。支付与存储凭证不在环境变量里——在 /app/admin/settings 配置。见 运行时设置

.env.local.example

模块配置流程

站点与数据库模块

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_SECRETMUSE_SETTINGS_SECRET 必须替换为高强度随机值(后者至少 32 个字符);不要复用 .env.local.example 中的示例值。MUSE_SETTINGS_SECRET 用于加密后台支付与存储设置,绝不入库。

better-auth 官方提供了在线生成以及本地 bash 脚本生成两种方式:

相关文档:

人机校验模块(Turnstile / CAPTCHA)

NEXT_PUBLIC_TURNSTILE_SITE_KEY="..."
CAPTCHA_SECRET_KEY="..."

说明:

  • NEXT_PUBLIC_* 变量会暴露到浏览器,仅放可公开值。
  • 服务端校验密钥只放在非公开变量中。

相关文档:

邮件模块(Resend)

RESEND_API_KEY="re_xxx"

校验点:

  • 注册/验证邮件可发送
  • 发件域名已验证

相关文档:

计费模块(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_SECRETMUSE_SETTINGS_SECRET(后者至少 32 个字符),不要复用示例值。

所有占位值(YOUR_* / xxx)已替换为真实配置。

本地、测试、生产环境变量分离管理,不共用密钥。

新增环境变量时,同步更新 .env.local.example 与本文档。

On this page