3.9 KiB
3.9 KiB
TG Forwarder enable_rule=0 Silent Killer (2026-08-06 实战)
症状
signal_queue.db几小时到几天没有新信号signal-queue-retrycron 每 5 分钟跑 (silent / empty output — 没有 pending)- 用户问"为什么没跟单"——以为是 bug
- 实际上 TG forwarder 收到源频道信号,但 rule disabled,所以不转发到目标群
signal_queue.db没有数据,因为数据来源(target group)从未收到消息
误诊路径(我犯过的)
- 看 signal_queue.db pending=0 → "没信号,正常"
- 看 process_signal 输出 → "一切正常"
- 看 mihomo / Telegram forwarder 容器 → "running"
- 看 cron output → "silent OK"
全对,但链路在最上游断。
真凶: forward_rules.enable_rule=0
/app/db/forward.db 表 forward_rules.enable_rule 字段是 boolean。
规则存在 + enable=0 = 完全不匹配,不转发,不报错。
诊断命令
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]}')
"
修复
# 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) 但不自动改:
# 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
通用诊断流程(下次"信号没了")
# 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— 监听器层 bugreferences/tg-forwarder-ops.md— forwarder 基础运维references/v4.5.41-signal-queue-done-but-no-order-execute.md— 下游执行层 bugreferences/v4.5.42-insufficient-funds-explicit-notify.md— 下单失败通知