17 KiB
Контейнер 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 (из архитектуры)
- Доступ: с 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, emailj3tears100@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-<id>/и делаютdocker exec npm nginx -s reload.
Подробнее по SSL: Выпуск сертификата Let's Encrypt (DNS-01).
Команды:
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 (в контейнере).
Команды:
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).
Команды:
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).
Команды:
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 минут выполняется:
Скрипт читает логи из
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 (в контейнере).
Команды:
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).
- Для файлов proxy-host-*_access.log настроен logrotate:
- Certbot:
/etc/logrotate.d/certbot— ротация логов letsencrypt (weekly, 12 копий). - AdGuard: данные и логи в
data/work/иdata/conf/(~85 MB). Стоит проверить настройки хранения логов запросов в веб-интерфейсе AdGuard (ограничение по времени/размеру). - Homepage: небольшие логи в
config/logs/.
Запуск и порядок поднятия
- Создать сеть (если ещё нет):
docker network create proxy_network. - NPM:
cd /opt/docker/nginx-proxy && docker compose up -d. - AdGuard:
cd /opt/docker/adguard && docker compose up -d(создаёт свою сеть и подключается к proxy_network). - Homepage (+ dockerproxy):
cd /opt/docker/homepage && docker compose up -d. - Wallos:
cd /opt/docker/wallos && docker compose up -d. - VPN Route Check:
cd /opt/docker/vpn-route-check && docker compose up -d. - Log-dashboard: при необходимости запустить контейнер с монтом html и портом 8088.
После изменений в NPM (proxy, SSL): перезагрузка nginx внутри контейнера — docker exec npm nginx -s reload. Certbot продлевает сертификаты по таймеру; deploy-hook’и копируют их в NPM и перезагружают nginx.
Уязвимости и риски
- Пароли и креды в конфигах: В
services.yaml(Homepage) хранятся пароли виджетов (AdGuard, NPM, Proxmox). Файл лежит только на сервере; не помещать в публичный репозиторий. - VPN Route Check: Логин и пароль роутера прописаны в
docker-compose.yml. Доступ к compose = доступ к роутеру. Рекомендуется вынести в.envи ограничить права на файл. - AdGuard на 3000: Веб-интерфейс доступен по порту 3000 на хосте. Доступ из LAN; при необходимости закрыть фаерволом снаружи или использовать только через NPM (proxy).
- NPM на 81: Админка NPM по порту 81. Убедиться, что с интернета доступ только через VPN или не пробрасывать 81 наружу.
- Логи 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’и.
Эти размеры небольшие сейчас, но могут расти за счёт логов и числа доменов — учитывать при выборе стратегии бэкапа.
Связь с другими документами
- Архитектура и подключение — таблица контейнеров, домены, схема сети.
- Выпуск сертификата Let's Encrypt (DNS-01) — certbot, Beget API, интеграция с NPM.
- Роутер Netcraze Speedster — VPN и telnet, используемые vpn-route-check.