雨云VPS用webhook做Git自动部署

用 webhook + 裸仓库在雨云VPS上实现 push 即上线,密钥不出机、比 CI 平台更轻
发布于 更新于
4

为什么不直接上 CI/CD 平台

先说我的取舍:小项目、个人站、或者服务器本身就不想对第三方暴露部署密钥的场景,GitHub Actions 这类托管 CI/CD 其实有点重。它要你把服务器 SSH 私钥或者部署令牌交给平台托管,还得配 runner。我更想让”push 一下就上线”这件事完全跑在自己这台雨云 VPS 上,密钥不出机器。webhook 自动部署就是干这个的:一个轻量脚本在服务器上听着,Git 平台一推就触发拉取和发布,逻辑你全看得见。

webhook 自动部署到底干了啥

流程很短,但得先理清:

  1. 你在本地 git push 到 Gitea、GitHub 或 GitLab。
  2. 平台按配置向你的服务器发一个 HTTP POST(就是 webhook)。
  3. 服务器上的小脚本收到请求,进入网站目录执行 git pull,再按需要重新构建或重启服务。

核心就是”推代码 → 通知 → 拉取 → 发布”四步。比起把整条流水线交给 CI 平台,webhook 只借平台的”通知”能力,真正干活的全在你自己机器上。很多 VPS测评 只比配置和带宽,这种部署链路顺不顺反而没人聊,但它直接决定你改一行代码要花多少时间。

在雨云上把这套跑起来

我习惯用裸仓库(bare repo)加 post-receive 钩子,最省事,不用额外起 web 服务:

# 在雨云VPS上,用部署专用账户
mkdir -p /home/deploy/site.git && cd /home/deploy/site.git
git init --bare

hooks/post-receive

#!/bin/bash
TARGET=/var/www/my-site
GIT_DIR=/home/deploy/site.git
git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f
cd $TARGET && npm run build 2>/dev/null || true
systemctl restart my-app 2>/dev/null || true

给钩子加执行权限 chmod +x hooks/post-receive,然后在 Git 平台把仓库的 webhook 指向你的服务器 IP 加端口(或走 SSH 推送地址)。如果你不想开端口,纯用 SSH 推送的 bare repo 方案连 web 服务都不用起,最省心。

如果你更想要一个能收 HTTP webhook 的入口(比如配合 Gitea 的 webhook URL),起个最小的 Flask 或 Node 脚本监听一个高位端口,收到带正确 token 的请求才 git pull,也行。国内机房节点记得在控制台安全组和系统防火墙只放行你信任的来源,别把钩子端口裸开在公网。

和你已经跑的服务怎么衔接

  • 宝塔 / 1Panel 面板:面板里的网站根目录就是 git checkout 的目标,钩子把代码拉进去,面板负责 Nginx 和 PHP 运行,两边不冲突。建站流程里那套从零部署 WordPress的思路也能套:把 wp-content 或主题放进仓库,push 即同步。
  • 数据库:发布前最好先对 MySQL 做个备份(MySQL 安装备份调优里讲的定时 dump 思路),万一代码带崩了配置还能回退。
  • 和 GitHub Actions 的取舍GitHub Actions 一键推上云服务器适合多人协作、要跑测试再发布的团队;webhook 裸仓库方案适合一个人、求快、密钥不想出机的场景。两者不矛盾,甚至可以 Actions 跑测试、通过后调你服务器的 webhook 做发布。

几个我踩过的坑

  • 钩子环境找不到 git:post-receive 跑在受限 shell 下,有时 git 不在 PATH。脚本开头显式写 export PATH=/usr/bin:/bin:$PATH,或者直接用绝对路径。
  • 权限问题:web 服务(www-data / nginx)要对目标目录有读权限,部署账户要对它有写权限。我一般把目录属主设成部署账户,再让 www-data 进同一个组。
  • 构建产物目录:前端项目 git pull 后记得 npm run build,并把 Nginx 根目录指到 dist 而不是仓库根,不然会暴露 .git
  • 回滚:出问题别手忙脚乱。要么 git checkout 上一个commit,要么部署前先 git tag,回滚就是切回旧 tag。
  • secret 校验:公网收 webhook 一定要带 token 校验,不然谁都能打你接口触发拉取。GitHub/Gitea 都支持在 URL 里拼 ?secret=xxx 或在 header 里带签名,脚本里比对一下再执行。

香港、美国节点的几点提醒

香港VPS、美国VPS 这些免备案VPS 节点公网直连方便,收 webhook 不用绕,但同样别裸开端口;用 token 校验 + 安全组限制来源是最低要求。价格上雨云这类节点便宜、性价比高,拿来跑个人站和自动部署很合适。如果你还没开机器,用雨云优惠码 admin01 五折开一台小规格先把这套部署链路跑通,比每次手动 scp 强太多。

使用雨云云服务器及本文所述的自动部署方案,请遵守《网络安全法》《个人信息保护法》《数据安全法》等相关规定,仅部署你拥有合法权利的代码与内容,不将相关能力用于突破国家网络管控或任何违法违规用途。

常见问题(FAQ)

雨云VPS做 webhook 自动部署需要开放什么端口?
如果用 SSH 推送的 bare repo 方案,根本不用开端口,纯靠 git 协议。如果起 HTTP web 服务收 webhook,监听一个高位端口即可,但国内机房节点要在控制台安全组和系统防火墙里只放行你信任的来源,别裸开在公网。
webhook 部署怎么防止别人伪造 push 请求?
公网收 webhook 必须带 token 校验:在 URL 里拼 ?secret=xxx 或比对 GitHub/Gitea 下发的签名 header,脚本里不一致就直接拒绝执行。没校验的钩子等于谁都能打你接口触发拉取。
宝塔或 1Panel 面板里的网站,能用 webhook 自动更新吗?
可以。面板负责 Nginx 和 PHP 运行,你把网站根目录设成 git checkout 的目标目录,钩子把代码拉进去就行,两边不冲突。前端项目记得 build 后把 Nginx 根指到 dist。
和 GitHub Actions 比,自己搭 webhook 有什么优缺点?
优点是密钥不出机、逻辑全看得见、部署延迟低,适合个人站和小项目;缺点是要自己维护钩子脚本和回滚,没有 Actions 那套现成的测试矩阵。两者也能配合:Actions 跑测试,通过后再调你服务器的 webhook 做发布。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600

用雨云 KVM 云服务器 Docker 自建 Gotify 推送服务:把监控告警与脚本结果实时推手机,不限条数、数据自管,联动 Uptime Kuma/Watchtower,含优惠码 admin01 五折。

用雨云 KVM 云服务器 Docker 自建 Drone 持续集成,Drone server+runner 接 Gitea OAuth,写 .drone.yml 实现提交即构建。含 RPC_SECRET 坑、HTTPS 反代与优惠码 adm