Files
homelab-docs/docs/network/network-topology.md

16 KiB
Raw Blame History

Схема сети и зависимости инфраструктуры

Полная топология: домашняя сеть, Proxmox, контейнеры/ВМ, внешние VPS, маршруты и зависимости. Помогает видеть единые точки отказа (single point of failure).


Граф зависимостей (dependency graph)

Цепочка обслуживания любого публичного запроса к доменам katykhin.ru:

flowchart TB
  subgraph External["Внешний мир"]
    DNS["DNS (Beget)\n*.katykhin.ru → IP"]
  end

  subgraph Edge["Граница сети"]
    Router["Роутер\n192.168.1.1\nпроброс 80/443 → .100"]
  end

  subgraph Gateway["Единая точка входа"]
    NPM["NPM\nCT 100\nтерминация SSL, маршрут по Host"]
  end

  subgraph Backends["Сервисы"]
    S101["Nextcloud\nCT 101"]
    S103["Gitea / CouchDB\nCT 103"]
    S104["Paperless\nCT 104"]
    S105["RAG API\nCT 105"]
    S107["Invidious\nCT 107"]
    S108["Galene\nCT 108"]
    S200["Immich\nVM 200"]
  end

  subgraph Data["Данные"]
    D101["PostgreSQL\nRedis\nCT 101"]
    D103["PostgreSQL\nCT 103"]
    D104["PostgreSQL\nRedis\nCT 104"]
    D107["PostgreSQL\nCT 107"]
    D200["PostgreSQL\nRedis\nVM 200"]
  end

  subgraph External2["Внешние зависимости"]
    coTURN["coTURN\nVPS Миран 185.147.80.190"]
  end

  DNS --> Router
  Router --> NPM
  NPM --> S101
  NPM --> S103
  NPM --> S104
  NPM --> S105
  NPM --> S107
  NPM --> S108
  NPM --> S200

  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).

Схема сети (упрощённо)

                    Интернет (пользователи)
                              │
                              ▼
              ┌───────────────────────────────┐
              │  Роутер 192.168.1.1          │  Внешний IP: 185.35.193.144
              │  Netcraze Speedster           │  Проброс 80/443 → .100
              │  VPN: AmneziaWG DE / US        │
              └───────────────┬───────────────┘
                              │
         ┌────────────────────┼────────────────────┐
         │                    │                    │
         ▼                    ▼                    ▼
  ┌──────────────┐   ┌────────────────┐   ┌─────────────────┐
  │ Proxmox      │   │ CT 100         │   │ Остальные CT/VM  │
  │ 192.168.1.150│   │ 192.168.1.100  │   │ .101 .103 .104   │
  │ (гипервизор) │   │ NPM, AdGuard,  │   │ .105 .107 .108   │
  │              │   │ Homepage,      │   │ VM 200 .200      │
  │ pct / qm     │   │ Wallos, etc.  │   │ (бэкенды)       │
  └──────────────┘   └───────┬────────┘   └────────┬────────┘
         │                   │                      │
         │                   │  HTTPS по Host       │
         │                   └──────────────────────┘
         │                      (NPM проксирует на бэкенды)
         │
         │   Туннели VPN (роутер ↔ VPS)
         │
         ├──────────────────────────────────────────────────┐
         │                                                   │
         ▼                                                   ▼
  ┌──────────────────┐  ┌──────────────────┐  ┌──────────────────────┐
  │ VPS DE           │  │ VPS US           │  │ VPS Миран (СПБ)       │
  │ 185.103.253.99   │  │ 147.45.124.117   │  │ 185.147.80.190        │
  │ AmneziaWG        │  │ AmneziaWG        │  │ coTURN (Galene),      │
  │ (обход блок.)    │  │ (обход блок.)    │  │ боты, Prometheus      │
  └──────────────────┘  └──────────────────┘  └──────────────────────┘

Поток публичного трафика:
Запрос из интернета (например 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) git.katykhin.ru, obsidian.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
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

(Точный список 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 и порту).

Внутри хостов

  • 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/фаерволом.
  • 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.
Certbot / Beget API Истечение сертификатов → браузеры начнут ругаться. Продление через DNS-01 зависит от Beget. Следить за продлением (таймер certbot); иметь запасной способ выпуска (другой DNS или ручной сертификат).
DNS (Beget) Смена IP или потеря записей — домены перестанут вести на твой хост. Ведение записей вручную/через API; при смене IP обновить A-записи.
VPS Миран (coTURN) Galene: проблемы с установкой видеозвонов за NAT. Остальные сервисы не зависят. Локальный coTURN на 108 или другом хосте как запасной вариант.
Конкретный бэкенд (101, 103, …) Падает только свой сервис (Nextcloud, Gitea, Invidious и т.д.). Остальные работают. Зависимости внутри стека (БД первым) и мониторинг каждого хоста.

Связь с другими документами