Remove deprecated files related to homelab architecture, container context, and various scripts. This cleanup includes the removal of configuration files for Nextcloud, Gitea, and VPN setups, as well as documentation files that are no longer relevant. This helps streamline the project and eliminate outdated references.

This commit is contained in:
2026-02-25 17:03:10 +03:00
parent 3c00fbf67b
commit b0d2746490
74 changed files with 2662 additions and 7107 deletions

View File

@@ -0,0 +1,233 @@
# Схема сети и зависимости инфраструктуры
Полная топология: домашняя сеть, Proxmox, контейнеры/ВМ, внешние VPS, маршруты и зависимости. Помогает видеть единые точки отказа (single point of failure).
---
## Граф зависимостей (dependency graph)
Цепочка обслуживания **любого** публичного запроса к доменам katykhin.ru:
```mermaid
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 и т.д.). Остальные работают. | Зависимости внутри стека (БД первым) и мониторинг каждого хоста. |
---
## Связь с другими документами
- [Архитектура и подключение](../architecture/architecture.md) — общее описание, таблица контейнеров, поток запросов.
- [Контейнер 100](../containers/container-100.md) — NPM, AdGuard, Homepage, порядок запуска.
- [Роутер 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.

View File

@@ -0,0 +1,102 @@
# Роутер Netcraze Speedster
Домашний маршрутизатор с веб-админкой и поддержкой WireGuard/AmneziaWG. Используется для выхода в интернет и выборочной маршрутизации части трафика через VPN (два профиля: Германия и США).
---
## Доступ и логины
- **Веб-интерфейс:** http://192.168.1.1 — логин `admin`, пароль `eC1cLwZPRoDVEY1`.
- **Веб-CLI (ограниченный):** http://192.168.1.1/a — отправка отдельных команд из браузера.
- **Полноценный CLI:** по **telnet** на 192.168.1.1, порт **2048** (стандартный 23 изменён). Пароль администратора тот же: `eC1cLwZPRoDVEY1`. SSH в настройках включался, но **не работает** — используется telnet.
Подключение по telnet с компьютера в домашней сети:
```bash
telnet 192.168.1.1 2048
```
После ввода пароля администратора доступна CLI с автодополнением по Tab (команды и параметры текущего уровня).
---
## VPN (WireGuard / AmneziaWG)
Настройка выполнялась по инструкции для Keenetic с AmneziaWG: [Installing VPN on a Keenetic Router](https://docs.amnezia.org/documentation/instructions/keenetic-os-awg/) (импорт .conf из AmneziaVPN, при необходимости ручная установка asc-параметров обфускации в CLI).
**Два подключения WireGuard:**
| Подключение | Пир (сервер) | Назначение | Статус в скринах |
|--------------------|------------------------|----------------|-------------------|
| netcraze_amnezia | 185.103.253.99:33118 | Германия (AWG) | Включено |
| router_us | 147.45.124.117:37135 | США (AWG) | Выключено |
- Внутренний адрес клиента для **netcraze_amnezia:** 10.8.1.2/32 (порт 42472).
- Для **router_us:** 10.8.1.2/32 (порт 43116).
Переключение: в разделе **Интернет → Другие подключения** включается или выключается нужное WireGuard-подключение. В **Приоритеты подключений** оба профиля работают в режиме резервирования.
---
## Приоритеты подключений
**Интернет → Приоритеты подключений:**
- **Политика по умолчанию** — основное подключение (Ethernet / PPPoE).
- **netcraze_amnezia** — режим резервирования, WireGuard (Германия).
- **us** — режим резервирования, WireGuard (router_us, США).
Нужная политика выбирается для устройств/сегментов на вкладке **Применение политик**. Для выхода части трафика через VPN можно создать отдельную политику с одним VPN-подключением и назначить её нужным устройствам или сегментам (например, гостевой WiFi).
---
## Маршрутизация
**Сетевые правила → Маршрутизация → IPv4-маршруты:**
- Пользовательские маршруты с приоритетом над динамическими.
- **Шлюз** в таблице: 10.8.1.2 (внутренний адрес VPN-клиента на роутере).
- **Интерфейсы:** `netcraze_amnezia` и `router_us` — трафик к указанным сетям назначения уходит через соответствующий VPN.
- Записей много (порядка 2000+); для части сетей включено **«Добавлять автоматически»**. Списки конкретных IP/сетей в документацию не выносятся — при необходимости экспорт/импорт через кнопки в веб-интерфейсе.
---
## DNS
**Сетевые правила → Интернет-фильтры → Настройка DNS:**
- **Системный профиль:** DNS провайдера (подключение Ethernet), например 178.155.7.18, 217.66.16.35; разрешён транзит запросов.
- **DoT-серверы:** 1.1.1.1 (Cloudflare) и 8.8.8.8 (Google), интерфейс «Любой».
При необходимости игнорирование DNS провайдера включается в **Интернет → Кабель Ethernet → Порты и VLANы**.
---
## Основные команды CLI (telnet)
После входа в CLI доступны стандартные команды Keenetic-подобной оболочки. Автодополнение: **Tab** в приглашении выводит список доступных команд на текущем уровне.
**Полезные команды:**
- `show interface` — список интерфейсов (в т.ч. WireGuard по имени подключения; по описанию можно найти имя интерфейса, например Wireguard1).
- `system configuration save` — сохранение конфигурации.
- `exit` — выход из CLI.
**Ручная установка asc-параметров AmneziaWG (если веб не импортировал их):**
По [инструкции Amnezia](https://docs.amnezia.org/documentation/instructions/keenetic-os-awg/) для версий KeeneticOS 4.3.3 и ниже параметры обфускации (Jc, Jmin, Jmax, S1, S2, H1H4) задаются в CLI командой вида:
```text
interface Wireguard1 wireguard asc 6 10 50 90 62 1455064900 852483043 2078090415 1981181588
```
(имя интерфейса и значения — из .conf и `show interface`; для 4.3.4+ импорт из файла может подставлять их автоматически.)
Полный перечень команд — в [руководстве по CLI](https://support.keenetic.com/hero/kn-1012/en/18480-command-line-interface--cli-.html) и в разделе загрузок на support.keenetic.com для модели Speedster.
---
## Связь с другими статьями
- Серверы VPN: [VPN-сервер (VPS, AmneziaWG)](../vps/vpn-vps-amneziawg.md), [Перенос конфигурации AmneziaWG](../vps/vpn-migrate-config.md).
- Домашняя сеть и Proxmox: [Архитектура и подключение](../architecture/architecture.md).

View File

@@ -0,0 +1,102 @@
# Инструкция: выпуск сертификата Let's Encrypt (DNS-01)
Универсальная инструкция для использования как промпт в следующих проектах. Подходит, когда HTTP-01 недоступен (порт 80 закрыт, блокировки, инстанс за NAT).
---
## Когда использовать DNS-01
- **HTTP-01** не срабатывает: таймаут, «Connection refused», порт 80 недоступен с интернета, провайдер или регион блокирует запросы от Let's Encrypt.
- **DNS-01**: проверка владения доменом по TXT-записи `_acme-challenge.<домен>`. До сервера стучаться не нужно — важен только DNS.
---
## Общий алгоритм
1. Выбрать DNS-провайдера домена и проверить, есть ли у него API или плагин для certbot/acme.sh.
2. Установить certbot и плагин для этого DNS (или использовать acme.sh с DNS API).
3. Создать файл учётных данных (логин/API-токен провайдера), права 600.
4. Запросить сертификат: `certbot certonly --authenticator dns-<провайдер> ... -d example.com`.
5. Подложить полученные `fullchain.pem` и `privkey.pem` в reverse proxy (Nginx Proxy Manager, nginx, Caddy и т.д.).
6. Настроить автообновление (systemd timer certbot + deploy-hook при продлении).
---
## Пример: Beget.com (certbot-dns-beget-api)
**Условия:** домен на Beget, доступ к API (логин + пароль или отдельный API-пароль).
1. **Установка (Debian/Ubuntu):**
```bash
apt install certbot
pip3 install certbot-dns-beget-api # или: python3 -m pip install certbot-dns-beget-api --break-system-packages
```
2. **Файл учётных данных** (например `/root/.secrets/certbot/beget.ini`):
```ini
dns_beget_api_username = ВАШ_ЛОГИН_BEGET
dns_beget_api_password = ВАШ_ПАРОЛЬ_ИЛИ_API_ПАРОЛЬ
```
```bash
chmod 600 /root/.secrets/certbot/beget.ini
```
3. **Запрос сертификата:**
```bash
certbot certonly \
--authenticator dns-beget-api \
--dns-beget-api-credentials /root/.secrets/certbot/beget.ini \
--dns-beget-api-propagation-seconds 120 \
-d example.com \
--non-interactive \
--agree-tos \
--email your@email.com
```
4. **Где лежат файлы после выпуска:**
- Сертификат: `/etc/letsencrypt/live/<домен>/fullchain.pem`
- Ключ: `/etc/letsencrypt/live/<домен>/privkey.pem`
5. **Интеграция с Nginx Proxy Manager (NPM):**
- Либо вручную скопировать в каталог custom_ssl (например `custom_ssl/npm-<id>/fullchain.pem` и `privkey.pem`) и перезагрузить nginx в контейнере NPM.
- Либо добавить запись в БД NPM (таблица `certificate`, provider `other`) и положить те же файлы в каталог, на который ссылается конфиг nginx (например `custom_ssl/npm-<certificate_id>/`).
6. **Продление и deploy-hook** (чтобы после `certbot renew` сертификат автоматически подхватывался NPM):
```bash
# /etc/letsencrypt/renewal-hooks/deploy/copy-to-npm.sh
# RENEWED_LINEAGE = путь к обновлённому сертификату, например /etc/letsencrypt/live/example.com
if [ "$RENEWED_LINEAGE" = "/etc/letsencrypt/live/EXAMPLE_DOMAIN" ]; then
cp "$RENEWED_LINEAGE/fullchain.pem" /path/to/npm/custom_ssl/npm-ID/
cp "$RENEWED_LINEAGE/privkey.pem" /path/to/npm/custom_ssl/npm-ID/
chmod 644 /path/to/npm/custom_ssl/npm-ID/fullchain.pem
chmod 600 /path/to/npm/custom_ssl/npm-ID/privkey.pem
docker exec CONTAINER_NPM nginx -s reload
fi
```
Сделать скрипт исполняемым: `chmod +x ...`
7. **Проверка автообновления:** таймер certbot обычно уже включён:
```bash
systemctl list-timers | grep certbot
```
---
## Другие DNS-провайдеры (идеи для промпта)
- **Cloudflare:** `certbot-dns-cloudflare`, переменные `dns_cloudflare_api_token` или `dns_cloudflare_email` + `dns_cloudflare_api_key`.
- **Reg.ru:** плагин `certbot-dns-regru`, свои переменные в credentials-файле.
- **NIC.ru:** `certbot-dns-nicru`.
- **Без API:** `certbot certonly --manual --preferred-challenges dns -d example.com` — выводит TXT-значение, пользователь вручную добавляет запись в DNS, затем продолжает по Enter.
---
## Краткий чеклист для нового домена/проекта
- [ ] Домен и DNS у одного провайдера; выяснить, есть ли API/плагин для ACME DNS-01.
- [ ] Установить certbot и нужный DNS-плагин.
- [ ] Создать credentials-файл (chmod 600), не коммитить в git.
- [ ] Выпустить сертификат: `certbot certonly --authenticator dns-... -d domain`.
- [ ] Подложить fullchain.pem и privkey.pem в reverse proxy.
- [ ] Добавить deploy-hook для продления и перезагрузки nginx/прокси.
- [ ] Убедиться, что certbot.timer включён для автоматического renew.