ProductReadyProductReady

部署指南

将 ProductReady 部署到生产环境 - Vercel、Docker、环境设置和 CI/CD 最佳实践

部署指南

将 ProductReady 部署到生产环境的完整指南。学习 VercelDocker 和自托管环境的部署策略。

推荐:部署到 Vercel 以获得最简单的体验。它针对 Next.js 优化,需要最少的配置。


快速概览

部署选项:

  • Vercel - 推荐(一键部署,自动 HTTPS)
  • Docker - 自托管或云(AWS、GCP、Azure)
  • Kubernetes - 用于大规模应用
  • VPS - 传统服务器(DigitalOcean、Linode)

你需要什么:

  • PostgreSQL 数据库(Neon、Supabase 或自托管)
  • 邮件服务商(Resend、Postmark、AWS SES)
  • 支付服务商(Stripe、LemonSqueezy)- 可选
  • 域名 + SSL 证书

部署到 Vercel

一键部署

最快的开始方式:

Fork 仓库

将 ProductReady Fork 到您的 GitHub 账户

导入到 Vercel

  1. 前往 vercel.com/new
  2. 导入您 fork 的仓库
  3. 选择 apps/productready 作为根目录

配置环境变量

在 Vercel 仪表板中添加:

# 数据库
PG_DATABASE_URL=postgresql://user:pass@host:5432/db

# 认证
BETTER_AUTH_SECRET=your-32-char-secret
BETTER_AUTH_URL=https://your-domain.vercel.app

# OAuth(可选)
GITHUB_CLIENT_ID=your-github-client-id
GITHUB_CLIENT_SECRET=your-github-secret

# 邮件(可选)
RESEND_API_KEY=re_123456789

# 支付(可选)
STRIPE_SECRET_KEY=sk_live_...
STRIPE_WEBHOOK_SECRET=whsec_...

部署

点击 Deploy - Vercel 将:

  • 安装依赖
  • 构建应用
  • 部署到生产环境
  • 提供 URL

自定义域名

