Files
knowledge-base/projects/benilux/umny-server-concept.md

32 KiB
Raw Blame History

date, type, status, tags, aliases
date type status tags aliases
2026-06-29 project concept
alexandr
umnybot
concept
cosmos
self-service
ai-services
media
nextcloud
концепция умного сервера Александра
umnybot concept
сервис-каталог Александра

🧠 Концепция «Умного сервера» Александра — простой ИИ-сервис, всё через бота

Развитие пилота ../dttb/ai-assistant-pilot/architecture в законченный продукт: «умный сервер с ИИ-сервисами», который продали клиенту. Цель — простой и удобный сервис, где клиент ничего не настраивает руками: попросил бота — бот сам поставил/настроил. Максимальная автономность от инфраструктуры Олега. Секреты — в ../dttb/ai-assistant-pilot/credentials и credentials.

TL;DR (что решили)

  • Лицо сервиса — бот, а не панель. Клиент НЕ кликает в Cosmos сам. Он пишет боту (Алекс/Hermes в Telegram) или в SwarmClaw: «поставь мне облако» / «хочу смотреть фильмы» → агент сам разворачивает сервис через Cosmos API, выдаёт ссылку. Самообслуживание = диалог.
  • Cosmos Cloud — движок под капотом, не витрина. Даёт реверс-прокси + авто-HTTPS + изоляцию + API для автодеплоя. Клиент его обычно не видит; админ-доступ — у Олега и у бота.
  • База знаний бота — ТОЛЬКО Бенелюкс. Изолированная KB по инфраструктуре Александра, без общей базы Олега. Это и автономность, и безопасность.
  • Максимальная автономность от Олега: свой LLM-ключ/баланс, свой публичный вход (Cloudflare Tunnel вместо VPS-шлюза Олега), свой мониторинг. См. #автономность.
  • Железо — работаем в рамках (i3-2100, 2 ядра, 15 ГБ ОЗУ, уже ~⅔ занято). Лёгкие версии сервисов, приоритизация. Всё «на полную» коробка не потянет — концепция это учитывает.

1. Что уже есть на коробке (инвентарь)

Сервер физически у Александра (КП Бенелюкс), Proxmox pve 192.168.1.247. Публичный вход — домены *.umnybot.ru через статичный VPS-шлюз 158.255.0.139 по NetBird (WAN Александра динамический, DNS на него вешать нельзя).

LXC Сервис RAM (выдано) Статус
101 NPM (внутр. реверс-прокси коробки) 512 МБ 🟢 работает
102 бот Алекс (openclaw @alex_umny_bot) + OmniRoute + Postgres ~4 ГБ 🟢 работает
103 SwarmClaw (umnybot.ru, публично) ~4 ГБ 🟢 работает
104 Gitea ~1 ГБ 🟢 работает
105 Homepage + filebrowser (Docker) ~1 ГБ 🟢 работает
VM100 ZimaOS удалена (VT-x слетел)

Свободно ОЗУ: ориентировочно 35 ГБ (нужно замерить free -m перед стартом — см. шаг 0). Диск: SSD 111 ГБ (система) + HDD 1.8 ТБ под медиа/торренты/облако — места достаточно.

Чего по ТЗ ещё нет

Nextcloud, медиасервер (Plex/«Flex»), торрент-клиент, Open WebUI, второй бот (Hermes на GLM 5.2), и сама платформа самообслуживания — её и делаем сердцем продукта.


2. Целевая архитектура — «всё через бота»

