---
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/<provider>/<model>` |
| Провайдер 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.` = веб ассистента Александра; `<client>.` на будущих |

## Почта (на 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 требует телефон при регистрации — реальный потолок числа аккаунтов.

**OmniRoute коробки (2026-06-01):** подключено **2 Codex-аккаунта** (oauth, `is_active=1`, `test_status=active`) — пул для `cx/gpt-5.5`: OmniRoute сам обходит лимит одного через второй (ёмкость + failover). Также `kiro` active (запас, в fallback openclaw не стоит). Проверено: gpt-5.5 отвечает через пул. openclaw primary `omniroute/cx/gpt-5.5`, fallback → openrouter free + `cx/gpt-5.4-mini`. Больше одновременных пользователей → добавляй ещё Codex-учётки в дашборд OmniRoute, подхватятся в пул автоматически.

## Аккаунты провайдеров

| Сервис | Логин | Заметка |
|---|---|---|
| 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`: `security=allowlist, ask=on-miss` — read-инструменты в allowlist бегут свободно, запись/новое → кнопка approval в TG, см. ниже). Проверено в живом диалоге (TG): «какие точки wifi по комнатам» → Алекс сам зовёт `alex-unifi.sh`.

**Подтверждение write-действий (Этап 4) — ХАРД-ГЕЙТ, ПОДТВЕРЖДЁН 2026-05-31:** `exec-approvals.json` → `defaults {security:"allowlist", ask:"on-miss", askFallback:"deny"}` + `agents."*".allowlist[]` с glob'ами read-инструментов (`/opt/assistant/alex-router.sh*`, `alex-unifi.sh*`, `alex-security.sh*`, `alex-print.sh*`). `alex-fix.sh` НЕ в allowlist → при попытке агента выполнить openclaw показывает Олегу в Telegram **кнопки `[Allow Once] [Allow Always] [Deny]`** (+ текст-команды `/approve <id> allow-once|allow-always|deny`), команда висит pending до решения. **Живой тест в TG прошёл** — кнопка появилась на `alex-fix.sh restart-podkop`. Агент физически не обойдёт. Гибкость сохранена: незнакомую команду агент не теряет — спрашивает кнопкой (Allow Once). SOUL объясняет действие до запуска (без дубля текстового «да» — кнопка сама спрашивает). Бэкстоп — авто-аудит каждого ВЫПОЛНЕННОГО write-действия Олегу. Добавить read-инструмент: `openclaw approvals allowlist add "/opt/assistant/<script>*"`. ⚠️ НЕ жать «Allow Always» на alex-fix (запомнит → перестанет спрашивать).

| Скрипт | Что делает |
|---|---|
| `alex-router.sh [status\|devices\|printer\|dns]` | Cudy: статус обхода (`awg show awg0`), DHCP-аренды, пинг принтера, FakeIP-DNS. read-only |
| `alex-unifi.sh [list\|check <ip>]` | UniFi: точки/свитчи по комнатам + онлайн-проверка пингом. read-only |
| `alex-print.sh` (текст на stdin) | Печать на HP M775, кириллица через `paps`→CUPS |
| `alex-fix.sh [restart-podkop\|reboot-ap <ip>\|test]` | **write-действия** (перезапуск обхода / перезагрузка Wi-Fi точки). Авто-аудит Олегу в TG на каждое. reboot-ap через device-SSH `ktf8b@<ip>` пароль `TlbbdJoVADiXGDrcpnNq3q` |
| `alex-security.sh` | аудит безопасности сети (см. ниже «Защита сети») |
| `alex-nas.sh [status\|find <q>\|list [папка]\|usage]` | Домашний NAS ZimaOS (10.0.0.190): место, поиск файлов (кириллица через python), содержимое папок. read-only, в allowlist |

### 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`, «🛡️ Алекс-сторож на посту»).
- **Авто-лечение:** если флаг = открытый WAN-SSH, сторож САМ возвращает nft-блок (`nft insert ... input iifname eth0 dport 22 drop`) до алерта + помечает «закрыл автоматически». Проверено боевым тестом (удалил handle из `incident_block_in` → сторож восстановил → `count=1`). Расширять авто-heal на cron/ключи НЕ стоит (риск ложного авто-удаления) — там только алерт.
- ⚠️ **ssh в скриптах — с `-n`** (или запуск из cron/файла, не pipe): `ssh` без `-n` в скрипте, поданном в `bash` через pipe, съедает остаток скрипта со stdin.
- On-demand в TG: «нас не ломают?» → Алекс сам зовёт проверку, объясняет спокойно. Проверено.
- Статус: всё чисто, ~150 WAN-SSH брутов отбито (nft counter растёт — защита держит вектор).

