Files
Hermes-Skills/okx-auto-position/references/forwarder-rule-enable-killer.md
T

3.9 KiB

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 = 完全不匹配,不转发,不报错。

诊断命令

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 — 监听器层 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 — 下单失败通知