Files
knowledge-base/projects/dttb/ai-assistant-pilot/credentials.md

219 lines
30 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).
## Автономизация 2026-06-17 (проксирование + агент + gitea)
После переезда (см. [[../proxmox-pve-147]]) коробка отвязана от домашней инфры Олега:
- **NPM коробки** (LXC 101, теперь `192.168.1.221:81`, `it5870@yandex.ru`/`1qaz!QAZ`) — бэкенды всех 8 хостов перенаправлены на новые IP: `omni→192.168.1.154:20128` (LXC102 OmniRoute), `swarm→192.168.1.71:3456` (LXC103), `git→192.168.1.96:3000` (LXC104), `cloud:7080`/`kino:32400`/`dom:8123`/`alex:18790`/`tg:3000``192.168.1.190` (ZimaOS, ждёт BIOS-фикс). Все cert=0 (HTTP) — для публичного доступа нужен ещё DNS→WAN Александра + форвард 80/443 на `.221` + LE на NPM коробки.
- **Агент (openclaw LXC102):** удалён провайдер `maxcc` (`http://10.0.0.179:8319/v1` — домашний CLIProxy Олега + ключ `sk-clawdbot-proxy`), бэкап `/root/.openclaw/openclaw.json.bak-alexclean`. Остался автономный провайдер `omniroute` (primary `omniroute/cx/gpt-5.5`, fallbacks omniroute+openrouter). `alex-nas.sh``192.168.1.190`. Других ссылок на `10.0.0.x` в агенте нет.
- **Gitea коробки** (LXC104 `git.umnybot.ru`, единственный юзер `benelux`=admin): из `benelux/knowledge-base` вычищены перекрёстные упоминания др. объектов (НИИКН/ММФБ/Главторг/Знаменское — peer-ID/IP/NetBird-mesh в compromise.md и README), commit `49716a0`. Push только через Gitea (HTTP+token; прямой file://-push режется pre-receive). В postgres агента чужих данных НЕТ (RAG/история чисты).
## Коробка (хост + контейнер)
| Параметр | Значение |
|---|---|
| Хост | Proxmox `pve` (pve-147), **192.168.1.247** (сеть Александра; было 10.0.0.147 — переезд 2026-06-17), root / `1qaz!QAZ` |
| Контейнер | **LXC 102 «assistant»**, Debian 12, IP **192.168.1.154** (DHCP; было 10.0.0.163), NetBird `100.70.186.192` |
| root LXC 102 | `j5DS1JSPKewKQw6i7mTK` (уникальный; Mac-ключ `ai@mac-20260112` в authorized_keys) |
| Стек | Docker (overlayfs) + Node 22; openclaw 2026.5.27; OmniRoute 3.8.7; Postgres16/pgvector |
| Доступ | `ssh -i ~/.ssh/id_ed25519 root@100.70.186.192` (LXC102 по NetBird) → `sshpass -p '1qaz!QAZ' ssh root@192.168.1.247``pct exec 102 -- bash`. Хост сам без NetBird (джамп через LXC102) |
## 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.147`** с 2026-06-21)
- ⚠️ **2026-06-21: IP сменился `192.168.1.148`→`192.168.1.147`** — DHCP перетасовал адреса после ребутов/переезда, `.148` занял UniFi-свитч USW-Flex-Mini. Принтер «не печатал/не соединялся» (CUPS+DNAT смотрели на мёртвый `.148`). **Зафиксировано на Cudy:** резервации `hp-printer`(`f8:b4:6a:0e:c3:a9`)→`.147`, `usw-flex-mini`(`d0:21:f9:e7:f5:f7`)→`.148` — чтобы не менялись местами.
- 9100/515 закрыты, открыт только **IPP/631** (+AirPrint).
- Печать: **CUPS на коробке**, очередь `alex` = **`ipp://192.168.1.147:631/ipp/print`** (IPP Everywhere). **DNAT 6310 на Cudy больше НЕ нужен** — коробка (`192.168.1.154`) в одной LAN с принтером, печатает напрямую (старый `/etc/nftables.d/30-alex-printer.nft` стёрся при fw4-сбросе миграции, восстанавливать не нужно). Сменить URI при новом дрейфе: `lpadmin -p alex -v ipp://<ip>:631/ipp/print -m everywhere -E`.
- **Если Александр печатает со своего устройства** — оно могло остаться на старом `.148`; переподключить принтер по `.147` или через AirPrint.
- Кириллица: `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)
> ❌ **VM 100 (ZimaOS) УДАЛЕНА 2026-06-18** (`qm destroy --purge`, по подтверждению Олега, без бэкапа /DATA). Не стартовала после переезда (VT-x слетел), была заменена Docker-апками на LXC105. **Последствия:** тул `alex-nas.sh` и домены `cloud/kino/dom/alex/tg.umnybot.ru`→`192.168.1.190` мертвы. Секция ниже — историческая. Если NAS нужен — поднимать заново.
«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`.
- **Путь (с 2026-06-17, после переезда):** LXC 137 → **NetBird → LXC102 `100.70.186.192` по ключу** (`root@openclaw` добавлен в authorized_keys 102) → проверки/лечение сервисов прямо внутри 102 (`systemctl`, `curl localhost:20128`). Хост `192.168.1.247` без NetBird → если LXC102 недоступен, авто-старт контейнера невозможен, только алерт. Старый путь (`ssh root@10.0.0.147``pct exec 102`) мёртв. Бэкап старого скрипта: `/root/antoshka-watch-alex.sh.bak-20260617`.
- **Проверяет:** контейнер 102 `running` (иначе `pct start 102`); `openclaw-gateway` active (иначе restart); `omniroute` active + HTTP `:20128` отвечает (иначе restart); диск <90% (иначе только алерт, сам не чистит). Перепроверка через 6с — не ловить штатный рестарт.
- **Алерт** от имени Антошки Олегу (chat `1292155421`), дедуп md5 + «отбой». Проверено боевым тестом: `stop openclaw-gateway` → Антошка поймал, перезапустил (`active`), прислал алерт.
-**Переезд учтён (2026-06-17):** скрипт переписан под NetBird→LXC102 (см. выше). Алекс автономен сам (`Restart=on-failure`); Антошка — второй слой + алерт Олегу, опционален.
## 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`.
## 🌐 Публичный доступ — VPS-шлюз через NetBird (2026-06-17, РАБОТАЕТ)
**Решение:** WAN Александра **динамический** (`proto=dhcp`, аренда 24ч) → DNS на него вешать нельзя. Прямой проброс на Cudy откатан. Публичный доступ — через **статичный VPS-шлюз по NetBird** (это и была изначальная задумка: DNS почти всех `*.umnybot.ru` смотрит на VPS).
**Архитектура:** `DNS → VPS 158.255.0.139 (NPM, LE-серты) → NetBird → NPM коробки (LXC101, 100.70.90.103) → внутренние бэкенды`.
| Узел | Значение |
|---|---|
| VPS-шлюз | **`158.255.0.139`** (`vm-nano`, Ubuntu 22.04), root / `Kw_0kkksW5`, NetBird **`100.70.127.23`** |
| NPM на VPS | jc21 в Docker (`/opt/npm`), админка `http://158.255.0.139:81` (⚠️ :81 публичен), логин **`admin@umnybot.ru` / `App5870w`** |
| NPM коробки (LXC101) | теперь в NetBird: **`100.70.90.103`** (`alex-npm.netbird.cloud`), setup-key Benelux. VPS бьёт сюда, NPM коробки роутит внутрь (cloud→105:8082, alex→105:3001, omni→102:20128) |
| LXC 105 «alex-apps» | filebrowser (облако, `:8082`, admin/`App5870w`) + Homepage (дашборд, `:3001`), `/data` на HDD |
**Публично сейчас (2026-06-17, финал):**
- **`umnybot.ru`** → SwarmClaw (LXC103 `192.168.1.71:3456`, через NPM коробки id9). Открыто.
- **`pve.umnybot.ru`** → Proxmox UI (host `192.168.1.247:8006`) **за Basic Auth** на VPS NPM: **`oleg` / `Pve!Umny5870wX`** (access-list `pve-basic-auth` id1), потом обычный логин Proxmox. Серт LE id18. ⚠️ **root-пароль Proxmox слабый (`1qaz!QAZ`) — сменить и/или включить 2FA в Proxmox** (Basic Auth — только заслонка от брутфорса).
DDNS НЕ нужен — DNS на статичный VPS, динамика WAN неважна.
**Остальное — internal (по NetBird/LAN, не публично):** `omni` (OmniRoute 102:20128), `cloud` (filebrowser 105:8082), `alex` (Homepage 105:3001), `git` (Gitea 104:3000). Снято с VPS NPM: эти + 8 доменов ZimaOS (`zima/tg/rustdesk/plex/ha/oc/qbit/term`) + `ai`→10.0.0.239 (домашний openclaw Олега, не коробка).
**Сервисы на коробке:** SwarmClaw (103:3456), OmniRoute (102:20128), Gitea (104:3000), filebrowser (105:8082), Homepage (105:3001), Proxmox UI (host:8006), бот Алекс (102, Telegram). VM100 ZimaOS — stopped (не используется, заменён Docker-апками на 105).
> 🏗️ Полная карта с диаграммой — [[architecture]].
## Статус (2026-05-31)
Этап 1 почти закрыт. Тракт TG→openclaw→OmniRoute→Kiro-роутинг проверен (429 = достучались). Блокер: рабочая модель (новый Kiro троттлит → Олег подключает 2-й провайдер). Дальше: openclaw model=omniroute/* + fallback → тест «привет» в TG.