2.8 KiB
date, type, tags
| date | type | tags | |||||
|---|---|---|---|---|---|---|---|
| 2026-04-28 | decision |
|
2026-04-28: NetBird watchdog на LXC 132 и 137 (фикс "бот молчит")
Симптом
Олег пишет Максимке (openclaw, LXC 137) с 10:10 до 11:09 — 9 сообщений без ответа. В логах gateway:
FailoverError: LLM request failed: network connection error
502 [kiro/claude-sonnet-4.5]: fetch failed (reset after 1s)
502 [claude/claude-sonnet-4-6]: fetch failed (reset after 5s)
502 [codex/gpt-5.4]: fetch failed (reset after 2s)
Все 3 модели в failover-цепочке падают с TCP-reset за 1-5 секунд.
Корень
NetBird daemon на LXC 132 (code-server, OmniRoute + CLIProxy) в зомби-состоянии:
Management: Connected
Signal: Connected
Relays: 0/4 Available ← застряло
Nameservers: 0/0 Available
DNS-запросы к 1.1.1.1 через wt0-туннель падают мгновенно с write: required key not available — WireGuard handshake с пиром не завершён, ключ не загружен в ядро. Поэтому curl на api.anthropic.com / api.openai.com отвечает HTTP 000 за 0.0001s. CLIProxy без апстрима возвращает HTTP 500 на каждый POST.
Ручной systemctl restart netbird сразу чинит — Relays поднимаются 4/4, DNS работает, curl Anthropic = 405, OpenAI = 401.
Решение
Watchdog на LXC 132 и LXC 137:
/usr/local/bin/netbird-watchdog.sh— проверяетnetbird status. ЕслиRelays: 0/NилиPeers count: 0/N(при N>0 и Management=Connected) —systemctl restart netbird. Минимум 5 мин между рестартами (lock-файл/run/netbird-watchdog.last-restart).netbird-watchdog.service(oneshot) +netbird-watchdog.timer(каждые 2 мин).
Деплой
for CT in 132 137; do
pct push $CT netbird-watchdog.sh /usr/local/bin/ --perms 0755
pct push $CT netbird-watchdog.service /etc/systemd/system/
pct push $CT netbird-watchdog.timer /etc/systemd/system/
pct exec $CT -- systemctl daemon-reload
pct exec $CT -- systemctl enable --now netbird-watchdog.timer
done
Скрипты — snippets/netbird-watchdog/.
Логи
Решение пишет в journalctl с tag netbird-watchdog:
journalctl -t netbird-watchdog -n 20
Если за неделю не было ни одного срабатывания — проблема была разовой. Если срабатывает регулярно — нужно копать корень почему wireguard handshake разваливается (MTU? фрагментация UDP? провайдер режет?).