Refactor README, architecture, and backup documentation to emphasize the use of Vaultwarden for credential management across various services. Update scripts for Nextcloud, Gitea, Paperless, and others to reference Vaultwarden for sensitive information. Remove outdated references to previous backup strategies and ensure clarity on credential retrieval processes. This improves security practices and streamlines backup operations.
276 lines
19 KiB
Markdown
276 lines
19 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`. Пароль — в Vaultwarden (объект **CT_100_ROOT_PASSWORD**).
|
||
- **AdGuard Home (через домен):** https://adguard.katykhin.ru (через NPM, сертификат Let's Encrypt). Пользователь и пароль — в Vaultwarden (объект **ADGUARD**). Прямой доступ по порту 3000 больше не используется.
|
||
- **Nginx Proxy Manager:** http://192.168.1.100:81. Имя, email и пароль — в Vaultwarden (объект **NPM_ADMIN**).
|
||
|
||
---
|
||
|
||
## Сервисы (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` (генерируется из Vaultwarden скриптом `deploy-beget-credentials.sh` с хоста Proxmox).
|
||
- 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)](../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.
|
||
|
||
**Секреты:** `ROUTER_TELNET_HOST`, `ROUTER_TELNET_USER`, `ROUTER_TELNET_PASSWORD` берутся из Vaultwarden (объект **localhost**). Деплой — единым скриптом на Proxmox:
|
||
|
||
```bash
|
||
/root/scripts/deploy-vpn-route-check.sh
|
||
```
|
||
|
||
Скрипт: разблокирует bw, получает креды из Vaultwarden, атомарно пишет `.env` в CT 100, запускает `docker compose up -d`. Режим проверки без записи: `--dry-run`. Шаблон compose: `scripts/vpn-route-check/docker-compose.yml`.
|
||
|
||
**Том:** volume `vpn-route-check-data` → `/data` (в контейнере).
|
||
|
||
**Команды:**
|
||
```bash
|
||
# Деплой (с хоста Proxmox)
|
||
/root/scripts/deploy-vpn-route-check.sh
|
||
|
||
# Логи
|
||
pct exec 100 -- 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`.
|
||
- **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](../maintenance/logrotate/README.md).
|
||
- **Certbot:** `/etc/logrotate.d/certbot` — ротация логов letsencrypt (weekly, 12 копий).
|
||
|
||
---
|
||
|
||
## Запуск и порядок поднятия
|
||
|
||
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: `/root/scripts/deploy-vpn-route-check.sh` (с хоста Proxmox).
|
||
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:** Креды роутера в `.env` (генерируется из Vaultwarden скриптом `deploy-vpn-route-check.sh`). Файл `.env` не коммитить.
|
||
3. **AdGuard на 3000:** Веб-интерфейс доступен по порту 3000 на хосте. Доступ из LAN; при необходимости закрыть фаерволом снаружи или использовать только через NPM (proxy).
|
||
4. **NPM на 81:** Админка NPM по порту 81. Убедиться, что с интернета доступ только через VPN или не пробрасывать 81 наружу.
|
||
5. **Логи NPM:** Часть логов (fallback_*) не ротируется — возможен рост и заполнение диска (см. TODO).
|
||
|
||
---
|
||
|
||
## TODO по контейнеру 100
|
||
|
||
- [x] **Логи NPM:** Добавить в logrotate ротацию для `fallback_http_access.log`, `fallback_http_error.log` (и при необходимости других fallback_*) по размеру или по дням — настроено в `npm-nginx.conf` (30 дней / ~512 MB).
|
||
- [x] **Логи AdGuard:** Ограничить хранение логов запросов/статистики — настроено в `AdGuardHome.yaml` (`querylog.interval = 336h`, `statistics.interval = 336h` ≈ 14 дней).
|
||
- [x] **VPN Route Check:** Секреты из Vaultwarden (объект localhost), деплой через `deploy-vpn-route-check.sh`.
|
||
- [ ] **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.
|