## ZimaOS NAS — интеграция с Алексом (2026-06-01)

«AI-NAS»: Алекс = интерфейс к домашнему NAS семьи.
- **VM 100 «Zima»** на pve-147, **10.0.0.190** (8 ГБ, autoboot). Веб `http://10.0.0.190` / `https://zima.umnybot.ru`. **Веб/API логин: `admin` / `App5870w`** (сменён 2026-06-01, публичная панель). **SSH (Linux): `admin` / `1qaz!QAZ`** — ОТДЕЛЬНЫЙ, только LAN/NetBird (не публичный), его юзает `alex-nas`; root SSH запрещён, у admin есть sudo. API JWT `POST /v1/users/login`. SMB(445/139) + NFS(2049) + ttyd(7681).
- Хранилище **`/DATA`** (114G, ~83G свободно). HDD **1.8TB `/dev/sdb` ещё НЕ проброшен** в ZimaOS (на будущее — disk-passthrough). Папки: `Documents`/`Gallery`/`Downloads`/`Backup` (777-доступ).
- Доступ Алекса: **sshpass `admin@10.0.0.190`** (ключ не положить — home=`/DATA` root-owned, `.ssh` не создать). Инструмент **`alex-nas.sh`** (в allowlist, read-only).
- ⚠️ **Кириллический поиск:** `find -iname` НЕ case-fold'ит кириллицу даже на `en_US.UTF-8` (и `C.UTF-8` не помог). Решение — список файлов с ZimaOS → фильтр через `python3 .lower()` на коробке (Unicode-aware). В `alex-nas.sh` так и сделано.
- Проверено в TG: «сколько места на NAS, найди договор» → Алекс отвечает.
- **Домен `zima.umnybot.ru`** (2026-06-01): A→`176.62.183.186` (Spaceweb editMain add), основной NPM **10.0.0.195** proxyhost **id31** → `http://10.0.0.190:80`, LE cert **id116** (до 30 авг 2026, websocket+force-SSL). Работает публично (200), серт LE valid. ⚠️ Грабли NPM v2.14: cert-create принимает только `meta:{}` (НЕ email/agree/dns_challenge — «additional properties»). На NPM коробки zima пока НЕ продублирован (отложено с внешним доступом).
- ✅ **БЕЗОПАСНОСТЬ (закрыто 2026-06-01):** веб-пароль ZimaOS сменён на сильный **`App5870w`**. CasaOS хранит пароль как **чистый MD5** в `/var/lib/casaos/db/user.db` таблица `o_users` (файл root:644 → правка `echo PASS | sudo -S sqlite3 ... "UPDATE o_users SET password='<md5>' WHERE username='admin'"`). API/CLI смены пароля НЕ нашлось (Bearer-токен отвергается 401, `casaos-cli user` только list, `zimaos-user -ru` опасен). Проверено: старый пароль отвергнут, новый логинится. Публичная панель больше не на `1qaz!QAZ`. SSH (Linux) остался `1qaz!QAZ` — но не публичен (LAN/NetBird), для продакшна тоже сменить.
- **Дальше (roadmap AI-NAS):** RAG по содержимому документов (parse+index в pgvector); SMB-шара для загрузки файлов семьёй с телефонов/Mac; управление приложениями ZimaOS (через API+approval); passthrough HDD 1.8TB. Тестовые сэмплы в /DATA/Documents (Договор-аренды-2026, wifi-инструкция) — удалить перед передачей.

## Антошка стережёт Алекса — внешний мониторинг пилота (2026-05-31)

Антошка (openclaw LXC 137, 10.0.0.239 / NetBird 100.70.167.54, бот-токен `8020760639:AAH-Ra0nayJnFgjvSVAagAtZgSb46onBpB4`) следит за коробкой Алекса, лечит и алертит Олега. Второй слой поверх `Restart=on-failure` самих сервисов.

