---
url: /docs/agentbuff-stack/website.md
---
# 网站配置

**唯一入口：`packages/core/website.ts`**，类型为 `WebsiteConfig`。这里没有服务密钥，不读取 `process.env`，可安全用于 Astro、React 和 API。兼容的 `site` 对象由它派生。

## 配置结构

```ts
export const websiteConfig: WebsiteConfig = {
  metadata: {/* 品牌、文案、语言、联系邮箱、OG 图片、社交链接 */},
  brand: {
    mark: "✳",
    logo: { light: null, dark: null },
    favicon: "/brand/favicon.svg",
    touchIcon: null,
    emailLogo: null,
  },
  i18n: {
    locales: ["en", "zh"],
    translations: { zh: {/* 完整中文产品文案 */}, es: null },
  },
  ui: { defaultMode: "system", enableSwitch: true },
  auth: { password: true, emailOtp: true, passkey: true },
  blog: { enabled: true, homePosts: 2, relatedPosts: 3 },
  notifications: {
    taskEmail: false,
    preferenceVersion: "2026-10-11",
    retentionDays: 30,
    operator: { enabled: false, since: null },
  },
  analytics: {
    provider: "none",
    toolEvents: {
      enabled: false,
      consentVersion: "2026-10-10",
      retentionDays: 30,
    },
    serverEvents: {
      enabled: false,
      consentVersion: "2026-10-10.2",
      retentionDays: 30,
    },
  },
  marketing: {
    newsletter: false,
    waitlist: false,
    contactsSync: false,
    consentVersion: "2026-10-10",
    confirmationHours: 24,
    resendMinutes: 15,
  },
  payment: { provider: "stripe", enabled: true, trialDays: 14 },
  support: { provider: "crisp", enabled: false, websiteId: null },
  affiliates: {
    provider: "rewardful",
    enabled: false,
    campaignId: null,
    stripeAccountId: null,
    tracking: { enabled: false, publicKey: null },
  },
  credits: { signupCredits: 20 },
  history: { maxSavedRuns: 100 },
  storage: {
    enabled: true,
    maxFileBytes: 5 * 1024 * 1024,
    maxFiles: 25,
    maxTotalBytes: 50 * 1024 * 1024,
    retentionDays: 7,
    uploadsPerMinute: 10,
    readsPerMinute: 120,
  },
  plans: [/* free、starter、pro */],
};
```

上面的注释只说明结构，完整默认值以源码为准。账号、私有文件、任务与支付已有本地验收；营销订阅、联系人同步以及公开工具 / 工作台观测默认关闭。工作台观测包含实际任务、附件下载、积分包与个人订阅账单确认。团队付款观测已有独立选择、管理权限保护和去重恢复；AI 扩展、云资源和真实外部环境仍按计划验收，见[模块总览](./modules)。

## 品牌与元数据

| 字段 | 作用 |
| --- | --- |
| `metadata.id` | 小写站点 ID；认证 cookie 前缀。上线后修改会使原 cookie 不再被读取 |
| `metadata.name` | 网站标题、页头、邮件品牌、Passkey 名称；同步修改 Wrangler `APP_NAME` |
| `metadata.tagline` / `hero` / `description` | 默认标题、首页两行主标题和描述 |
| `metadata.language` | 默认语言保持 `en`；第二语言通过 `i18n` 启用，不直接更改此字段 |
| `metadata.supportEmail` | Contact 页联系方式；上线前填真实地址 |
| `support` | 默认 `{ provider: "crisp", enabled: false, websiteId: null }`；开启需公开 Website UUID 与真实支持邮箱，只在联系页主动加载，失败保留邮件回退，见[教程](./support-chat) |
| `metadata.ogImage` | `null` 或 `/brand/` 内 PNG / JPEG / WebP；静态分享元数据使用它，两个产品构建的 public 目录均须有文件 |
| `metadata.social` | `{ label, href }[]`；生成页脚公开链接，空数组不显示 |

公开域名放在 `PUBLIC_SITE_URL`，认证同源域名放在 `APP_ORIGIN`。本站三 Worker 以一个公共域名工作，两者应相同。新站工厂还会更换安装清单名称和 Worker 名称，并重置品牌素材、OG、联系方式与社交链接。`brand` 字段、图片目录、浅深主题和邮件限制见[品牌素材](./brand-assets)。

## 产品语言

