diff --git a/decisions/2026-05-08-buzharovo-sql-native-backup.md b/decisions/2026-05-08-buzharovo-sql-native-backup.md new file mode 100644 index 0000000..42c711c --- /dev/null +++ b/decisions/2026-05-08-buzharovo-sql-native-backup.md @@ -0,0 +1,75 @@ +--- +date: 2026-05-08 +type: decision +tags: [decision, buzharovo, 1c, backup, mssql, effector-saver] +--- + +# 2026-05-08: Бэкап Бужарово 1С — переход с Effector Saver DT на native MS SQL Backup + +## Контекст + +Вечером 2026-05-08, после починки rmngr-loop, регулярная задача `Бэкап 1Cv8` в Effector Saver Free 4.8/2 на `server1c.netbird.cloud` (Win 2012 R2, MSSQL 2012 SP4, 1С 8.3.27.1606) **отказывалась завершаться успешно**. Шесть подряд запусков (19:51 → 22:21) падали с одной и той же связкой ошибок: + +1. `HRESULT=800401F3` — `V83.ComConnector` не зарегистрирован → Olег зарегистрировал через UI Effector Saver, переключился на 64-bit +2. `HRESULT=80004005` — "Администратор кластера не аутентифицирован" — у кластера 1С есть проверка авторизации, но **в кластере нет ни одного admin'а**, а добавить нельзя: + - В Серверной консоли 1С: `Локальный кластер → Администраторы` показывает количество=0, форма "Новый администратор" заполнена, но при OK **просит логин/пароль и не принимает agent-уровневый admin** (создан Olегом отдельно) + - Через COM `V83.COMConnector`: `AuthenticateAgent('admin', '1qaz!QAZ')` проходит, но `RegClusterAdmin` падает "пользователь не выполнил аутентификацию для требуемой операции" (chicken-and-egg: для создания первого cluster admin нужен уже cluster admin) + - Через `rac` с `--agent-user`: cluster operations не принимают agent-уровневую аутентификацию (design choice 1С) + +3. `Ошибка исключительной блокировки информационной базы` — даже без cluster admin'а Effector Saver продолжает выгрузку, но не может получить эксклюзив, потому что в БД активные сессии. Особенно "вечная" сессия `КулябинПИ sid=4514, начат 12:55:42` — после моего рестарта службы 1С в 19:30 и последующих SQL `KILL` сессий, она **раз за разом возвращается** (вероятно, реально открытый где-то тонкий клиент Павла Ивановича + persistent state в `1CV8Clst.lst`). + +## Что пробовали и почему не сработало + +| Попытка | Результат | +|---|---| +| `regsvr32` x64 `comcntr.dll` | ✅ COM зарегистрирован, переключение Effector Saver на 64-bit убрало `800401F3` | +| `Restart-Service '1C:Enterprise 8.3 Server Agent'` | ✅ rmngr вылечен, но session 4514 в реестре кластера **persists** между рестартами | +| `KILL` SQL-сессий через `sa/Qwer1122334400` | ✅ временно (sess=0, locks=0), но 1С rphost восстанавливает соединения за 1-2 мин и сессия 4514 reanimates | +| `rac cluster admin register` без auth | ❌ "оператор не существует" | +| `RegClusterAdmin` через COM с `AuthenticateAgent` | ❌ "пользователь не аутентифицирован для требуемой операции" | +| GUI Серверной консоли 1С — добавить cluster admin | ❌ форма не сохраняет, требует cluster auth (которой нет) | + +Тупик: **в кластере БД 1С нет cluster admin'а, и зарегистрировать первого нельзя ни через GUI, ни через rac, ни через COM.** Возможный единственный путь — обнулить `srvinfo\reg_1541\1CV8Clst.lst` целиком (потеря и админов, и регистрации ИБ — нужна перерегистрация ИБ с SQL params; рискованно). + +## Решение: native MS SQL Backup + +Effector Saver делает **DT-выгрузку через 1С Конфигуратор** (`1cv8.exe DESIGNER /DumpIB`), которая требует эксклюзив на ИБ. Это исторический способ для **файловых** ИБ. Для **клиент-серверных** ИБ на MS SQL правильный путь — **`BACKUP DATABASE` на уровне SQL Server**: + +- ✅ **Online backup** — снимает копию во время работы, не требует эксклюзива +- ✅ Не зависит от 1С-кластера, cluster admin'а, активных сессий +- ✅ С `WITH COMPRESSION` файл сжимается ~3:1 (3.8 GB → 1.1 GB) +- ✅ Быстрее — у нас 2 секунды на 3.8 GB БД +- ✅ Восстанавливается одним запросом `RESTORE DATABASE` + +Реализация: + +```sql +BACKUP DATABASE [RitmUl] +TO DISK = N'C:\backup\RitmUl_.bak' +WITH FORMAT, INIT, NAME = N'RitmUl-Full', + SKIP, NOREWIND, NOUNLOAD, COMPRESSION, COPY_ONLY, + STATS = 5 +``` + +`COPY_ONLY` — чтобы наш бэкап не ломал log chain если потом настроят differential/log backups. + +Запускается через WinRM `python3 + System.Data.SqlClient` с LXC 139 `severny-les` (бот). Storage: `C:\backup\` на server1c (374 GB свободно). + +## Артефакт + +- **Первый успешный бэкап 2026-05-08:** `C:\backup\RitmUl_2026-05-08_2225.bak` (1105 MB) +- **Скрипт:** `/root/clawd/scripts/sql_native_backup.py` на LXC 139 + +## TODO (после возвращения Olега из Египта) + +1. **Автоматизировать** — добавить cron на LXC 139 `severny-les`: каждый день в 03:00 МСК запускать `sql_native_backup.py`, ротировать (хранить N дней). Алерт в Telegram-группу при сбое. +2. **Ротация и трансфер** — настроить копирование `.bak` файлов на внешний носитель (Nextcloud / S3 / Gitea-LFS). +3. **Тест восстановления** — раз в N дней автоматически развернуть бэкап в тестовую БД и проверить целостность. +4. **Effector Saver** оставить как есть, не чинить (чинить cluster admin = разбирать `1CV8Clst.lst` бинарник, риск убить ИБ). Можно отключить регулярную задачу `Бэкап 1Cv8` в Effector Saver чтобы не плодились алерты "ошибка". +5. **TODO документировать** SQL creds в `projects/dttb/credentials.md` (см. блок Бужарово). + +## Связанные + +- [[projects/buzharovo/server1c]] — обновлён с SQL backup как новый канон +- [[projects/buzharovo/severny-les-bot]] — бот теперь умеет бэкапить через WinRM+SQL +- [[decisions/2026-05-07-buzharovo-1c-rmngr-loop-after-crash]] — про rmngr (отдельная история, починена) diff --git a/decisions/2026-05-08-severny-les-bot-buzharovo.md b/decisions/2026-05-08-severny-les-bot-buzharovo.md new file mode 100644 index 0000000..7482901 --- /dev/null +++ b/decisions/2026-05-08-severny-les-bot-buzharovo.md @@ -0,0 +1,77 @@ +--- +date: 2026-05-08 +type: decision +tags: [decision, buzharovo, bot, openclaw, watchdog, telegram] +--- + +# 2026-05-08: Северный лес — отдельный AI-ассистент + watchdog для server1c (Бужарово) + +## Контекст + +Олег уезжает в отпуск в Египет 2026-05-09 → 2026-05-22. На server1c (Бужарово, VDS 185.13.47.2 / NetBird 100.70.75.103) недавно (2026-05-07) был rmngr-loop, который лечится только `Restart-Service '1C:Enterprise 8.3 Server Agent (x86-64)' -Force` — ребут не помогает (см. [[decisions/2026-05-07-buzharovo-1c-rmngr-loop-after-crash]]). + +Пока Олег в отпуске, нужно: +1. Чтобы кто-то узнавал когда сервер упал (Telegram-группа руководящего состава Северного леса); +2. Чтобы можно было дёрнуть восстановительное действие (`/approve restart_1c`) не дожидаясь возвращения Олега из Египта. + +Через ~2 недели (после Египта) планируется миграция server1c с VDS на собственный сервер. Бот должен работать **до и после** миграции — поэтому он не на самом server1c, а на dttb-Proxmox через NetBird. + +## Развилка: clawdbot vs openclaw vs другой watchdog + +Рассматривались три варианта: + +| Вариант | Плюсы | Минусы | +|---|---|---| +| **clawdbot** (как у [[projects/niikn/clawdbot-niikn|Максимки-Мауля]]) | Проверенный рецепт, проще | Старый стек, не обновляется. exec-approvals самописные. | +| **openclaw** (свежий стек 137) | Встроенный `exec-approvals.json` whitelist для shell-команд. Plugins, skills, делегирование на Opus 4.7 через Max. Свежий, активная разработка. | Жёсткая schema, есть тонкости (bonjour, IPv6, FakeIP DNS) — но они уже разобраны на 137. | +| **Голый watchdog без AI** | Минимум зависимостей. | Нет диагностики "почему упало". Невозможно дёрнуть `/restart_1c` через `/approve` — только ручной WinRM. | + +**Решение:** **openclaw** — встроенный whitelist для shell-команд (`exec-approvals.json`) — это прямо то что нужно для `/approve` flow. Плюс Опус 4.7 через Max. + +## Архитектура + +**Изоляция от Максимки (LXC 137):** не подвешиваем как доп.канал на 137 — если openclaw на 137 упадёт (а это бывает: bonjour, FakeIP, Kiro 402), упадут и алерты Бужарово. Для критичной мониторинг-задачи нужен **отдельный** инстанс. + +**Хост:** новый LXC 139 на dttb (10.0.0.240, NetBird 100.70.212.78, Ubuntu 24.04, 2c/4GB/10GB). + +**Два слоя независимых:** +1. **buzharovo-watchdog** — bash + curl→TG bot API напрямую, systemd timer 60s. **Не зависит от openclaw.** Если AI-часть упала, алерт всё равно дойдёт. +2. **openclaw 2026.5.7** — AI-помощник для диагностики и `/approve`-action'ов через WinRM. + +**Алерт-уровни:** +- `OK` — всё доступно; +- `WARNING` — часть проверок упала; +- `WARNING_NETBIRD` — NetBird до server1c лежит, публично сервер виден; +- `CRITICAL` — сервер не отвечает ни публично, ни через NetBird. + +Антиспам: алерт шлётся **только при смене уровня**, состояние в `/var/lib/severny-les/state.json`. + +**WinRM-actions с подтверждением:** +- read-only без approval (`/status`, `/check_1c`, `/check_rmngr`); +- destructive с обязательным `/approve` от Олега `1292155421` (`/restart_1c`, `/kill_orphan_ragent`); +- ребута сервера НЕ даём (по опыту 2026-05-07 не помогает rmngr-loop). + +## Превентивные правки на старте (уроки 137) + +Все три "ловушки openclaw" пропатчены сразу: +1. `plugins.entries.bonjour.enabled = false` — против mDNS crash-loop (см. [[projects/dttb/openclaw#Crash-loop-каждые-40-сек]]). +2. `pct set 139 --nameserver '1.1.1.1 8.8.8.8'` + правка `/etc/resolv.conf` — против FakeIP DNS от 10.0.0.1. +3. `NODE_OPTIONS=--dns-result-order=ipv4first` в systemd unit — против IPv6-сбоев Telegram API. + +systemd unit для openclaw — **system-level** (`/etc/systemd/system/openclaw-gateway.service`), а не `--user` как на 137. В LXC без user-session `systemctl --user` не работает (`Failed to connect to bus`). + +## Что осталось сделать после возвращения Олега + +1. **NetBird ACL** `severny-les` → `server1c` (порт 5985 TCP минимум) — без него WinRM-actions не работают, watchdog мониторит только публичные проверки. +2. **Добавить @bz_sl_bot в TG-группу** руководящего состава, узнать `chat_id`, обновить `/etc/severny-les/watchdog.env` `BZ_TG_CHAT` и `openclaw.json` `groupAllowFrom`. +3. После миграции server1c на свой сервер — обновить IP в `/root/clawd/INFRASTRUCTURE.md` и в `buzharovo-watchdog.sh`. + +## Артефакты + +- LXC 139 `severny-les` (10.0.0.240) +- TG bot `@bz_sl_bot` (token `8322860033:...`) +- Справочник: [[projects/buzharovo/severny-les-bot]] +- Persona: `/root/clawd/{IDENTITY,INFRASTRUCTURE,USER,SOUL,TOOLS,MEMORY,HEARTBEAT}.md` +- Скрипты: `/root/clawd/scripts/check_buzharovo.sh`, `winrm_lib.py`, `check_1c_service.py`, `check_rmngr_cpu.py`, `restart_1c_agent.py`, `kill_orphan_ragent.py`, `heartbeat.sh` +- Watchdog: `/usr/local/bin/buzharovo-watchdog.sh` + `.service` + `.timer` (60s); `netbird-watchdog` clone с 137 (2 мин) +- Whitelist: `/root/.openclaw/exec-approvals.json` diff --git a/projects/buzharovo/README.md b/projects/buzharovo/README.md index eaebebe..2bbd459 100644 --- a/projects/buzharovo/README.md +++ b/projects/buzharovo/README.md @@ -16,6 +16,12 @@ aliases: [Бужарово, buzharovo, Server1C] - Netbird: 100.70.75.103 (server1c.netbird.cloud) - Подробности и runbook: [[projects/buzharovo/server1c]] +- **Северный лес — AI-ассистент** — LXC 139 на dttb-Proxmox, openclaw + watchdog для server1c. + - LAN: 10.0.0.240, NetBird: 100.70.212.78 + - Telegram: `@bz_sl_bot` ("ИИ Ассистент Бужарово ( Северный лес )") + - Справочник и runbook: [[projects/buzharovo/severny-les-bot]] + - Решение о создании: [[decisions/2026-05-08-severny-les-bot-buzharovo]] + ## Известные рецепты - **rmngr-loop после crash** (07.05.2026): тормоза локальных пользователей → `Restart-Service '1C:Enterprise 8.3 Server Agent (x86-64)' -Force`. Полный ребут сервера НЕ помогает. Полный разбор: [[decisions/2026-05-07-buzharovo-1c-rmngr-loop-after-crash]]. diff --git a/projects/buzharovo/server1c.md b/projects/buzharovo/server1c.md index 829ee9d..0c5f3f8 100644 --- a/projects/buzharovo/server1c.md +++ b/projects/buzharovo/server1c.md @@ -47,3 +47,45 @@ tags: [dttb] **Why:** причина рута rmngr-loop неясна — возможно повреждение кэша `srvinfo`, регресс 8.3.27.1606, или Disabled-служба `RagentServer_8327` мешает первому запуску ragent. Если повторится — смотреть `C:\Program Files\1cv8\srvinfo\reg_*\1Cv8FTLog\` на ошибки. **Долгосрочно:** настроить несколько `rphost` в кластере (по одному на 8-12 сеансов) — сейчас один rphost на всех локальных юзеров = бутылочное горлышко. + +## MS SQL Server (для server1c\RitmUl) + +- **Instance:** `localhost` (default, MSSQL11 = SQL Server 2012 SP4) +- **SA / Qwer1122334400** (полные права на все БД) +- **БД:** `RitmUl` (~3.8 GB), также есть `Accounting`, `Retail_2021`, `Retail_2021demo` +- **Connection string:** `Server=localhost;Database=master;User Id=sa;Password=Qwer1122334400;` + +## Бэкапы — native SQL, не Effector Saver + +**Канон от 2026-05-08:** `BACKUP DATABASE` через SQL Server, не DT-выгрузка через Effector Saver. Подробности и причины — в [[decisions/2026-05-08-buzharovo-sql-native-backup]]. + +Команда: +```sql +BACKUP DATABASE [RitmUl] +TO DISK = N'C:\backup\RitmUl_.bak' +WITH FORMAT, INIT, COMPRESSION, COPY_ONLY, STATS = 5 +``` + +- **Папка:** `C:\backup\` (на C: было 374 GB свободно на 2026-05-08) +- **Время:** ~2 сек на 3.8 GB БД +- **Размер:** ~30% от оригинала (3.8 GB → 1.1 GB сжатый) +- **Online:** не требует отключения пользователей, не требует cluster admin'а 1С +- **Скрипт:** `/root/clawd/scripts/sql_native_backup.py` на LXC 139 (severny-les bot) + +## Кластер 1С — известные проблемы + +### Cluster admin отсутствует, и его нельзя добавить +Серверная консоль 1С → `Локальный кластер → Администраторы` показывает 0, но при попытке создать через GUI требует логин cluster admin'а (которого нет) — chicken-and-egg. Через `rac` и `V83.COMConnector` — то же самое. Agent admin (создан 2026-05-08, `admin/1qaz!QAZ` на уровне `(*)Server1C → Администраторы`) **не поднимает права на cluster operations**. + +**Последствия:** +- Effector Saver задача `Бэкап 1Cv8` падает с `Администратор кластера не аутентифицирован (HRESULT=80004005)` → не может вызвать `TerminateSession` → не может получить эксклюзив на ИБ. +- Все cluster operations (просмотр сессий, kill сессий, блокировка соединений) недоступны через API. + +**Что НЕ помогло:** SQL `KILL` сессий через sa — 1С rphost восстанавливает соединения за 1-2 мин, и persistent session_id (например `КулябинПИ 4514` от 12:55:42 в день 2026-05-08) reanimate. + +**Workaround:** SQL native backup (см. выше) — обходит всю эту историю с эксклюзивом. + +**Как лечить (не сделано, рискованно):** обнулить `C:\Program Files\1cv8\srvinfo\reg_1541\1CV8Clst.lst` → потеряются и админы и регистрация ИБ → перерегистрировать ИБ через SQL params (`SA/Qwer1122334400`, host `localhost`, db `RitmUl`). + +### V83.COMConnector x64 зарегистрирован +2026-05-08 я через `regsvr32` зарегистрировал `C:\Program Files\1cv8\8.3.27.1606\bin\comcntr.dll` в `HKLM\SOFTWARE\Classes\V83.COMConnector` (только x64; x86 платформа на сервере не установлена). В Effector Saver вручную переключено на "64-разрядный V83.ComConnector" → `HRESULT=800401F3` ушёл. diff --git a/projects/buzharovo/severny-les-bot.md b/projects/buzharovo/severny-les-bot.md new file mode 100644 index 0000000..889ae59 --- /dev/null +++ b/projects/buzharovo/severny-les-bot.md @@ -0,0 +1,173 @@ +--- +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 — нужно удалить руками.