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

17 KiB
Raw Blame History

Контейнер 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, 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).

Команды:

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 (в контейнере).

Команды:

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)
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и.
    Эти размеры небольшие сейчас, но могут расти за счёт логов и числа доменов — учитывать при выборе стратегии бэкапа.

Связь с другими документами