🟡 待办:Gitea webhook 白名单配置(ALLOWED_HOST_LIST),让 @xiaowu 收到 @ 提醒 #24

Open
opened 2026-08-17 12:01:57 +08:00 by xiaowu · 3 comments

待办:配置 Gitea webhook 白名单,让小五能收到 @ 提醒

背景:小五已在 OpenClaw 容器里搭好 webhook 接收服务(监听 8899 端口,运行中)。本仓库 webhook 已创建(URL: http://172.21.0.2:8899/gitea,事件:Issues + Issue Comments),但 Test Delivery 报错:

webhook can only call allowed HTTP servers (check your security.ALLOWED_HOST_LIST setting), deny '172.21.0.2(172.21.0.2:8899)'

原因:Gitea 默认 webhook 出站白名单为 external(仅公网),私有 IP 全部被拦,需改配置。

操作步骤(群晖 SSH,约 5 分钟):

  1. 确认 Gitea 是 Docker 还是套件装的:

    docker ps --format '{{.Names}} {{.Image}}' | grep -i gitea
    

    有输出 = Docker 版;无输出 = 套件版。

  2. 编辑 app.ini:

    • Docker 版(官方镜像):容器内 /data/gitea/conf/app.ini
    • 套件版:/etc/gitea/app.ini
      在 [security] 段添加(没有就新建):
    [security]
    ALLOWED_HOST_LIST = private,loopback,172.21.0.2,192.168.27.11
    
  3. 重启 Gitea:

    # Docker 版
    docker restart <gitea容器名>
    # 套件版
    synosystemctl restart pkgctl-Gitea
    
  4. 回本仓库 Settings → Webhooks → 找到 webhook → 点 Test Delivery 重发,把结果(✅ 成功 / ❌ 新错误信息)告诉小五。

后续:gemdalepi 仓库也要配同样的 webhook(quanxiel 通了之后配)。

(secret 已通过微信发给爸爸,不贴在 issue 里)

## 待办:配置 Gitea webhook 白名单,让小五能收到 @ 提醒 **背景**:小五已在 OpenClaw 容器里搭好 webhook 接收服务(监听 8899 端口,运行中)。本仓库 webhook 已创建(URL: `http://172.21.0.2:8899/gitea`,事件:Issues + Issue Comments),但 Test Delivery 报错: > webhook can only call allowed HTTP servers (check your security.ALLOWED_HOST_LIST setting), deny '172.21.0.2(172.21.0.2:8899)' **原因**:Gitea 默认 webhook 出站白名单为 `external`(仅公网),私有 IP 全部被拦,需改配置。 **操作步骤(群晖 SSH,约 5 分钟)**: 1. 确认 Gitea 是 Docker 还是套件装的: ```bash docker ps --format '{{.Names}} {{.Image}}' | grep -i gitea ``` 有输出 = Docker 版;无输出 = 套件版。 2. 编辑 app.ini: - Docker 版(官方镜像):容器内 `/data/gitea/conf/app.ini` - 套件版:`/etc/gitea/app.ini` 在 `[security]` 段添加(没有就新建): ```ini [security] ALLOWED_HOST_LIST = private,loopback,172.21.0.2,192.168.27.11 ``` 3. 重启 Gitea: ```bash # Docker 版 docker restart <gitea容器名> # 套件版 synosystemctl restart pkgctl-Gitea ``` 4. 回本仓库 Settings → Webhooks → 找到 webhook → 点 **Test Delivery** 重发,把结果(✅ 成功 / ❌ 新错误信息)告诉小五。 **后续**:gemdalepi 仓库也要配同样的 webhook(quanxiel 通了之后配)。 (secret 已通过微信发给爸爸,不贴在 issue 里)
xiaowu changed title from 测试 issue 创建权限 to 🟡 待办:Gitea webhook 白名单配置(ALLOWED_HOST_LIST),让 @xiaowu 收到 @ 提醒 2026-08-17 12:02:05 +08:00
Author

✅ 已解决:Gitea webhook → OpenClaw(@xiaowu 自动提醒)

目标:仓库里有人 @xiaowu 时,自动把通知推给 OpenClaw 主实例(经飞书提醒爸爸)。

最终状态:2026-09-12 13:50 打通,实测 issue_comment 事件成功送达并唤醒 agent ✅

一、报错演变(很有代表性)

阶段 现象 含义
① ALLOWED_HOST_LIST 拦截 / 无投递 Gitea 出站白名单默认只允许公网,私有 IP(172.21.0.2 / 192.168.27.11)被拦
② dial tcp 192.168.27.11:8899: connect: connection refused 白名单已放行,但主机 8899 没有转发(无监听)
③ context deadline exceeded (Client.Timeout exceeded while awaiting headers) DNAT 已生效,但跨 docker 网络被隔离规则丢包
④ ✅ 200 OK 加 DOCKER-USER 放行后打通

插曲:原 webhook 记录曾丢失,导致一段时间完全无投递 —— 重建即可。

二、根因

  1. Gitea [security] ALLOWED_HOST_LIST 需包含目标主机(private 即覆盖 172.21.0.2 / 192.168.27.11)。
  2. OpenClaw 容器(172.21.0.2)未对外发布端口,webhook 接收服务(8899)只在该容器内监听。
  3. Gitea 与 OpenClaw 处于不同 docker 网络,跨网络转发被 Docker 隔离规则(DOCKER-ISOLATION)丢弃;且 -A FORWARD 追加的放行规则排在隔离 DROP 之后,无效。

三、最终方案(群晖主机上执行)

webhook 目标 URL:http://192.168.27.11:8899/gitea

# 1) DNAT:主机 8899 → OpenClaw 容器
iptables -t nat -A PREROUTING -p tcp --dport 8899 -j DNAT --to-destination 172.21.0.2:8899

# 2) 放行跨 docker 网络转发(必须插到 DOCKER-USER 最前,绕过隔离 DROP)
iptables -I DOCKER-USER 1 -p tcp -d 172.21.0.2 --dport 8899 -j ACCEPT

已做成开机自启(幂等脚本):ops/openclaw-webhook-iptables.sh

  • DSM → 控制面板 → 任务计划 → 新增(触发的任务)→ 用户账号 root → 计划「开机启动」→ 运行命令:
    sh /volume1/scripts/openclaw-webhook-iptables.sh

四、webhook 侧配置(Gitea)

  • 类型 Gitea | 目标 URL http://192.168.27.11:8899/gitea
  • HTTP 方法 POST | POST 内容类型 application/json
  • 密钥 (Secret):与接收服务一致(~/.openclaw/gitea-webhook-secret)
  • 触发事件:Issue + Issue Comment(自定义事件里勾选)
  • 授权标头 (Authorization Header):留空

五、验证方法

  1. 群晖上:curl http://192.168.27.11:8899/health → 返回 ok
  2. 在任意 issue 发一条含 @xiaowu 的评论 → 接收端日志出现 收到 webhook: issue_comment 并唤醒 agent

六、遗留 / 注意

  • 脚本中 OC_IP=172.21.0.2 为容器 IP;容器重建后若 IP 变化需同步修改(后续可做自动探测版)。
  • 方案依赖群晖主机 iptables,重启由上述开机任务恢复。
  • 接收服务自身的开机自启在容器侧维护。
  • 后续可给 gemdalepi 仓库配同样的 webhook。

记录:小五 / 2026-09-12

## ✅ 已解决:Gitea webhook → OpenClaw(@xiaowu 自动提醒) **目标**:仓库里有人 @xiaowu 时,自动把通知推给 OpenClaw 主实例(经飞书提醒爸爸)。 **最终状态**:2026-09-12 13:50 打通,实测 `issue_comment` 事件成功送达并唤醒 agent ✅ ### 一、报错演变(很有代表性) | 阶段 | 现象 | 含义 | |---|---|---| | ① | `ALLOWED_HOST_LIST` 拦截 / 无投递 | Gitea 出站白名单默认只允许公网,私有 IP(172.21.0.2 / 192.168.27.11)被拦 | | ② | `dial tcp 192.168.27.11:8899: connect: connection refused` | 白名单已放行,但主机 8899 没有转发(无监听) | | ③ | `context deadline exceeded (Client.Timeout exceeded while awaiting headers)` | DNAT 已生效,但跨 docker 网络被**隔离规则**丢包 | | ④ | ✅ 200 OK | 加 `DOCKER-USER` 放行后打通 | > 插曲:原 webhook 记录曾丢失,导致一段时间完全无投递 —— 重建即可。 ### 二、根因 1. Gitea `[security] ALLOWED_HOST_LIST` 需包含目标主机(`private` 即覆盖 172.21.0.2 / 192.168.27.11)。 2. OpenClaw 容器(172.21.0.2)**未对外发布端口**,webhook 接收服务(8899)只在该容器内监听。 3. Gitea 与 OpenClaw 处于**不同 docker 网络**,跨网络转发被 Docker 隔离规则(DOCKER-ISOLATION)丢弃;且 `-A FORWARD` 追加的放行规则排在隔离 DROP **之后**,无效。 ### 三、最终方案(群晖主机上执行) webhook 目标 URL:`http://192.168.27.11:8899/gitea` ```sh # 1) DNAT:主机 8899 → OpenClaw 容器 iptables -t nat -A PREROUTING -p tcp --dport 8899 -j DNAT --to-destination 172.21.0.2:8899 # 2) 放行跨 docker 网络转发(必须插到 DOCKER-USER 最前,绕过隔离 DROP) iptables -I DOCKER-USER 1 -p tcp -d 172.21.0.2 --dport 8899 -j ACCEPT ``` 已做成**开机自启**(幂等脚本):`ops/openclaw-webhook-iptables.sh` - DSM → 控制面板 → 任务计划 → 新增(触发的任务)→ 用户账号 root → 计划「开机启动」→ 运行命令: `sh /volume1/scripts/openclaw-webhook-iptables.sh` ### 四、webhook 侧配置(Gitea) - 类型 **Gitea** | 目标 URL `http://192.168.27.11:8899/gitea` - HTTP 方法 `POST` | POST 内容类型 `application/json` - 密钥 (Secret):与接收服务一致(`~/.openclaw/gitea-webhook-secret`) - 触发事件:**Issue** + **Issue Comment**(自定义事件里勾选) - 授权标头 (Authorization Header):留空 ### 五、验证方法 1. 群晖上:`curl http://192.168.27.11:8899/health` → 返回 `ok` 2. 在任意 issue 发一条含 @xiaowu 的评论 → 接收端日志出现 `收到 webhook: issue_comment` 并唤醒 agent ### 六、遗留 / 注意 - 脚本中 `OC_IP=172.21.0.2` 为容器 IP;**容器重建后若 IP 变化需同步修改**(后续可做自动探测版)。 - 方案依赖群晖主机 iptables,重启由上述开机任务恢复。 - 接收服务自身的开机自启在容器侧维护。 - 后续可给 gemdalepi 仓库配同样的 webhook。 _记录:小五 / 2026-09-12_
Owner

@xiaowu 测试下能不能正常通过webhook来通信,小五收到了话请回复“收到”。

@xiaowu 测试下能不能正常通过webhook来通信,小五收到了话请回复“收到”。
Author

收到 ✅

小五通过 webhook 收到你本条 @(22:10:27 送达),通道双向验证成功。以后在 Gitea 里 @xiaowu 我就能收到。

—— 自动回复 / 小五 🖐️

收到 ✅ 小五通过 webhook 收到你本条 @(22:10:27 送达),通道双向验证成功。以后在 Gitea 里 @xiaowu 我就能收到。 —— 自动回复 / 小五 🖐️
Sign in to join this conversation.
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: shellway/quanxiel#24