返回更新日志
里程碑

运行时设置:支付与存储凭证加密入库

支付与 S3 凭证离开环境变量,加密写入数据库。生产环境必须设置 MUSE_SETTINGS_SECRET。结账使用稳定套餐 ID,后台支付页把每个网关的产品 ID 收进对应服务商面板。

对已有 fork 这是一次破坏性配置变更:网关密钥和 S3 凭证运行时不再从环境变量读取。

为什么改模板

  • 支付和存储密钥以前和邮件、OAuth 一起放在 .env 里。轮换密钥就要重建部署,把启动必需的配置和日常运维混在了一起。
  • 运行时对支付和 S3 只读 app_setting 表。把本地残留值导入之后,没有环境变量回退。

你必须设置的项

  • 增加 MUSE_SETTINGS_SECRET(至少 32 个字符)。它用 HKDF-SHA256 + AES-256-GCM 包装加密设置,绝不入库。生产运行时缺少它会在启动时直接失败。
  • 执行迁移 0001_dry_terror.sql,确保存在 app_settingapp_setting_revisionpnpm drizzle:migrate)。
  • 创建管理员后打开 后台 → 运行时设置/app/admin/settings)。保存网关凭证、结账产品 ID 和 S3 设置。上线前先点 测试连接
  • 可选一次性操作:pnpm muse:settings:import 把本地残留的网关/存储凭证写入数据库。之后运行时不再读取这些 env。结账产品 ID 在后台填写,不走环境变量。

计费与结账

  • 公开定价页仍使用稳定套餐 ID(pro_monthlypro_yearlylifetime)。支付商产品 ID 存在 billing.productMap
  • Direct checkout 模式已移除。付费套餐一律通过 Muse Billing,走后台保存的默认网关(Creem、Stripe、Dodo 或 Waffo)。
  • 后台支付页顶部是默认网关卡片。每个服务商默认收起;展开后在同一面板填写凭证和该网关的产品 ID。标题右侧会显示「默认」「已配置 / 未配置」、已映射产品 ID 数量,以及未保存时的「未保存」。

存储与部署

  • S3 access key、secret、endpoint 和头像 bucket 都在后台设置。NEXT_PUBLIC_AVATARS_PROXY_URL 仍留在环境变量,因为浏览器要靠它拼接头像 URL。
  • Docker、Vercel、Cloudflare Workers 和 EdgeOne 的生产环境变量清单现在都要求 MUSE_SETTINGS_SECRET,不再把网关或 S3 密钥当作环境变量。