From 55bf07a26673df543c0e207dda6a9bab5c26083d Mon Sep 17 00:00:00 2001 From: dttb Date: Thu, 18 Jun 2026 22:08:58 +0300 Subject: [PATCH] =?UTF-8?q?German:=20Hermes=20Agent=20=D0=BB=D0=B8=D1=87?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=B0=D1=81=D1=81=D0=B8=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=20=D0=9E=D0=BB=D0=B5=D0=B3=D0=B0=20=D0=BD=D0=B0=20?= =?UTF-8?q?LXC=20141=20(Telegram=20+=20KB-=D0=B4=D0=BE=D1=81=D1=82=D1=83?= =?UTF-8?q?=D0=BF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- .../2026-06-18-german-hermes-agent-deploy.md | 57 +++++++++++++++++++ projects/dttb/proxmox-inventory.md | 24 ++++++-- 2 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 decisions/2026-06-18-german-hermes-agent-deploy.md diff --git a/decisions/2026-06-18-german-hermes-agent-deploy.md b/decisions/2026-06-18-german-hermes-agent-deploy.md new file mode 100644 index 0000000..f6cdfb1 --- /dev/null +++ b/decisions/2026-06-18-german-hermes-agent-deploy.md @@ -0,0 +1,57 @@ +--- +date: 2026-06-18 +tags: [decision, ai, hermes, telegram, lxc, assistant] +--- + +# German — Hermes Agent как личный супер-ассистент Олега (LXC 141) + +## Контекст +Олег попросил поставить **Hermes Agent** (NousResearch, open-source, MIT, Python, model-agnostic — из ресёрча [[../notes/claude/2026-06-08-145004-найди-аналог-openclaw-для-меня-нужен-аркестратор-и]]) на homelab. Сначала — «для тестирования самого Hermes через Telegram», затем расширил: **настроить как супер-помощника с полным доступом к базе знаний**. Имя — **Герман** (German). + +## Что развёрнуто +- **LXC 141 `german`** (10.0.0.141, Debian 12, 2 vCPU / 3 GB / 12 GB на local-lvm, nesting, unprivileged, onboot=1). Создан из `debian-12-standard 12.12`. +- **Hermes Agent v0.16.0** — установлен официальным `install.sh --non-interactive --skip-setup`. Код `/usr/local/lib/hermes-agent`, данные `/root/.hermes` (uv + managed Node). +- **Telegram-бот** «Герман Непомнящий» **@german_dttb_bot** (id 8885932329). Gateway = systemd `hermes-german.service` (`hermes gateway run --replace`, Restart=always, drain 210s, crash-guard, NoNewPrivileges/PrivateTmp). + +## Модель +- Провайдер **OmniRoute** (OpenAI-совместимый шлюз на LXC 132): `base_url http://10.0.0.179:20128/v1`, модель **`cc/claude-opus-4-8`** (Opus 4.8 через Max-подписку Олега). +- Ключ — `OPENAI_API_KEY` + `OPENAI_BASE_URL` в `/root/.hermes/.env` (chmod 600). +- `auxiliary` (vision/web_extract/compression/session_search) → `provider: main` — иначе лезли бы в OpenRouter (ключа нет) и падали. +- ⚠️ **Грабля для будущего:** оба воркфлоу-ревьюера по коду утверждали, что на приватный IP-эндпоинт `OPENAI_API_KEY` из env «гейтится по хосту» и нужен `model.api_key: ${OPENAI_API_KEY}` в config.yaml, иначе 401. **Эмпирически опровергнуто** — CLI- и gateway-вызовы к 10.0.0.179 проходят с env-ключом без `model.api_key`. Если когда-нибудь начнёт давать 401 на первом вызове модели — добавить `api_key: ${OPENAI_API_KEY}` в секцию `model:` и `systemctl restart hermes-german`. + +## База знаний (KB) +- Зеркало vault клонировано в **`/root/german/knowledge-base`** (workspace = `/root/german`, systemd `WorkingDirectory`). +- Обновление: `/root/kb-pull.sh` (cron `*/15`) делает `git fetch + git reset --hard origin/main` — это **read-only зеркало** (правки агента там затираются; для своих заметок у него `/root/german/notes` + native memory). +- **Безопасность кред:** из `.git/config` workspace убран токен Gitea (был `https://oleg:TOKEN@...`); remote сделан tokenless, креды вынесены в `/root/.git-credentials` (chmod 600, вне workspace). +- Доступ Германа к KB: тулсеты **file** (read_file/grep) + **terminal**. Семантического индекса нет — навигация через `knowledge-base/CLAUDE.md` → grep. Это прописано в `SOUL.md`. + +## Конфиг (ключевое, `/root/.hermes/config.yaml`, 600) +- `platform_toolsets.telegram` — **явный список** `[web, terminal, file, memory, todo, skills, session_search, tts]` (+ kanban по дефолту). +- **Почему не пресет `hermes-telegram`:** security-ревью (читало `toolsets.py:440`) показало, что пресет тянет полный core-набор (**browser, execute_code, computer_use**), а `disabled_toolsets` их НЕ убирает (категории — web/browser/terminal/code_execution/image_gen). Для бота с доступом к секретам это лишние каналы исхода. Проверено `hermes tools --summary`: на Telegram **9/26 тулов, browser/code-exec/computer-use отсутствуют**. +- **web-поиск без ключей:** `web.backend: ddgs` (DuckDuckGo, бесплатно). Browser недоступен (требует BROWSERBASE_API_KEY) — веб через ddgs + `curl` в terminal. +- `SOUL.md` (личность «Герман», навигация по KB, правила безопасности) — 600. +- Прочее: `display.language: ru`, `session_reset: idle 2880m`, `memory_enabled`, `security.redact_secrets: true` + `tirith_enabled: true`, `stt` (faster-whisper base — голосовые транскрибируются). + +## Безопасность — модель угроз +- **Доступ только у Олега**: `TELEGRAM_ALLOWED_USERS=1292155421`, `guest_mode: false`, `unauthorized_dm_behavior: ignore`. Проверено по коду (`telegram.py`/`authz_mixin.py`): пустой allowlist = deny-all, fail-closed. Чужие сообщения молча игнорируются. +- terminal=local + root = Герман может выполнять любой bash на 141 и читать секреты из KB. **Это намеренно** (DevOps-ассистент), защита держится на allowlist. Жёсткий systemd-сэндбокс (ProtectSystem/ProtectHome) не ставил — сломал бы функции. Будущее ужесточение: отдельный непривилегированный юзер. +- `redact_secrets: true` — секреты вычищаются из tool output/логов/ответов перед доставкой. + +## Эксплуатация +- Статус/логи: `systemctl status hermes-german`; логи **в файлах** `/root/.hermes/logs/{gateway,agent}.log` (не в journal). +- Рестарт после правок config/SOUL: `systemctl restart hermes-german` (дренаж до ~180с). +- Бэкапы конфигов: `/root/.hermes/config.yaml.bak.*`, `.env.bak.orig`. +- Эндпоинт-санити: `curl -s http://10.0.0.179:20128/v1/models` (должен отдавать cc/claude-opus-4-8). + +## Проверено +- ✅ Установка, конфиг грузится, `hermes status` → Model cc/claude-opus-4-8 / Custom endpoint. +- ✅ End-to-end CLI: вопрос по KB → grep → верный ответ (IP openclaw 10.0.0.239). +- ✅ Прямой вызов OmniRoute cc/claude-opus-4-8 (стрим). +- ✅ Gateway: `✓ telegram connected` (polling), getMe ok, allowlist на Олега. +- ✅ Тулсет Telegram безопасен (без browser/code-exec/computer-use). +- ⏳ Финальный gateway-раунд-трип подтверждается первым реальным сообщением Олега боту. + +## TODO / на будущее +- Fallback-цепочка (cc/sonnet-4-6, kr/sonnet-4.5, cx/gpt-5.4) — формат `fallback_providers` с `api_key_env` (НЕ `${VAR}` — путь резолва фолбэков не делает env-подстановку). Пока не ставил (primary надёжен). +- Настоящий web-search через self-hosted SearXNG (`SEARXNG_URL`) или ключ Tavily/Firecrawl — если ddgs будет мало. +- Рассмотреть запуск под non-root юзером для уменьшения blast radius. diff --git a/projects/dttb/proxmox-inventory.md b/projects/dttb/proxmox-inventory.md index 36380de..9c89674 100644 --- a/projects/dttb/proxmox-inventory.md +++ b/projects/dttb/proxmox-inventory.md @@ -9,7 +9,7 @@ tags: [dttb, proxmox] > **Основная нода:** pve (10.0.0.250) — описана ниже > **Вторая нода (standalone):** pve (10.0.0.147) — отдельный хост i3-2100/15GB/SSD+1.8TB HDD, см. [[proxmox-pve-147]] (VM 100 ZimaOS, LXC 101 второй NPM) > -> Последнее обновление: 2026-06-15 (добавлен LXC 140 unifi — UniFi Network Application) +> Последнее обновление: 2026-06-18 (добавлен LXC 141 german — Hermes Agent, личный ассистент в Telegram) --- @@ -18,8 +18,8 @@ tags: [dttb, proxmox] | Тип | Всего | Запущено | Остановлено | |-----|-------|----------|-------------| | QEMU VM | 15 | 5 | 10 | -| LXC | 23 | 13 | 10 | -| **Итого** | **38** | **18** | **20** | +| LXC | 24 | 14 | 10 | +| **Итого** | **39** | **19** | **20** | --- @@ -199,8 +199,8 @@ tags: [dttb, proxmox] ### LXC 138 — vpn-proxy | Параметр | Значение | |----------|----------| -| Статус | 🟢 running | -| IP | 10.0.0.141 (LAN) / 100.70.161.29 (NetBird) | +| Статус | 🔴 stopped (onboot=0, dormant) | +| IP | `ip=dhcp` (раньше в инвентаре стояло 10.0.0.141 — это был старый DHCP-снимок; статики нет. Адрес .141 теперь у LXC 141 german) | | Назначение | VPN-proxy (детали уточнить) | ### LXC 140 — unifi (UniFi Network Application) @@ -216,6 +216,20 @@ tags: [dttb, proxmox] | Tags | network, unifi | | Назначение | **Контроллер UniFi (Network Application)** для home lab. ⚠️ MongoDB именно **4.4** — CPU Xeon X5672 без AVX, Mongo 5.0+ падает с `Illegal instruction`. См. [[../../decisions/2026-06-15-unifi-controller-homelab]] | +### LXC 141 — german (Hermes Agent) +| Параметр | Значение | +|----------|----------| +| Статус | 🟢 running | +| IP | 10.0.0.141 (LAN, статика) | +| ОС/рантайм | Debian 12, unprivileged + nesting, Hermes Agent v0.16.0 (Python, `/usr/local/lib/hermes-agent`, данные `/root/.hermes`) | +| Ресурсы | 2 vCPU / 3 GB / 12 GB (rootfs на local-lvm) | +| Telegram | бот **«Герман Непомнящий»** @german_dttb_bot — заперт на Олега (`TELEGRAM_ALLOWED_USERS=1292155421`) | +| Модель | `cc/claude-opus-4-8` через OmniRoute (`http://10.0.0.179:20128/v1`), auxiliary→main | +| Workspace | `/root/german` (KB-зеркало `knowledge-base/` RO, cron `*/15` pull; `notes/` writable) | +| Сервис | systemd `hermes-german.service` (`hermes gateway run --replace`) | +| Tags | ai, assistant, hermes | +| Назначение | **Личный супер-ассистент Олега с полным доступом к KB** (read-only зеркало) + площадка для оценки самого Hermes Agent. Тулсет: terminal, file, web(ddgs), memory, todo, skills, session_search, tts (без browser/code-exec). См. [[../../decisions/2026-06-18-german-hermes-agent-deploy]] | + --- ## 🔴 Остановленные LXC