Files
knowledge-base/projects/buzharovo/severny-les-bot.md

174 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
date: 2026-05-08
type: project
tags: [buzharovo, bot, openclaw, watchdog, monitoring]
---
# Северный лес — AI-ассистент для server1c
> Создан 2026-05-08, до отпуска Олега в Египте (2026-05-09 → 2026-05-22). Цель — пока Олега нет, кто-то на стороне Бужарово видит в Telegram-группе что происходит с сервером и может ткнуть `/approve` на восстановительные действия.
## Что это
Отдельный AI-бот на стеке **openclaw 2026.5.7**, заточен только под мониторинг и реагирование на инциденты сервера 1С в Бужарово. Watchdog-слой работает независимо от openclaw и шлёт алерты в Telegram напрямую через bot API — даже если AI-часть упала, уведомления всё равно дойдут.
**Не путать с:**
- LXC 137 [[projects/dttb/openclaw|Максимка]] — основной AI-бот Олега, обслуживает всю инфраструктуру.
- LXC 114 [[projects/niikn/clawdbot-niikn|Максимка-Мауля]] — бот в НИИКН для Максима Мауля.
## Расположение
| Параметр | Значение |
|---|---|
| Proxmox LXC | **139** (hostname `severny-les`) |
| IP LAN | `10.0.0.240` |
| NetBird IP | `100.70.212.78` (FQDN `severny-les.netbird.cloud`) |
| Ресурсы | 2 cores / 4 GB RAM / 10 GB disk (Ubuntu 24.04) |
| Доступ | `sshpass -p '1qaz!QAZ' ssh root@10.0.0.250 "pct exec 139 -- bash"` |
## Telegram
- **Bot username:** `@bz_sl_bot`
- **Display name:** "ИИ Ассистент Бужарово ( Северный лес )"
- **Bot ID:** `8322860033`
- **Token:** см. `/root/.openclaw/openclaw.json``channels.telegram.botToken` (или `/etc/severny-les/watchdog.env`)
- **Allowlist:** Олег `1292155421` (DM). Группа — пока пустая, обновим `groupAllowFrom` когда бот будет добавлен в TG-группу руководящего состава.
## Стек и сервисы
### openclaw 2026.5.7 (system-level systemd)
- **Конфиг:** `/root/.openclaw/openclaw.json`
- **Workspace:** `/root/clawd/` (IDENTITY/INFRASTRUCTURE/USER/SOUL/MEMORY/TOOLS/HEARTBEAT.md + `scripts/`)
- **Unit:** `/etc/systemd/system/openclaw-gateway.service` (НЕ `--user` как на 137 — в LXC без sessions это не работает)
- **Gateway port:** `18790` (на 137 — 18789, чтобы не путать)
- **Primary model:** `omniroute/cc/claude-opus-4-7` (Opus 4.7 через Max), fallbacks: `kr/claude-sonnet-4.5``cc/claude-sonnet-4-6`
- **Plugin bonjour:** disabled (превентивно от mDNS-крэшей в LXC)
- **NODE_OPTIONS:** `--dns-result-order=ipv4first` (превентивно от Telegram IPv6-сбоев)
```bash
systemctl status openclaw-gateway.service
systemctl restart openclaw-gateway.service
journalctl -u openclaw-gateway.service -n 50 --no-pager
```
### buzharovo-watchdog (system-level systemd timer, каждые 60s)
- **Скрипт:** `/usr/local/bin/buzharovo-watchdog.sh`
- **Unit:** `/etc/systemd/system/buzharovo-watchdog.{service,timer}`
- **Env:** `/etc/severny-les/watchdog.env` (TG token + chat_id)
- **State:** `/var/lib/severny-les/state.json` — антиспам (алерт только при смене уровня)
Уровни: `OK` / `WARNING` (часть проверок упала) / `WARNING_NETBIRD` (NB до server1c лежит, публично OK) / `CRITICAL` (сервер недоступен и публично, и через NetBird).
Алерт уходит в TG **напрямую** через `https://api.telegram.org/bot.../sendMessage`, мимо openclaw. Если openclaw упал — алерт всё равно придёт.
```bash
journalctl -t buzharovo-watchdog --since "1 hour ago" -n 30
systemctl list-timers buzharovo-watchdog.timer
# Тестовый прогон:
set -a; . /etc/severny-les/watchdog.env; set +a; /usr/local/bin/buzharovo-watchdog.sh
```
### netbird-watchdog (как на LXC 132/137)
- **Скрипт:** `/usr/local/bin/netbird-watchdog.sh` (порт с LXC 137)
- **Unit:** `/etc/systemd/system/netbird-watchdog.{service,timer}` (каждые 2 мин)
- При `Relays: 0/N` или `Peers: 0/N` (когда N>0) и Management=Connected — `systemctl restart netbird` (минимум 5 мин между рестартами).
### Heartbeat (cron */5)
- `/etc/cron.d/severny-les-heartbeat``/root/clawd/scripts/heartbeat.sh` пишет timestamp в `/tmp/severny-les-heartbeat`
- buzharovo-watchdog проверяет: если heartbeat старше 600s — добавляет в алерт строчку про "openclaw молчит" (анти-спам: не чаще 1 раз в час).
## Что бот может делать (TOOLS.md)
### Без `/approve` (read-only)
- `/status` — общий статус (ping/порты публично + через NetBird, состояние 1С службы, CPU rmngr)
- `/check_1c` — три 1С службы через WinRM (Running/Stopped/Disabled)
- `/check_rmngr` — детектор rmngr-loop (CPU rmngr.exe за 5 секунд, >50% = диагноз)
### С `/approve` от Олега `1292155421`
- `/restart_1c``Restart-Service '1C:Enterprise 8.3 Server Agent (x86-64)' -Force`. Все сеансы 1С вылетят. Это рецепт от 2026-05-07 rmngr-loop ([[decisions/2026-05-07-buzharovo-1c-rmngr-loop-after-crash]]).
- `/kill_orphan_ragent` — найти `ragent.exe` без LISTENING на 1540 и `Stop-Process -Force` (зомби после restart_1c).
Ребут сервера НЕ даём — по опыту 2026-05-07 ребут rmngr-loop не помогает, простой добавляет.
`exec-approvals.json` лежит в `/root/.openclaw/exec-approvals.json` — это whitelist для openclaw. Команды не из whitelist openclaw отказывается выполнять.
## WinRM на server1c
- **Адрес:** `100.70.75.103:5985` (через NetBird, basic, http) — публично 5985 закрыт
- **Учётка:** `dttb` / `1qaz!QAZ`
- **Python:** `pywinrm` уже стоит. Обёртка — `/root/clawd/scripts/winrm_lib.py`.
⚠️ **На 2026-05-08 NetBird ACL до server1c пока НЕ работает** — handshake не идёт (`Required key not available`). Олегу нужно в NetBird Dashboard разрешить `severny-les` доступ к `server1c` хотя бы на порты 5985 (WinRM) + 1 ICMP + 3389 (опц.). До этого WinRM-actions не работают, watchdog мониторит только публичные проверки.
## Скрипты в `/root/clawd/scripts/`
| Скрипт | Что делает |
|---|---|
| `check_buzharovo.sh` | bash, общий статус (ping+порты), без WinRM |
| `winrm_lib.py` | обёртка pywinrm, переиспользуют все py-скрипты |
| `check_1c_service.py` | 3 службы 1С через WinRM |
| `check_rmngr_cpu.py` | детектор rmngr-loop |
| `restart_1c_agent.py` | `Restart-Service '1C:...'` (требует /approve) |
| `kill_orphan_ragent.py` | убить зомби ragent (требует /approve) |
| `heartbeat.sh` | cron, пишет timestamp |
| `sql_native_backup.py` | **бэкап ИБ через MS SQL Server `BACKUP DATABASE` с компрессией** (см. [[decisions/2026-05-08-buzharovo-sql-native-backup]]). Online, ~2 сек на 3.8 GB, не требует cluster admin 1С |
## Сценарии работы
### Олег в отпуске, ночью упал rmngr
1. Watchdog на 60-й секунде заметил: WinRM `1C:Enterprise 8.3 Server Agent (x86-64)` всё ещё Running, **но** `check_rmngr_cpu.py` вернул `RMNGR_LOOP`.
2. Watchdog шлёт в TG-группу: 🚨 Северный лес — rmngr-loop на server1c. CPU rmngr 67%. Предлагаю `/restart_1c`.
3. Дежурный из руководящего состава отвечает в группу, бот ему: "Ок, но нужно `/approve` от Олега. Можете позвонить ему? Или подождать утра — время до критичного простоя ~2 часа."
4. Олег с пляжа делает `/approve restart_1c` → бот выполняет → отписывается в группу что прошло.
### Сервер недоступен публично
1. Watchdog: 3 подряд провала ping `185.13.47.2` за 3 минуты + RDP не отвечает.
2. Шлёт в группу: 🚨 server1c НЕДОСТУПЕН. Не отвечает ни публично, ни через NetBird. Похоже сервер лёг или сеть провайдера.
3. Бот ничего не может сделать сам — это VDS у внешнего провайдера. Эскалирует на Олега, ждёт ручного вмешательства.
### NetBird до server1c упал, публично всё OK
1. Watchdog: ping `185.13.47.2` ОК, ping `100.70.75.103` нет.
2. Шлёт: ⚠️ NetBird до server1c лежит. Публично сервер виден. WinRM-actions недоступны.
3. Сервер сам по себе работает — пользователи в Бужарово 1С видят. Но бот не может делать диагностику/рестарты пока NetBird не починен.
## Чек-лист после возвращения Олега из Египта
- [ ] Прописать в NetBird Dashboard ACL `severny-les``server1c` (5985 TCP минимум).
- [ ] Добавить @bz_sl_bot в TG-группу руководящего состава Северного леса; узнать `chat_id` группы.
- [ ] Обновить `/etc/severny-les/watchdog.env` BZ_TG_CHAT на групповой chat_id.
- [ ] Обновить `/root/.openclaw/openclaw.json` `channels.telegram.groupAllowFrom` — добавить chat_id группы.
- [ ] Сделать smoke-test `/restart_1c` (на тестовых выходных, не в боевые часы) — убедиться что openclaw реально дёргает скрипт после `/approve`.
- [ ] После миграции server1c на свой сервер — обновить IP в `/root/clawd/INFRASTRUCTURE.md` и в watchdog-скрипте.
## Известные ограничения и риски
- **NetBird ACL** на момент создания не пускает severny-les к server1c. Watchdog мониторит публично + через NetBird пингом; WinRM-команды (диагностика 1С, рестарт службы) не работают пока ACL не настроен.
- **Группа TG ещё не настроена** — алерты идут в личку Олегу. Когда @bz_sl_bot добавят в группу — поправить env+config.
- **Bonjour отключен** превентивно (был crash-loop на 137, см. [[projects/dttb/openclaw#Проблема-Crash-loop-каждые-40-сек]]).
- **DNS LXC 139** идёт на `1.1.1.1`/`8.8.8.8` напрямую (через `pct set --nameserver`), не на `10.0.0.1` — иначе FakeIP от Mihomo ломает Telegram API.
- **openclaw на system-level** (не --user как на 137). В LXC без user-session systemd --user недоступен.
## Бэкап
```bash
# на самом LXC 139
tar czf /root/severny-les-state-$(date +%F).tar.gz /root/.openclaw /root/clawd /etc/systemd/system/buzharovo-watchdog.* /etc/systemd/system/netbird-watchdog.* /etc/systemd/system/openclaw-gateway.service /etc/severny-les /etc/cron.d/severny-les-heartbeat /usr/local/bin/buzharovo-watchdog.sh /usr/local/bin/netbird-watchdog.sh
# скопировать наружу
sshpass -p '1qaz!QAZ' ssh root@10.0.0.250 "pct pull 139 /root/severny-les-state-*.tar.gz /var/lib/vz/dump/"
```
## Откат
Если бот сломал что-то и его нужно убрать целиком:
```bash
# stop and disable
pct exec 139 -- systemctl disable --now openclaw-gateway.service buzharovo-watchdog.timer netbird-watchdog.timer
# либо целиком LXC
pct stop 139 && pct destroy 139
```
NetBird-пир `severny-les.netbird.cloud` останется в Dashboard — нужно удалить руками.