Files
homelab-docs/docs/containers/container-100.md

259 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Контейнер 100 (nginx): NPM, Homepage, AdGuard, Wallos и сопутствующие сервисы
Подробное описание LXC-контейнера **100** на Proxmox (192.168.1.100): reverse proxy, DNS-фильтрация, дашборд, учёт подписок, мониторинг логов и маршрутов VPN.
---
## Общие сведения
- **Хостнейм:** nginx
- **IP:** 192.168.1.100/24
- **ОС:** Debian 12 (bookworm)
- **Ресурсы:** 1 core, 2 GB RAM (из [архитектуры](../architecture/architecture.md))
- **Доступ:** с Proxmox — `pct exec 100 -- bash` или `ssh` на 192.168.1.100, если настроен.
Диск контейнера: порядка 10 GB, занято ~4.6 GB (логи и данные сервисов). Следить за местом (см. раздел «Логи и ротация» и TODO).
---
## Доступ и логины
- **Debian (CT 100):** логин `root` (или консольный пользователь Debian), пароль `waccEk-fyqbux-rarja3`.
- **AdGuard Home:** http://192.168.1.100:3000, пользователь `kerrad`, пароль `waccEk-fyqbux-rarja3`.
- **Nginx Proxy Manager:** http://192.168.1.100:81, имя `Kerrad`, email `j3tears100@gmail.com`, пароль `kqEUubVq02DJTS8`.
- **Wallos:** https://wallos.katykhin.ru (через NPM), Webлогин/пароль сохранены в менеджере паролей; Basic Auth в NPM — логин `admin`, пароль `fy8lNlWvvJryfrUVMZr8`.
- **Homepage:** https://home.katykhin.ru, логин `admin`, пароль `fy8lNlWvvJryfrUVMZr8`.
---
## Сервисы (Docker)
Все сервисы запущены в Docker. Сети: **proxy_network** (общая для NPM, Homepage, Wallos, dockerproxy, AdGuard), **adguard_proxy_network** (AdGuard дополнительно). Контейнер **vpn-route-check** в режиме `network_mode: host`.
| Контейнер | Образ | Порты (хост) | Назначение |
|-------------------|------------------------------------|-------------------|------------|
| npm | jc21/nginx-proxy-manager:latest | 80, 81, 443 | Reverse proxy, SSL, админка NPM |
| adguard | adguard/adguardhome:latest | 53/tcp+udp, 6768, 853, 3000 | DNS, DoT, веб-интерфейс, опционально DHCP |
| homepage | ghcr.io/gethomepage/homepage:latest| 4000→3000 | Дашборд сервисов (home.katykhin.ru) |
| dockerproxy | tecnativa/docker-socket-proxy | 2375 (внутри сети)| Прокси к Docker API для Homepage (только чтение) |
| wallos | bellamy/wallos:latest | 8282→80 | Учёт подписок (wallos.katykhin.ru) |
| log-dashboard | nginx:alpine | 8088→80 | Просмотр ленты обращений NPM (статика из html) |
| vpn-route-check | свой образ (build) | host | Проверка маршрутов VPN по доменам, дашборд на 8765 |
---
## 1. Nginx Proxy Manager (NPM)
**Каталог:** `/opt/docker/nginx-proxy/`
**Compose:** `docker-compose.yml` (образ `jc21/nginx-proxy-manager:latest`, restart unless-stopped).
**Порты:** 80 (HTTP), 81 (админка), 443 (HTTPS).
**Тома:**
- `./data``/data` (конфиги nginx, БД SQLite, логи, custom_ssl, proxy_host)
- `./letsencrypt``/etc/letsencrypt` (в контейнере; с хоста certbot пишет в системный `/etc/letsencrypt`, см. ниже).
**Сеть:** proxy_network.
**Основные пути на хосте:**
- `/opt/docker/nginx-proxy/data/` — данные NPM (в т.ч. `nginx/proxy_host/*.conf`, `logs/`, `custom_ssl/`, `database.sqlite`).
- `/opt/docker/nginx-proxy/data/logs/` — логи nginx: `proxy-host-*_access.log`, `proxy-host-*_error.log`, `fallback_http_access.log`, `fallback_http_error.log`, `letsencrypt.log` и др.
- `/opt/docker/nginx-proxy/letsencrypt/` — копия/симлинки сертификатов для контейнера (56 KB); основные сертификаты выпускаются certbot на хосте в `/etc/letsencrypt/live/<домен>/` и при продлении копируются в NPM (custom_ssl) через deploy-hook.
**Certbot на хосте (внутри CT 100):**
- Установлен в системе, таймер `certbot.timer` (проверка продления дважды в день).
- Учётные данные Beget API: `/root/.secrets/certbot/beget.ini`.
- Deploy-hookи: `/etc/letsencrypt/renewal-hooks/deploy/` — скрипты `copy-*-to-npm.sh` (video, docs, immich, mini-lm и т.д.) копируют `fullchain.pem` и `privkey.pem` в соответствующий каталог `custom_ssl/npm-<id>/` и делают `docker exec npm nginx -s reload`.
Подробнее по SSL: [Выпуск сертификата Let's Encrypt (DNS-01)](../network/ssl-letsencrypt-dns01.md).
**Команды:**
```bash
docker logs npm
docker exec npm nginx -s reload
```
---
## 2. AdGuard Home
**Каталог:** `/opt/docker/adguard/`
**Compose:** `docker-compose.yml` (образ `adguard/adguardhome:latest`).
**Порты:** 53 (DNS TCP/UDP), 6768 (DHCP при необходимости), 853 (DoT), 3000 (веб-интерфейс).
**Тома:** `./data/work`, `./data/conf` → соответствующие пути в контейнере.
**Сеть:** adguard_proxy_network и proxy_network (доступ с NPM по имени `adguard`).
**Конфиг:** `/opt/docker/adguard/data/conf/AdGuardHome.yaml` (upstream DNS, кэш, привязки, пользователи и т.д.). Данные и кэш: `data/work/`.
Доступ в веб: http://192.168.1.100:3000. В NPM настроен proxy на adguard (в т.ч. для adguard.local). Виджет и пароль для Homepage задаются в `services.yaml` (в контейнере).
**Команды:**
```bash
docker logs adguard
docker restart adguard
```
---
## 3. Homepage
**Каталог:** `/opt/docker/homepage/config/`
**Compose:** в `/opt/docker/homepage/docker-compose.yml` (homepage + dockerproxy).
**Порты:** 4000 (хост) → 3000 (контейнер).
**Тома:** `./config``/app/config`, `./config/images``/app/public/images`.
**Переменные:** `TZ=Europe/Moscow`, `HOMEPAGE_ALLOWED_HOSTS=home.katykhin.ru`, `DOCKER_HOST=tcp://dockerproxy:2375`.
**Сеть:** proxy_network.
**Основные файлы конфигурации:**
- `services.yaml` — список сервисов, виджеты (NPM, AdGuard, Proxmox и др.), ссылки, пинги. Пароли и токены виджетов хранятся здесь (не коммитить в открытый репозиторий).
- `docker.yaml` — подключение к Docker через dockerproxy (host/port).
- `settings.yaml`, `widgets.yaml`, `bookmarks.yaml`, `custom.css`, `proxmox.yaml`, `kubernetes.yaml` при необходимости.
Логи Homepage: `/opt/docker/homepage/config/logs/` (~588 KB).
**Команды:**
```bash
cd /opt/docker/homepage && docker compose up -d
docker logs homepage
```
---
## 4. Docker Socket Proxy (dockerproxy)
Запускается из того же compose, что и Homepage. Даёт Homepage доступ к Docker API только на чтение (CONTAINERS, SERVICES, TASKS, IMAGES, INFO, NETWORKS, VOLUMES; POST=0). Сокет хоста монтируется read-only. Отдельных конфигов нет.
---
## 5. Wallos
**Каталог:** `/opt/docker/wallos/`
**Compose:** `docker-compose.yml` (образ `bellamy/wallos:latest`).
**Порты:** 8282 (хост) → 80 (контейнер).
**Тома:** `./db``/var/www/html/db`.
**Сеть:** proxy_network. Доступ через NPM: https://wallos.katykhin.ru (с Basic Auth в NPM).
**Команды:**
```bash
docker logs wallos
docker restart wallos
```
---
## 6. Log-dashboard (лента обращений NPM)
Показывает обработанные access-логи NPM в виде ленты с фильтрацией по домену и геолокацией.
- **Контейнер:** `log-dashboard`, образ `nginx:alpine`, порт **8088** (хост) → 80.
- **Том:** `/opt/docker/log-dashboard/html``/usr/share/nginx/html` (только чтение). Контейнер отдаёт статический HTML.
- **Генерация контента:** на **хосте** (внутри CT 100) по крону каждые **15 минут** выполняется:
```bash
python3 /opt/docker/log-dashboard/gen-dashboard.py /opt/docker/log-dashboard/html/index.html
```
Скрипт читает логи из `/opt/docker/nginx-proxy/data/logs/`, парсит access-формат NPM, добавляет геолокацию (ip-api.com, кэш в `ip_cache.json`), пишет результат в `index.html`.
- **Cron:** запись в crontab root: `*/15 * * * * ... gen-dashboard.py ...`.
Доступ: http://192.168.1.100:8088 (или через NPM, если настроен proxy). Контейнер запускается отдельно (не из общего compose в каталогах выше — при перезагрузке CT нужно проверить, что он поднят).
---
## 7. VPN Route Check
**Каталог:** `/opt/docker/vpn-route-check/`
**Compose:** `docker-compose.yml` (сборка своего образа, `network_mode: host`).
Проверяет, идут ли запросы к заданным доменам через VPN или через основное подключение (подключение к роутеру по telnet, разбор маршрутов). Результаты отдаёт на порту **8765** (на хосте). В Homepage добавлена ссылка на http://192.168.1.100:8765.
**Переменные окружения в compose:** `ROUTER_TELNET_HOST`, `ROUTER_TELNET_USER`, `ROUTER_TELNET_PASSWORD` — **заданы в самом файле** (не в .env). Рекомендация: вынести в `.env` и не коммитить пароль (см. TODO).
**Том:** volume `vpn-route-check-data` → `/data` (в контейнере).
**Команды:**
```bash
cd /opt/docker/vpn-route-check && docker compose up -d
docker logs vpn-route-check
```
---
## Порты (сводка на хосте)
| Порт | Сервис / примечание |
|-------|----------------------------|
| 80 | NPM (HTTP) |
| 81 | NPM (админка) |
| 443 | NPM (HTTPS) |
| 53 | AdGuard (DNS TCP/UDP) |
| 6768 | AdGuard (DHCP при необходимости) |
| 853 | AdGuard (DoT) |
| 3000 | AdGuard (веб) |
| 4000 | Homepage |
| 8088 | Log-dashboard |
| 8282 | Wallos |
| 8765 | VPN Route Check (host) |
---
## Логи и ротация
- **NPM:** логи в `/opt/docker/nginx-proxy/data/logs/`.
- Для файлов **proxy-host-*_access.log** настроен logrotate: `/etc/logrotate.d/npm-access` — ротация при 100 MB, 4 копии, copytruncate, compress.
- Файлы **fallback_http_access.log**, **fallback_http_error.log** и другие **fallback_*** в правиле не указаны** — ротация по размеру/времени для них не настроена, каталог уже ~67 MB. Риск разрастания (см. TODO).
- **Certbot:** `/etc/logrotate.d/certbot` — ротация логов letsencrypt (weekly, 12 копий).
- **AdGuard:** данные и логи в `data/work/` и `data/conf/` (~85 MB). Стоит проверить настройки хранения логов запросов в веб-интерфейсе AdGuard (ограничение по времени/размеру).
- **Homepage:** небольшие логи в `config/logs/`.
---
## Запуск и порядок поднятия
1. Создать сеть (если ещё нет): `docker network create proxy_network`.
2. NPM: `cd /opt/docker/nginx-proxy && docker compose up -d`.
3. AdGuard: `cd /opt/docker/adguard && docker compose up -d` (создаёт свою сеть и подключается к proxy_network).
4. Homepage (+ dockerproxy): `cd /opt/docker/homepage && docker compose up -d`.
5. Wallos: `cd /opt/docker/wallos && docker compose up -d`.
6. VPN Route Check: `cd /opt/docker/vpn-route-check && docker compose up -d`.
7. Log-dashboard: при необходимости запустить контейнер с монтом html и портом 8088.
После изменений в NPM (proxy, SSL): перезагрузка nginx внутри контейнера — `docker exec npm nginx -s reload`. Certbot продлевает сертификаты по таймеру; deploy-hookи копируют их в NPM и перезагружают nginx.
---
## Уязвимости и риски
1. **Пароли и креды в конфигах:** В `services.yaml` (Homepage) хранятся пароли виджетов (AdGuard, NPM, Proxmox). Файл лежит только на сервере; не помещать в публичный репозиторий.
2. **VPN Route Check:** Логин и пароль роутера прописаны в `docker-compose.yml`. Доступ к compose = доступ к роутеру. Рекомендуется вынести в `.env` и ограничить права на файл.
3. **AdGuard на 3000:** Веб-интерфейс доступен по порту 3000 на хосте. Доступ из LAN; при необходимости закрыть фаерволом снаружи или использовать только через NPM (proxy).
4. **NPM на 81:** Админка NPM по порту 81. Убедиться, что с интернета доступ только через VPN или не пробрасывать 81 наружу.
5. **Логи NPM:** Часть логов (fallback_*) не ротируется — возможен рост и заполнение диска (см. TODO).
---
## TODO по контейнеру 100
- [ ] **Логи NPM:** Добавить в logrotate ротацию для `fallback_http_access.log`, `fallback_http_error.log` (и при необходимости других fallback_*) по размеру или по дням, чтобы не забивать диск.
- [ ] **Логи AdGuard:** Проверить в веб-интерфейсе AdGuard настройки хранения логов запросов (срок/размер) и при необходимости ограничить.
- [ ] **VPN Route Check:** Вынести `ROUTER_TELNET_*` в `.env`, подключать в compose через `env_file`, не коммитить .env в репозиторий.
- [ ] **Log-dashboard:** Зафиксировать способ запуска контейнера (отдельный compose или скрипт) и добавить его в документацию/автозапуск при перезагрузке CT.
- [ ] **Мониторинг диска:** Настроить оповещение (например, из Prometheus/Alertmanager или скрипт по крону) при заполнении корня или `/opt/docker` выше порога (например 80%).
- [ ] **Резервное копирование:** Регулярный бэкап критичных папок (оценка размеров на момент документации):
- `/opt/docker/nginx-proxy/data` — ~68 MB (конфиги NPM, БД, логи, custom_ssl).
- `/opt/docker/adguard/data` — ~85 MB (конфиги и данные AdGuard).
- `/opt/docker/homepage/config` — ~0.7 MB (конфиги Homepage).
- `/opt/docker/wallos/db` — ~0.2 MB (БД Wallos).
- `/opt/docker/vpn-route-check` — ~0.1 MB (скрипты и конфиг).
- `/etc/letsencrypt` — ~0.5 MB (структура сертификатов, live/archive).
- `/root/.secrets/certbot` и `/etc/letsencrypt/renewal-hooks/deploy/` — секреты и deploy-hookи.
Эти размеры небольшие сейчас, но могут расти за счёт логов и числа доменов — учитывать при выборе стратегии бэкапа.
---
## Связь с другими документами
- [Архитектура и подключение](../architecture/architecture.md) — таблица контейнеров, домены, схема сети.
- [Выпуск сертификата Let's Encrypt (DNS-01)](../network/ssl-letsencrypt-dns01.md) — certbot, Beget API, интеграция с NPM.
- [Роутер Netcraze Speedster](../network/router-netcraze-speedster.md) — VPN и telnet, используемые vpn-route-check.