Skip to content
Go back

使用 Docker 部署 Gitea 服务端并配置 GitHub Webhook 来自动镜像仓库

| 0 Views Edit page

前言

作为境内无法访问 GitHub 的解决方案之一。


方案概述

  1. 使用 Docker 部署 Gitea 服务端
  2. 在 Gitea 中配置 GitHub 的镜像仓库
  3. 获取 Gitea 的 API Token
  4. 在 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 界面

二、在 Gitea 中配置 GitHub 的镜像仓库

点击右上角的 + 号,选择迁移外部仓库(New Migration)。
然后在迁移来源中选择 GitHub
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
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 页面查看请求状态: Recent Deliveries

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

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

结束。


Edit page