部署
将 LaunchSaaS 部署到 Vercel、Cloudflare、Railway 或 Docker 生产环境。分步指南包含环境配置和最佳实践。
部署
本指南涵盖将 LaunchSaaS 部署到生产环境,包括特定平台的说明和最佳实践。
部署前检查清单
在部署之前,确保你已经:
- 数据库已设置并可从生产环境访问
- 所有必需的环境变量已配置
- 数据库迁移已应用(
pnpm run db:migrate) - 管理员用户已创建(
pnpm run init:scripts) - Stripe webhooks 已使用生产环境 URL 配置
- Resend 中的电子邮件域名已验证
- 社交 OAuth 应用已使用生产环境回调 URL 配置
-
NEXT_PUBLIC_APP_ENV设置为production -
NEXT_PUBLIC_APP_URL设置为你的生产域名
Vercel(推荐)
Vercel 是 Next.js 的创建者,提供最佳的部署体验。
通过控制台部署
- 前往 vercel.com
- 点击"Add New Project"
- 导入你的 Git 仓库
- 配置环境变量(从
.env文件添加所有变量) - 点击"Deploy"
通过 CLI 部署
- 安装 Vercel CLI:
pnpm install -g vercel- 登录并部署:
vercel login
vercel --prod环境变量
在 Vercel Dashboard 中添加所有必需的环境变量:
- 前往 Project Settings → Environment Variables
- 为"Production"环境添加每个变量
- 添加变量后重新部署
自定义域名
- 前往 Project Settings → Domains
- 添加你的域名
- 配置 DNS(CNAME 到
cname.vercel-dns.com或使用 Vercel 名称服务器) - 等待 DNS 传播
Railway
Railway 提供简单的部署,包含数据库。
部署到 Railway
- 前往 railway.app
- 点击"New Project"
- 选择"Deploy from GitHub repo"
- 选择你的仓库
- 添加环境变量
- 点击"Deploy"
Railway 上的数据库
Railway 可以配置 PostgreSQL 数据库:
- 点击"New"→"Database"→"PostgreSQL"
- 复制连接字符串
- 作为
DATABASE_URL环境变量添加
Docker(VPS/自托管)
在自己的 VPS 或服务器上使用 Docker 部署。此方法适合需要完全控制基础设施的场景。
推荐设置:使用 Docker 部署应用,使用托管数据库服务(Neon/Supabase)以获得简单性和可靠性。
前置要求
- 安装了 Docker 的 VPS 或服务器
- 托管数据库(推荐 Neon 或 Supabase)
- 配置了 DNS 的域名(可选)
- 至少 2GB RAM 和 10GB 磁盘空间
快速开始
- 克隆和配置
git clone https://github.com/your-repo/launchsaas.git
cd launchsaas
cp .env.example .env- 编辑
.env文件
配置必需的变量:
DATABASE_URL- 你的托管数据库连接字符串BETTER_AUTH_SECRET- 随机的 32+ 字符字符串ADMIN_EMAIL和ADMIN_PASSWORD- 管理员凭据NEXT_PUBLIC_APP_URL- 你的生产域名
- 构建并启动
./docker-quickstart.sh你的应用现在运行在 http://localhost:3000
使用自托管数据库(可选)
如果你更喜欢在 Docker 中运行 PostgreSQL 而不是使用托管服务:
- 取消注释
docker-compose.yml中的数据库
# 移除这些行的 # 注释:
postgres:
image: postgres:16-alpine
# ... 其余配置
volumes:
postgres_data:- 使用 Docker 数据库 URL 更新
.env
DATABASE_URL=postgres://postgres:postgres@postgres:5432/launchsaas- 重启容器
./docker-quickstart.sh down
./docker-quickstart.sh up自托管数据库需要定期备份和维护。生产环境推荐使用 Neon 或 Supabase 等托管服务。
生产环境设置
1. 配置反向代理和 HTTPS
选择以下选项之一来添加 HTTPS 支持:
选项 A:SWAG(推荐用于 Docker)
SWAG 是一个集成解决方案,通过 Let's Encrypt 自动管理 SSL 证书。
# 添加到你的 docker-compose.yml
services:
swag:
image: lscr.io/linuxserver/swag:latest
container_name: swag
cap_add:
- NET_ADMIN
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- URL=yourdomain.com
- VALIDATION=http
- [email protected]
volumes:
- ./swag:/config
ports:
- 443:443
- 80:80
restart: unless-stopped在 ./swag/nginx/proxy-confs/launchsaas.subdomain.conf 创建代理配置:
server {
listen 443 ssl http2;
server_name yourdomain.com;
include /config/nginx/ssl.conf;
location / {
include /config/nginx/proxy.conf;
proxy_pass http://launchsaas-app:3000;
}
}选项 B:Caddy(最简单)
最少配置自动 HTTPS:
# 添加到 docker-compose.yml
services:
caddy:
image: caddy:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data创建 Caddyfile:
yourdomain.com {
reverse_proxy launchsaas-app:3000
}选项 C:Nginx
手动 SSL 证书配置:
server {
listen 80;
server_name yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}2. 环境变量
选项 A:使用单独的环境文件(推荐)
为每个环境创建不同的环境文件:
# 创建生产环境文件
cp .env.example .env.prod
# 编辑 .env.prod 设置生产值
nano .env.prod配置生产值:
APP_ENV=productionNEXT_PUBLIC_APP_URL=https://yourdomain.com- 生产数据库 URL
- 所有服务的生产 API 密钥
使用特定的环境文件启动:
# 使用 docker-quickstart.sh
./docker-quickstart.sh start --env .env.prod
./docker-quickstart.sh -e .env.staging
# 直接使用 docker compose
export ENV_FILE=.env.prod
docker compose up -d选项 B:使用单个 .env 文件
使用生产值更新现有的 .env:
nano .env然后正常启动:
./docker-quickstart.sh查看环境变量了解完整列表。
3. 数据库初始化
运行迁移并创建管理员用户:
docker compose exec app pnpm run init或者分别运行:
docker compose exec app pnpm run db:migrate
docker compose exec app pnpm run init:scripts可用命令
./docker-quickstart.sh start # 构建并启动(默认)
./docker-quickstart.sh build # 仅构建 Docker 镜像
./docker-quickstart.sh up # 仅启动容器
./docker-quickstart.sh down # 停止容器
./docker-quickstart.sh restart # 重启容器
./docker-quickstart.sh logs # 查看日志(Ctrl+C 退出)
./docker-quickstart.sh clean # 移除容器和镜像使用不同的环境文件:
# 使用生产环境启动
./docker-quickstart.sh start --env .env.prod
# 使用预发布环境启动
./docker-quickstart.sh start -e .env.staging
# 使用特定环境构建
./docker-quickstart.sh build --env .env.prod
# 查看日志(不需要环境文件)
./docker-quickstart.sh logs常见工作流:
# 开发环境
./docker-quickstart.sh
# 生产环境
cp .env.example .env.prod
# 编辑 .env.prod 设置生产值
./docker-quickstart.sh start --env .env.prod
# 切换环境
./docker-quickstart.sh down
./docker-quickstart.sh start --env .env.staging
# 查看日志和重启
./docker-quickstart.sh logs
./docker-quickstart.sh restart故障排除
端口已被使用:
# 在 .env 中更改端口
APP_PORT=3001然后重启:
./docker-quickstart.sh restart数据库连接失败:
- 验证
DATABASE_URL是否正确 - 确保数据库允许来自 Docker 的连接
- 对于托管数据库,检查 IP 白名单设置
- 测试连接:
docker compose exec app node -e "console.log(process.env.DATABASE_URL)"
容器无法启动:
# 检查错误日志
./docker-quickstart.sh logs
# 检查容器状态
docker compose ps
# 如需要可以重新构建
./docker-quickstart.sh clean
./docker-quickstart.sh build磁盘空间不足:
# 清理 Docker 资源
docker system prune -a
# 移除旧容器和镜像
./docker-quickstart.sh clean为什么选择 Vercel/Railway?
虽然 Docker 给你完全的控制权,但托管平台提供显著的优势:
- ✅ 自动 SSL 证书
- ✅ 零停机部署
- ✅ 内置 CDN 和边缘缓存
- ✅ 自动扩展
- ✅ 小项目的免费套餐
- ✅ 无需服务器维护
在以下情况使用 Docker:
- 需要完全的服务器控制
- 自定义基础设施要求
- 有现有的 VPS/服务器可以利用
- 符合特定的托管要求
- 与现有的基于 Docker 的基础设施集成
部署后
更新 Webhook URL
部署后,更新你的 Stripe webhook URL:
- 前往 Stripe Dashboard→Webhooks
- 将端点 URL 更新为:
https://yourdomain.com/api/auth/stripe/webhook
更新 OAuth 回调 URL
更新社交登录回调 URL:
- GitHub:
https://yourdomain.com/api/auth/callback/github - Google:
https://yourdomain.com/api/auth/callback/google
验证部署
- 访问你的生产环境 URL
- 测试注册和登录
- 使用 Stripe 测试卡测试支付流程
- 验证电子邮件是否正在发送
- 检查管理面板访问