# Схема сети и зависимости инфраструктуры Полная топология: домашняя сеть, Proxmox, контейнеры/ВМ, внешние VPS, маршруты и зависимости. Помогает видеть единые точки отказа (single point of failure). --- ## Граф зависимостей (dependency graph) Цепочка обслуживания **любого** публичного запроса к доменам katykhin.ru: ```mermaid flowchart TB subgraph External["Внешний мир"] DNS["DNS (Beget)
*.katykhin.ru → IP"] end subgraph Edge["Граница сети"] Router["Роутер
192.168.1.1
проброс 80/443 → .100"] end subgraph Gateway["Единая точка входа"] NPM["NPM
CT 100
терминация SSL, маршрут по Host"] end subgraph Backends["Сервисы"] S101["Nextcloud
CT 101"] S103["Gitea / CouchDB / Vaultwarden
CT 103"] S104["Paperless
CT 104"] S105["RAG API
CT 105"] S107["Invidious
CT 107"] S108["Galene
CT 108"] S109["WireGuard VPN
CT 109
10.10.99.0/24"] S200["Immich
VM 200"] end subgraph Data["Данные"] D101["PostgreSQL
Redis
CT 101"] D103["PostgreSQL
CT 103"] D104["PostgreSQL
Redis
CT 104"] D107["PostgreSQL
CT 107"] D200["PostgreSQL
Redis
VM 200"] end subgraph External2["Внешние зависимости"] coTURN["coTURN
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
доступ к 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** живёт на том же хосте, что и NPM (CT 100), но логически стоит «рядом» с NPM (доступ к нему тоже через роутер и при необходимости через NPM, домен `adguard.katykhin.ru` ограничен LAN + VPN). - **Homepage и Wallos** после миграции работают на CT 103, но остаются доступны по доменам через NPM на CT 100; домены `home.katykhin.ru` и `wallos.katykhin.ru` также закрыты Access List'ом под LAN (192.168.1.0/24) и VPN (10.10.99.0/24). - **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, AdGuard, log-dashboard, vpn-route-check | adguard.local, adguard.katykhin.ru; приём 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, Homepage, Wallos | git.katykhin.ru, obsidian.katykhin.ru, vault.katykhin.ru (LAN + VPN), home.katykhin.ru, wallos.katykhin.ru | | **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 | 192.168.1.103:4000 | CT 103 (Homepage) | | wallos.katykhin.ru | 192.168.1.103:8282 | CT 103 (Wallos) | | adguard.local | adguard:3000 | CT 100 | | adguard.katykhin.ru | adguard:80 | 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-сервисы** зависят от: 1. **Роутер** — без него нет входа 80/443 на LAN. 2. **Контейнер 100 (NPM)** — без NPM нет терминации SSL и маршрутизации по Host. 3. **Certbot + Beget DNS** — без них нет валидных сертификатов (либо только HTTP или самоподписные). 4. **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 и т.д.). Остальные работают. | Зависимости внутри стека (БД первым) и мониторинг каждого хоста. | --- ## Связь с другими документами - [Архитектура и подключение](../architecture/architecture.md) — общее описание, таблица контейнеров, поток запросов. - [Контейнер 100](../containers/container-100.md) — NPM, AdGuard, Homepage, порядок запуска. - [Контейнер 109](../containers/container-109.md) — WireGuard VPN (local-vpn), доступ к vault и LAN. - [Генерация .mobileconfig для WireGuard (On-Demand)](vpn-mobileconfig-wireguard.md) — как собрать профиль для iOS/macOS с автоматическим подключением вне дома. - [Роутер Netcraze Speedster](router-netcraze-speedster.md) — проброс портов, VPN. - [VPN-сервер (VPS, AmneziaWG)](../vps/vpn-vps-amneziawg.md) — туннели с роутера. - [VPS Миран: боты и STUN/TURN](../vps/vps-miran-bots.md) — coTURN для Galene.