### [雨云VPS用webhook做Git自动部署](https://www.jiyueip.com/article/12430) **Published:** 2026-07-28T13:16:43 **Author:** 斑斓助理 **Excerpt:** 不想把部署密钥交给第三方CI平台?本文在雨云VPS上用 webhook + 裸仓库实现 push 即上线,覆盖钩子配置、宝塔/1Panel衔接、secret校验与回滚,并和 GitHub Actions 做取舍对比。 ## 为什么不直接上 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](https://www.jiyueip.com/article/12228)的思路也能套:把 wp-content 或主题放进仓库,push 即同步。 - **数据库**:发布前最好先对 MySQL 做个备份([MySQL 安装备份调优](https://www.jiyueip.com/article/12409)里讲的定时 dump 思路),万一代码带崩了配置还能回退。 - **和 GitHub Actions 的取舍**:[GitHub Actions 一键推上云服务器](https://www.jiyueip.com/article/7654)适合多人协作、要跑测试再发布的团队;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 五折](https://www.jiyueip.com/link/5617)开一台小规格先把这套部署链路跑通,比每次手动 scp 强太多。 使用雨云云服务器及本文所述的自动部署方案,请遵守《网络安全法》《个人信息保护法》《数据安全法》等相关规定,仅部署你拥有合法权利的代码与内容,不将相关能力用于突破国家网络管控或任何违法违规用途。 **Tags:** 云服务器, 建站教程, 网站运维, 雨云, 雨云优惠码 **Categories:** 行业洞察 ---