`i18n.locales` 默认 `["en"]`；可开启 `["en", "es"]`，需要完整的 `i18n.translations.es` 元数据与计划说明。首页、功能与价格共用页面结构，真实译文放在产品字典；登录 / 注册 / 找回与重置、工作台首页、任务列表 / 详情、文件库、历史、积分 / 购买记录、成员 / 邀请 / 设置与管理后台已支持语言路径与认证回跳；公开工具列表、JSON / 文本完整交互与说明已支持双语，博客目录、两篇全文译文与分语言 RSS 已交付，账号验证 / 重置 / 验证码 / 邀请邮件已本地验收，任务邮件持久化语言已本地验收，营销确认邮件语言已本地验收，托管支付回站语言已本地验收。路径、语言切换、缺失译文与 SEO 规则见[产品语言](./languages)。

## 主题与登录

| 字段 | 默认 | 实际效果 |
| --- | --- | --- |
| `ui.defaultMode` | `system` | 没有已保存偏好时的默认主题；公共页与工作台预绘制脚本都读取它 |
| `ui.enableSwitch` | `true` | 显示 / 隐藏公共页、工作台和设置里的主题切换；不清除已有用户偏好 |
| `auth.password` | `true` | 同时控制密码登录 / 注册表单和服务端密码认证 |
| `auth.emailOtp` | `true` | 同时控制 OTP 入口和 Better Auth OTP 插件 |
| `auth.passkey` | `true` | 同时控制 Passkey 登录入口和服务端插件；需要已注册 Passkey 的账号 |

Google / GitHub 通过各自完整的服务端凭据启用。前端查询实际 provider 名称，不复制一份会漂移的 OAuth 开关。至少保留一种让新用户进入的方式；Passkey 本身不能替代首次注册。

## 内容与运营

| 字段 | 默认 | 实际效果 |
| --- | --- | --- |
| `blog.enabled` | `true` | 控制导航、页脚、首页文章、文章构建路径、RSS 内容和 sitemap；关闭后 `/blog` 索引页仍存在但 noindex 且无文章 |
| `blog.homePosts` | `2` | 首页展示文章数量；0 表示不展示文章卡片 |
| `blog.relatedPosts` | `3` | 文章页其他文章的数量；当前按日期排序，不做智能推荐 |
| `analytics.provider` | `none` | `cloudflare` 时公共页面插入 beacon；同时需要 `PUBLIC_CF_ANALYTICS_TOKEN` |
| `notifications` | 个人任务邮件、站主渠道分别默认关闭，保留 30 天 | 个人邮件需 0022 和验证邮箱选择；站主渠道需 0021、明确起点及服务端秘密地址。去重、有限尝试和失败列表，见[任务邮件](./task-notifications)与[站主通知](./operator-notifications) |
| `analytics.serverEvents` | 默认关闭，保留 30 天 | 个人选择授权任务 / 附件读取 / 积分包及个人账单，团队 owner / admin 单独选择授权团队账单；先升级至 0025 并重建 API / 工作台，见[教程](./server-activity-events) |
| `analytics.toolEvents` | 默认关闭，保留 30 天 | 公开工具明确选择后发送浏览器使用报告；与访问统计、账号和支付独立；先升级至 0017 并重建公共页 / API，见[教程](./tool-usage-events) |
| `affiliates` | Rewardful，默认关闭，计划 / 商户 ID 为空 | 签名回调、佣金 / 结算复核及登录后的个人 / 团队推荐绑定后端；需升级至 0033、两项私密凭据与原 Stripe 完整组。浏览器采集、明确选择与新购买首次结账冻结已受控本地验收；具体订单 / 佣金联查与管理员证据与带原因 / 审计的安全人工复核已受控本地验收；有界漏回调补查与进度 / 审计已受控本地验收；真实购买归因与付款待验，见[教程](./affiliates) |

公开导航集中在 `packages/core/navigation.ts`，公开页头、页脚与工作台共用；首页入口是 `Home`，博客入口是 `Blog`。英文博客来自 `apps/web/content/blog/*.md`，西班牙语同名译文在 `apps/web/content/blog/es/`，工具目录及处理器来自 `packages/core/tools.ts`，工具完整译文集中在 `packages/core/tool-locales.ts`，供公开页和工作台共用。主题变量来自 `packages/ui/design/tokens.css`，字体变更仍需同步资源和许可。

## 计划、积分和历史

`payment.enabled: false` 同时停用 Stripe 插件和计费可用性接口，已有账单记录不会被删除。为 true 但没有 Stripe 凭据时计费仍关闭；部分凭据会报配置错误。

`payment.trialDays` 控制 Pro 试用天数，0 不提供试用。当前计划固定为 `free`、`starter`、`pro`，对应现有账单与权限映射；增加新计划需要同步服务端映射和支付配置，不只增加卡片。

