用这套模板建立下一个英文工具站
1. 先确定可交付任务
记录真实搜索/社区证据,明确输入、处理、预览和输出。示例 JSON/文本工具是模板验收样例,不是新词推荐。目标市场默认英文美国、英国、加拿大、澳大利亚。
2. 复制源代码
需要交付一份独立源码归档时,使用开发交付包:从已提交版本生成产品,附文件摘要、来源提交与依赖声明。直接复制仍使用下面的原命令。
运行 bun run site:create /absolute/path/my-tool --name "My Tool" --domain https://my-tool.com --port 4700。不复制密钥、Git 历史、本地数据、依赖和构建产物。生成后依然需要在每个站安装依赖、配置独立数据库和服务。官网与案例不会复制进产品;来源版本记录在 template.json,见升级说明。
工厂按绑定和环境重新命名 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 图标;详见品牌素材。业务文案和文章仍需自行替换。生成器会清空 creditPacks 并关闭积分售卖;新站必须配置自己的目录、Price ID 和独立 webhook secret,不能沿用源站商品。
PUBLIC_SITE_URL 控制 canonical、sitemap、RSS 的公开域名,APP_ORIGIN 控制 API/登录信任来源。生产时两者都设为同一实际域名。本地执行 bun preview:build 会按 preview.config.json 构建产品 origin;生产构建使用实际域名。工厂可预设未来域名,配置诊断会提示与本地 origin 的差异。
模板默认启用英文与简体中文。开启第二语言前检查 i18n.translations 和实际字典;生成器保留样例业务文案,修改产品时应同步调整启用语言。当前公开页范围与尚未翻译入口见产品语言。
3. 接入工具
新站的 Crisp 客服默认关闭,公开 Website ID 重置为 null,原支持邮箱清空。需要聊天时填写自己工作区的 ID 与真实邮箱;只需要邮件联系时保持聊天关闭,见客服教程。
新站的 Rewardful 联盟后台核查也默认关闭,推广计划 / 商户账户 ID 重置为 null,不复制服务密钥。启用前使用自己环境的完整配置并迁移至 0033;个人 / 团队推荐绑定后端已本地验收,公开采集与个人 / 团队设置已本地验收,具体订单 / 佣金联查及管理证据与带原因 / 审计的安全人工复核已受控本地验收,真实购买归因继续验证,见联盟营销教程。
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 全部排除;英文草稿的译文也不发布。缺中文译文时不混入英文列表,不创建虚假中文详情;可选西语仍使用明确标注的英文回退。作者署名和样例正文保留,复制后应逐项核对,见产品语言。
发布与任务直接相关、可复现的使用教程和输出限制。不要批量建立功能相同、文案近似的关键词页。隐私、条款和联系方式目前是占位,必须替换。首页的演示说明与样例文案也需随真实产品一起更换。
5. 启动与验证
本地 PostgreSQL 准备好后,用 .env.example 创建 .env.local。生成唯一 auth secret,再执行:
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,再按部署教程核对目标构建产物和真实服务。文件型任务的业务限制已接原任务入口;真实模型及 Cloudflare、Neon、Stripe / 发信仍待验收。本地启动成功不代表上线验收完成。
出售模板前
至少用两个真实站验证配置复用、部署文档、升级和数据迁移。保留 MIT 原版权声明,并核对新引入依赖/素材的授权。不要将演示积分账本描述为已经完成积分包售卖。