Files
billai/WEBHOOK_SETUP.md
CHE LIANG ZHAO 05ab270677 feat: 添加 Gitea webhook 自动部署功能
- 新增独立的 webhook 服务 (Go, 端口 9000)
- HMAC-SHA256 签名验证
- 零停机热更新部署
- 自动清理旧镜像
- 完整配置文档 WEBHOOK_SETUP.md
- 精简 README 版本历史为表格形式
2026-01-13 14:37:01 +08:00

491 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 自动部署配置指南
这个指南将帮助你配置 Gitea webhook 以实现代码推送时的自动部署。
## 整体架构
```mermaid
flowchart TD
A[🏠 Gitea<br/>代码仓库] -->|Push Event| B[🔗 Webhook Service<br/>Port 9000]
B -->|验证签名| C{签名有效?}
C -->|❌ 无效| D[拒绝请求]
C -->|✅ 有效| E{主分支?}
E -->|❌ 否| F[跳过部署]
E -->|✅ 是| G[📜 Deploy Script<br/>deploy.sh]
G --> H[📥 git pull<br/>拉取最新代码]
H --> I[🔨 热更新部署<br/>零停机]
I --> J[🧹 清理旧镜像]
J --> K[🏥 健康检查]
K --> L[✅ 部署完成]
style A fill:#f9f,stroke:#333
style B fill:#bbf,stroke:#333
style G fill:#bfb,stroke:#333
style L fill:#9f9,stroke:#333
```
## 第一步:生成 Webhook Secret
打开终端,运行以下命令生成安全的随机密钥:
```bash
# Linux / macOS
openssl rand -hex 32
# Windows PowerShell
[System.BitConverter]::ToString([System.Security.Cryptography.RandomNumberGenerator]::GetBytes(32)).Replace('-','').ToLower()
```
示例输出:
```
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
```
## 第二步:配置 docker-compose.yaml
编辑 `docker-compose.yaml` 文件中的 webhook 服务配置:
### 设置 Secret
```yaml
webhook:
environment:
WEBHOOK_SECRET: "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6" # 替换为你生成的 Secret
```
### 配置仓库路径(关键)
**重要!** 根据你的部署方式修改挂载路径:
#### 如果使用本地路径部署:
```yaml
webhook:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /home/user/billai:/app # 替换为你的实际路径
```
#### 如果在云服务器上部署:
```yaml
webhook:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /opt/billai:/app # 替换为你的实际路径
```
### 网络配置说明
**webhook 服务对外暴露 9000 端口**,用于接收 Gitea webhook 事件。
这样的好处是:
- ✅ 支持外部 Gitea 服务器的 webhook 回调
- ✅ 灵活的部署架构
- ✅ 支持多种网络拓扑
**Webhook 访问地址:**
- 本地访问:`http://localhost:9000/webhook`
- 内部网络:`http://<internal-ip>:9000/webhook`
- 公网访问:`http://<public-ip>:9000/webhook`
- 通过域名:`http://webhook.yourdomain.com:9000/webhook`
## 第三步:启动 Webhook 服务
```bash
# 进入项目根目录
cd /path/to/billai
# 构建并启动 webhook 服务
docker-compose up -d webhook
# 验证服务是否启动
docker-compose logs webhook
# 测试健康检查
curl http://localhost:9000/health
```
输出应该显示:
```json
{
"status": "ok",
"time": "2026-01-13T10:30:00Z"
}
```
## 第四步:配置 Gitea Webhook
### 4.1 进入 Gitea 仓库设置
1. 打开 Gitea 管理界面
2. 找到你的 BillAI 仓库
3. 点击 **设置 (Settings)****Webhooks**
### 4.2 添加新 Webhook
点击 "添加 Webhook (Add Webhook)" 按钮,选择 "Gitea"
### 4.3 填写 Webhook 配置
| 字段 | 值 |
|------|-----|
| **目标 URL** | `http://<your-server-ip>:9000/webhook` |
| **内容类型** | `application/json` |
| **密钥** | `a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6` (你生成的 Secret) |
| **事件** | ✓ 推送事件 (Push Events) |
| **活跃** | ✓ 是 |
### 4.4 配置说明
#### 目标 URL
根据 Gitea 部署方式选择合适的 URL
**情况 1Gitea 和 webhook 都在同一台机器**
```
http://localhost:9000/webhook
```
**情况 2Gitea 在不同机器webhook 在 Docker**
使用 webhook 所在服务器的 IP 地址:
```
http://<webhook-server-ip>:9000/webhook
```
**情况 3使用域名访问**
```
http://webhook.yourdomain.com:9000/webhook
https://webhook.yourdomain.com/webhook (需要配置反向代理处理 HTTPS)
```
#### 防火墙配置
确保防火墙允许 9000 端口的入站连接:
```bash
# Linux (ufw)
sudo ufw allow 9000/tcp
# Linux (iptables)
sudo iptables -A INPUT -p tcp --dport 9000 -j ACCEPT
# Windows Firewall (PowerShell)
New-NetFirewallRule -DisplayName "Allow Webhook" -Direction Inbound -LocalPort 9000 -Protocol TCP -Action Allow
```
### 4.5 测试 Webhook
在 Gitea webhook 设置页面,找到刚添加的 webhook点击 "测试 (Test)" 按钮。
预期响应:
```json
{
"message": "非主分支,跳过部署"
}
```
(这是因为测试会使用一个默认的测试分支)
## 第五步:网络配置
### 防火墙配置
在部署前,确保服务器防火墙允许以下端口:
```bash
# 允许 9000 端口webhook
sudo ufw allow 9000/tcp
# 允许 3000 端口前端web- 已配置
sudo ufw allow 3000/tcp
# 允许 80 端口HTTP如果使用
sudo ufw allow 80/tcp
# 允许 443 端口HTTPS如果使用
sudo ufw allow 443/tcp
```
### 可选Nginx 反向代理配置
如果需要通过 HTTPS 访问 webhook可以配置 Nginx 反向代理:
```nginx
server {
listen 443 ssl http2;
server_name webhook.yourdomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# HTTP 重定向到 HTTPS
server {
listen 80;
server_name webhook.yourdomain.com;
return 301 https://$server_name$request_uri;
}
```
## 第六步:测试自动部署
现在你可以测试自动部署功能:
```bash
# 进入仓库目录
cd /path/to/billai
# 做一些改动
echo "# 测试自动部署" >> README.md
# 提交并推送到主分支
git add .
git commit -m "test: 测试自动部署功能"
git push origin master
```
### 监控部署过程
```bash
# 查看 webhook 服务日志
docker-compose logs -f webhook
# 查看部署脚本日志
docker exec billai-webhook tail -f /tmp/billai_deploy.log
# 查看其他服务日志
docker-compose logs -f server
docker-compose logs -f web
docker-compose logs -f analyzer
```
## 常见问题排查
### 问题 1Webhook 签名验证失败
**症状**:日志中出现 "无效的签名"
**解决方案**
- 确认 Gitea 中设置的 Secret 与 docker-compose.yaml 中的 WEBHOOK_SECRET 完全相同
- 检查是否有多余空格或特殊字符
```bash
# 在 docker-compose.yaml 中查看
grep WEBHOOK_SECRET docker-compose.yaml
# 在 Gitea 中重新复制 Secret确保没有多余空格
```
### 问题 2无法连接到 Webhook 服务
**症状**Gitea webhook 测试失败
**解决方案**
1. 检查 webhook 容器是否运行:
```bash
docker-compose ps webhook
```
2. 检查端口是否正确暴露:
```bash
docker-compose logs webhook | grep "listen"
```
3. 检查防火墙规则:
```bash
# Linux
netstat -tulpn | grep 9000
sudo ufw status
# Windows
netstat -ano | findstr 9000
```
4. 测试本地连接:
```bash
curl http://localhost:9000/health
```
5. 如果是远程连接,测试网络连通性:
```bash
# 从 Gitea 服务器测试
curl http://<webhook-server-ip>:9000/health
netstat -ano | findstr 9000 # Windows
```
4. 测试本地连接:
```bash
curl http://localhost:9000/health
```
### 问题 3部署脚本无法执行
**症状**:日志中显示 "部署脚本执行失败"
**解决方案**
1. 检查 deploy.sh 是否存在:
```bash
ls -la deploy.sh
```
2. 检查文件权限:
```bash
chmod +x deploy.sh
```
3. 检查容器内的环境:
```bash
docker exec billai-webhook bash -c "ls -la /app/deploy.sh"
```
4. 查看详细错误信息:
```bash
docker exec billai-webhook tail -f /tmp/billai_deploy.log
```
### 问题 4Docker 操作权限不足
**症状**:日志中显示 "permission denied" 或 "Cannot connect to Docker daemon"
**解决方案**
1. 检查 Docker Socket 是否正确挂载:
```yaml
webhook:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
```
2. 检查 Docker Socket 权限:
```bash
ls -l /var/run/docker.sock
chmod 666 /var/run/docker.sock # 可能需要 sudo
```
3. 确保 webhook 容器以正确的用户运行(通常是 root
### 问题 5部署后服务无法启动
**症状**:健康检查超时,部署失败
**解决方案**
1. 检查 docker-compose build 是否成功:
```bash
docker-compose build
```
2. 检查依赖服务是否启动:
```bash
docker-compose ps
```
3. 查看各服务的详细日志:
```bash
docker-compose logs server
docker-compose logs web
docker-compose logs analyzer
```
4. 增加健康检查的超时时间(修改 deploy.sh 中的 sleep 时间)
## 监控和维护
### 定期检查 Webhook 状态
```bash
# 查看最近 50 条日志
docker-compose logs --tail=50 webhook
# 实时监控日志
docker-compose logs -f webhook
```
### 查看部署历史
部署脚本的日志保存在:`/tmp/billai_deploy.log`
```bash
# 查看部署历史
docker exec billai-webhook cat /tmp/billai_deploy.log
# 持续监控
docker exec billai-webhook tail -f /tmp/billai_deploy.log
```
### 禁用/启用自动部署
如果需要临时禁用自动部署,修改 deploy.sh
```bash
#!/bin/bash
# 临时禁用部署,取消下面的注释
# exit 0
# ... 后续脚本内容
```
然后重新启动 webhook 服务:
```bash
docker-compose restart webhook
```
## 高级配置
### 只部署特定分支
编辑 webhook/main.go修改分支检查逻辑
```go
// 检查分支,修改条件为只部署 master 和 develop 分支
if !strings.Contains(payload.Ref, "master") &&
!strings.Contains(payload.Ref, "develop") {
// 跳过部署
}
```
### 添加 Slack 通知
修改 deploy.sh在部署完成后发送 Slack 消息:
```bash
# 在部署完成后添加
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"BillAI 部署完成!\"}" \
YOUR_SLACK_WEBHOOK_URL
```
### 限制部署频率
在 webhook/main.go 中添加速率限制,防止频繁部署。
## 安全建议
1. **使用强密钥**:确保 WEBHOOK_SECRET 是随机生成的强密钥
2. **限制网络访问**:只允许 Gitea 服务器的 IP 访问 webhook
3. **HTTPS**:在生产环境中使用 HTTPS 而不是 HTTP
4. **日志监控**:定期检查部署日志,及时发现问题
5. **备份**:在部署前备份重要数据
## 相关文件
- [webhook/README.md](../webhook/README.md) - Webhook 服务文档
- [deploy.sh](../deploy.sh) - 部署脚本
- [docker-compose.yaml](../docker-compose.yaml) - Docker Compose 配置
- [webhook/main.go](../webhook/main.go) - Webhook 服务源代码