Gitea + Webhook 自动部署完整教程
🚀 Gitea + Webhook 自动部署完整教程(规范版)
适用场景:代码推送到 Gitea 后,自动触发部署脚本,将构建产物发布到指定目录。支持多项目扩展。
📖 目录
📁 一、项目结构
假设项目根目录为 /home/<your-user>/webhook-project/(可根据实际情况调整)。
1 | webhook-project/ |
🐳 二、核心配置文件
2.1 docker-compose.yml
位置:/home/<your-user>/webhook-project/docker-compose.yml
1 | # Docker Compose 版本(使用 3.8 支持最新特性) |
2.2 Dockerfile
用途说明:
almir/webhook 官方镜像是一个精简的 Alpine Linux 基础镜像,仅包含 Webhook 服务本身,没有安装 git 和 rsync。而我们的部署脚本需要执行 git pull 拉取代码、rsync 同步文件,因此需要通过自定义 Dockerfile 来安装这两个依赖工具。
此外,官方镜像默认以非 root 用户运行,没有权限向系统目录写入文件,因此需要在 Dockerfile 中先切换到 root 用户才能执行 apk add 安装软件包。
位置:/home/<your-user>/webhook-project/data/webhook/Dockerfile
1 | FROM almir/webhook:latest |
构建说明:
在 docker-compose.yml 中,我们使用了 build: ./data/webhook 而非 image: almir/webhook:latest,这样 Docker Compose 会读取此 Dockerfile 构建一个包含 git 和 rsync 的自定义镜像,而不是直接使用官方原版镜像。
1 | services: |
2.3 hooks.json
位置:/home/<your-user>/webhook-project/data/webhook/hooks.json
1 | [ |
生成密钥:
openssl rand -hex 32,将输出替换YOUR_SECRET_KEY_HERE。
2.4 通用部署函数
位置:/home/<your-user>/webhook-project/data/webhook/scripts/common/deploy.sh
⚠️ 注意:以下脚本适用于 Hexo 源码仓库(包含
source/、themes/、package.json)。如果你的仓库直接存放的是 Hexo 生成的静态文件(即仓库根目录就是index.html、archives/等),请使用下方的 「静态文件直接同步版」 脚本。
Hexo 源码构建版(推荐):
1 |
|
静态文件直接同步版(适用于仓库直接存放 Hexo 生成产物):
如果你的 Gitea 仓库直接存放的是 Hexo 生成的静态文件(即仓库根目录是 index.html、archives/ 等),使用此版本:
1 |
|
2.5 Hexo 入口脚本
位置:/home/<your-user>/webhook-project/data/webhook/scripts/hexo/deploy.sh
1 |
|
2.6 赋予执行权限
1 | cd /home/<your-user>/webhook-project |
🚀 三、启动 Webhook 服务
3.1 准备 Docker 网络(如未创建)
1 | docker network create ipbridge |
3.2 构建并启动
1 | cd /home/<your-user>/webhook-project |
3.3 查看运行状态
1 | docker-compose ps |
📦 四、初始化项目工作区
Webhook 容器内需要有一个包含 .git 的完整工作区,用于执行 git pull。
4.1 进入 Webhook 容器
1 | docker exec -it webhook /bin/sh |
4.2 初始化 Hexo 项目
1 | # 创建工作区目录 |
4.3 检查仓库分支
1 | git branch -a |
如果看到 master 分支,脚本中的 git pull origin master 会正常工作。如果看到 main 分支,请修改脚本中的分支名。
4.4 安装项目依赖(仅源码版需要)
如果你的仓库是 Hexo 源码(有 package.json):
1 | npm install |
4.5 测试构建(仅源码版需要)
1 | npx hexo generate |
4.6 退出容器
1 | exit |
🔗 五、Gitea 端配置
5.1 修改 Gitea 配置文件(允许 Webhook 目标)
Gitea 默认限制 Webhook 可访问的主机,需要将 webhook 加入白名单。
找到 Gitea 的 app.ini 文件(宿主机路径示例):
1 | /home/<your-user>/docker/gitea/data/gitea-data/gitea/conf/app.ini |
添加以下配置:
1 | [webhook] |
如果希望更宽松,可设为
ALLOWED_HOST_LIST = *(不推荐生产环境)。
保存后重启 Gitea 容器:
1 | docker restart gitea |
5.2 在 Gitea 仓库中添加 Webhook
- 登录 Gitea,进入你的仓库页面。
- 点击 仓库设置 → Webhook → 添加 Webhook → 选择 Gitea。
填写配置:
| 配置项 | 填写内容 |
|---|---|
| 目标 URL | http://webhook:9000/hooks/deploy-hexo |
| HTTP 方法 | POST |
| POST 内容类型 | application/json |
| 密钥 | 填入 hooks.json 中生成的密钥 |
| 触发条件 | 选择 Push Events |
| 激活 | ✅ 勾选 |
- 点击 添加 Webhook 保存。
5.3 测试 Webhook
在 Webhook 列表页面,点击 测试推送,查看投递记录:
- 状态码应为
200 OK - 响应内容应为
Hexo deployment triggered successfully.
✅ 六、验证完整流程
6.1 提交代码触发部署
在本地修改 Hexo 源码并推送:
1 | git add . |
6.2 查看部署日志
1 | # Webhook 服务日志 |
6.3 检查部署结果
1 | ls -la data/deploy/hexo/ |
应该能看到 Hexo 生成的静态文件(index.html、archives/ 等)。
➕ 七、添加新项目(扩展多仓库)
7.1 在 hooks.json 中添加新钩子
1 | { |
7.2 创建入口脚本
**data/webhook/scripts/vuepress/deploy.sh**:
1 |
|
赋予执行权限:
1 | chmod +x data/webhook/scripts/vuepress/deploy.sh |
7.3 初始化工作区
1 | docker exec -it webhook /bin/sh |
7.4 在 Gitea 中配置 Webhook
目标 URL 为:http://webhook:9000/hooks/deploy-vuepress
🔧 八、常见问题排查
| 问题 | 解决方法 |
|---|---|
| Dockerfile 构建失败(权限) | 确认已添加 USER root |
| 无法克隆仓库 | 检查 Gitea 容器名和网络,或使用宿主机 IP |
git pull 失败(分支名错误) |
检查分支是 master 还是 main,修改脚本中对应的分支名 |
git pull 失败(权限) |
确保 /workspace/ 挂载不是只读(去掉 :ro) |
| Webhook 请求被拒绝 | 修改 Gitea 的 ALLOWED_HOST_LIST 并重启 Gitea |
| npm install 慢 | 设置淘宝镜像:npm config set registry https://registry.npmmirror.com |
| rsync 没有权限写入 | 检查宿主机目录权限:chmod 755 data/deploy/hexo |
| Hexo 构建失败 | 确认 package.json 中有 hexo 和 hexo-cli 依赖 |
脚本报错 bad interpreter: No such file or directory |
确认脚本 shebang 是 #!/bin/sh 而非 #!/bin/bash(镜像无 bash) |
📊 九、路径规范总览
| 用途 | 宿主机路径 | 容器内路径 |
|---|---|---|
| 所有项目工作区 | data/workspace/ |
/workspace/ |
| Hexo 工作区 | data/workspace/hexo/ |
/workspace/hexo/ |
| 所有项目部署目标 | data/deploy/ |
/deploy/ |
| Hexo 部署目标 | data/deploy/hexo/ |
/deploy/hexo/ |
| Webhook 配置 | data/webhook/hooks.json |
/etc/webhook/hooks.json |
| 所有项目脚本 | data/webhook/scripts/ |
/scripts/ |
| 通用脚本 | data/webhook/scripts/common/ |
/scripts/common/ |
| Hexo 脚本 | data/webhook/scripts/hexo/ |
/scripts/hexo/ |
| 所有项目日志 | data/webhook/scripts/logs/ |
/scripts/logs/ |
| Hexo 日志 | data/webhook/scripts/logs/hexo.log |
/scripts/logs/hexo.log |
💎 十、总结
这套方案的核心优势:
- 通用性强:一套配置支持任意多个项目。
- 目录规范:
workspace/、deploy/、webhook/三个核心目录平级,职责清晰。 - 易于扩展:新增项目只需添加钩子配置、创建脚本、初始化工作区三步。
- 安全可控:支持 HMAC 签名验证,可配置允许的主机列表。
- 便于迁移:所有数据集中在
data/下,可整体迁移。
每次 git push 后,Gitea 自动通知 Webhook 服务,触发拉取、构建、部署全流程。🚀
📌 重要提示
分支名适配
根据你的仓库实际情况,在 data/webhook/scripts/common/deploy.sh 中修改分支名:
- 如果仓库默认分支是
master:git pull origin master - 如果仓库默认分支是
main:git pull origin main
shebang 说明
almir/webhook 镜像基于 Alpine Linux,默认只有 sh 而没有 bash,因此所有脚本必须使用 #!/bin/sh 作为第一行。
两种部署模式
| 模式 | 仓库内容 | 适用脚本 |
|---|---|---|
| 源码模式 | source/、themes/、package.json |
Hexo 源码构建版 |
| 静态模式 | index.html、archives/、post/ |
静态文件直接同步版 |
请根据你的仓库实际情况选择对应的 deploy.sh 版本。
