ops: 新增 Gitea webhook→OpenClaw 通道的 iptables 开机脚本(issue #24)
This commit is contained in:
@@ -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`
|
||||
@@ -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"
|
||||
Reference in New Issue
Block a user