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.
20 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 живёт на том же хосте, что и 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-сервисы зависят от:
- Роутер — без него нет входа 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 и т.д.). Остальные работают. | Зависимости внутри стека (БД первым) и мониторинг каждого хоста. |
Связь с другими документами
- Архитектура и подключение — общее описание, таблица контейнеров, поток запросов.
- Хост Proxmox — скрипты, таймеры, пути на 192.168.1.150.
- Контейнер 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.