67 lines
2.8 KiB
Markdown
67 lines
2.8 KiB
Markdown
---
|
||
date: 2026-04-28
|
||
type: decision
|
||
tags: [decision, openclaw, netbird, code-server, monitoring]
|
||
---
|
||
|
||
# 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 мин).
|
||
|
||
## Деплой
|
||
|
||
```bash
|
||
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`:
|
||
|
||
```bash
|
||
journalctl -t netbird-watchdog -n 20
|
||
```
|
||
|
||
Если за неделю не было ни одного срабатывания — проблема была разовой. Если срабатывает регулярно — нужно копать корень почему wireguard handshake разваливается (MTU? фрагментация UDP? провайдер режет?).
|