在 Vercel 中添加域名:

  • 前往 Project Settings → Domains
  • 添加您的域名(例如 productready.com

更新 DNS:

  • 添加指向 cname.vercel-dns.com 的 CNAME 记录
  • 等待 DNS 传播(通常 < 5 分钟)

更新环境变量:

BETTER_AUTH_URL=https://productready.com

使用 Docker 部署

Dockerfile

ProductReady 包含生产就绪的 Dockerfile:

# apps/productready/Dockerfile
FROM node:24.18.0-alpine AS base

# 仅在需要时安装依赖
FROM base AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app

# 安装 pnpm
RUN npm install -g pnpm

# 复制包文件
COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile

# 仅在需要时重新构建源代码
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .

# 构建
ENV NEXT_TELEMETRY_DISABLED 1
RUN pnpm build

# 生产镜像
FROM base AS runner
WORKDIR /app

ENV NODE_ENV production
ENV NEXT_TELEMETRY_DISABLED 1

RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

# 复制构建文件
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static

USER nextjs

EXPOSE 3000

ENV PORT 3000
ENV HOSTNAME "0.0.0.0"

CMD ["node", "server.js"]

构建和运行

# 构建镜像
docker build -t productready:latest .

# 运行容器
docker run -p 3000:3000 \
  -e PG_DATABASE_URL="postgresql://..." \
  -e BETTER_AUTH_SECRET="your-secret" \
  -e BETTER_AUTH_URL="https://your-domain.com" \
  productready:latest

数据库设置

Neon(推荐)

  1. neon.tech 创建账户
  2. 创建项目
  3. 复制连接字符串
  4. 添加到环境:
PG_DATABASE_URL=postgresql://user:pass@host.neon.tech:5432/neondb?sslmode=require

为什么选择 Neon?

  • ✅ Serverless PostgreSQL(缩放到零)
  • ✅ 慷慨的免费套餐
  • ✅ 用于开发的分支数据库
  • ✅ 内置连接池

Supabase

  1. supabase.com 创建项目
  2. 从 Settings → Database 获取连接字符串
  3. 在生产中使用连接池字符串:
# 事务模式(推荐用于 Drizzle)
PG_DATABASE_URL=postgresql://postgres.[ref]:[password]@aws-0-[region].pooler.supabase.com:6543/postgres

本地数据库

对于本地开发,ProductReady 提供了 Docker Compose 配置,可以快速启动开发所需的所有数据库服务。

使用 make db 启动本地数据库

在项目根目录(kapps/)运行以下命令:

# 启动数据库服务
make db

这将启动:

  • PostgreSQL 16 (带 pgvector 扩展)

    • 端口: 5432
    • 用户名: bika
    • 密码: bikabika
    • 数据库: bikadev
    • 连接字符串: postgresql://bika:bikabika@localhost:5432/bikadev
  • Redis Stack 7.2 (带 Redis Insight)

    • Redis 端口: 6379
    • Redis Insight UI: http://localhost:8001
    • 数据持久化: ./.data/redis
  • Typesense 27.1 (搜索引擎)

    • 端口: 8108
    • API Key: bikabika
    • 数据持久化: ./.data/typesense

常用数据库管理命令

# 停止数据库服务
make db-stop

# 查看服务日志
make db-logs

# 运行数据库迁移(所有项目)
make db-migrate

# 生成 Prisma/Drizzle 客户端
make db-generate

# 填充种子数据
make db-seed

# 重置数据库
make db-reset

配置环境变量

apps/productready/.env 中配置本地数据库连接:

.env
# PostgreSQL
PG_DATABASE_URL="postgresql://bika:bikabika@localhost:5432/bikadev"

# Redis(如果需要)
REDIS_URL="redis://localhost:6379"

# Typesense(如果需要)
TYPESENSE_URL="http://localhost:8108"
TYPESENSE_API_KEY="bikabika"

数据持久化:所有数据存储在 ./.data/ 目录中,该目录已添加到 .gitignore,不会被提交到版本控制。

注意:确保已安装 Docker 和 Docker Compose。如果尚未安装,请访问 Docker 官网 下载。


环境变量

必需

# 数据库
PG_DATABASE_URL=postgresql://...

# 认证
BETTER_AUTH_SECRET=your-32-char-random-string
BETTER_AUTH_URL=https://your-production-domain.com

可选 - OAuth

# GitHub OAuth
GITHUB_CLIENT_ID=your-github-client-id
GITHUB_CLIENT_SECRET=your-github-client-secret

# Google OAuth
GOOGLE_CLIENT_ID=your-google-client-id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=your-google-client-secret

可选 - 邮件

# Resend
RESEND_API_KEY=re_123456789

# 或 Postmark
POSTMARK_API_KEY=your-postmark-token

生成密钥

# 生成 32 字符密钥
openssl rand -base64 32

# 或使用 Node.js
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"

数据库迁移

生产迁移

重要:在部署新代码之前运行迁移以避免错误。

选项 1:手动

# 安装依赖
pnpm install

# 运行迁移
pnpm db:migrate

选项 2:CI/CD(推荐)

# .github/workflows/deploy.yml
name: Deploy
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: pnpm/action-setup@v2
      - uses: actions/setup-node@v3
        with:
          node-version: 24.18.0
          cache: 'pnpm'
      
      # 运行迁移
      - run: pnpm install
      - run: pnpm db:migrate
        env:
          PG_DATABASE_URL: ${{ secrets.PG_DATABASE_URL }}
      
      # 部署(Vercel 示例)
      - run: npx vercel --prod
        env:
          VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}

健康检查

ProductReady 包含健康检查端点:

GET /api/health

Response:
{
  "status": "ok",
  "timestamp": "2025-11-19T10:00:00.000Z",
  "service": "productready",
  "version": "1.0.0"
}

部署前检查清单

部署到生产环境前:

  • 设置所有必需的环境变量
  • 运行数据库迁移
  • 使用生产数据库测试(staging 环境)
  • 设置自定义域名
  • 配置 SSL/HTTPS
  • 设置错误跟踪(Sentry)
  • 设置正常运行时间监控
  • 设置数据库备份
  • 测试 OAuth 流程(生产凭据)
  • 测试支付 webhooks(生产模式)

部署后

部署后:

  • 监控错误率(Sentry)
  • 检查性能指标(Vercel Analytics)
  • 验证 webhooks 是否正常工作
  • 测试关键用户流程
  • 监控数据库性能

下一步

  • 部署到 staging - 生产前测试所有内容
  • 设置监控 - 跟踪错误和性能
  • 配置备份 - 保护您的数据

Vercel 开始获得最简单的部署体验。一旦熟悉,探索 Docker/Kubernetes 以获得更多控制。

On this page