向你自己的服务器推送代码更新。SSH 连接,拉取代码,重启服务。或者封装成一行部署脚本。典型应用的部署时间:10–30 秒。
SSH 连接到服务器:
ssh deploy@your-server-ip
进入项目目录并拉取代码:
cd /var/www/myapp
git pull origin main
安装新依赖(仅当 package.json / requirements.txt 有变动时才需要):
npm install --production
# or: pip install -r requirements.txt
# or: bundle install --deployment
构建项目(如有需要):
npm run build
重启服务:
# If using systemd:
sudo systemctl restart myapp
# If using pm2:
pm2 reload myapp
# If using Docker:
docker compose pull && docker compose up -d
就这些——新代码已经上线了。
你会频繁执行这些操作,用脚本能省下不少时间。在服务器上创建 deploy.sh:
#!/usr/bin/env bash
set -euo pipefail
cd /var/www/myapp
git pull origin main
npm install --production
npm run build
sudo systemctl restart myapp
echo "✓ Deployed at $(date)"
赋予执行权限:chmod +x deploy.sh。之后 SSH 进来,一条命令搞定重新部署:
./deploy.sh
甚至不需要手动 SSH——在你的 Mac 上直接用脚本搞定:
# deploy.sh on your laptop
#!/usr/bin/env bash
ssh deploy@your-server-ip '/var/www/myapp/deploy.sh'
或者直接内联执行:
ssh deploy@your-server-ip 'cd /var/www/myapp && git pull && npm install --production && npm run build && sudo systemctl restart myapp'
sudo systemctl restart myapp 要求输入密码,脚本就会卡住。在 /etc/sudoers.d/myapp-restart 中添加一条规则,允许部署用户无需密码执行这一条命令。
简单粗暴地重启会中断正在处理的请求。真正的生产环境需要更稳健的方案:
Type=notify — 服务就绪后主动通知 systemd,再由 systemd 关闭旧实例,停机窗口比默认重启更小。up -d — 对于 Compose 管理的服务,设置 deploy.update_config 后 Docker 会自动滚动替换容器。想在每次推送到 main 时自动部署,最简单的几种方案:
workflow_dispatch 或 on: push: main 触发,Action 执行 ssh ... 'deploy.sh'。需要将 SSH 部署密钥存储为 GitHub Secret。deploy.sh。注意:公网 Webhook 端点需要验证签名(原理与Stripe Webhook 类似)。如果新部署出了问题:
cd /var/www/myapp
git reset --hard HEAD~1 # back to the previous commit
npm install --production
npm run build
sudo systemctl restart myapp
这会回退到上一个提交。长期来看更好的做法是:将最近 N 个版本保存在带编号的目录中,用符号链接 current 指向当前版本——这样无需重新构建即可立即回滚。