Files
homelab-docs/docs/network/network-topology.md
Andrey 53769e6832 Update architecture and backup documentation to include Healthchecks integration
Add Healthchecks service details to architecture and backup documentation, including its role as a Dead man's switch for backups. Update backup scripts to utilize systemd timers instead of cron for improved scheduling. Enhance network topology documentation to reflect Healthchecks integration in the VPS Miran setup. This update clarifies backup processes and enhances overall system reliability.
2026-02-28 15:43:39 +03:00

20 KiB
Raw Permalink Blame History

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

Полная топология: домашняя сеть, 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 живёт на том же хосте, что и 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),      │
  │ (обход блок.)    │  │ (обход блок.)    │  │ Healthchecks, боты   │
  └──────────────────┘  └──────────────────┘  └──────────────────────┘

Доступ к 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), Healthchecks, боты, prod call.katykhin.ru (STUN/TURN), healthchecks.katykhin.ru
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 и т.д.). Остальные работают. Зависимости внутри стека (БД первым) и мониторинг каждого хоста.

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