Клиент общается только с ботом. Бот — это «оператор» сервера: понимает запрос на естественном языке, дёргает Cosmos API, отвечает ссылкой. Панель Cosmos — служебная, для Олега.

        КЛИЕНТ                          КЛИЕНТ (опц., если удобно)
   Telegram: бот Алекс / Hermes            SwarmClaw (веб-чат)
          │  «поставь облако»                    │
          └──────────────┬───────────────────────┘
                         ▼
              АГЕНТ (openclaw/hermes) ── KB: только Бенелюкс
                         │  tool: cosmos-deploy.sh «nextcloud»
                         ▼
              Cosmos Cloud API (движок) ── реверс-прокси + HTTPS + изоляция
                         │  поднимает контейнер, выдаёт поддомен
        ┌────────────────┼────────────────┬───────────────┬───────────────┐
        ▼                ▼                 ▼               ▼               ▼
   Nextcloud           Plex          qBittorrent     Open WebUI      (доп. апки)
   cloud.*            media.*           dl.*            chat.*
                                          │
                       скачал торрент → /mnt/Work/media (HDD 1.8 ТБ)
                                          │
                       ├─→ Plex видит библиотеку (media volume)
                       └─→ Nextcloud External Storage (тот же путь) → видно в облаке

Роли в новой модели

Компонент Роль Видит ли клиент
Бот (Алекс/Hermes) лицо сервиса, принимает запросы, разворачивает сервисы основной интерфейс
SwarmClaw альт. веб-интерфейс к тем же агентам (если удобнее чата) опц., ограниченный аккаунт
Cosmos Cloud движок: API автодеплоя, прокси, HTTPS, изоляция только Олег + бот
Homepage витрина-портал со ссылками на готовые сервисы как «рабочий стол»

Почему Cosmos Cloud (как движок, не витрина)

Клиент сам кликать в App Store не будет — установку делает бот через API. Cosmos выбран потому, что лучше прочих (CasaOS/Runtipi/Portainer) закрывает именно автодеплой-через-API + безопасность:

  • API + Docker-оркестрация: бот вызывает Cosmos, тот поднимает контейнер, навешивает поддомен, HTTPS и изоляцию — всё одним движком, без сборки NPM+certbot+Portainer руками.
  • Безопасен для паблика: SmartShield (анти-брутфорс, rate-limit, изоляция приложений) — на случай, если что-то всё же смотрит в интернет.
  • Лёгкий: сам Cosmos ~150250 МБ ОЗУ — критично для этой коробки.
  • Сосуществует с текущим NPM: новые сервисы — на Cosmos, существующие (SwarmClaw, pve) пока за NPM коробки. Миграция постепенная.

Бот ставит сервисы через скрипт-обёртку (напр. cosmos-deploy.sh <app>), добавленный в инструменты агента — по образцу alex-*.sh (../dttb/ai-assistant-pilot/architecture). Каждый деплой — write-действие, проходит approval-гейт (кнопка в Telegram Олегу), чтобы клиент не наплодил лишнего. Со временем доверенные апки можно вынести в allowlist (без подтверждения).


3. Сервисы — что и как

3.1 Боты (ИИ-ядро, уже частично есть)

Бот Движок Канал Ключ/модель Статус
Алекс openclaw (LXC102) Telegram @alex_umny_bot + веб OmniRoute (Codex/Max) 🟢 есть
Hermes (новый) Hermes Agent Telegram + веб-дашборд GLM 5.2 на ключе Олега 🔜 поставить

