返回文档
GitHub 集成

自动部署

通过服务器上始终在线的 webhook worker,将每次推送到您跟踪的 GitHub 分支都自动部署。

Intermediate12 min readUpdated 2026-07-21

自动部署的工作原理

每当 GitHub 为应用所跟踪的分支发送 push 事件时,自动部署就会重新部署该 GitHub 应用。Server Compass 会在您的服务器上安装一个始终在线的网关和私有部署 worker,创建仓库 webhook,验证 GitHub 已签名的测试投递,并将该确切的 commit 排入部署队列。

设置完成后,Server Compass 桌面应用无需保持打开。服务器端运行时会随 Docker 一起重启,并持续接收 webhook、构建应用并记录部署历史。您的 SSH 端口可以保持私有;只有 webhook 主机名必须能被 GitHub 通过 HTTPS 访问到。

前提条件

开始之前,请确认您已具备:

  • 一个已从 GitHub 仓库部署的 Docker 应用
  • 已选择 Build on VPS 作为构建位置;webhook 自动部署 v1 不支持 GitHub Actions 构建
  • 应用的 Server Compass 目录内有一个受管的 Git 检出
  • 一个已关联、并有权限创建仓库 webhook 的 GitHub 账户
  • 服务器上安装了 Docker Engine 和 Docker Compose
  • 一个专用的公开 HTTPS 主机名,例如 deploy.example.com
  • 从该主机名到 webhook 网关的路由

自动部署会跟随已部署应用上保存的分支。每次推送到该确切分支都会将 GitHub 事件中包含的 commit 排入队列;对其他分支的推送会被忽略。

设置应用

  1. 在 Server Compass 中,将仓库部署为 GitHub 应用。
  2. 部署时选择 Build on VPS
  3. 打开已部署的应用,前往 Deployments
  4. 找到 自动部署 卡片,点击 Set up Auto Deploy
  5. 输入一个公开的 webhook 主机名。仅使用主机名或 HTTPS origin,例如 deploy.example.comhttps://deploy.example.com。请勿添加路径、查询字符串或自定义端口。

该主机名是 GitHub 的公开入口。仅有一个域名还不够:DNS、TLS、防火墙或 NAT 规则,以及您的代理或隧道,必须共同构成一条通往服务器上网关的完整路由。

选择 GitHub 访问服务器的方式

这三种路由选项都使用相同的已签名 webhook 和私有部署 worker。只有公开路由不同。

Server Compass 托管的 Traefik

当 Server Compass 托管的 Traefik 已经是服务器上的公开反向代理时,使用此选项。将主机名的 DNS 记录指向服务器,并确保入站端口 80 和 443 可以到达它。Server Compass 会将 webhook 网关接入现有的 traefik-public Docker 网络,并配置 HTTPS 主机路由。

对于公开的 VPS,这通常是最简单的选项。当路由器将端口 80 和 443 转发到某台 LAN 服务器,且主机名解析到路由器的公网 IP 时,它也可用于该 LAN 服务器。

现有的反向代理

当 Nginx、Caddy、Traefik、HAProxy 或其他代理已经处理该主机名时,使用此选项。点击 Check server 获取生成的 loopback 目标,然后将 webhook 主机名路由到显示的地址,例如 http://127.0.0.1:42315

代理必须保留原始请求正文和 GitHub webhook 请求头,以便网关能够验证 HMAC 签名。请勿在此路由前放置登录中间件、Cloudflare Access 或其他交互式身份验证页面。

如果代理运行在 Docker 中,请记住代理容器内的 127.0.0.1 指的是该容器本身。请改用 host 网络、host-gateway 地址或合适的共享 Docker 网络。

稳定隧道

对于 LAN 服务器、私有 VPS、CGNAT 连接,或任何您不想开放入站端口的服务器,使用此选项。创建一个持久的具名 Cloudflare Tunnel 或等效隧道,在服务器上运行其连接器,并将公开主机名映射到 Check server 显示的 loopback 目标,例如 http://127.0.0.1:42315

