Enhance backup scripts for Nextcloud, Gitea, Paperless, Vaultwarden, Immich, and VPS configurations by adding Telegram notifications upon completion. Include details such as backup size and objects backed up. Update backup documentation to reflect these changes and ensure clarity on backup processes and retention policies.
19 KiB
Контейнер 100 (nginx): NPM, AdGuard и сопутствующие сервисы
Подробное описание 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 (через домен): https://adguard.katykhin.ru (через NPM, сертификат Let's Encrypt), пользователь
kerrad, парольwaccEk-fyqbux-rarja3. Прямой доступ по порту 3000 больше не используется. - Nginx Proxy Manager: http://192.168.1.100:81, имя
Kerrad, emailj3tears100@gmail.com, парольkqEUubVq02DJTS8.
Сервисы (Docker)
Все сервисы запущены в Docker. Сети: proxy_network (общая для NPM, AdGuard и служебных контейнеров вроде log-dashboard), 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 |
| 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, vault и т.д.) копируютfullchain.pemиprivkey.pemв соответствующий каталогcustom_ssl/npm-<id>/и делаютdocker exec npm nginx -s reload.
vault.katykhin.ru: сертификат выпускается certbot’ом в /etc/letsencrypt/live/vault.katykhin.ru/, deploy-hook copy-vault-to-npm.sh копирует его в custom_ssl/npm-18/. В NPM у proxy host’а vault.katykhin.ru должен быть выбран именно этот сертификат (Custom SSL → каталог npm-18). Если в NPM по ошибке привязать другой сертификат (например от другого домена), браузер покажет ошибку «нет сертификата» или неверный домен; тогда в конфиге proxy host’а должны быть пути ssl_certificate /data/custom_ssl/npm-18/....
Подробнее по 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 (исторически веб-интерфейс; сейчас доступ к GUI идёт через NPM и домен adguard.katykhin.ru).
Тома: ./data/work, ./data/conf → соответствующие пути в контейнере.
Сеть: adguard_proxy_network и proxy_network (доступ с NPM по имени adguard).
Конфиг: /opt/docker/adguard/data/conf/AdGuardHome.yaml (upstream DNS, кэш, привязки, пользователи и т.д.). Данные и кэш: data/work/.
Доступ в веб:
- Из LAN/VPN:
https://adguard.katykhin.ru(через NPM, доступ ограничен подсетями 192.168.1.0/24 и 10.10.99.0/24). - Старый вариант
http://192.168.1.100:3000больше не используется (порт 3000 не нужен при наличии прокси).
В NPM настроены proxy host'ы на adguard.local и adguard.katykhin.ru. Виджет и пароль для Homepage задаются в services.yaml (в контейнере 103).
Команды:
docker logs adguard
docker restart adguard
3. Homepage (сервис перенесён на контейнер 103)
Сервис сейчас работает на CT 103 (192.168.1.103); ниже описание compose и конфигов, которые после миграции живут на контейнере 103.
Каталог: /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:- Vaultwarden description: Менеджер паролей (Bitwarden-совместимый) icon: vaultwarden.png href: https://vault.katykhin.ru target: _blank(При использовании только LAN по IP укажите
href: http://192.168.1.103:8280. Иконка: в документации Homepage или локальный файл в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).
Команды:
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 (сервис перенесён на контейнер 103)
Каталог: /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 (веб) |
| 8088 | Log-dashboard |
| 8765 | VPN Route Check (host) |
Логи и ротация
- NPM: логи в
/opt/docker/nginx-proxy/data/logs/.- Logrotate:
/etc/logrotate.d/npm-nginx.conf— все*.logв каталоге; ротация daily,size 100M,rotate 5,compress,copytruncate(≈30 дней / ~512 MB). Старый конфигnpm-accessпереименован вnpm-access.disabled.
- Logrotate:
- AdGuard: данные и логи в
data/work/иdata/conf/(~85 MB). Хранение логов запросов и статистики ограничено 14 днями: вAdGuardHome.yamlзаданыquerylog.interval = 336hиstatistics.interval = 336h. - Базовая политика LXC: системные логи контейнера ротируются по
/etc/logrotate.d/homelab-lxc.conf— 14 дней, 50 MB, 5 архивов. Подробнее: Logrotate — базовая политика homelab. - Certbot:
/etc/logrotate.d/certbot— ротация логов letsencrypt (weekly, 12 копий).
Запуск и порядок поднятия
- Создать сеть (если ещё нет):
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). - 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_*) по размеру или по дням — настроено вnpm-nginx.conf(30 дней / ~512 MB). - Логи AdGuard: Ограничить хранение логов запросов/статистики — настроено в
AdGuardHome.yaml(querylog.interval = 336h,statistics.interval = 336h≈ 14 дней). - 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/vpn-route-check— ~0.1 MB (скрипты и конфиг).
-/etc/letsencrypt— ~0.5 MB (структура сертификатов, live/archive).
-/root/.secrets/certbotи/etc/letsencrypt/renewal-hooks/deploy/— секреты и deploy-hook’и.
Эти размеры небольшие сейчас, но могут расти за счёт логов и числа доменов — учитывать при выборе стратегии бэкапа.
Связь с другими документами
- Архитектура и подключение — таблица контейнеров, домены, схема сети.
- Контейнер 103 (Gitea, Vaultwarden, Homepage, Wallos) — Gitea, Vaultwarden, CouchDB, а также перенесённые сюда Homepage и Wallos.
- Выпуск сертификата Let's Encrypt (DNS-01) — certbot, Beget API, интеграция с NPM.
- Роутер Netcraze Speedster — VPN и telnet, используемые vpn-route-check.