diff --git a/ops/README.md b/ops/README.md new file mode 100644 index 0000000..83286ed --- /dev/null +++ b/ops/README.md @@ -0,0 +1,30 @@ +# ops/ — 群晖主机侧运维脚本 + +## openclaw-webhook-iptables.sh + +让 **Gitea 的 webhook 能送达 OpenClaw 容器**(`172.21.0.2:8899`)。 + +- **作用**:在群晖主机上维护两条 iptables 规则 + 1. `nat PREROUTING`:主机 8899 → 容器 172.21.0.2:8899(DNAT) + 2. `DOCKER-USER`:放行跨 docker 网络转发(插到最前,绕过隔离 DROP) +- **幂等**:重复运行不会产生重复规则 +- **需 root**;开机时自动等待 `DOCKER-USER` 链就绪(最多 ~3 分钟) + +### 部署 +```sh +sudo mkdir -p /volume1/scripts +sudo cp ops/openclaw-webhook-iptables.sh /volume1/scripts/ +sudo chmod +x /volume1/scripts/openclaw-webhook-iptables.sh +``` +DSM → 控制面板 → 任务计划 → 新增(触发的任务)→ 用户账号 root → 计划「开机启动」→ 运行命令: +``` +sh /volume1/scripts/openclaw-webhook-iptables.sh +``` + +### 变量 +- `OC_IP`:OpenClaw 容器 IP(默认 `172.21.0.2`)。容器重建后 IP 若变化需同步修改。 +- `PORT`:接收服务端口(默认 `8899`) + +### 相关 +- 排障全过程与最终方案见 issue **#24** +- webhook 目标 URL:`http://192.168.27.11:8899/gitea` diff --git a/ops/openclaw-webhook-iptables.sh b/ops/openclaw-webhook-iptables.sh new file mode 100644 index 0000000..3b8dda6 --- /dev/null +++ b/ops/openclaw-webhook-iptables.sh @@ -0,0 +1,47 @@ +#!/bin/sh +# ============================================================ +# OpenClaw Gitea webhook 通道:群晖主机 8899 -> OpenClaw 容器 +# 幂等:重复运行不会产生重复规则;需 root 运行 +# 适用:群晖 DSM 7.x,任务计划-开机启动 +# ============================================================ +export PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH + +OC_IP="172.21.0.2" # OpenClaw 容器 IP(容器重建后若 IP 变了,改这里) +PORT="8899" # 接收服务端口 +LOG="/volume1/scripts/openclaw-webhook-iptables.log" + +mkdir -p "$(dirname "$LOG")" 2>/dev/null +log() { echo "[$(date '+%F %T')] $*" >> "$LOG"; } + +log "=== run start (OC_IP=$OC_IP PORT=$PORT) ===" + +# --- 1) DNAT:群晖主机 PORT -> OpenClaw 容器 --- +if iptables -t nat -C PREROUTING -p tcp --dport "$PORT" \ + -j DNAT --to-destination "$OC_IP:$PORT" 2>/dev/null; then + log "DNAT 已存在,跳过" +else + iptables -t nat -A PREROUTING -p tcp --dport "$PORT" \ + -j DNAT --to-destination "$OC_IP:$PORT" && log "已添加 DNAT" +fi + +# --- 2) 放行跨 docker 网络转发(插到 DOCKER-USER 最前,绕过隔离 DROP)--- +# 开机时 docker 可能还没起,先等 DOCKER-USER 链就绪 +i=0 +while ! iptables -L DOCKER-USER -n >/dev/null 2>&1; do + i=$((i+1)) + [ "$i" -gt 36 ] && { log "等待 DOCKER-USER 超时,放弃"; exit 1; } + sleep 5 +done + +if iptables -C DOCKER-USER -p tcp -d "$OC_IP" --dport "$PORT" -j ACCEPT 2>/dev/null; then + log "DOCKER-USER 放行已存在,跳过" +else + iptables -I DOCKER-USER 1 -p tcp -d "$OC_IP" --dport "$PORT" -j ACCEPT \ + && log "已添加 DOCKER-USER 放行" +fi + +log "=== run done ===" + +# 可选的即时自检(注释掉即可) +# iptables -t nat -L PREROUTING -n | grep ":$PORT" +# iptables -L DOCKER-USER -n | grep "$OC_IP"