全部文章

实战 / 2026-09-01

从克隆到上线,完整走一遍

从 `bun install` 到线上域名之间的每一步——先配什么、后配什么,以及哪些步骤是真的没法自动化的。

从克隆到上线,完整走一遍

这是完整路径,顺序就是依赖关系的实际顺序。除非明确写了「可选」,否则都不能跳。

1. 先跑起来(5 分钟)

bun install
bun run db:migrate:local
bun run dev

现在 localhost:3000 上已经有一个带本地 D1 和 R2 的应用了——但你还登不进去,因为 Google 是唯一的登录方式。

2. Google OAuth(10 分钟,主要在浏览器里)

在 Google Cloud 创建 OAuth 客户端,回调地址填 http://localhost:3000/api/auth/callback/google。把 id 和 secret 写进 .dev.vars,并且把 id 同时写进 appConfig.googleClientId——One Tap 在浏览器里跑,需要这个值是公开的。改完重启 dev server,环境变量只在启动时读一次。

登录一次,然后把自己提成管理员:

bunx wrangler d1 execute DB --local \
  --command "UPDATE user SET role='admin' WHERE email='you@example.com';"

3. 改成你自己的(30 分钟,非常值)

先改 src/config/app-config.ts:名称、正式域名、支持邮箱、法律实体。这些值会出现在营销页、每一封事务邮件,以及服务条款和隐私政策页上——法律实体是原样打印的,所以在收第一笔钱之前就要填好。

然后是 src/config/plans.ts。文件顶部的注释解释了整个价格阶梯:加油包按标价卖,订阅在标价之下,而 plans.test.ts 会在任何一档跌破毛利下限时让构建失败。CREDIT_COST_CENTS 要来自实测,不是拍脑袋。

4. 接支付(20 分钟)

建好商品目录——每档一个 product,每个计费周期一个 recurring price——把 id 粘回 plans.ts,替换掉那些 REPLACE_ME 占位符。把 secret key 和 webhook secret 写进 .dev.vars,并设置 PAYMENT_PROVIDER

用 Stripe CLI 把 webhook 转发到本地 dev server 来测:

bun run stripe:listen

用测试卡买一次,看着账本动起来。在支付商密钥配好之前,购买按钮会直接说明情况而不是发起结账,所以这一步推迟也是安全的。

5. 部署(15 分钟)

wrangler d1 create shipkit            # 把 id 填进 wrangler.jsonc
wrangler r2 bucket create shipkit-files
bun run db:migrate:remote
grep -v '^#' .prod.vars | grep = | wrangler secret bulk
bun run deploy

迁移一律手工执行,绝不从 CI 跑——改表结构是一件需要人盯着的、有意为之的操作,而部署任务会拒绝发布尚有未执行迁移的代码。

6. 只有你自己能做的那些事

给正式域名再建一个 Google OAuth 客户端。在支付商后台配一个指向 <你的域名>/api/webhooks/stripe 的 webhook。在 Resend 里验证发信域名。这些都是浏览器操作,没有值得脚本化的 API——这也正是仓库自带 Claude Code 技能的原因:带你走完并验证结果,而不是假装这些步骤不存在。

更多文章