Hermes для Александра — по образцу German (LXC141, см. ../../decisions/2026-06-18-german-hermes-agent-deploy):

  • Отдельный LXC (или контейнер в Cosmos), Hermes Agent + gateway Telegram + dashboard hermes.umnybot.ru.
  • Модель — GLM 5.2 напрямую (ключ Олега) или через OmniRoute-провайдер glm/*. ⚠️ В KB у glm/glm-5.1 был баланс 0 — проверить баланс ключа GLM 5.2 перед стартом (см. #открытые-вопросы).
  • ОЗУ: ~11.5 ГБ. Это самый заметный новый потребитель после медиа — ставить, когда подтвердим бюджет.

Инструмент деплоя у агента — ключ модели «всё через бота». В набор tools агента (рядом с alex-*.sh) добавляем cosmos-deploy.sh <app>: бот по запросу клиента дёргает Cosmos API, поднимает сервис, отдаёт ссылку. Каталог понятных алиасов: «облако» → nextcloud, «фильмы/кино» → plex, «качалка» → qbittorrent, «чат с ИИ» → open-webui, «пароли» → vaultwarden. Деплой — write-действие через approval-гейт (см. раздел 2).

SwarmClaw для клиента (если ему удобнее веб-чата) — сейчас это админский оркестратор Олега (umnybot.ru). Приспособить:

  • Завести отдельный ограниченный аккаунт Александру (чат с агентами, без управления узлами/креденшалами).
  • ⚠️ База swarmclaw.db хранит API-ключи всех клиентов Олега — не давать админ-доступ, только пользовательский профиль. Полная изоляция = отдельный инстанс (+4 ГБ ОЗУ, не потянем с медиа). Рекомендация: ограниченный аккаунт; SwarmClaw — опция, основной канал всё равно Telegram-бот.

3.2 Homepage — информационный портал

  • Уже есть на LXC105. Доработать: плитки на ВСЕ ресурсы Александра (боты, облако, медиа, торрент, Open WebUI, Cosmos), живые виджеты (Proxmox, Nextcloud, qBittorrent).
  • Сделать стартовой страницей home.umnybot.ru — первое, что видит клиент. Можно вынести как «дашборд» внутри Cosmos.
  • Образец конфига — ../../decisions/2026-06-27-homepage-dashboard-lxc145.

3.3 Nextcloud — личное облако

  • Лёгкая установка, НЕ AIO (AIO тянет 10+ контейнеров и 10 ГБ ОЗУ — коробка не вытянет). Ставим nextcloud:apache + отдельный MariaDB, или официальный образ через Cosmos App Store.
  • Данные — на HDD /mnt/pve/Work (1.8 ТБ).
  • Интеграция с торрентом: External Storage → локальная папка /mnt/Work/media (куда качает qBittorrent). Скачанное сразу видно в облаке.
  • Домен cloud.umnybot.ru. ОЗУ ~11.5 ГБ.

3.4 Plex — мультимедиа («Flex»)

  • Plex Media Server (выбран клиентом), библиотека на HDD /mnt/Work/media.
  • ⚠️ Честное ограничение: i3-2100 (2011, без рабочего QuickSync) не тянет транскодинг, особенно 4K. Работает только Direct Play — файл должен подходить устройству напрямую (формат/кодек/битрейт). Для ТВ/телефона в большинстве случаев ок; 4K HEVC на старый ТВ — будет тормозить. Это нужно проговорить с клиентом.
  • Интеграция: та же папка /mnt/Work/media, что у торрента и Nextcloud → скачал → появилось в Plex. Домен media.umnybot.ru. ОЗУ ~1 ГБ (без транскода).

3.5 Торрент — qBittorrent

  • qbittorrent (linuxserver), WebUI dl.umnybot.ru, загрузки в /mnt/Work/media (общая папка с Plex и Nextcloud — ключ всей интеграции).
  • Лёгкий, ~256512 МБ ОЗУ.
  • Прямой доступ из Nextcloud и Plex реализуется именно через общий путь загрузок — отдельные «коннекторы» не нужны, всё через одну директорию на HDD.

3.6 Open WebUI — чат с ИИ через браузер

  • open-webui, бэкенд — OmniRoute (http://<omni>:20128/v1), как на LXC142 (../../decisions/2026-06-22-open-webui-deploy).
  • Домен chat.umnybot.ru. Клиенту — красивый веб-чат со всеми моделями без Telegram.
  • ОЗУ ~1 ГБ (embedding-модель грузится с HF при первом старте — учесть медленную загрузку из РФ).

3.7 Что ещё полезного предложить Александру

  • Vaultwarden — менеджер паролей (на дом/семью), ~128 МБ. Дёшево и очень полезно.
  • Immich — фото-бэкап с телефонов (замена Google Photos). ⚠️ Тяжёлый (ML-распознавание лиц) — только если добавить ОЗУ или отключить ML.
  • Uptime Kuma — мониторинг доступности всех сервисов, ~128 МБ, плитка в Homepage.
  • AdGuard Home — блокировка рекламы/трекеров на весь дом (DNS), ~128 МБ. Хорошо ложится на тему «обхода РКН» которая у клиента уже есть.
  • Paperless-ngx — архив документов с распознаванием (для домовладельца удобно). Тяжеловат, опционально.

Клиент не ищет это в каталоге — он просит бота («заведи менеджер паролей»), бот ставит. Мы лишь заранее прописываем алиасы в cosmos-deploy.sh и проверяем, что апка лёгкая.


4. База знаний бота — только Бенелюкс (изоляция)

Принципиальное требование: KB агента Александра содержит только инфраструктуру Бенелюкса, без общей базы Олега. Это даёт автономность и безопасность — через бота клиента нельзя вытащить данные о НИИКН/dttb/других клиентах.

  • Отдельный репозиторий/папка KB для коробки (напр. kb-benelux), куда входит: сеть Александра (роутер, UniFi, принтер, камеры), его сервисы (этот документ, architecture, credentials Бенелюкса), инструкции для семьи. Не входит: projects/dttb, projects/niikn, decisions Олега, общие snippets.
  • Источник синка — не общий vault Олега. Сейчас агенты тянут общую KB (kb-pull.sh с Gitea Олега). Для Александра: либо отдельный репозиторий в его Gitea (LXC104, уже на коробке!), либо локальная папка без внешнего синка. Рекомендация: держать KB в Gitea Александра (LXC104) — полностью на его сервере, ноль зависимости от Gitea Олега.
  • Память бота (openclaw memory / pgvector) переиндексируется только из этой папки. Проверить, что в индекс не попали общие записи от предыдущего пилота.
  • Олег как админ правит KB Бенелюкса через его Gitea; клиент видит результат через ответы бота.

⚠️ Сейчас у пилота KB могла быть общая — аудит при внедрении: что именно сейчас в памяти бота Алекс, нет ли там чужой инфры. См. #открытые-вопросы.


5. Бюджет ресурсов

Главный лимит — ОЗУ (15 ГБ), а не диск/CPU. Нельзя поднять всё сразу. Грубая раскладка «реалистичного» набора:

Сервис ОЗУ Приоритет
Текущее (Алекс+OmniRoute, SwarmClaw, Gitea, NPM, Homepage) ~10 ГБ уже работает
Cosmos Cloud (платформа) ~0.25 ГБ P0
qBittorrent ~0.4 ГБ P1
Plex (Direct Play) ~1 ГБ P1
Nextcloud (light) ~1.5 ГБ P1
Open WebUI ~1 ГБ P2
Hermes (GLM 5.2) ~1.5 ГБ P2
Vaultwarden / Uptime Kuma / AdGuard ~0.4 ГБ P3

Сумма P0+P1 уже подводит к потолку. Варианты разруливания (для обсуждения с клиентом):

  1. Поджать текущее — SwarmClaw/Gitea Александру не критичны; SwarmClaw можно ужать или вынести на инфру Олега, освободив ~4 ГБ.
  2. Апгрейд ОЗУ — плата ZOTAC H61 держит до 1632 ГБ DDR3 (2 слота). Докупить планки = весь стек комфортно. Дешёвый DDR3 б/у. Самое разумное вложение, если клиент хочет «всё».
  3. Тяжёлое — на инфру Олега — Open WebUI/Hermes держать у Олега, отдавать через *.umnybot.ru. Разгружает коробку, но появляется зависимость от Олега (против идеи автономности).

Рекомендация: стартуем P0+P1 в рамках текущего железа (поджав SwarmClaw), параллельно предлагаем клиенту апгрейд ОЗУ до 32 ГБ под полный набор.


6. Автономность от инфры Олега

Цель — коробка должна жить, даже если инфра Олега выключена. Три точки зависимости и как их закрыть:

Зависимость сейчас Проблема Решение для автономности
Публичный вход через VPS-шлюз Олега (158.255.0.139) домены *.umnybot.ru ходят через сервер Олега Cloudflare Tunnel на коробке: cloudflared поднимает исходящий туннель к Cloudflare, тот публикует *.umnybot.ru. Не нужен ни статичный IP, ни VPS Олега, ни проброс портов. Работает за динамическим WAN и за CGNAT. Это и есть ключ к автономности входа. Домен перевести на Cloudflare DNS.
LLM через OmniRoute на ключах/аккаунтах Олега боты думают «мозгами» Олега (Max/Codex-аккаунты) Свой биллинг: прямой ключ GLM 5.2 (или свой Anthropic/OpenRouter) в OmniRoute коробки. У коробки уже свой OmniRoute (LXC102) — нужен только отдельный оплаченный ключ, а не общий пул Олега.
Мониторинг Антошкой (LXC137 Олега) сторож живёт у Олега Локальный сторож на коробке (cron + Uptime Kuma) шлёт алерты в Telegram самому Олегу/клиенту. Внешний догляд Олега оставить как второй контур, но коробка самодостаточна.
KB из общего vault Олега см. раздел 4 KB в Gitea Александра (LXC104), на его сервере.

После этих шагов коробка автономна: свой вход (Cloudflare), свои мозги (свой ключ), своя память (своя KB), свой сторож. Олег — только админ-доступ для поддержки.

⚠️ Cloudflare Tunnel vs текущий VPS-шлюз — это развилка по входу. Cloudflare бесплатен и автономен, но трафик идёт через Cloudflare (для домашнего сервиса ок). Решить при внедрении (раздел 9).


7. Доступ и креды — удобно и безопасно

Требование: клиент и семья заходят в сервисы просто, но без дыр. Урок коробки уже оплачен — компрометация 2026-05-20 случилась именно из-за общего слабого пароля 1qaz!QAZ (../../decisions/2026-05-20-benelux-compromise). Поэтому: никаких общих паролей на сервисы, уникальный секрет на каждый, выдача через защищённые каналы.

Модель доступа: один вход → все сервисы (SSO)

Большинство сервисов клиент не логинит по отдельности — единый вход:

  • Cosmos SSO / forward-auth на периметре: один аккаунт Александра (логин + обязательная 2FA/TOTP) открывает все веб-сервисы за прокси (Nextcloud, Plex-веб, qBittorrent, Open WebUI, Homepage). Зашёл один раз — внутри ходит свободно.
  • Где у сервиса свой обязательный аккаунт (Plex-приложения на ТВ, Nextcloud-клиент на телефоне) — заводим отдельный пароль на сервис, генерируется, не переиспользуется.
  • Семья/персонал/гости — отдельные ограниченные учётки, не админ Александра. Ложится на уже запланированную сегментацию Wi-Fi (wifi-segmentation-concept): хозяева/персонал/гости и в сети, и в сервисах.

Хранение: Vaultwarden как «сейф» семьи

  • Vaultwarden (лёгкий, ~128 МБ) — единое хранилище паролей на дом. Все сгенерированные креды сервисов лежат там, клиент открывает по одному мастер-паролю + 2FA.
  • Приложения Bitwarden на всех устройствах семьи (iOS/Android/браузер) — автозаполнение, делиться доступом без пересылки паролей в мессенджерах.
  • Это и «удобно» (автозаполнение, один сейф), и «безопасно» (уникальные пароли, шифрование, не в переписке).

Выдача через бота — безопасно

Бот не только ставит сервис, но и отдаёт доступ правильно:

  • При деплое cosmos-deploy.sh генерирует пароль (openssl rand), кладёт его в Vaultwarden через API и навешивает на сервис — пароль нигде не печатается «по умолчанию».
  • Боту клиент пишет «дай доступ к облаку» → бот отвечает ссылкой на запись в Vaultwarden (или одноразово показывает логин). Реквизиты не оседают в истории Telegram навсегда.
  • Если показывать прямо в чат — то самоудаляющимся сообщением и только владельцу (проверка Telegram user-id, как в approval-гейте).
  • Полный реестр секретов админ-уровня (root, токены) остаётся у Олега в ../dttb/ai-assistant-pilot/credentials — клиенту туда доступа нет.

Базовая гигиена (закрыть сразу)

  • Сменить общий 1qaz!QAZ на хосте/Proxmox и в сервисах на уникальные — этот пароль «утёк» в инцидент и до сих пор живёт (root pve, Basic Auth pve). Включить 2FA на Proxmox UI.
  • Внутренние сервисы не светить в интернет без нужды — только через SSO/Cloudflare Access; всё остальное по NetBird/LAN.
  • Секреты сервисов — в .env (chmod 600), не в git, не в KB.

Итог цепочки: деплой ботом → пароль сгенерирован → лёг в Vaultwarden → клиент входит по SSO+2FA, а где нужно — берёт из сейфа. Удобно для семьи, при этом ни одного общего/слабого пароля.


8. План внедрения (по шагам, с проверками)

Шаг 0 — замер + аудит KB. free -m, df -h /mnt/pve/Work, pct list + RAM каждого LXC. Проверить, что сейчас в памяти бота Алекс — нет ли там общей инфры Олега (раздел 4). свободно ≥3 ГБ ОЗУ и KB понятна.

Шаг 1 — Cosmos Cloud (движок). Поставить на хост (или LXC с nesting). Настроить, проверить API. через API поднимается тестовый контейнер.

Шаг 2 — Vaultwarden + SSO периметр. Поднять Vaultwarden («сейф» семьи) и включить Cosmos SSO/forward-auth с обязательной 2FA для Александра. один вход открывает защищённый тестовый сервис, креды лежат в сейфе.

Шаг 3 — деплой-инструмент бота. Написать cosmos-deploy.sh <app>: ставит сервис + генерирует пароль (openssl rand) и кладёт в Vaultwarden через API, отдаёт клиенту ссылку на запись. Добавить в tools агента через approval-гейт. «поставь тест» → контейнер поднят, пароль в сейфе, бот прислал ссылку (не сам пароль в чат).

Шаг 4 — общая медиа-папка + торрент. Создать /mnt/pve/Work/media. Бот ставит qBittorrent (volume = эта папка). тестовая закачка появляется в папке.

Шаг 5 — Plex. Библиотека на /mnt/Work/media. тестовый файл играет Direct Play на ТВ/телефоне клиента.

Шаг 6 — Nextcloud (light). External Storage → /mnt/Work/media. скачанный торрент виден и в облаке, и в Plex (сквозная интеграция — ядро ТЗ).

Шаг 7 — изоляция KB. Создать репозиторий kb-benelux в Gitea Александра (LXC104), наполнить только инфрой Бенелюкса, переключить синк/память бота на него. бот отвечает по Бенелюксу, не знает про НИИКН/dttb.

Шаг 8 — автономный вход (Cloudflare Tunnel). Поставить cloudflared на коробку, перевести umnybot.ru на Cloudflare DNS, опубликовать сервисы. домены работают без VPS-шлюза Олега.

Шаг 9 — Open WebUI + Hermes (GLM 5.2). Проверить баланс GLM, поставить. Open WebUI chat.*, Hermes — TG + hermes.*. оба отвечают на своём ключе.

Шаг 10 — Homepage как «рабочий стол». Плитки на всё, живые виджеты, стартовая. клиент с одной страницы попадает в любой сервис, а бот ставит новые по запросу.


9. Открытые вопросы (уточнить у Олега/клиента)

  • Аудит KB пилота — что сейчас в памяти бота Алекс? Если там общая инфра Олега — вычистить (требование автономности/безопасности).
  • Вход: Cloudflare Tunnel или остаёмся на VPS-шлюзе? Cloudflare = автономность от Олега + работа за динамич. WAN; минус — трафик через Cloudflare. Рекомендация — Cloudflare.
  • Свой LLM-ключ (GLM 5.2 / другой) с оплаченным балансом — чтобы боты не зависели от пула Олега. Проверить баланс (у glm-5.1 в KB был 0).
  • Апгрейд ОЗУ до 32 ГБ DDR3 — готов ли клиент на железо? Определяет P1 или полный набор.
  • Plex и транскод — проговорить ограничение Direct Play (4K на старом ТВ тормозит). Ожидания выровнять заранее.
  • SwarmClaw клиенту — нужен ли вообще, если основной канал бот? Если да — ограниченный аккаунт.
  • NetBird на сам хост — висящий TODO (../dttb/proxmox-pve-147); упростит админ-доступ Олега.

Связанное