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

240 lines
27 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-06-29
type: project
status: concept
tags: [alexandr, umnybot, concept, cosmos, self-service, ai-services, media, nextcloud]
aliases: ["концепция умного сервера Александра", "umnybot concept", "сервис-каталог Александра"]
---
# 🧠 Концепция «Умного сервера» Александра — простой ИИ-сервис, всё через бота
> Развитие пилота [[../dttb/ai-assistant-pilot/architecture|umnybot]] в законченный продукт: «умный сервер с ИИ-сервисами», который продали клиенту. Цель — **простой и удобный** сервис, где клиент ничего не настраивает руками: попросил бота — бот сам поставил/настроил. Максимальная автономность от инфраструктуры Олега. Секреты — в [[../dttb/ai-assistant-pilot/credentials|credentials пилота]] и [[credentials|сеть Бенелюкса]].
## TL;DR (что решили)
- **Лицо сервиса — бот, а не панель.** Клиент НЕ кликает в Cosmos сам. Он пишет боту (Алекс/Hermes в Telegram) или в SwarmClaw: «поставь мне облако» / «хочу смотреть фильмы» → **агент сам разворачивает сервис через Cosmos API**, выдаёт ссылку. Самообслуживание = диалог.
- **Cosmos Cloud — движок под капотом**, не витрина. Даёт реверс-прокси + авто-HTTPS + изоляцию + API для автодеплоя. Клиент его обычно не видит; админ-доступ — у Олега и у бота.
- **База знаний бота — ТОЛЬКО Бенелюкс.** Изолированная KB по инфраструктуре Александра, без общей базы Олега. Это и автономность, и безопасность.
- **Максимальная автономность от Олега:** свой LLM-ключ/баланс, свой публичный вход (Cloudflare Tunnel вместо VPS-шлюза Олега), свой мониторинг. См. [#автономность](#7-автономность-от-инфры-олега).
- **Железо** — работаем в рамках (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 могла быть общая — **аудит при внедрении:** что именно сейчас в памяти бота Алекс, нет ли там чужой инфры. См. [#открытые-вопросы](#9-открытые-вопросы).
---
## 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. План внедрения (по шагам, с проверками)
**Шаг 0 — замер.** `free -m`, `df -h /mnt/pve/Work`, `pct list` + RAM каждого LXC. Зафиксировать реальный свободный объём ОЗУ. ✅ если свободно ≥3 ГБ — продолжаем; если нет — сначала поджать SwarmClaw/обсудить апгрейд.
**Шаг 1 — Cosmos Cloud.** Поставить на хост (или в LXC с nesting). Подключить домен `app.umnybot.ru` через VPS-шлюз. Настроить SSO/2FA. ✅ клиент логинится, видит пустой App Store и текущие контейнеры.
**Шаг 2 — общая медиа-папка + торрент.** Создать `/mnt/pve/Work/media`. Поставить qBittorrent (volume = эта папка). ✅ тестовая закачка появляется в папке.
**Шаг 3 — Plex.** Библиотека на `/mnt/Work/media`. ✅ тестовый файл играет Direct Play на ТВ/телефоне клиента.
**Шаг 4 — Nextcloud (light).** External Storage → `/mnt/Work/media`. ✅ скачанный торрент виден и в облаке, и в Plex (проверка сквозной интеграции — ядро ТЗ).
**Шаг 5 — Open WebUI.** Бэкенд OmniRoute. ✅ чат отвечает в браузере.
**Шаг 6 — Hermes (GLM 5.2).** Сначала проверить баланс ключа GLM. Поставить, Telegram + `hermes.umnybot.ru`. ✅ бот отвечает.
**Шаг 7 — Homepage как портал.** Плитки на всё, живые виджеты. Сделать стартовой. ✅ клиент с одной страницы попадает в любой сервис.
**Шаг 8 — каталог App Store + инструкция.** Подготовить карточки лёгких приложений (Vaultwarden, Uptime Kuma, AdGuard) + короткая памятка клиенту «как поставить сервис самому». ✅ клиент ставит что-то сам в один клик.
---
## 6. Открытые вопросы (уточнить у Олега/клиента)
- [ ] **Баланс ключа GLM 5.2** — в KB `glm/glm-5.1` был «баланс 0». Hermes на нём не заведётся. Проверить/пополнить.
- [ ] **Апгрейд ОЗУ** до 32 ГБ DDR3 — готов ли клиент на железо? Определяет, P1 или полный набор.
- [ ] **Plex и транскод** — проговорить ограничение Direct Play (4K на старом ТВ будет тормозить). Возможно, клиенту хватит — но ожидания выровнять заранее.
- [ ] **SwarmClaw для клиента** — ограниченный аккаунт в текущем инстансе (рекомендация) или поджать/вынести? Влияет на бюджет ОЗУ.
- [ ] **Cosmos vs текущий NPM** — Cosmos на новые сервисы, NPM коробки остаётся на SwarmClaw/pve; или со временем всё на Cosmos? (постепенная миграция).
- [ ] **NetBird на сам хост** — давно висящий TODO ([[../dttb/proxmox-pve-147]]); упростит управление, стоит закрыть в ходе работ.
---
## Связанное
- [[../dttb/ai-assistant-pilot/architecture]] — текущая архитектура коробки
- [[../dttb/proxmox-pve-147]] — железо хоста
- [[../dttb/ai-assistant-pilot/credentials]] — доступы/секреты
- [[README]] — объект Бенелюкс (сеть, роутер)
- [[../../decisions/2026-06-22-open-webui-deploy]], [[../../decisions/2026-06-27-homepage-dashboard-lxc145]], [[../../decisions/2026-06-18-german-hermes-agent-deploy]] — образцы деплоя