小王刚改完一个订单超时的 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 再重推快多了。
其实自动化部署没那么玄乎,核心就三点:代码能一致地拉下来、服务能稳定地启起来、出错了能快速地撤回去。工具只是手段,目标是让自己少熬夜,让线上少报警。