---
url: /docs/agentbuff-stack/new-site.md
---
# 用这套模板建立下一个英文工具站

## 1. 先确定可交付任务

记录真实搜索/社区证据，明确输入、处理、预览和输出。示例 JSON/文本工具是模板验收样例，不是新词推荐。目标市场默认英文美国、英国、加拿大、澳大利亚。

## 2. 复制源代码

需要交付一份独立源码归档时，使用[开发交付包](./distribution)：从已提交版本生成产品，附文件摘要、来源提交与依赖声明。直接复制仍使用下面的原命令。

运行 `bun run site:create /absolute/path/my-tool --name "My Tool" --domain https://my-tool.com --port 4700`。不复制密钥、Git 历史、本地数据、依赖和构建产物。生成后依然需要在每个站安装依赖、配置独立数据库和服务。官网与案例不会复制进产品；来源版本记录在 `template.json`，见[升级说明](./template-upgrades)。

工厂按绑定和环境重新命名 R2 桶、预览桶、业务 / 死信队列，并同步死信消费者及 `TASK_DEAD_QUEUE_NAME`，生产 Hyperdrive / Cloudflare 账号 ID 改为待替换占位，不沿用源站资源。即使源站手工配置了不带品牌前缀的名字也会重置；本地远程资源开关被关闭。当前未支持的其他资源绑定会明确拒绝生成，需要先增加对应的隔离规则。本地只读取 `DATABASE_URL`，不再生成旧 Hyperdrive 连接覆盖变量。

公开地址也按配置环境重新生成：上述新站的正式入口为 `my-tool.com`，测试入口为 `staging.my-tool.com`，开发入口为本地端口。源产品站使用任意命名的测试域名，都不会复制成新站的正式域名；这项隔离来自 Wrangler 环境，不能靠源域名的前缀猜测。源站若使用非自定义域名的路由规则，生成器会明确拒绝，需先确认其路由设计。

修改 `packages/core/website.ts`：品牌、说明、联系方式、欢迎积分、历史上限、计划价格。当前 Free/Starter/Pro 的计划 ID 与 Stripe 集成绑定；改名字/价格可以只改配置，增删计划需同时改 API 计费和后台入口。配置价格必须与 Stripe Price 实际金额一致。生成器会重置名称、`brand`、OG 图片、社交链接和联系邮箱，并在新目录 `/brand/` 生成自己的 SVG 图标；详见[品牌素材](./brand-assets)。业务文案和文章仍需自行替换。生成器会清空 `creditPacks` 并关闭积分售卖；新站必须配置自己的目录、Price ID 和独立 webhook secret，不能沿用源站商品。

`PUBLIC_SITE_URL` 控制 canonical、sitemap、RSS 的公开域名，`APP_ORIGIN` 控制 API/登录信任来源。生产时两者都设为同一实际域名。本地执行 `bun preview:build` 会按 `preview.config.json` 构建产品 origin；生产构建使用实际域名。工厂可预设未来域名，配置诊断会提示与本地 origin 的差异。

模板默认启用英文与简体中文。开启第二语言前检查 `i18n.translations` 和实际字典；生成器保留样例业务文案，修改产品时应同步调整启用语言。当前公开页范围与尚未翻译入口见[产品语言](./languages)。

## 3. 接入工具

新站的 Crisp 客服默认关闭，公开 Website ID 重置为 `null`，原支持邮箱清空。需要聊天时填写自己工作区的 ID 与真实邮箱；只需要邮件联系时保持聊天关闭，见[客服教程](./support-chat)。

新站的 Rewardful 联盟后台核查也默认关闭，推广计划 / 商户账户 ID 重置为 `null`，不复制服务密钥。启用前使用自己环境的完整配置并迁移至 0033；个人 / 团队推荐绑定后端已本地验收，公开采集与个人 / 团队设置已本地验收，具体订单 / 佣金联查及管理证据与带原因 / 审计的安全人工复核已受控本地验收，真实购买归因继续验证，见[联盟营销教程](./affiliates)。

`packages/core/tools.ts` 定义每个工具的 ID、标题、说明、样例、步骤、FAQ、下载类型以及 `runTool` 处理器。

