前言
作为境内无法访问 GitHub 的解决方案之一。
方案概述
- 使用 Docker 部署 Gitea 服务端
- 在 Gitea 中配置 GitHub 的镜像仓库
- 获取 Gitea 的 API Token
- 在 GitHub 配置 Webhook
操作步骤
一、使用 Docker 部署 Gitea 服务端
Docker 的安装可以参考我的另一篇文章:Ubuntu 20.04 从官方源安装最新的 Docker
创建工作目录并编写 docker-compose.yml 文件:
mkdir -vp /opt/gitea/data # 持久化 gitea 数据
cd /opt/gitea
nano docker-compose.yml
version: "3.8"
services:
gitea:
image: gitea/gitea:latest
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__service__DISABLE_REGISTRATION=true # 禁止用户注册
- GITEA__service__REQUIRE_SIGNIN_VIEW=true # 强制要求登录才能查看页面(如果你希望仓库完全私有化,不被游客看到)
restart: always
volumes:
- /opt/gitea/data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000" # Web UI
- "222:22" # SSH
启动:
docker compose up -d
访问 http://<服务器IP>:3000,按照提示完成 Gitea 的初始配置,创建管理员账号,之后登录就能看到 Gitea 的界面了:

二、在 Gitea 中配置 GitHub 的镜像仓库
点击右上角的 + 号,选择迁移外部仓库(New Migration)。
然后在迁移来源中选择 GitHub:

接着填写以下内容:
- 克隆地址:填写你要镜像的 GitHub 仓库的 HTTPS 地址(例如:
https://github.com/用户名/仓库名.git)。 - 访问令牌(Access Token):如果 GitHub 仓库是私有仓库,你需要提供 GitHub 的 Personal Access Token(在 GitHub 的 Developer Settings 中生成,权限需要包含
repo),我这里镜像的是公开仓库所以不需要。 - 该仓库将是一个镜像:勾选后,Gitea 才会定期从 GitHub 拉取更新(默认每 8 小时一次)。

最后点击迁移仓库,完成镜像仓库的创建。
稍等片刻就能在 Gitea 中看到刚刚迁移过来的仓库了:

三、获取 Gitea 的 API Token
由于 Gitea 镜像仓库默认是定时拉取,为了让 GitHub 能够通过 API 实时触发 Gitea 拉取代码,需要生成一个 Gitea 的访问令牌。
点击 Gitea 右上角的头像,进入设置,然后点击应用:

令牌名字我填的是 github-webhook-token,权限范围勾选 repository 的 读写:

然后生成令牌,它大概是下面这样的:
xxxx01ace5c22e7axxxxxxxxxxxxxxxxxxx
令牌只会显示一次,切记保存好。
四、在 GitHub 配置 Webhook
利用 Gitea 的 mirror-sync API 接口,我们就可以实现主动触发同步。
请求方式为:
curl -X POST http://<服务器IP或域名>:3000/api/v1/repos/<Gitea用户名>/<Gitea仓库名>/mirror-sync?token=<你的GiteaToken>
在我的例子中,它就是:
curl -X POST https://gitea.example.com/api/v1/repos/admin/one-click-scripts/mirror-sync?token=xxxx01ace5c22e7axxxxxxxxxxxxxxxxxxx
知道了原理,配置就简单了。
在对应的 GitHub 仓库的 Settings 中选择 Webhooks,然后点击 Add webhook:

然后填写内容:
- Payload URL:填写上面提到的 API 接口地址
https://gitea.example.com/api/v1/repos/admin/one-click-scripts/mirror-sync?token=xxxx01ace5c22e7axxxxxxxxxxxxxxxxxxx。 - Content type:选择
application/json。 - Secret:留空即可。
- Which events would you like to trigger this webhook:选择
Just the push event.(仅在推送代码时触发)。 - Active:勾选。

保存后,GitHub 会自动发送一个 ping 测试请求,你可以点击刚创建的 Webhook,进入 Recent Deliveries 页面查看请求状态:

如果返回 200,说明配置成功。
再切回到 Gitea 那边,就能看到已经触发了一次镜像同步:

之后再往 GitHub 的仓库推送代码,就会自动触发 Gitea 的镜像同步了。
结束。