本节摘要:开发完成 ≠ 上线成功。本节讲清 Next.js 的两种主流部署方式:Vercel(平台托管,零配置)与自托管(Node 服务器/Docker),以及环境管理、CI/CD、监控与回滚——把"能跑的应用"变成"可靠的服务"。
阅读完本节,你应当能够:
Next.js 应用有两种部署形态:
直觉类比:Vercel 像"托管公寓"(交钥匙入住,物业全包);自托管像"自建房"(一切自己来,但房子完全属于你)。小团队/创业期用 Vercel 最快;有合规、成本、定制需求时自托管。
💡 关键直觉:Next.js 的构建产物是"纯静态 + 可选服务器"的混合——纯静态页面可以托管在任何静态托管(CDN);有动态能力时需要一个 Node 服务器(或平台)。理解"什么内容需要服务器",就理解了部署形态的选择。
# 1. 推送代码到 Git 仓库(GitHub/GitLab) git init && git add -A && git commit -m "init" git push origin main # 2. 在 vercel.com 导入仓库,框架自动识别(Next.js) # 3. 配置环境变量(数据库地址、密钥) # 4. 部署完成,获得 https://xxx.vercel.app
Vercel 自动能力:
# 1. 构建 npm run build # 2. 启动(生产模式) npm run start -- -p 3000 # 3. 用进程管理器守护 npm install -g pm2 pm2 start "npm run start -- -p 3000" --name next-app pm2 save && pm2 startup
可选独立产物(Docker 优化):
// next.config.ts const nextConfig = { output: "standalone", // 生成最小独立产物(不含 node_modules 冗余) };
# Dockerfile FROM node:20-alpine AS deps WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci FROM node:20-alpine AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . RUN npm run build FROM node:20-alpine AS runner WORKDIR /app ENV NODE_ENV=production COPY --from=builder /app/.next/standalone ./ COPY --from=builder /app/.next/static ./.next/static COPY --from=builder /app/public ./public EXPOSE 3000 CMD ["node", "server.js"]
docker build -t next-app . docker run -d -p 3000:3000 -e DATABASE_URL=xxx next-app
注意:standalone 模式需配合 output: "standalone" 配置。
| 环境 | 用途 | 数据 |
|---|---|---|
| 开发(development) | 本地开发 | 本地数据库 |
| 预发布(preview) | PR 评审/联调 | 测试数据库 |
| 生产(production) | 线上 | 生产数据库 |
隔离纪律:环境变量按环境注入(Vercel 的环境配置 / 自托管的 .env.production)。
# .github/workflows/deploy.yml name: Deploy on: push: branches: [main] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci - run: npm run lint - run: npm run test:unit deploy: needs: test runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm ci - run: npm run build # 部署到自托管服务器(示例:rsync/ssh) - run: scp -r .next user@server:/app
CI 流程:提交 → lint+测试(闸门)→ 构建 → 部署 → 健康检查。
npm run build 通过,无类型错误| 误区 | 现象 | 正解 |
|---|---|---|
| 生产忘配置环境变量 | 启动失败/数据连不上 | 部署平台配置或 .env.production |
| 用 dev 模式跑生产 | 性能差、不安全 | 必须 build + start |
| 忘记迁移数据库 | 接口报错 | 部署流程包含迁移步骤 |
| 自托管没守护进程 | 服务器重启应用挂 | pm2/systemd |
| 构建产物含密钥 | 泄露 | 环境变量注入,不进产物 |
# 1. 准备 .env.example(提交)与 .env.production(平台配置) # 2. 推送 GitHub git remote add origin https://github.com/user/next-app.git git push -u origin main # 3. Vercel 导入(vercel.com → Add New Project → 选仓库) # 4. 配置环境变量:DATABASE_URL、AUTH_SECRET # 5. 点击 Deploy # 6. 绑定域名(Settings → Domains) # 7. 验证:访问线上域名,跑一遍核心流程 # 8. 配置 Vercel Analytics 监控 Web Vitals
从提交代码到线上可访问,全程在 Vercel 面板完成——这就是平台托管的效率。之后每次 push 到 main 自动部署,PR 自动出预览环境。
| 维度 | Vercel | 自托管 |
|---|---|---|
| 上手成本 | 极低 | 中 |
| 运维负担 | 平台负责 | 自己负责 |
| 边缘网络 | 内置 | 需自建 |
| 成本 | 免费额度/按量 | 服务器费用 |
| 掌控度 | 低 | 高 |
| 适合 | 团队/快速上线 | 合规/定制需求 |
| 事故 | 预防 |
|---|---|
| 环境变量缺失导致启动失败 | 启动时校验必要变量,fail fast |
| 迁移未执行导致接口报错 | CI/CD 里包含迁移步骤 |
| 密钥暴露 | .env.local 不入库,平台环境变量管理 |
| 版本回滚丢失数据 | 迁移前备份数据库 |
一句话:部署不是"最后一步",而是"持续的过程"——环境、迁移、监控、回滚都在部署流程里,做全了才叫"可靠上线"。
问:Vercel 和自托管怎么选?
小团队/快速上线/不想管服务器 → Vercel;合规要求/成本控制/完全掌控 → 自托管(Docker + 云服务器)。从 Vercel 起步,需要时再迁自托管。
问:自托管需要什么配置?
Node 20+、构建产物(build + start 或 standalone)、进程守护(pm2/systemd)、反向代理(Nginx,可选)、环境变量、HTTPS 证书。数据库单独部署(托管服务或云数据库)。
问:数据库迁移在生产怎么执行?
部署流程中加入迁移步骤:npx prisma migrate deploy(生产环境专用,只应用已有迁移)。迁移失败要先回滚代码再排查。
问:如何监控线上应用?
三件套:日志(控制台/日志服务)、错误追踪(Sentry)、性能指标(Vercel Analytics / 自建 RUM)。告警规则:错误率突增、可用性下降。
问:回滚怎么做?
Vercel 一键回滚到历史部署;自托管保留旧镜像/产物,出问题切换。"能快速回滚"比"部署得完美"更重要。