- **Скрипт:** `/root/antoshka-watch-alex.sh` на LXC 137, cron `*/3`.
- **Путь лечения:** LXC 137 → `sshpass -p 1qaz!QAZ ssh root@10.0.0.147` (pve-147) → `pct exec 102` (137 умеет sshpass, достаёт pve-147 и 10.0.0.163).
- **Проверяет:** контейнер 102 `running` (иначе `pct start 102`); `openclaw-gateway` active (иначе restart); `omniroute` active + HTTP `:20128` отвечает (иначе restart); диск <90% (иначе только алерт, сам не чистит). Перепроверка через 6с — не ловить штатный рестарт.
- **Алерт** от имени Антошки Олегу (chat `1292155421`), дедуп md5 + «отбой». Проверено боевым тестом: `stop openclaw-gateway` → Антошка поймал, перезапустил (`active`), прислал алерт.
- ⚠️ **При передаче клиенту:** Алекс автономен (самолечение `Restart=on-failure`); Антошка достанет коробку уже только через NetBird (`100.70.186.192`) — поправить IP в скрипте на NetBird-адрес или оставить как опц. внешний контроль Олега.

## NPM коробки — автономный reverse-proxy (LXC 101, настроен 2026-05-31)

Для автономности при переезде к клиенту коробка раздаёт свои домены САМА — через свой NPM (LXC 101 pve-147), не завися от основного NPM Олега.

| Параметр | Значение |
|---|---|
| NPM коробки | LXC 101 «npm» (pve-147), **10.0.0.207**, порты 80/81/443. Админка `http://10.0.0.207:81`, логин **`it5870@yandex.ru` / `1qaz!QAZ`** |
| Proxy host **id1** | `omni.umnybot.ru` → `http://10.0.0.163:20128` (OmniRoute), websocket + force-SSL |
| Cert **id1** | omni.umnybot.ru — **скопирован** с основного NPM (LE до 2026-08-29, `provider=other` → коробка его НЕ авто-renew) |
| Проверка | локально `curl --resolve omni.umnybot.ru:443:10.0.0.207` → серт валиден (LE trusted), проксирует в OmniRoute (307). Публично пока на основном NPM (один 443 на дом Олега) |

**При переезде к клиенту (Александр):**
1. DNS `omni.umnybot.ru` (+ др. поддомены) → публичный IP клиента (Cudy WAN, напр. 45.143.21.60).
2. Роутер клиента (Cudy) форвардит **443 + 80** → NPM коробки (его IP в LAN клиента).
3. Пере-выпустить серт как **LE-managed на NPM коробки** (HTTP-01 заработает — публичные 80/443 теперь приходят на коробку) → авто-renew. Либо DNS-01.
- **Cloudflare Tunnel** (Этап 5, без проброса/белого IP): `cloudflared` установлен `/usr/local/bin/cloudflared`. **Тест 2026-05-31 из РФ-сети коробки:** подключается к CF только по `--protocol http2` (QUIC/7844 троттлится РФ-DPI: «datagram manager failure», UDP-буфер не растёт), регистрируется на московский edge `dme01`. НО free quick-tunnel (`trycloudflare`) флапает на обслуживании — `530 origin unregistered` и с коробки, и с Mac. Может быть нестабильность РФ-канала ИЛИ известная флакость trycloudflare. **Продакшн named-tunnel не тестирован** (нужен CF-аккаунт + umnybot.ru на CF — у CF стабильный routing, может работать где quick не смог). ⚠️ Для РФ-коробки CF Tunnel РИСКОВАН — альтернатива надёжнее: **VPS reverse-tunnel** (коробка→Finland VPS swtest/vps-znam→публично, исходящий из РФ стабилен, Олег владеет VPS).

Старое (убрать при передаче): основной NPM **10.0.0.195** proxyhost **id30** omni→`10.0.0.163:20128`, cert **id115** — пока обслуживает публичный `omni.umnybot.ru`.

## Статус (2026-05-31)
Этап 1 почти закрыт. Тракт TG→openclaw→OmniRoute→Kiro-роутинг проверен (429 = достучались). Блокер: рабочая модель (новый Kiro троттлит → Олег подключает 2-й провайдер). Дальше: openclaw model=omniroute/* + fallback → тест «привет» в TG.
