- U7-LR не виделся = битый порт 5 свитча (PoE есть, линк down) -> порт 8 - stuck 'Принятие' = Docker bridge отдавал внутренний IP -> system_ip=10.0.0.196 - DNS unifi->10.0.0.196 на OpenWrt для автообнаружения - host networking сломал mongo-URI кэш + автодетект IP, откатан на bridge - USG физически не в сети (0 следов в БД) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
85 lines
7.9 KiB
Markdown
85 lines
7.9 KiB
Markdown
---
|
||
date: 2026-06-15
|
||
type: decision
|
||
tags: [decision, dttb, unifi, proxmox, lxc, network]
|
||
---
|
||
|
||
# UniFi Network Application на home lab — LXC 140 (2026-06-15)
|
||
|
||
## Задача
|
||
Развернуть контроллер UniFi (Network Application) на Proxmox home lab (10.0.0.250) + домен `unifi.dttb.ru`.
|
||
|
||
## Итог
|
||
- **LXC 140 `unifi`** — Debian 12, unprivileged + nesting/keyctl, Docker compose
|
||
- IP **10.0.0.196** (статика), nameserver **1.1.1.1**
|
||
- Ресурсы: 2 vCPU / 3 GB RAM / 16 GB диск (**rootfs на `work`** — `local-lvm` забит на 90%)
|
||
- Стек: `docker.io/mongo:4.4` + `docker.io/linuxserver/unifi-network-application:latest`, persistent bind-mount `/opt/unifi/{config,db}`
|
||
- Web UI: **https://10.0.0.196:8443** (302 на логин — поднялся), inform на :8080
|
||
- Домен: **unifi.dttb.ru** (NPM proxy host #36 → HTTPS 10.0.0.196:8443, WSS) + Let's Encrypt
|
||
|
||
## КОРЕНЬ (важная грабля): MongoDB 4.4, не выше
|
||
Хост HP Z800 = 2× **Xeon X5672 (Westmere)** — **без AVX** (`grep avx /proc/cpuinfo` пусто).
|
||
MongoDB **5.0+** (и 7.0, который ставит стандартный community-script `ct/unifi.sh`) требует AVX и падает с **`Illegal instruction`**.
|
||
LXC видит CPU хоста напрямую — маскировки нет. → берём **mongo:4.4** (последняя версия без AVX; UniFi 8.x поддерживает Mongo 3.6–7.0).
|
||
Проверка живости: `docker logs unifi-db` → `restarts=0`, «Waiting for connections», app подключился. Падений нет.
|
||
|
||
Native-установка на Debian 12 отпала: MongoDB 4.4 под bookworm в репах нет (4.4 собран под bullseye/libssl1.1). Docker-стек `mongo:4.4` самодостаточен и обходит это. Заодно это тот же стек, что отлажен на Передельках ([[2026-04-16-unifi-migration-peredelki]], там bind-mount решал сброс БД).
|
||
|
||
## Грабля 2: ghcr.io виснет из РФ
|
||
`lscr.io/linuxserver/...` редиректит на **ghcr.io** → закачка встала на 0 KB/s (compose висел). `mongo:4.4` с docker.io скачался нормально.
|
||
→ Образ переключён на **`docker.io/linuxserver/unifi-network-application:latest`** (linuxserver публикует и туда, и в ghcr). Скорость 1.2 MB/s. Если опять затык — NetBird Trance→finland exit или docker registry mirror.
|
||
|
||
## Домен и SSL (процедура как для omni — [[2026-05-26-omni-domain-and-update]])
|
||
DNS dttb.ru — на **Spaceweb** (нет публичного wildcard, каждый поддомен записью вручную).
|
||
1. `unifi.dttb.ru` → публично NXDOMAIN (DoH 1.1.1.1; с Mac `dig` хайджачится NetBird — [[feedback_dttb_dns_split_view]]).
|
||
2. Добавлена A-запись через Spaceweb API **одним** вызовом (НЕ в цикле — `editMain` циклом ломает зону):
|
||
`POST https://api.sweb.ru/domains/dns` → `editMain action=add name=unifi type=A value=176.62.183.186` → `result:true`.
|
||
3. Negative-cache LE Boulder + 1.1.1.1 (TTL ~600) → ждать ~10 мин после первой неудачной попытки, потом выпуск.
|
||
4. NPM proxy host #36 создан (backend HTTPS 10.0.0.196:8443, WSS вкл). Cert Let's Encrypt **id 126** (exp 2026-09-13) выпущен и привязан (`ssl_forced`, http2).
|
||
|
||
Проверка: `https://unifi.dttb.ru` → **302 `/setup/`** (свежий контроллер), сертификат CN=unifi.dttb.ru issued by Let's Encrypt YE1.
|
||
|
||
## Доступы
|
||
- Proxmox: `ssh root@10.0.0.250` (1qaz!QAZ), `pct ... 140`
|
||
- Контейнер: `pct exec 140 -- ...`; compose в `/opt/unifi/`
|
||
- MongoDB (внутр.): user `unifi` / `Un1fiM0ngo2026`, db `unifi`/`unifi_stat`
|
||
- UniFi UI: https://10.0.0.196:8443 или https://unifi.dttb.ru — **первый вход = создание admin-аккаунта** (контроллер пустой)
|
||
- Spaceweb DNS: `it5870yand` / `1qaz!QAZ` (api.sweb.ru)
|
||
- NPM: 10.0.0.195:81, `it5870@yandex.ru` / `1qaz!QAZ`
|
||
|
||
## Управление
|
||
```bash
|
||
ssh root@10.0.0.250
|
||
pct exec 140 -- bash -c 'cd /opt/unifi && docker compose ps'
|
||
pct exec 140 -- bash -c 'cd /opt/unifi && docker compose restart'
|
||
pct exec 140 -- bash -c 'cd /opt/unifi && docker compose pull && docker compose up -d' # апдейт
|
||
```
|
||
|
||
## Adoption устройств (2026-06-15, позже в тот же день)
|
||
|
||
Принимали **USW-Lite-16-PoE** (10.0.0.111) и **U7-LR**. Грабли:
|
||
|
||
### U7-LR не появлялся — физика порта свитча
|
||
Точка была в **порту 5** свитча: PoE подавался (Class 4, 4.41 Вт), но **линк down**, 0 пакетов, DHCP не получала; после передёргивания PoE детект вообще пропал (Class Unknown). → **битый порт/патч-корд**. Переткнули в **порт 8** — ожила: IP 10.0.0.243, линк 1000F, firmware 8.0.12. Вывод: «питание есть, а линка нет» = сначала кабель/порт, не контроллер.
|
||
|
||
### Stuck «Принятие» + ничего не автообнаруживается — Docker inform-host
|
||
Контроллер в Docker **bridge** отдавал устройствам inform-host = свой внутренний IP контейнера (`172.18.0.x`), до которого устройства не достучаться → adoption висит. Плюс заводская точка ищет `http://unifi:8080/inform`, а DNS-записи `unifi` не было.
|
||
|
||
**Фикс (рабочий, оставлен):**
|
||
1. **DNS на OpenWrt 10.0.0.1**: `uci add dhcp domain` → `name=unifi ip=10.0.0.196` → commit + `dnsmasq restart`. Теперь заводские устройства сами находят контроллер (как на Передельках).
|
||
2. **`system_ip=10.0.0.196`** в `/opt/unifi/config/data/system.properties` (был закомментирован `# system_ip=a.b.c.d`) + `docker restart unifi-network-application`. В логе стало `Current System IP: 10.0.0.196` (было `172.18.0.3`). Контроллер теперь отдаёт верный inform-host.
|
||
3. `set-inform http://10.0.0.196:8080/inform` на устройствах (ssh ubnt/ubnt) для немедленного появления.
|
||
|
||
Результат: оба `adopted:true` (проверено `docker exec unifi-db mongo unifi --eval 'db.device.find(...)'`).
|
||
|
||
### ⚠️ host networking НЕ применять (пробовал — откатил)
|
||
Переводил оба контейнера в `network_mode: host` — **сломалось**:
|
||
- linuxserver-образ кэширует mongo-URI в `system.properties` при первом старте и НЕ перечитывает env → в host остался `unifi-db:27017` (не резолвится) → `MongoTimeoutException`, краш-луп.
|
||
- контроллер в host автодетектил `Current System IP: 172.18.0.1` (docker-бридж), не 10.0.0.196.
|
||
Правильное решение — **оставить bridge + `system_ip` override**, а не host. Бэкап bridge-compose: `/opt/unifi/docker-compose.yml.bak-bridge-*`.
|
||
|
||
## Что осталось / на заметку
|
||
- **USG не adopt'ится — его физически нет в сети** (нет DHCP-аренды, нет на живых портах свитча, в БД контроллера 0 следов). Сначала запитать/воткнуть в живой порт; как появится — с DNS `unifi` + `system_ip` примется сам.
|
||
- `.196` — статика; убедиться, что вне DHCP-пула OpenWrt.
|
||
- При смене IP контроллера — обновить и DNS `unifi`, и `system_ip`.
|