# Контейнер 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, 67–68, 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-/` и делают `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), 67–68 (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 и др.), ссылки, пинги. Пароли и токены виджетов хранятся здесь (не коммитить в открытый репозиторий). В список сервисов добавлен **Vaultwarden** (менеджер паролей на контейнере 103): ссылка на `https://vault.katykhin.ru` (если в NPM настроен proxy) или на `http://192.168.1.103:8280` (доступ по LAN по IP). Пример записи в `services.yaml`: ```yaml - Vaultwarden description: Менеджер паролей (Bitwarden-совместимый) icon: vaultwarden.png href: https://vault.katykhin.ru target: _blank ``` (При использовании только LAN по IP укажите `href: http://192.168.1.103:8280`. Иконка: в [документации Homepage](https://gethomepage.dev/docs/services/) или локальный файл в `config/images/`.) - `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) | | 67–68 | 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) — таблица контейнеров, домены, схема сети. - [Контейнер 103 (Gitea, Vaultwarden)](container-103.md) — сервис Vaultwarden (менеджер паролей), добавляемый на дашборд Homepage. - [Выпуск сертификата 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.