19 KiB
Схема сети и зависимости инфраструктуры
Полная топология: домашняя сеть, Proxmox, контейнеры/ВМ, внешние VPS, маршруты и зависимости. Помогает видеть единые точки отказа (single point of failure).
Граф зависимостей (dependency graph)
Цепочка обслуживания любого публичного запроса к доменам katykhin.ru:
flowchart TB
subgraph External["Внешний мир"]
DNS["DNS (Beget)<br>*.katykhin.ru → IP"]
end
subgraph Edge["Граница сети"]
Router["Роутер<br>192.168.1.1<br>проброс 80/443 → .100"]
end
subgraph Gateway["Единая точка входа"]
NPM["NPM<br>CT 100<br>терминация SSL, маршрут по Host"]
end
subgraph Backends["Сервисы"]
S101["Nextcloud<br>CT 101"]
S103["Gitea / CouchDB / Vaultwarden<br>CT 103"]
S104["Paperless<br>CT 104"]
S105["RAG API<br>CT 105"]
S107["Invidious<br>CT 107"]
S108["Galene<br>CT 108"]
S109["WireGuard VPN<br>CT 109<br>10.10.99.0/24"]
S200["Immich<br>VM 200"]
end
subgraph Data["Данные"]
D101["PostgreSQL<br>Redis<br>CT 101"]
D103["PostgreSQL<br>CT 103"]
D104["PostgreSQL<br>Redis<br>CT 104"]
D107["PostgreSQL<br>CT 107"]
D200["PostgreSQL<br>Redis<br>VM 200"]
end
subgraph External2["Внешние зависимости"]
coTURN["coTURN<br>VPS Миран 185.147.80.190"]
end
DNS --> Router
Router --> NPM
NPM --> S101
NPM --> S103
NPM --> S104
NPM --> S105
NPM --> S107
NPM --> S108
NPM --> S200
Router --> S109
S109 -.->|"клиенты VPN<br>доступ к vault, LAN"| NPM
S101 --> D101
S103 --> D103
S104 --> D104
S107 --> D107
S200 --> D200
S108 -.-> coTURN
Каноническая цепочка для одного запроса:
DNS → Router → NPM → Service → Database
- DNS — без правильных записей запрос не дойдёт до твоего IP.
- Router — без проброса 80/443 трафик не попадёт в LAN на NPM.
- NPM — без него нет HTTPS и нет маршрутизации по домену на нужный бэкенд (узкое место: все сервисы проходят через один узел).
- Service — приложение (Nextcloud, Invidious, Immich и т.д.).
- Database — отказ БД/Redis ломает только свой сервис, не остальные.
Узкие места, которые видно из графа:
| Узел | Почему узкое место |
|---|---|
| NPM | Один контейнер на все домены: отказ или перегрузка NPM роняет весь публичный доступ ко всем сервисам. |
| Router | Один прибор на вход в сеть: отказ = нет доступа извне. |
| DNS | Один регистратор/API: смена IP или ошибка в записях — домены перестают вести к тебе. |
| Сервис/БД | Ломается только один бэкенд; остальные цепочки независимы. |
Исключения из цепочки:
- Galene (108) дополнительно зависит от coTURN (VPS Миран) для STUN/TURN — на графе это отдельная зависимость от внешнего узла.
- RAG (105) без внешней БД в стеке — только NPM → Service.
- AdGuard, Homepage, Wallos живут на том же хосте, что и NPM (CT 100), но логически стоят «рядом» с NPM (доступ к ним тоже через роутер и при необходимости через NPM).
- Vaultwarden (vault.katykhin.ru): доступ только из LAN (192.168.1.0/24) и из VPN (10.10.99.0/24). Публичный доступ из интернета закрыт; удалённо — только через WireGuard (CT 109). NPM Access List ограничивает приём по подсетям.
Схема сети (упрощённо)
Интернет (пользователи)
│
▼
┌───────────────────────────────┐
│ Роутер 192.168.1.1 │ Внешний IP: 185.35.193.144
│ Netcraze Speedster │ Проброс 80/443 → .100
│ VPN: AmneziaWG DE / US │
└───────────────┬───────────────┘
│
┌────────────────────┼────────────────────┬────────────────┐
│ │ │ │
▼ ▼ ▼ ▼
┌──────────────┐ ┌────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Proxmox │ │ CT 100 │ │ Остальные CT/VM │ │ CT 109 │
│ 192.168.1.150│ │ 192.168.1.100 │ │ .101 .103 .104 │ │ 192.168.1.109 │
│ (гипервизор) │ │ NPM, AdGuard, │ │ .105 .107 .108 │ │ WireGuard VPN │
│ │ │ Homepage, │ │ VM 200 .200 │ │ UDP 43123 │
│ pct / qm │ │ Wallos, etc. │ │ (бэкенды) │ │ 10.10.99.0/24 │
└──────────────┘ └───────┬────────┘ └────────┬────────┘ └────────┬────────┘
│ │ │ │
│ │ HTTPS по Host │ │ клиенты VPN
│ └──────────────────────┘ │ → vault, LAN
│ (NPM проксирует на бэкенды) │
│ │
│ Туннели VPN (роутер ↔ VPS)
│ + входящий WireGuard на CT 109 (проброс UDP 43123)
│
├──────────────────────────────────────────────────┐
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────────┐
│ VPS DE │ │ VPS US │ │ VPS Миран (СПБ) │
│ 185.103.253.99 │ │ 147.45.124.117 │ │ 185.147.80.190 │
│ AmneziaWG │ │ AmneziaWG │ │ coTURN (Galene), │
│ (обход блок.) │ │ (обход блок.) │ │ боты, Prometheus │
└──────────────────┘ └──────────────────┘ └──────────────────────┘
Доступ к vault.katykhin.ru: из LAN (192.168.1.0/24) или через WireGuard (CT 109): клиент подключается к 192.168.1.109:43123, получает IP из 10.10.99.0/24, после чего запросы к vault.katykhin.ru идут через NPM (Access List разрешает обе подсети).
Поток публичного трафика:
Запрос из интернета (например https://video.katykhin.ru) → роутер (185.35.193.144:443) → проброс на 192.168.1.100:443 → NPM (контейнер 100) → по Host выбирается proxy host → запрос на бэкенд (например 192.168.1.107:3000 для Invidious). Ответ идёт обратно по той же цепочке.
Узлы, IP и домены (сводная таблица)
| Узел | IP / адрес | Роль | Домены / примечание |
|---|---|---|---|
| Роутер | 192.168.1.1 | Шлюз LAN, проброс 80/443, VPN-клиент (AmneziaWG) | Внешний IP: 185.35.193.144 |
| Proxmox | 192.168.1.150 | Гипервизор (LXC + KVM) | Управление: pct, qm |
| CT 100 | 192.168.1.100 | NPM, Homepage, AdGuard, Wallos, log-dashboard, vpn-route-check | home.katykhin.ru, wallos.katykhin.ru, adguard.local; приём 80/443 |
| CT 101 | 192.168.1.101 | Nextcloud, PostgreSQL, Redis | cloud.katykhin.ru |
| CT 103 | 192.168.1.103 | Gitea, PostgreSQL, act_runner, CouchDB (Obsidian), Vaultwarden | git.katykhin.ru, obsidian.katykhin.ru, vault.katykhin.ru (LAN + VPN) |
| CT 104 | 192.168.1.104 | Paperless-ngx, PostgreSQL, Redis | docs.katykhin.ru |
| CT 105 | 192.168.1.105 | RAG API (mini-lm) | mini-lm.katykhin.ru |
| CT 107 | 192.168.1.107 | Invidious, Companion, PostgreSQL | video.katykhin.ru |
| CT 108 | 192.168.1.108 | Galene (видеозвонки) | call.katykhin.ru |
| CT 109 | 192.168.1.109 | WireGuard VPN (local-vpn), UDP 43123 | Клиенты 10.10.99.0/24; доступ к vault, LAN, AdGuard DNS |
| VM 200 | 192.168.1.200 | Immich, PostgreSQL, Redis, ML, deduper, Power Tools, Public Share | immich.katykhin.ru, immich-pt.katykhin.ru, share.katykhin.ru |
| VPS DE | 185.103.253.99 | AmneziaWG (обход блокировок) | Туннель с роутера (10.8.1.x) |
| VPS US | 147.45.124.117 | AmneziaWG (второй выход) | Туннель с роутера |
| VPS Миран | 185.147.80.190 | coTURN (STUN/TURN для Galene), боты, prod | call.katykhin.ru использует STUN/TURN |
| DNS | Beget.com | Домен katykhin.ru, поддомены, API для DNS-01 | Все *.katykhin.ru |
Маршруты NPM (домен → бэкенд)
Все публичные HTTPS-запросы к доменам katykhin.ru приходят на 192.168.1.100 (NPM). NPM по заголовку Host направляет трафик на соответствующий бэкенд:
| Домен | Upstream (хост:порт) | Контейнер/ВМ |
|---|---|---|
| home.katykhin.ru | Homepage (внутри 100) | CT 100 |
| wallos.katykhin.ru | wallos:80 | CT 100 |
| adguard.local | adguard:3000 | CT 100 |
| cloud.katykhin.ru | 192.168.1.101:8080 | CT 101 |
| docs.katykhin.ru | 192.168.1.104:8000 | CT 104 |
| video.katykhin.ru | 192.168.1.107:3000 | CT 107 |
| call.katykhin.ru | 192.168.1.108:8443 | CT 108 |
| immich.katykhin.ru | 192.168.1.200:2283 | VM 200 |
| immich-pt.katykhin.ru | 192.168.1.200:8001 | VM 200 |
| share.katykhin.ru | 192.168.1.200:8501 | VM 200 |
| mini-lm.katykhin.ru | 192.168.1.105:8000 | CT 105 |
| git.katykhin.ru | 192.168.1.103:3000 | CT 103 |
| obsidian.katykhin.ru | 192.168.1.103:5984 | CT 103 |
| vault.katykhin.ru | 192.168.1.103:8280 | CT 103 (Vaultwarden; доступ по Access List: LAN + VPN) |
(Точный список proxy host — в NPM на CT 100; при добавлении доменов таблицу обновлять.)
Зависимости (кто от кого зависит)
Публичный доступ из интернета
-
Все публичные HTTPS-сервисы зависят от:
- Роутер — без него нет входа 80/443 на LAN.
- Контейнер 100 (NPM) — без NPM нет терминации SSL и маршрутизации по Host.
- Certbot + Beget DNS — без них нет валидных сертификатов (либо только HTTP или самоподписные).
- DNS (Beget) — без записей *.katykhin.ru запросы не дойдут до твоего IP.
-
Каждый бэкенд (101, 103, 104, 105, 107, 108, 200) при доступе снаружи зависит от NPM и роутера; при доступе только из LAN может работать и без NPM (по IP и порту).
-
Vaultwarden (vault.katykhin.ru): публичный доступ из интернета закрыт; разрешены только LAN (192.168.1.0/24) и клиенты WireGuard VPN (10.10.99.0/24). Удалённый доступ к vault — только через CT 109 (WireGuard).
Внутри хостов
- NPM (100): зависит от certbot (файлы сертификатов) и от конфигурации proxy_host (куда слать трафик). Не зависит от других контейнеров для старта.
- Homepage (100): зависит от NPM (ссылки), AdGuard (виджет), dockerproxy (виджеты Docker). Работает и без них, но без данных.
- AdGuard (100): самостоятельный; NPM может проксировать к нему по имени.
- Wallos (100): самостоятельный; NPM проксирует.
- Контейнеры 101, 103, 104, 107, 200: каждый свой стек: приложение зависит от своей БД (PostgreSQL) и при необходимости от Redis. Порядок запуска: сначала БД/Redis, потом приложение (обычно задано в docker-compose через depends_on).
- Контейнер 105 (RAG): один контейнер, без внешней БД в стеке.
- Контейнер 108 (Galene): не зависит от других контейнеров в LAN; зависит от внешнего coTURN (VPS Миран 185.147.80.190) для STUN/TURN — без него видеозвонки могут не устанавливаться за строгим NAT/фаерволом.
- Контейнер 109 (WireGuard VPN): самостоятельный; от него зависят удалённые пользователи (доступ к vault.katykhin.ru и LAN через NPM после подключения к VPN). DNS для клиентов — AdGuard (CT 100).
- Immich (200): зависит от PostgreSQL, Redis, при необходимости от immich-deduper (сеть и БД). ML-контейнер опционально (GPU).
Внешние сервисы
- Роутер → VPN: зависит от VPS (185.103.253.99 или 147.45.124.117) и от AmneziaWG на них. При падении VPS соответствующий туннель недоступен.
- Galene → coTURN: зависит от VPS Миран (185.147.80.190). При падении coTURN видеозвонки могут не работать в части сценариев.
Единые точки отказа (SPOF)
| Точка | Что ломается при отказе | Как смягчить |
|---|---|---|
| Роутер | Весь доступ из интернета к домашней сети (в т.ч. все домены). Нет VPN-выхода, если туннели подняты на роутере. | Резервный роутер / запасной канал; доступ к управлению из LAN. |
| Proxmox (192.168.1.150) | Все контейнеры и ВМ недоступны (они на нём запущены). | Резервное питание, мониторинг, бэкапы конфигов и данных. |
| Контейнер 100 (NPM) | Публичный HTTPS ко всем сервисам: без NPM нет терминации SSL и маршрутизации. Сервисы по IP:порт из LAN могут быть доступны, если порты не закрыты. | Мониторинг NPM и Docker на 100; быстрый перезапуск; бэкап конфигов NPM. |
| Контейнер 109 (WireGuard) | Нет удалённого доступа по VPN к vault.katykhin.ru и к внутренним сервисам извне LAN. | Мониторинг сервиса wg-quick@wg0; проброс UDP 43123 на роутере; бэкап /etc/wireguard. |
| Certbot / Beget API | Истечение сертификатов → браузеры начнут ругаться. Продление через DNS-01 зависит от Beget. | Следить за продлением (таймер certbot); иметь запасной способ выпуска (другой DNS или ручной сертификат). |
| DNS (Beget) | Смена IP или потеря записей — домены перестанут вести на твой хост. | Ведение записей вручную/через API; при смене IP обновить A-записи. |
| VPS Миран (coTURN) | Galene: проблемы с установкой видеозвонов за NAT. Остальные сервисы не зависят. | Локальный coTURN на 108 или другом хосте как запасной вариант. |
| Конкретный бэкенд (101, 103, …) | Падает только свой сервис (Nextcloud, Gitea, Vaultwarden, Invidious и т.д.). Остальные работают. | Зависимости внутри стека (БД первым) и мониторинг каждого хоста. |
Связь с другими документами
- Архитектура и подключение — общее описание, таблица контейнеров, поток запросов.
- Контейнер 100 — NPM, AdGuard, Homepage, порядок запуска.
- Контейнер 109 — WireGuard VPN (local-vpn), доступ к vault и LAN.
- Генерация .mobileconfig для WireGuard (On-Demand) — как собрать профиль для iOS/macOS с автоматическим подключением вне дома.
- Роутер Netcraze Speedster — проброс портов, VPN.
- VPN-сервер (VPS, AmneziaWG) — туннели с роутера.
- VPS Миран: боты и STUN/TURN — coTURN для Galene.