265 lines
18 KiB
Markdown
265 lines
18 KiB
Markdown
# Контейнер 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 (из [архитектуры](../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 (через домен):** https://adguard.katykhin.ru (через NPM, сертификат Let's Encrypt), пользователь `kerrad`, пароль `waccEk-fyqbux-rarja3`. Прямой доступ по порту 3000 больше не используется.
|
||
- **Nginx Proxy Manager:** http://192.168.1.100:81, имя `Kerrad`, email `j3tears100@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 и т.д.) копируют `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), 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).
|
||
|
||
**Команды:**
|
||
```bash
|
||
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`:
|
||
|
||
```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 (сервис перенесён на контейнер 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).
|
||
|
||
**Команды:**
|
||
```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 (веб) |
|
||
| 8088 | Log-dashboard |
|
||
| 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 (ограничение по времени/размеру).
|
||
|
||
---
|
||
|
||
## Запуск и порядок поднятия
|
||
|
||
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. VPN Route Check: `cd /opt/docker/vpn-route-check && docker compose up -d`.
|
||
5. 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/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, Homepage, Wallos)](container-103.md) — Gitea, Vaultwarden, CouchDB, а также перенесённые сюда Homepage и Wallos.
|
||
- [Выпуск сертификата 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.
|