diff --git a/projects/benilux/umny-server-concept.md b/projects/benilux/umny-server-concept.md index b84f711..65d8199 100644 --- a/projects/benilux/umny-server-concept.md +++ b/projects/benilux/umny-server-concept.md @@ -6,16 +6,17 @@ tags: [alexandr, umnybot, concept, cosmos, self-service, ai-services, media, nex aliases: ["концепция умного сервера Александра", "umnybot concept", "сервис-каталог Александра"] --- -# 🧠 Концепция «Умного сервера» Александра — единый ИИ-сервис с самообслуживанием +# 🧠 Концепция «Умного сервера» Александра — простой ИИ-сервис, всё через бота -> Развитие пилота [[../dttb/ai-assistant-pilot/architecture|umnybot]] в законченный продукт: «умный сервер с ИИ-сервисами», который продали клиенту. Цель — удобный личный кабинет, где Александр сам ставит и настраивает сервисы, всё за одним входом. Секреты — в [[../dttb/ai-assistant-pilot/credentials|credentials пилота]] и [[credentials|сеть Бенелюкса]]. +> Развитие пилота [[../dttb/ai-assistant-pilot/architecture|umnybot]] в законченный продукт: «умный сервер с ИИ-сервисами», который продали клиенту. Цель — **простой и удобный** сервис, где клиент ничего не настраивает руками: попросил бота — бот сам поставил/настроил. Максимальная автономность от инфраструктуры Олега. Секреты — в [[../dttb/ai-assistant-pilot/credentials|credentials пилота]] и [[credentials|сеть Бенелюкса]]. ## TL;DR (что решили) -- **Витрина и автодеплой** — **Cosmos Cloud** на хосте: один контейнер = реверс-прокси + авто-HTTPS + SSO/логин + App Store + защита (SmartShield) + мониторинг. Это «магазин сервисов», где Александр сам ставит приложения в один клик. -- **Железо** — работаем в рамках (i3-2100, 2 ядра, **15 ГБ ОЗУ, уже ~⅔ занято**). Лёгкие версии сервисов, без одновременной тяжёлой нагрузки, приоритизация. Честно: всё включить «на полную» эта коробка не потянет — концепция это учитывает. -- **Что работает сейчас:** боты Алекс + Hermes, SwarmClaw, Homepage, Open WebUI, Nextcloud, Plex, торрент — с интеграцией «скачал → видно в облаке и медиа». -- **Бюджет ОЗУ — главный лимит**, не диск и не CPU. См. [#бюджет-ресурсов](#бюджет-ресурсов). +- **Лицо сервиса — бот, а не панель.** Клиент НЕ кликает в Cosmos сам. Он пишет боту (Алекс/Hermes в Telegram) или в SwarmClaw: «поставь мне облако» / «хочу смотреть фильмы» → **агент сам разворачивает сервис через Cosmos API**, выдаёт ссылку. Самообслуживание = диалог. +- **Cosmos Cloud — движок под капотом**, не витрина. Даёт реверс-прокси + авто-HTTPS + изоляцию + API для автодеплоя. Клиент его обычно не видит; админ-доступ — у Олега и у бота. +- **База знаний бота — ТОЛЬКО Бенелюкс.** Изолированная KB по инфраструктуре Александра, без общей базы Олега. Это и автономность, и безопасность. +- **Максимальная автономность от Олега:** свой LLM-ключ/баланс, свой публичный вход (Cloudflare Tunnel вместо VPS-шлюза Олега), свой мониторинг. См. [#автономность](#7-автономность-от-инфры-олега). +- **Железо** — работаем в рамках (i3-2100, 2 ядра, **15 ГБ ОЗУ, уже ~⅔ занято**). Лёгкие версии сервисов, приоритизация. Всё «на полную» коробка не потянет — концепция это учитывает. --- @@ -39,35 +40,50 @@ Nextcloud, медиасервер (Plex/«Flex»), торрент-клиент, --- -## 2. Целевая архитектура +## 2. Целевая архитектура — «всё через бота» + +Клиент общается только с ботом. Бот — это «оператор» сервера: понимает запрос на естественном языке, дёргает Cosmos API, отвечает ссылкой. Панель Cosmos — служебная, для Олега. ``` -Интернет → *.umnybot.ru → VPS-шлюз 158.255.0.139 (NetBird) - │ - ┌─────────────┴─────────────┐ - ▼ ▼ - umnybot.ru (SwarmClaw) app.umnybot.ru (Cosmos UI) - │ ← ЕДИНЫЙ ВХОД клиента - ┌────────────────────────────┼────────────────────────────┐ - ▼ ▼ ▼ ▼ ▼ - Nextcloud Plex qBittorrent Open WebUI бот Hermes - cloud.* media.* dl.* chat.* (TG + web) - │ - скачал торрент → /mnt/Work/media (HDD 1.8 ТБ) - │ - ├─→ Plex видит библиотеку (media volume) - └─→ Nextcloud External Storage (тот же путь) → видно в облаке + КЛИЕНТ КЛИЕНТ (опц., если удобно) + 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 (тот же путь) → видно в облаке ``` -### Почему Cosmos Cloud (а не CasaOS/Runtipi/Portainer) -Выбран как «магазин сервисов» по ключевому критерию ТЗ — **самостоятельная установка + безопасный публичный доступ**: +### Роли в новой модели -- **Всё-в-одном:** встроенный реверс-прокси + автоматический Let's Encrypt + страница логина/2FA (свой SSO) + App Store + контейнерный мониторинг — одним сервисом. Не нужно собирать NPM+authentik+Portainer+Homepage по кусочкам. -- **Безопасен для паблика:** SmartShield (анти-брутфорс, гео/rate-limit, изоляция приложений) — у CasaOS этого нет, его в интернет голым выставлять нельзя. -- **Один клик для клиента:** Александр заходит в `app.umnybot.ru`, видит каталог, жмёт «Install» — Cosmos сам поднимает контейнер, выдаёт поддомен и HTTPS. -- **Сосуществует с текущим NPM:** Cosmos берёт на себя новые сервисы, существующие (SwarmClaw, pve) остаются за NPM коробки. Мигрируем постепенно, ничего не ломая. +| Компонент | Роль | Видит ли клиент | +|---|---|---| +| **Бот (Алекс/Hermes)** | лицо сервиса, принимает запросы, разворачивает сервисы | ✅ основной интерфейс | +| **SwarmClaw** | альт. веб-интерфейс к тем же агентам (если удобнее чата) | ✅ опц., ограниченный аккаунт | +| **Cosmos Cloud** | движок: API автодеплоя, прокси, HTTPS, изоляция | ❌ только Олег + бот | +| **Homepage** | витрина-портал со ссылками на готовые сервисы | ✅ как «рабочий стол» | -> Лёгкий по ресурсам (сам Cosmos ~150–250 МБ ОЗУ) — критично для этой коробки. +### Почему Cosmos Cloud (как движок, не витрина) +Клиент сам кликать в App Store не будет — установку делает **бот через API**. Cosmos выбран потому, что лучше прочих (CasaOS/Runtipi/Portainer) закрывает именно автодеплой-через-API + безопасность: + +- **API + Docker-оркестрация:** бот вызывает Cosmos, тот поднимает контейнер, навешивает поддомен, HTTPS и изоляцию — всё одним движком, без сборки NPM+certbot+Portainer руками. +- **Безопасен для паблика:** SmartShield (анти-брутфорс, rate-limit, изоляция приложений) — на случай, если что-то всё же смотрит в интернет. +- **Лёгкий:** сам Cosmos ~150–250 МБ ОЗУ — критично для этой коробки. +- **Сосуществует с текущим NPM:** новые сервисы — на Cosmos, существующие (SwarmClaw, pve) пока за NPM коробки. Миграция постепенная. + +> **Бот ставит сервисы через скрипт-обёртку** (напр. `cosmos-deploy.sh `), добавленный в инструменты агента — по образцу `alex-*.sh` ([[../dttb/ai-assistant-pilot/architecture]]). Каждый деплой — write-действие, проходит approval-гейт (кнопка в Telegram Олегу), чтобы клиент не наплодил лишнего. Со временем доверенные апки можно вынести в allowlist (без подтверждения). --- @@ -85,9 +101,11 @@ Nextcloud, медиасервер (Plex/«Flex»), торрент-клиент, - Модель — **GLM 5.2** напрямую (ключ Олега) или через OmniRoute-провайдер `glm/*`. ⚠️ В KB у `glm/glm-5.1` был баланс 0 — **проверить баланс ключа GLM 5.2 перед стартом** (см. [#открытые-вопросы](#открытые-вопросы)). - ОЗУ: ~1–1.5 ГБ. Это самый заметный новый потребитель после медиа — ставить, когда подтвердим бюджет. -**SwarmClaw для клиента** — сейчас это админский оркестратор Олега (`umnybot.ru`). Приспособить можно так: -- Завести **отдельный read-only/ограниченный аккаунт** Александру (доступ к чату с агентами, без управления узлами/креденшалами). -- ⚠️ База `swarmclaw.db` хранит API-ключи всех клиентов — **не давать Александру админ-доступ**, только пользовательский профиль. Если нужна полная изоляция — отдельный инстанс SwarmClaw для него (но это +4 ГБ ОЗУ, коробка не потянет вместе с медиа). **Рекомендация: ограниченный аккаунт в текущем инстансе.** +**Инструмент деплоя у агента** — ключ модели «всё через бота». В набор tools агента (рядом с `alex-*.sh`) добавляем `cosmos-deploy.sh `: бот по запросу клиента дёргает 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). @@ -122,11 +140,24 @@ Nextcloud, медиасервер (Plex/«Flex»), торрент-клиент, - **AdGuard Home** — блокировка рекламы/трекеров на весь дом (DNS), ~128 МБ. Хорошо ложится на тему «обхода РКН» которая у клиента уже есть. - **Paperless-ngx** — архив документов с распознаванием (для домовладельца удобно). Тяжеловат, опционально. -> Всё это — карточки в Cosmos App Store, клиент ставит сам когда захочет. Мы лишь готовим каталог и проверяем, что лёгкие. +> Клиент не ищет это в каталоге — он **просит бота** («заведи менеджер паролей»), бот ставит. Мы лишь заранее прописываем алиасы в `cosmos-deploy.sh` и проверяем, что апка лёгкая. --- -## 4. Бюджет ресурсов +## 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.** Нельзя поднять всё сразу. Грубая раскладка «реалистичного» набора: @@ -150,7 +181,24 @@ Nextcloud, медиасервер (Plex/«Flex»), торрент-клиент, --- -## 5. План внедрения (по шагам, с проверками) +## 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/обсудить апгрейд.