--- date: 2026-05-31 type: project tags: [ai-assistant, alexandr, umnybot, credentials, secrets, openclaw, omniroute] status: active --- # 🔐 AI-ассистент «umnybot» — инфра и креды (пилот Александра) > ⚠️ **КОНФИДЕНЦИАЛЬНО.** Продукт «консьерж в коробке». См. [[PROMPT]] (тех-задание) и память `project_alexandr_assistant`. > Все секреты также лежат на коробке в `/opt/assistant/.env` (chmod 600). ## Коробка (хост + контейнер) | Параметр | Значение | |---|---| | Хост | Proxmox `pve` (pve-147), **10.0.0.147**, root / `1qaz!QAZ` | | Контейнер | **LXC 102 «assistant»**, Debian 12, IP **10.0.0.163** | | root LXC 102 | `j5DS1JSPKewKQw6i7mTK` (уникальный; Mac-ключ `ai@mac-20260112` в authorized_keys) | | Стек | Docker (overlayfs) + Node 22; openclaw 2026.5.27; OmniRoute 3.8.7; Postgres16/pgvector | | Доступ | `sshpass -p '1qaz!QAZ' ssh root@10.0.0.147` → `pct exec 102 -- bash` (или `ssh root@10.0.0.163` по Mac-ключу) | ## OmniRoute (LLM-роутер) | Параметр | Значение | |---|---| | Сервис | systemd `omniroute.service`, слушает **0.0.0.0:20128** | | Дашборд | **https://omni.umnybot.ru** (через NPM, LE) или `http://10.0.0.163:20128` | | Пароль дашборда | **`A30Y7aan8dCKf9`** (Settings → Security можно сменить) | | API-ключ (для openclaw) | **`ork_VQo75huaEVGzhdfD4QlrL2XaxTmNKPTD`** | | Конфиг/секреты | `/root/.omniroute/.env` (STORAGE_ENCRYPTION_KEY + СВЕЖИЕ JWT_SECRET/API_KEY_SECRET — перегенерены перед выходом наружу), `storage.sqlite` | | Старт сервера | `node /usr/lib/node_modules/omniroute/app/server.js` (PORT=20128, HOSTNAME=0.0.0.0) | | Провайдеры | **Kiro** подключён (GitHub device-flow, аккаунт `kiro1@umnybot.ru`) — но **новый аккаунт троттлит (429 AWS CodeWhisperer)**. Олег добавляет 2-й провайдер через дашборд-GUI | | Сброс пароля | `omniroute-reset-password` (интерактивный, нужен `expect` для pipe) | ## openclaw (мозг + каналы) | Параметр | Значение | |---|---| | Версия | 2026.5.27 (глоб. npm), конфиг `/root/.openclaw/openclaw.json` | | Gateway | systemd **`openclaw-gateway.service`** (`openclaw gateway run`), loopback 127.0.0.1:18789 | | Канал | Telegram `@alex_umny_bot` (connected, polling) | | Дефолт-модель | пока `openai/gpt-5.5` (без провайдера) → переключить на `omniroute//` | | Провайдер omniroute | `openclaw models auth paste-api-key` (baseUrl `http://127.0.0.1:20128/v1`, key `ork_VQo…`) | ## Telegram | Параметр | Значение | |---|---| | Бот | **@alex_umny_bot** «Консьерж Бот», id 8601326674 | | Токен | `8601326674:AAEJwbyXGEgEEiIwmfZVdYbG2SxpyMkmDiA` | | Audit chat_id | **1292155421** (Олег, @it5870) | ## Postgres + pgvector `127.0.0.1:5432` (Docker `assistant-postgres`, pgvector/pgvector:pg16) — user `assistant` / `c2e193fb341120471917f720a1c6eeea` / db `assistant`. Compose: `/opt/assistant/docker-compose.yml`. ## Домен umnybot.ru (Spaceweb) | Параметр | Значение | |---|---| | Регистратор/DNS | **Spaceweb**, панель `vps.sweb.ru`, логин `it5870yand` / `1qaz!QAZ` | | API | `POST https://api.sweb.ru/domains/dns` (методы `editMain`/`editMx`/`editTxt`, `action:add`) | | ⚠️ Проверка DNS | **только через DoH** (`curl https://1.1.1.1/dns-query?name=...&type=...`) — `dig` из dttb-сети режется домашним :53-перехватом (ложно-пусто). `action:add` РАБОТАЕТ | | Записи | `omni` A→**176.62.183.186**; `@` MX→`mail.dttb.ru` (10); `@` TXT SPF `v=spf1 ip4:176.62.183.186 ~all`; `dkim._domainkey` (2048); `_dmarc` | | Поддомены план | `omni.` = дашборд OmniRoute; `alex.` = веб ассистента Александра; `.` на будущих | ## Почта (на Mailcow dttb, VM 107) | Параметр | Значение | |---|---| | Ящик ассистента | **`assistant@umnybot.ru`** / **`KQcZnxkB5sMNiVYo`** | | Catch-all | `@umnybot.ru` → `assistant@umnybot.ru` (любой адрес, удобно под регистрацию аккаунтов) | | Вебмейл | **https://mail.dttb.ru** (SOGo) | | IMAP/SMTP | `mail.dttb.ru:993` / `mail.dttb.ru:587` | | Mailcow | 10.0.0.107, admin `admin`/`1qaz!QAZ`, API `dttb-mailcow-api-2026` (с 10.0.0.0/24) | | rspamd whitelist | `github.com`, `sgmail.github.com`, `sendgrid.net` для umnybot.ru (новый домен резался, для приёма GitHub-кодов) | ## Codex/OpenAI ящики (мульти-аккаунт, 2026-05-31) 8 ящиков на umnybot.ru, **общий пароль `1BU5zqB9NxC84h`**: `codex1@umnybot.ru` … `codex8@umnybot.ru` (quota 512MB, real-боксы, не catch-all). Вебмейл https://mail.dttb.ru (логин любым `codexN@umnybot.ru` / пароль). Коды можно тянуть по IMAP `mail.dttb.ru:993`. ⚠️ OpenAI требует телефон при регистрации — реальный потолок числа аккаунтов. ## Аккаунты провайдеров | Сервис | Логин | Заметка | |---|---|---| | GitHub (для Kiro) | `kiro1@umnybot.ru` | пароль задал Олег — **здесь не записан, спросить у Олега**. Зарегистрирован через catch-all (код пришёл в assistant@) | | Kiro (AWS) | через GitHub-логин выше | device-flow, профиль `arn:aws:codewhisperer:us-east-1:...`. Новый аккаунт троттлит | ## NetBird (доступ коробки к сети Александра) | Параметр | Значение | |---|---| | **Setup-key (Benelux)** | `26C84D9A-B71B-474D-BC41-8FAC2C4C6399` (reusable, до 2027-05-31) | | Группа | **Benelux** `d8e5s1jl0ubs73f3g7vg` (туда добавлен Cudy «OpenWrt Benilux»), политика «Benelux Access» | | Коробка в NetBird | `alex-assistant` = **100.70.186.192** (userspace-режим, без TUN — работает; TUN прописан в `/etc/pve/lxc/102.conf`, активируется при `pct reboot 102`) | | Цель | достать Cudy Александра **100.70.207.97** (ping ✅ ~62мс) → jump на Mac (`aleksandrgrigorev`/`gav1971@`)/устройства | | Управление NetBird | `api.netbird.io`, токен `nbp_…` в `projects/dttb/credentials.md` | | ⚠️ Безопасность | Default-политика NetBird = `All↔All` → коробка достаёт и др. сети Олега. **Для продукта — Александра в ОТДЕЛЬНЫЙ NetBird** (изоляция + автономность). | ## Инструменты Алекса — управление устройствами Александра (2026-05-31) Алекс ходит в сеть Александра: коробка → NetBird → Cudy (`100.70.207.97`) → LAN. Прямой роут в `192.168.1.0/24` нельзя (коллизия с Знаменское/НИИКН в NetBird) → всё джампом через Cudy. Обёрнуто в скрипты на коробке (`/opt/assistant/`), Алекс зовёт их через exec (`exec-policy` = yolo). Проверено в живом диалоге (TG): «какие точки wifi по комнатам» → Алекс сам зовёт `alex-unifi.sh`. | Скрипт | Что делает | |---|---| | `alex-router.sh [status\|devices\|printer\|dns]` | Cudy: статус обхода (`awg show awg0`), DHCP-аренды, пинг принтера, FakeIP-DNS. read-only | | `alex-unifi.sh [list\|check ]` | UniFi: точки/свитчи по комнатам + онлайн-проверка пингом. read-only | | `alex-print.sh` (текст на stdin) | Печать на HP M775, кириллица через `paps`→CUPS | ### UniFi (Cloud Key Gen2+ `192.168.1.199`) - Доступ: **SSH через Cudy** — `DROPBEAR_PASSWORD='1qaz!QAZ!QAZ' dbclient -y root@192.168.1.199` (sshpass на Cudy нет; dropbear `dbclient` берёт пароль из env). - ⚠️ Локальный UniFi-API **залочен SSO** (`/api/auth/login` = 403). Данные тянем из **MongoDB контроллера**: `mongo --quiet --port 27117 ace --eval "db.device.find({},{name:1,ip:1,model:1,_id:0}).forEach(printjson)"`. Поле `state` пустое → онлайн проверяем пингом точки с Cudy. - 13×UAP6MP по комнатам + 7 свитчей, см. [[benelux-topology]]. ### Принтер (HP LaserJet M775 `192.168.1.148`) - 9100/515 закрыты, открыт только **IPP/631** (+AirPrint). - Печать: **CUPS на коробке** (`apt: cups cups-client cups-filters paps`), очередь `alex` = `ipp://100.70.207.97:6310/ipp/print` (IPP Everywhere, `lpadmin -m everywhere`). - Коробка достаёт принтер через **DNAT на Cudy**: `100.70.207.97:6310` (NetBird) → `192.168.1.148:631`. Персистентно: `/etc/nftables.d/30-alex-printer.nft` (dstnat + masquerade только для `saddr 100.70.186.192`; `fw4 check` ОК, `fw4 reload` применён). - Кириллица: `paps --font='DejaVu Sans Mono 11'` → PostScript → CUPS. Хелпер `/opt/assistant/alex-print.sh`. Тест-лист напечатан (job completed). ## Защита сети — Алекс-сторож (2026-05-31) Алекс защищает сеть Александра от повторения инцидента [[../../decisions/2026-05-20-benelux-compromise]] (WAN-SSH брут → спам-релей). Детект + алерт (превенция уже стоит: nft `incident-20260520` + key-only). - **Аудит:** `/opt/assistant/alex-security.sh` (на коробке) → `/root/.alex-seccheck.sh` (на Cudy, read-only). Чек-лист под вектор инцидента: WAN-SSH закрыт (правило `incident-20260520-no-ssh-from-wan`), нет `Allow-SSH-WAN`, `PasswordAuth=off`, чужие SSH-сессии (не `100.70.`/`192.168.1.`), исходящий SMTP 25/465/587, посторонний cron, скрытые **executable** в /tmp, левые SSH-ключи (белый список: `mac-20260112` / `claude-code@code-server` / `alex-assistant`), LA≥3. - **Сторож:** `/opt/assistant/alex-secwatch.sh` + cron коробки `*/15` → при FLAG алерт Олегу в TG (`TELEGRAM_AUDIT_CHAT_ID=1292155421` из `.env`), дедуп по md5 набора угроз, «отбой» когда чисто. Канал проверен (`tg=200`, «🛡️ Алекс-сторож на посту»). - On-demand в TG: «нас не ломают?» → Алекс сам зовёт проверку, объясняет спокойно. Проверено. - Статус: всё чисто, ~150 WAN-SSH брутов отбито (nft counter растёт — защита держит вектор). ## NPM (reverse proxy) | Параметр | Значение | |---|---| | Текущий | основной NPM **10.0.0.195** (it5870@yandex.ru/`1qaz!QAZ`): proxyhost **id30** `omni.umnybot.ru`→`10.0.0.163:20128`, cert **id115** (LE до 2026-08-29), websocket-upgrade вкл | | План | перенести на **NPM коробки** (LXC 101 pve-147, 10.0.0.207) для автономности; ограничение — публичный 443 один на дом, при передаче коробки к клиенту его роутер сразу на NPM коробки | ## Статус (2026-05-31) Этап 1 почти закрыт. Тракт TG→openclaw→OmniRoute→Kiro-роутинг проверен (429 = достучались). Блокер: рабочая модель (новый Kiro троттлит → Олег подключает 2-й провайдер). Дальше: openclaw model=omniroute/* + fallback → тест «привет» в TG.