* 增加定义和真正处理器后，工具目录、详情页和 sitemap 会随构建生成。
* API 的工具 ID 校验从同一目录生成，不另外维护一份名单。
* 当前 ToolWorkbench 适用于文本输入与文本输出，同一处理器在浏览器/服务器执行。
* 图片/PDF/视频或模型 API 需要实现对应输入校验与结果预览；不应把第三方密钥放进 core 或客户端。
* 服务端收费生成需要任务、文件存储、限流和退款链路。当前已有私有文件、异步任务、收费扣返、预览下载与失败恢复的本地验收；真实模型、外部支付和云端完整交付仍按计划验收，不能只改文案就声称某项业务支持。

## 4. 写页面和文章

英文文章在 `apps/web/content/blog/*.md`，中文译文在 `apps/web/content/blog/zh/`，可选西班牙语译文在 `apps/web/content/blog/es/`，用相同文件名配对。Frontmatter：title、description、date、author、category；可选 updated、tool、draft。draft: true 会从详情、列表、RSS、sitemap 全部排除；英文草稿的译文也不发布。缺中文译文时不混入英文列表，不创建虚假中文详情；可选西语仍使用明确标注的英文回退。作者署名和样例正文保留，复制后应逐项核对，见[产品语言](./languages)。

发布与任务直接相关、可复现的使用教程和输出限制。不要批量建立功能相同、文案近似的关键词页。隐私、条款和联系方式目前是占位，必须替换。首页的演示说明与样例文案也需随真实产品一起更换。

## 5. 启动与验证

本地 PostgreSQL 准备好后，用 `.env.example` 创建 `.env.local`。生成唯一 auth secret，再执行：

```sh
bun install
bun run config:check
bun db:migrate
bun preview:build
bun preview:start
```

打开生成器报告的产品地址，例如 localhost:4700。按真实输入走一遍粘贴/文件 → 处理 → 检查 → 下载。测试注册登录、Save to account、History、不同账号隔离。所有本地邮件只写 `.local/outbox.jsonl`。

修改 API 后用 `bun preview:stop` 再 `bun preview:start`；修改公开页或 App 后重新 `bun preview:build` 并刷新。端口统一位于 `preview.config.json`。`--port 4700` 设置公开入口并派生内部服务端口；第二个产品可选择 `--port 5700`。不传端口时按站点 ID 生成默认端口，启动器仍会检查占用并拒绝接管其他站的服务。

不同项目的会话 Cookie 与登录提示 Cookie 使用各自的站点 ID；更换端口本身不会隔离 Cookie。每个产品仍需配置独立数据库与认证 secret。

## 6. 配置生产服务

生产目标为 Cloudflare 三个 Worker（web/app/api）+ 服务绑定 + Neon PostgreSQL/Hyperdrive。修改 `apps/*/wrangler.jsonc` 中域名、服务名、Hyperdrive ID 和环境变量；模板里的 example.com 与 Hyperdrive 占位不是有效配置。

通过 Wrangler secret 配置真实密钥，勿提交到 Git。设置环境为 production，配置并验收 Resend 和 Google / GitHub（如果启用）。Stripe 四项必须完整配置；同一站的产品价格与配置对应，验证 webhook/订阅取消/portal/失败回跳。

生成器排除备份目录、归档文件与恢复环境文件，不复制旧站的私有数据。生成器会重置资源编号并为各环境重命名存储 / 队列；云端 `STORAGE` 与 Terraform 的 `{站点编号}-{环境}-uploads` 一致，资源尚未自动创建。先运行 `bun deploy:check --target staging` 检查资源关系，补真实资源与 Secrets，再按[部署教程](./deployment)核对目标构建产物和真实服务。文件型任务的业务限制已接原任务入口；真实模型及 Cloudflare、Neon、Stripe / 发信仍待验收。本地启动成功不代表上线验收完成。

## 出售模板前

至少用两个真实站验证配置复用、部署文档、升级和数据迁移。保留 MIT 原版权声明，并核对新引入依赖/素材的授权。不要将演示积分账本描述为已经完成积分包售卖。