`plans` 中 `price` 是月度展示价格，`members` 是计划团队限额，`name` 和 `description` 是展示文案。Stripe 实际价格由服务端 Price ID 决定，离线检查不能核实报价是否一致。

Pro 年付选项由服务端 `STRIPE_PRO_ANNUAL_PRICE_ID` 启用，不从这里的月度展示价乘以 12 或推算折扣。设置页分别发送月付 / 年付选择，实际收费项在创建时核对，最终金额在 Checkout 确认；官网当前价格卡片继续展示上述月度价格。

`credits.signupCredits` 是积分账户首次初始化时的赠送额（整数 0—1,000,000），一人一次；已有账户不会因修改配置重领。`history.maxSavedRuns` 控制每用户保存上限，降低上限不删除现有数据，超过上限后需先删除再保存。

`creditPacks` 是一次性积分包目录，默认 `{ enabled: false, packs: [] }`。配置 SKU、名称、版本、整数金额、币种、积分和真实 Stripe Price ID；客户端目录不暴露 Price ID。必须配完整 Stripe 凭据和独立积分回调，并完整迁移至 0024、重建工作台 / API 后才能启用；退款 / 争议对账已本地验收，真实沙箱仍待验收，字段及流程见[支付教程](./billing-tasks)。新站生成器清空目录，需为新站重新配置。

## 用户密钥与外部接口

`apiKeys` 默认关闭：每人最多 10 把有效密钥，新密钥每分钟 120 次、最长 365 天。启用前升级 0013 并重建前后端；设置页提供一次性展示、改名 / 撤销，`/api/v1` 只开放个人文件与任务。密钥限额叠加原有账号限额、文件配额和任务收费，不授予站点或团队管理员身份。字段范围、幂等、版本重试与本地验收见[用户密钥教程](./api-keys)。本任务主预览保持关闭，0013 尚未应用到主数据库。

## 邮件订阅与候补名单

`marketing.newsletter` 与 `marketing.waitlist` 默认关闭。匿名申请必须单独勾选用途，收到确认邮件后再主动确认；退订不影响账号邮件。`consentVersion` 记录文案版本，确认有效期为 1—24 小时，再次申请间隔为 1—60 分钟。当前版本启用前升级包含 0016 的完整迁移，并重建公共页与 API；主预览保留 0012。`contactsSync` 独立启用两个用途的供应商同步和签名回调；缺配置拒绝启动，两个主题必须默认退订。公开工具使用报告已单独接入，见[使用事件](./tool-usage-events)；工作台使用与积分包确认见[服务端事件](./server-activity-events)；个人订阅付款也已本地验收；团队独立选择及付款观测也已本地验收，真实外部环境仍在 I11 后续范围，见[邮件订阅教程](./marketing-subscriptions)。

## 修改与检查

`storage` 的范围、配额占用、原始二进制上传、会话授权下载、批次清理和本地验收方式，见[私有文件存储](./files-storage)。文件工作台已接入主预览，实际 320 / 390 像素布局已检查；两个生成站删除按钮的完整浏览器流程仍待验证，不把开关开启当成完整模块交付。

`tasks` 控制个人异步任务：`enabled` 停止新提交 / 重试但保留历史 / 取消；`maxActive` 默认五个活跃名额；`maxAttempts` 默认三次，创建时保存到任务，配置变更不增加已有预算；`writesPerMinute` 默认十次，`readsPerMinute` 默认一百二十次，服务端逐过程原子计数。`creditCost` 默认 0，整数 0—1,000,000；`priceVersion` 是报价版本，改价需更新，旧任务保存原价。报价确认与返还规则见[支付、积分与任务](./billing-tasks)。开启任务必须开启 `storage` 并配置 API 的 `STORAGE` / `TASK_QUEUE`，前后端一起重建。处理器、结果、工作台与验收范围见[任务生命周期](./task-lifecycle)。

```sh
bun run config:check
bun typecheck
bun build
```

前后端必须一起重建并发布，避免页面和 API 的开关不一致。环境变更后重启 API。检查命令验证关键范围、凭据组合、示例文件覆盖和域名一致性；不替代真实服务验收。

## 官网与产品配置分开

本页的 `packages/core/website.ts` 控制生成产品，包括品牌、认证、积分和产品套餐。模板官网配置在 `apps/website/config/site.ts`，不读取产品套餐。官网、案例及独立演示的维护方式见[对应教程](./website-showcase)。

## 上传验证开关

`security.turnstile.enabled` 默认为 `false`，开启后保护文件上传、任务提交、手动重试、积分购买与营销申请，前后端一起重建。实际凭据保留在 API 环境中，不填写到网站配置。收费与外部 API 已复用业务限制和验证，见[执行限制与验证](./execution-security)。