隧道必须稳定,并在重启后自动启动。临时的 Quick Tunnel 或重启后会变化的 ngrok URL 不适用,因为 GitHub 会存储该 webhook URL。如果连接器运行在 Docker 中,请为其提供 host 网络或另一条确实能到达主机上网关的路由。

检查服务器并激活

  1. 点击 Check server
  2. 确认 Docker Engine、Docker Compose 和建议的网关端口通过就绪检查。
  3. 如果您选择了托管的 Traefik,请确认 traefik-public 网络也通过检查。
  4. 如果您选择了现有代理或稳定隧道,请将外部路由指向结果中显示的确切 loopback 端口以完成配置。
  5. 点击 Activate Auto Deploy

Server Compass 会安装网关和 worker,创建一个私有 webhook URL,将签名密钥存储在服务器上,在 GitHub 中创建 webhook,发送一次 GitHub ping,并等待一次成功的已签名投递。状态会依次经过 InstalledRoutedHookedVerifiedActive

如果设置停留在 Awaiting route,说明运行时已安装,但 GitHub 尚无法访问它。请完成或修正 DNS、TLS、防火墙/NAT、代理或隧道路由,然后点击 Continue setup。您无需重新安装该应用。

验证自动部署

首先确认公开的健康检查端点能到达 Server Compass 网关:

curl -fsS https://deploy.example.com/healthz

然后验证完整的部署流程:

  1. 在 GitHub 中打开仓库,前往 Settings > Webhooks
  2. 打开 Server Compass 创建的 webhook,确认其最近一次投递返回了 2xx 响应。
  3. 向跟踪的分支推送一个小的 commit。
  4. 在 Server Compass 中打开应用的部署历史,确认该 webhook 任务使用了所推送的 commit。
  5. 确认已部署的应用包含该更改。

作为最后的测试,请完全退出 Server Compass,向跟踪的分支再推送一个 commit,然后再次验证应用。由于网关、队列和 worker 都运行在服务器上,部署应当仍能完成。

管理已激活的 webhook

自动部署卡片提供以下操作:

  • Test webhook 会发送另一次 GitHub 测试投递并刷新其状态。
  • Rotate secret 会同时替换服务器和 GitHub webhook 上的签名密钥。
  • Pause 会保留目标和历史,但停止自动部署;Resume 会再次启用。
  • Remove 会删除 GitHub webhook 及其远程目标策略,同时保留部署历史。

若要更改所跟踪的仓库或分支,请先移除自动部署,用新的仓库或分支更新并重新部署应用,然后再次设置自动部署。

故障排查与安全

  • 健康检查端点失败或返回 502/404: 请验证 DNS 和 TLS,确认代理或隧道指向当前的 loopback 端口,并确保网关容器正在运行。
  • GitHub 投递不是 2xx 请检查该 webhook 最近的投递,确认没有身份验证层拦截 GitHub,并确保代理没有更改原始正文或移除 GitHub 请求头。
  • 推送不触发部署: 请确认自动部署处于 Active 而非 Paused 状态,且推送发生在确切的跟踪分支上。
  • 隧道在重启前一直正常: 请将具名隧道连接器配置为系统服务或可重启的容器。请勿使用临时 URL。
  • 桌面应用已关闭且部署失败: 请检查服务器是否在线,以及 Server Compass 网关和 worker 容器是否正在运行。

webhook URL 包含一个私有路由令牌,不应公开。GitHub 投递通过一个 HMAC 签名密钥进行认证,该密钥在服务器上生成并存储,且从不在 UI 中显示。您无需将 SSH、Docker socket 或私有 worker 暴露到互联网。

Screenshots

自动部署 - Screenshot 1
自动部署 - Screenshot 2
自动部署 - Screenshot 3
自动部署 - Screenshot 4
自动部署 - Screenshot 5
自动部署 - Screenshot 6
自动部署 - Screenshot 7

Ready to try Server Compass?

Download the app and deploy your first application in under 5 minutes.

Download Server Compass