本文目录导读:
代码提交后,自动完成构建、测试、部署,并让新版本应用无缝上线。
针对不同的全栈框架(如 Next.js、Nuxt.js、Spring Boot + React/Vue、Laravel + Vue 等)和部署目标(VPS、云服务器、Serverless、容器平台),方法略有不同。
以下是通用的、从入门到进阶的自动化部署方案指南,我将其分为 3 个层次。
第一层:基础入门(适合单体全栈应用)
场景:Next.js、Nuxt.js 等全栈框架,部署到单台 VPS 或云服务器。
核心流程:Git Push → CI(如 GitHub Actions)触发 → 服务器 SSH 拉取代码 → 执行 npm install/build → 重启 PM2/Docker。
技术栈:Git + GitHub Actions + PM2/Docker + Nginx
实战步骤(以 Next.js + PM2 为例):
-
服务器端准备:
- 安装 Node.js、Git、PM2。
- 使用
pm2 start npm --name "my-app" -- start启动项目,并配置开机自启。
-
配置 GitHub Actions(
.github/workflows/deploy.yml):name: Deploy to Server on: push: branches: [main] # 监听 main 分支推送 jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: SSH into server and deploy uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SERVER_SSH_KEY }} script: | cd /path/to/your/project git pull origin main npm install npm run build pm2 restart my-app- 说明:
secrets是在 GitHub 仓库 Settings → Secrets and variables 中配置的。
- 说明:
-
缺点:直接在服务器上编译,会占用服务器 CPU/内存;如果构建失败,需要手动回滚,不够平滑。
第二层:进阶优化(CD 与 Docker 容器化)
场景:使用 Docker 容器化应用,解决环境不一致问题,并加入构建缓存和自动化回滚。
核心流程:Git Push → CI 构建 Docker 镜像 → 推送到镜像仓库(Docker Hub/阿里云 ACR) → SSH 登录服务器拉取新镜像 → 替换旧容器。
技术栈:Docker + Docker Compose + GitHub Actions + 镜像仓库
实战步骤:
-
编写 Dcokerfile(以 Node.js 全栈项目为例):
# 多阶段构建 FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM node:18-alpine AS runner WORKDIR /app COPY --from=builder /app/.next ./.next COPY --from=builder /app/public ./public COPY --from=builder /app/package.json ./ COPY --from=builder /app/node_modules ./node_modules EXPOSE 3000 CMD ["npm", "start"]
-
编写 docker-compose.yml:
version: '3.8' services: app: image: your_dockerhub_username/my-app:latest container_name: my-app restart: always ports: - "3000:3000" environment: - NODE_ENV=production - DATABASE_URL= # 你的数据库连接串 -
优化 GitHub Actions(构建镜像,推送,远程部署):
name: Build & Deploy with Docker on: push: branches: [main] jobs: build-and-push: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build Docker image run: docker build -t your_dockerhub_username/my-app:${{ github.sha }} . - name: Push to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - run: docker push your_dockerhub_username/my-app:${{ github.sha }} - name: Deploy to Server via SSH uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SERVER_SSH_KEY }} script: | cd /path/to/docker-compose docker compose down # 更新 docker-compose.yml 中的镜像版本或直接拉取 docker pull your_dockerhub_username/my-app:${{ github.sha }} # 更新 docker-compose.yml 中 image 标签为新版本 sed -i "s|image: your_dockerhub_username/my-app:latest|image: your_dockerhub_username/my-app:${{ github.sha }}|g" docker-compose.yml docker compose up -d # 清理旧镜像 docker image prune -f- 优点:构建在 CI 环境中完成,不消耗服务器资源;Docker 保证了环境一致性;回滚只需重新
docker compose up -d上一个标签。
- 优点:构建在 CI 环境中完成,不消耗服务器资源;Docker 保证了环境一致性;回滚只需重新
第三层:企业级方案(平台即服务与 Kubernetes)
如果不想管理服务器,或者应用需要自动扩容、零停机部署,推荐使用平台即服务或 Kubernetes。
方案 A:使用平台即服务(Neon/Zeabur/Fly.io 等)
- 代表框架:Next.js、Nuxt.js、SvelteKit。
- 怎么做:
- 全栈特例:如果使用 Next.js,Vercel 能够自动将前端静态资源分发到全球 CDN,将 API Routes / Server Actions 部署到边缘节点或 Serverless 函数。无需手动配置 Nginx 反向代理。
方案 B:基于 Kubernetes 的 GitOps(ArgoCD / Flux)
- 适用:大型团队,微服务架构,需要精细化的流量管理(蓝绿部署、金丝雀发布)。
- 流程:
- CI(Jenkins/GitHub Actions)构建 Docker 镜像。
- 自动更新 Git 仓库中的 Kubernetes 清单文件(
deployment.yaml)。 - ArgoCD 或 Flux 检测到 Git 仓库中的更改,自动将新版本部署到 Kubernetes 集群。
- 优点:声明式:Git 仓库是集群状态的唯一真实来源;自动同步:集群状态始终与 Git 保持一致;回滚简单:只需
git revert。
关键常见问题与解决方案
- 环境变量泄露:
- 不要写在代码或
docker-compose.yml里。 - 正确做法:在 CI(GitHub Actions Secrets)中配置,或在平台(Vercel/Railway)的环境变量设置页面配置,在服务器上使用
.env文件或 Kubernetes Secrets。
- 不要写在代码或
- 数据库迁移:
- 全栈应用经常需要改数据库结构。
- 做法:在部署脚本中,
npm run build之后,在启动新版本前,执行npm run db:migrate,注意要确保迁移是幂等的且向后兼容。
- 零停机部署:
- Docker Swarm/K8s:天然支持滚动更新。
- 单台服务器:使用 PM2 的集群模式(
pm2 start npm --name "app" --start -i max),它会在新旧版本之间进行优雅切换(reload)。 - Nginx:配置
upstream指向不同端口的应用实例,通过脚本切换端口。
- 静态资源与 CDN:
- 前端经构建后,最好将静态资源(
._next/static或dist/assets)上传到 CDN(如阿里云 OSS + CDN、AWS S3 + CloudFront)。 - CI 脚本中增加一步:
aws s3 sync .next/static s3://your-bucket/_next/static。
- 前端经构建后,最好将静态资源(
总结建议
- 个人项目 / 小团队:选择 Docker + GitHub Actions + 单机部署(第二层),投入产出比最高,既能优雅解决问题,又不需要学习太多新概念。
- 追求极速开发 / 不想管服务器:直接选 Vercel(前端+全栈) + Supabase/Neon(数据库),几乎不需要写部署脚本。
- 公司项目 / 高并发要求:选择 Kubernetes + Helm + ArgoCD,流程规范,安全可控,支持灰度发布。
标签: Pipeline