# TG Forwarder `enable_rule=0` Silent Killer (2026-08-06 实战) ## 症状 - `signal_queue.db` 几小时到几天没有新信号 - `signal-queue-retry` cron 每 5 分钟跑 (silent / empty output — 没有 pending) - 用户问"为什么没跟单"——以为是 bug - 实际上 **TG forwarder 收到源频道信号**,但 **rule disabled**,所以不转发到目标群 - `signal_queue.db` 没有数据,因为数据来源(target group)从未收到消息 ## 误诊路径(我犯过的) 1. **看 signal_queue.db pending=0** → "没信号,正常" 2. **看 process_signal 输出** → "一切正常" 3. **看 mihomo / Telegram forwarder 容器** → "running" 4. **看 cron output** → "silent OK" **全对,但链路在最上游断**。 ## 真凶: `forward_rules.enable_rule=0` `/app/db/forward.db` 表 `forward_rules.enable_rule` 字段是 boolean。 规则存在 + enable=0 = **完全不匹配,不转发,不报错**。 ### 诊断命令 ```bash docker exec telegram-forwarder python3 -c " import sqlite3 conn = sqlite3.connect('/app/db/forward.db') for r in conn.execute('SELECT id, source_chat_id, target_chat_id, enable_rule, add_mode FROM forward_rules').fetchall(): print(f'rule {r[0]}: src={r[1]} -> tgt={r[2]} enable={r[3]} add_mode={r[4]}') " ``` ### 修复 ```bash # 1. 找到 enable=0 的规则 docker exec telegram-forwarder python3 -c " import sqlite3 conn = sqlite3.connect('/app/db/forward.db') for r in conn.execute('SELECT id FROM forward_rules WHERE enable_rule=0').fetchall(): print(r[0]) " # 2. 批量 enable docker exec telegram-forwarder python3 -c " import sqlite3 conn = sqlite3.connect('/app/db/forward.db') conn.execute('UPDATE forward_rules SET enable_rule=1 WHERE enable_rule=0') conn.commit() print(f'updated {conn.total_changes} rows') " # 3. 重启 forwarder 加载新规则 docker restart telegram-forwarder ``` ## 何时 enable_rule 被禁用? - 手动通过 bot 命令 (`/sw` / `/off`) 关闭 - Web UI 误操作 - **forwarder 升级/migration 时的默认值变更** - 数据迁移时未保留 enable 字段 ## 预防 — 加 cron 守护 **加 cron 每小时检查一次** `enable_rule=0` 的规则 → **告警** (推 QQ) 但不自动改: ```bash # cron: forwarder-rule-guardian (每小时) #!/bin/bash DISABLED=$(docker exec telegram-forwarder python3 -c " import sqlite3 conn = sqlite3.connect('/app/db/forward.db') print(len(conn.execute('SELECT 1 FROM forward_rules WHERE enable_rule=0').fetchall())) " 2>/dev/null) if [ "$DISABLED" != "0" ]; then echo "⚠️ forwarder rule disabled count: $DISABLED" fi ``` ## 通用诊断流程(下次"信号没了") ```bash # 1. signal_queue.db 最后一条 sqlite3 ~/.hermes/trading/signal_queue.db "SELECT MAX(created_at) FROM queue" # 2. forwarder 收到消息没?(telethon log) docker logs telegram-forwarder --since 6h 2>&1 | grep -E "message_listener|规则.*未启用" | tail -10 # 3. forwarder 规则 enabled? docker exec telegram-forwarder python3 -c " import sqlite3 conn = sqlite3.connect('/app/db/forward.db') for r in conn.execute('SELECT id, source_chat_id, target_chat_id, enable_rule FROM forward_rules').fetchall(): print(r) " # 4. source chat 是否在用?源 chat_id 对应到 target chat_id? # 5. forwarder 容器 health docker ps | grep telegram-forwarder ``` ## 关键差异 vs `tg_signal_monitor.py` 表名错 (v4.5.39) - **v4.5.39**: 监听器代码 bug,完全不读消息 → **forwarder 自己没问题** - **本节**: 监听器正常,消息已到 forwarder → **forwarder rule disabled,不转发** 两种都让 `signal_queue.db` 没新数据,但**根因完全不同**。 ## 关联 - `references/v4.5.39-tg-monitor-forwarder-table-bug-and-cron-disconnects.md` — 监听器层 bug - `references/tg-forwarder-ops.md` — forwarder 基础运维 - `references/v4.5.41-signal-queue-done-but-no-order-execute.md` — 下游执行层 bug - `references/v4.5.42-insufficient-funds-explicit-notify.md` — 下单失败通知