后端服务自动化部署:从手动上线到一键发布

小王刚改完一个订单超时的 bug,测试通过后,得登录三台服务器,逐个拉代码、停服务、清缓存、启新进程……等全部搞定,已经晚上十点。隔壁组用 Jenkins 配了条流水线,点一下「Deploy」,5 分钟后服务就跑在生产环境上了——连日志都自动归档好了。

为什么非得自动

手动部署不是不能用,但一出错就是线上事故。比如漏删旧配置、忘记重启某个实例、某台机器没同步代码……这些事在开发机上没问题,到了线上可能直接导致用户下单失败。更现实的是:人会累、会忘、会下班。而自动化脚本不会。

最常用的组合:Git + Shell + Nginx

不用一上来就搞 Kubernetes。很多中小项目,靠几行 Shell 脚本就能解决 80% 的部署问题。比如把代码推到 Git 仓库后,触发一个 webhook,服务器收到请求就自动执行:

#!/bin/bash
cd /var/www/my-api
git pull origin main
npm install --production
pm restart app.js
systemctl reload nginx

配上简单的权限控制和日志记录,比人工 ssh 进去敲命令稳得多。

进阶一点:用 GitHub Actions 直接管生产

如果你的后端代码托管在 GitHub,可以直接用 Actions 写个部署流程。比如 push 到 prod 分支就自动发布

name: Deploy to Server
on:
  push:
    branches: [prod]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USER }}
          key: ${{ secrets.KEY }}
          source: "dist/"
          target: "/var/www/my-api/"
      - uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USER }}
          key: ${{ secrets.KEY }}
          script: |
            cd /var/www/my-api
            pm2 reload ecosystem.config.js

密钥、IP、用户名全藏在仓库 Secrets 里,安全又干净。

别光顾着跑通,监控和回滚也得跟上

自动化不是「发完就完」。上线后接口 502?延迟飙升?得配个简单健康检查脚本:

curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/health | grep "200" || (echo "Health check failed" && pm2 revert app)

配合 pm2 的版本管理,出问题秒级回退,比翻 git log 找 commit 再重推快多了。

其实自动化部署没那么玄乎,核心就三点:代码能一致地拉下来、服务能稳定地启起来、出错了能快速地撤回去。工具只是手段,目标是让自己少熬夜,让线上少报警。