Files
knowledge-base/projects/dttb/ai-assistant-pilot/credentials.md
dttb d1886cf75f ZimaOS веб-пароль сменён на сильный (закрыт публичный риск)
- CasaOS хранит пароль как чистый MD5 в /var/lib/casaos/db/user.db o_users
- смена через sudo sqlite3 UPDATE (API/CLI смены нет); старый отвергнут, новый ок
- alex-nas цел (SSH Linux отдельный, не менялся)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 11:58:42 +03:00

181 lines
23 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-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 требует телефон при регистрации — реальный потолок числа аккаунтов.
## Аккаунты провайдеров
| Сервис | Логин | Заметка |
|---|---|---|
| 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` / `8FLnjg6kcpQKKKyvmW`** (сменён 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 сменён на сильный **`8FLnjg6kcpQKKKyvmW`**. 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.