---
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? провайдер режет?).
