应用配置
深入理解 src/config/index.ts:每个配置项的作用、影响范围与改动建议。
src/config/index.ts 是 MuseMVP 的运行时总配置入口,集中管理 i18n、认证行为、页面开关、存储、支付、AI 与统计。
如果你要“改产品行为”,通常第一站就是这个文件。
本页关注点
本页只讲 src/config/index.ts 的代码级配置。涉及密钥和环境变量(例如数据库、OAuth、支付网关 API Key),请看 /docs/quick-build/environment-variables。
配置指南
i18n:国际化
关键字段:
i18n.enabledi18n.locales.en|zh(appName/summary/description/keywords/docsAlias/headerMenuMap/footerConfig)i18n.defaultLocalei18n.defaultCurrencyi18n.localePrefixi18n.localeCookieName
实际影响:
docsAlias用于文档页面标题后缀(例如xxx | 文档)。headerMenuMap会被导航和自定义路由复用。localePrefix会影响 next-intl 路由行为与 docs source 的语言隐藏策略。
改文案时的建议
en 和 zh 同步修改,避免导航与页脚双语不一致。
users:新用户注册引导页以及计费总开关
关键字段:
users.enableSetup
当前行为:
enableSetup=true:新注册用户(未完成 onboarding 的登录用户)会被引导到引导页/setup。
auth:注册方式与会话生命周期
关键字段:
auth.gates.allowRegisterauth.gates.allowSocialSignInauth.gates.allowPasswordSignInauth.gates.allowTwoFactorAuthauth.lifecycle.redirectAfterLoginauth.lifecycle.redirectAfterSignOutauth.lifecycle.redirectWhenSessionExpiredauth.lifecycle.sessionTtlSeconds
行为要点:
allowRegister=false时,/auth/register会重定向到/auth/login。allowPasswordSignIn和allowSocialSignIn主要控制前端入口显示。allowTwoFactorAuth主要控制设置页的 2FA 区块显示。sessionTtlSeconds会直接写入 Better-Auth 的session.expiresIn。
容易误解的点
allowTwoFactorAuth 不是后端插件总开关。2FA 插件仍会注册,它主要影响前端是否暴露入口。
mails:邮件发件人和品牌 Logo
关键字段:
mails.frommails.links.logo
行为要点:
mails.from如果只写邮箱地址,会在发送时自动组装为"AppName" <email@...>格式。mails.links.logo用于邮件模板中的LOGO,默认使用项目根目录下的public/icon.png,你也可以使用自定义访问速度更快的图片的外链。
ui:主题、页面开关、导航与页脚
ui 是改动频率最高的一段,建议分块理解。
ui: {
enabledThemes: ["light", "dark"],
defaultTheme: "dark",
saas: { enabled: true, useSidebarLayout: true, cookieInfo: { showBox: true } },
features: { enabled: true },
docs: { enabled: true },
legal: {
enabled: true,
allowMap: [
{ type: "privacy", enabled: true },
{ type: "terms", enabled: true },
{ type: "behavior", enabled: false },
],
},
changelog: { enabled: true },
blog: { enabled: true },
contactForm: {
enabled: true,
to: "support@musemvp.com",
subject: "MuseMVP contact form message",
},
}行为要点:
ui.saas.enabled=false会关闭 auth 区域和 saas 区域入口(相关 layout 会直接重定向到首页)。ui.docs/blog/changelog/contactForm/features会同时影响导航显示与对应页面访问。ui.legal.enabled控制 legal 页面总开关;allowMap主要影响页脚/认证页的法律链接展示。customRoutes为enabled && !external的项目会自动进入 sitemap。customRoutes的最终标题优先取headerMenuMap[path],其次label。footerConfig.socialIcon.github.href还会被文档页用于生成 GitHub 源码链接。
两个常见坑
allowMap 不是 legal 页面路由白名单;它主要影响链接展示。
另外 ui.docs.enabled=false 时,当前 sitemap 实现仍会生成 docs URL,如需严格一致请同步调整 src/app/sitemap.ts。
storage:Cloudflare R2
关键字段:
storage.meta.S3_ACCESS_KEY_IDstorage.meta.S3_SECRET_ACCESS_KEYstorage.meta.S3_ENDPOINTstorage.meta.S3_REGION(默认auto)storage.bucketNames.avatars(默认musemvp-com)storage.proxyUrls.avatarsFile
行为要点:
- 上传接口会检查
S3_ACCESS_KEY_ID / S3_SECRET_ACCESS_KEY / S3_ENDPOINT,缺失会返回错误。 NEXT_PUBLIC_AVATARS_PROXY_URL会去掉末尾/再参与拼接。avatars桶名不配时会回退到默认值musemvp-com。
ai:聊天模型选择
关键字段:
ai.enabledai.chatModel
行为要点:
ai.enabled=false时,会隐藏账号后台中的 AI Chat 导航项,/app/aichat重定向到/app,并让/api/aichat/**返回404。- 后端 AI Chat 路由直接读取
config.ai.chatModel作为MODEL_ID,默认模型gemini-3-pro-preview。 - 更换模型通常只需改这一处(前提是对应 provider key 已配置)。
payments:计费总开关与产品目录映射
关键字段:
payments.enableBillingpayments.enableFreepayments.enableEnterprisepayments.productCatalog
productCatalog 的 productId 读取优先级(以月付 Pro 为例):
NEXT_PUBLIC_MUSE_PRICE_PRO_MONTHLY_ID
-> NEXT_PUBLIC_MUSE_CREEM_PRICE_PRO_MONTHLY_ID
-> NEXT_PUBLIC_MUSE_STRIPE_PRICE_PRO_MONTHLY_ID
-> ""行为要点:
productCatalog.*.gatewayProductIds会在发起 checkout 时使用;缺失会直接报错。pricing-desc-usage.ts里只有productId非空的价格项才会进入套餐展示。pricing-desc-usage.ts还支持可选字段originalAmount,用于展示划线原价;它只影响定价 UI,实际结算仍使用amount。enableBilling=false会关闭定价入口与相关计费流程分支。
重要边界
网关默认选择(MUSE_BILLING_DEFAULT_GATEWAY)和网关 API Key 在环境变量里,不在 config/index.ts。
analytics:统计脚本注入
关键字段:
analytics.googleAnalyticsIdanalytics.baiduTongjiId
行为要点:
- 统计脚本只在非 development 环境注入。
- ID 为空时对应脚本不会渲染。
修改后验证清单
pnpm type-check
pnpm buildHeader / Footer 文案是否在 en 与 zh 下都正常显示。
docs/blog/legal/changelog/contact/features 的可见性是否符合开关预期。
若 ai.enabled=false,确认 AI Chat 已从侧边栏和个人菜单中隐藏,/app/aichat 会重定向,且 /api/aichat/** 不可访问。
登录、注册、退出后的跳转是否符合 auth.lifecycle 配置。
定价页是否只展示已配置 productId 的套餐项。
如果配置了 originalAmount,确认定价卡片会显示划线原价,同时 checkout 仍按 amount 发起结算。
上传头像与资源访问是否符合 storage 配置(桶名/代理地址)。