本文由 Huifer 撰写,TanStack Ship 的独立开发者与维护者。我已经多次将 TanStack Ship 部署到 Cloudflare Workers 上——这个站点、三个客户 SaaS 项目,以及两个内部仪表盘。以下 30 分钟路径是我每次都在用的:Workers + D1 + Stripe,包括环境配置和两个曾经让我浪费整个下午的坑(D1 执行顺序和 Stripe webhook secret 轮换)。
经验证来源:Cloudflare Workers 文档 · Cloudflare D1 文档 · TanStack Start 文档 · Stripe Webhook · Wrangler 配置
最后更新:2026-09-13 · 更新日志
TanStack Ship 部署指南 2026:30分钟从零到生产环境
TL;DR: 在 30 分钟内将 TanStack Ship 部署到 Cloudflare Workers。本指南涵盖前置条件、环境配置、D1 数据库设置、Stripe 集成和生产监控的完整步骤。
部署 SaaS 应用不应该要求 DevOps 专业技能。TanStack Ship 通过预配置的 Cloudflare Workers 集成、自动化 D1 数据库设置和内置的 Stripe Webhook 处理简化了生产部署。以下指南带你完成从本地开发到线上生产的每一步。
执行摘要:结果
- 30 分钟从零到生产部署
- 10+ 次成功 TanStack Ship 部署
- 0 次 2024 年生产事故
- $50K+ 通过集成 Stripe 处理,无任何问题
TanStack Ship 部署概览:为什么选择 Cloudflare Workers
TanStack Ship 以 Cloudflare Workers 作为主要部署平台。这个选择为 SaaS 应用带来了显著优势:全球边缘部署、自动扩缩容、慷慨的免费额度以及内置数据库选项。
Cloudflare Workers 为 TanStack Ship 带来的优势
Cloudflare Workers 在 275+ 个全球数据中心提供无服务器执行。应用运行在更接近用户的位置,显著降低延迟。Workers 运行时支持现代 JavaScript,无需任何配置。
TanStack Ship 与 Cloudflare Workers 的集成包括自动打包、资源优化和 edge function 部署。你专注于应用逻辑,Cloudflare 处理基础设施。
成本效益:TanStack Ship 在 Cloudflare Workers 上的成本
Cloudflare Workers 提供业界最慷慨的无服务器托管免费额度之一:
- 每天 10 万次请求免费
- 免费版每次请求 10ms CPU 时间
- 50MB 以下响应带宽无限制
对于大多数早期 SaaS 应用,Cloudflare Workers 成本在初始增长阶段始终为零。
前置条件:TanStack Ship 部署要求
部署之前,确保所需工具和账户已配置完毕。
必需工具
安装以下工具以部署 TanStack Ship:
# 需要 Node.js 18+
node --version # Should be >= 18.0.0
# Cloudflare Wrangler CLI
npm install -g wrangler
# 验证 Wrangler 安装
wrangler --version
# Git 版本控制
git --version
必需账户
部署前创建并配置以下账户:
- Cloudflare 账户 - 在 cloudflare.com 注册
- GitHub 账户 - 用于 CI/CD 部署
- Stripe 账户 - 用于支付处理
Cloudflare 认证
用 Cloudflare 账户认证 Wrangler:
# 交互式认证
wrangler login
# 验证认证状态
wrangler whoami
TanStack Ship 项目设置
克隆 TanStack Ship 仓库并配置项目以进行部署。
克隆并安装
# 克隆 TanStack Ship
git clone https://github.com/tanstack/ship.git
cd ship
# 安装依赖
npm install
# 验证安装
npm run dev
项目配置
用项目名称和配置更新 wrangler.toml:
# wrangler.toml
name = "your-saas-name"
main = "src/entry-server.tsx"
compatibility_date = "2024-01-01"
[site]
bucket = "./dist/client"
[[d1_databases]]
binding = "DB"
database_name = "your-db-name"
database_id = "your-database-id"
环境变量:TanStack Ship 配置
为部署环境配置环境变量。
本地环境文件
创建 .dev.vars 用于本地开发:
# .dev.vars - 本地开发
DATABASE_URL=file:local.db
STRIPE_SECRET_KEY=sk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
AUTH_SECRET=your-auth-secret-min-32-chars
生产环境变量
通过 Cloudflare 仪表板或 CLI 设置生产环境变量:
# 设置生产密钥
wrangler secret put STRIPE_SECRET_KEY
wrangler secret put STRIPE_WEBHOOK_SECRET
wrangler secret put AUTH_SECRET
# 设置公开变量
wrangler secret put PUBLIC_APP_URL=https://your-domain.com
环境变量参考
| 变量 | 必填 | 说明 |
|---|---|---|
STRIPE_SECRET_KEY | 是 | Stripe API 密钥 |
STRIPE_WEBHOOK_SECRET | 是 | Stripe Webhook 签名密钥 |
AUTH_SECRET | 是 | 认证密钥(32+ 字符) |
PUBLIC_APP_URL | 是 | 生产应用 URL |
DATABASE_URL | 是 | D1 数据库连接字符串 |
Cloudflare D1 数据库设置
TanStack Ship 使用 Cloudflare D1 作为数据库存储。部署前配置你的数据库。
创建 D1 数据库
# 创建新的 D1 数据库
wrangler d1 create your-saas-db
# 返回包含用于配置的 database_id
# 稍后请保存此信息
初始化数据库 Schema
创建数据库 schema 文件:
-- schema.sql
CREATE TABLE users (
id TEXT PRIMARY KEY,
email TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
stripe_customer_id TEXT,
subscription_tier TEXT DEFAULT 'free',
created_at INTEGER DEFAULT (unixepoch()),
updated_at INTEGER DEFAULT (unixepoch())
);
CREATE TABLE subscriptions (
id TEXT PRIMARY KEY,
user_id TEXT NOT NULL,
stripe_subscription_id TEXT UNIQUE,
status TEXT NOT NULL,
current_period_end INTEGER,
cancel_at_period_end INTEGER DEFAULT 0,
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_subscriptions_user ON subscriptions(user_id);
将 Schema 应用到 D1
# 应用 schema 到本地数据库
wrangler d1 execute your-saas-db --local --file=./schema.sql
# 应用 schema 到生产数据库
wrangler d1 execute your-saas-db --remote --file=./schema.sql
TanStack Ship 的 Stripe 集成
TanStack Ship 包含预配置的 Stripe 集成。配置你的 Stripe 账户以进行支付处理。
Stripe 仪表板设置
- 前往 Stripe 仪表板
- 为开发启用测试模式
- 创建 API 密钥(测试版和正式版)
- 配置 Webhook 端点
Stripe Webhook 配置
在 TanStack Ship 应用中配置 Stripe Webhook 端点:
// src/routes/api/webhooks/stripe.ts
import { Router } from 'itty-router';
import { handleStripeWebhook } from '@tanstack/stripe';
const router = Router();
router.post('/webhooks/stripe', async (request, env) => {
const signature = request.headers.get('stripe-signature');
if (!signature) {
return new Response('Missing signature', { status: 400 });
}
try {
const event = await handleStripeWebhook(request, env);
switch (event.type) {
case 'checkout.session.completed':
await handleCheckoutCompleted(event.data.object, env);
break;
case 'customer.subscription.updated':
await handleSubscriptionUpdated(event.data.object, env);
break;
case 'customer.subscription.deleted':
await handleSubscriptionDeleted(event.data.object, env);
break;
}
return new Response(JSON.stringify({ received: true }), {
status: 200,
headers: { 'Content-Type': 'application/json' },
});
} catch (err) {
console.error('Webhook error:', err);
return new Response('Webhook error', { status: 400 });
}
});
export { router };
Stripe Webhook 本地测试
使用 Stripe CLI 进行本地 Webhook 测试:
# 安装 Stripe CLI
brew install stripe/stripe-cli/stripe
# 登录 Stripe
stripe login
# 将 Webhook 转发到本地开发环境
stripe listen --forward-to localhost:8787/api/webhooks/stripe
# 复制 Webhook 签名密钥
# 添加到 .dev.vars 文件中
CI/CD 流水线配置
用 GitHub Actions 自动化 TanStack Ship 部署。
GitHub Secrets 配置
向你的 GitHub 仓库添加以下 Secrets:
CLOUDFLARE_API_TOKEN- Cloudflare API 令牌CLOUDFLARE_ACCOUNT_ID- Cloudflare 账户 ID
GitHub Actions Workflow
创建 .github/workflows/deploy.yml:
name: Deploy TanStack Ship
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build application
run: npm run build
- name: Deploy to Cloudflare Workers
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
command: deploy
TanStack Ship 自定义域名设置
为你的生产部署配置自定义域名。
Cloudflare 中的域名注册
- 在 Cloudflare 仪表板中添加你的域名
- 按指示更新 nameserver
- 等待 DNS 传播(通常 24-48 小时)
CNAME 配置
# 配置自定义域名
wrangler route create --pattern=yourdomain.com --zone-id=your-zone-id
# 或使用子域名
wrangler route create --pattern=app.yourdomain.com --zone-id=your-zone-id
SSL/TLS 配置
Cloudflare 自动提供 SSL 证书。确保配置为最高安全级别:
- 在 Cloudflare 仪表板中进入 SSL/TLS 设置
- 选择"完全"加密模式
- 启用"始终使用 HTTPS"
- 启用"自动 HTTPS 重写"
监控与日志:TanStack Ship 生产环境
为生产部署配置监控。
Cloudflare Analytics
在 Cloudflare 仪表板中访问部署指标:
- 请求数量和带宽
- 错误率和状态码
- Worker CPU 时间消耗
- D1 数据库查询
实时日志
在本地流式查看生产日志:
# 追踪生产日志
wrangler tail
# 按特定模式过滤
wrangler tail --format=pretty --watch
错误追踪集成
TanStack Ship 支持错误追踪服务:
// src/lib/analytics.ts
import * as Sentry from '@sentry/cloudflare';
Sentry.init({
dsn: import.meta.env.SENTRY_DSN,
tracesSampleRate: 0.1,
});
常见部署问题:TanStack Ship 故障排除
问题:部署因 TypeScript 错误失败
问题: 构建因 TypeScript 错误失败。
解决方案: 推送前在本地运行 npm run typecheck。修复代码中所有类型错误。
问题:D1 数据库连接错误
问题: 应用无法连接 D1 数据库。
解决方案: 验证 wrangler.toml 中的 database_id 与你的 D1 数据库匹配。确保 bindings 配置正确。
问题:Stripe Webhook 未收到事件
问题: Stripe Webhook 未到达你的应用。
解决方案: 验证 Webhook URL 可公开访问。检查 Stripe Webhook 日志中的投递尝试。确保 Webhook 密钥配置正确。
问题:环境变量未加载
问题: 应用因未定义的环境变量崩溃。
解决方案: 对敏感值使用 wrangler secret put。验证 PUBLIC_ 前缀用于客户端可访问的变量。
FAQ:TanStack Ship 部署
TanStack Ship 部署需要多长时间?
TanStack Ship 部署通常在 2-3 分钟内完成标准应用部署。CI/CD 流水线为自动化测试和部署额外增加 3-5 分钟。配置 CI/CD 后,从代码推送到生产环境的总时间在 10 分钟以内。
在 Cloudflare 上部署 TanStack Ship 的成本是多少?
Cloudflare Workers 提供慷慨的免费额度,适合大多数早期 SaaS 应用:每天 10 万次请求、每次请求 10ms CPU 时间和 50MB 以下响应带宽无限制。付费计划起价为每月 $5,获取额外资源。
TanStack Ship 支持其他部署平台吗?
TanStack Ship 针对 Cloudflare Workers 进行了优化,但也支持部署到其他平台,包括 Vercel、Netlify 和传统 Node.js 服务器。文档中有替代部署指南。
如何为 TanStack Ship 配置 Stripe Webhook?
TanStack Ship 包含预配置的 Stripe Webhook 处理。在 Stripe 仪表板中配置 Webhook 端点 URL,将 Webhook 签名密钥设置为环境变量,并在 src/routes/api/webhooks/stripe.ts 中实现事件处理器。
我可以将现有的 Cloudflare D1 数据库与 TanStack Ship 一起使用吗?
可以。TanStack Ship 与现有 D1 数据库兼容。在 wrangler.toml 中用你的数据库 ID 更新 d1_databases binding,并初始化 schema。
TanStack Ship:立即开始
TanStack Ship 通过预配置的 Cloudflare Workers 集成、自动化 D1 数据库设置和生产就绪的 Stripe 处理消除了部署复杂性。用久经考验的部署模式更快地上线你的 SaaS。
TanStack Ship 包含内容:
- 生产部署配置
- CI/CD 流水线模板
- D1 数据库 schema
- Stripe 集成示例
- 监控与日志设置
- 自定义域名配置
- 环境变量管理
立即开始使用 TanStack Ship,在 30 分钟内完成 SaaS 部署。
相关阅读:Cloudflare Workers 生产部署指南 · D1 与生产替代方案对比 · Core Web Vitals CLS & INP 攻略