Compare commits

...

No commits in common. "ca183215eee225b7aa35ed4a73b91f0653273b30" and "7f06bc25c7b6c34f88d377e88290f3effa18f26a" have entirely different histories.

19 changed files with 4894 additions and 205 deletions

108
README.md
View File

@ -1,55 +1,55 @@
# Домашний сервер Olimp
Документация по инфраструктуре домашнего сервера, работающего под управлением Proxmox VE, с набором LXC-контейнеров и виртуальных машин. Основная цель — создание независимой мультимедийной платформы с доступом из внешней сети через домен `zailon.ru`.
**Ansible-репозиторий** обеспечивает автоматизированное развертывание и обслуживание всех сервисов. Вся конфигурация описана в коде и может быть воспроизведена за несколько команд.
## 📖 Содержание
### Железо и гипервизор
- [Железо](docs/01-hardware.md)
- [Гипервизор Proxmox](docs/02-hypervisor.md)
- [Виртуальные машины и LXC](docs/03-vms-lxcs.md)
### Сеть и доступ
- [Сеть и доступ](docs/04-network.md)
- [OlimpVPN — внешний VPN-сервер](docs/04b-olimpvpn.md)
- [Проксирование и SSL (NPM)](docs/07-proxy-ssl.md)
### Сервисы и данные
- [Samba файловые шары](docs/05-samba.md)
- [Сервисы и порты](docs/06-services.md) *(в разработке)*
- [Мониторинг и логирование](docs/08-monitoring.md)
### Управление конфигурацией (Ansible)
- [Общее описание репозитория](docs/09-ansible-overview.md)
- [Переменные и окружение](docs/09-ansible-variables.md)
- [Плейбуки и запуск](docs/09-ansible-playbooks.md)
- [Роли (roles)](docs/09-ansible-roles.md)
- [Архивные роли](docs/09-ansible-archive-roles.md)
- [Инвентарь](docs/09-ansible-inventory.md)
- [Защищённые данные (vault)](docs/09-ansible-vault.md)
### Эксплуатация
- [Безопасность](docs/10-security.md)
- [Резервное копирование](docs/11-backup.md)
- [Решение проблем](docs/12-troubleshooting.md)
- [Плановое обслуживание](docs/13-maintenance.md)
---
## 🚀 Краткий обзор
- **Гипервизор**: Proxmox VE 9.0 на Intel Core i7-8700, 12 потоков, 32 ГБ ОЗУ.
- **Хранилище**: RAID6 (4×8 ТБ) через LSI MegaRAID 9260-8i, логические тома для ВМ и LXC.
- **Сеть**: локальная подсеть 192.168.1.0/24, VPN-подсеть 192.168.45.0/24 (OpenVPN).
- **Домен**: zailon.ru → внешний IP 188.73.191.202.
- **Внешний VPN**: OlimpVPN (VLESS + Reality) на VPS 2.27.50.20 (Финляндия) — обход блокировок.
- **Основные сервисы**: Jellyfin, Immich, Nextcloud, Bitwarden, GitLab, Grafana и др.
- **Автоматизация**: Ansible, все роли используют Docker Compose, шаблоны Jinja2, обработчики, переменные разделены на `group_vars/all.yml` и `vault.yml`.
---
## 📝 Статус
# Домашний сервер Olimp
Документация по инфраструктуре домашнего сервера, работающего под управлением Proxmox VE, с набором LXC-контейнеров и виртуальных машин. Основная цель — создание независимой мультимедийной платформы с доступом из внешней сети через домен `zailon.ru`.
**Ansible-репозиторий** обеспечивает автоматизированное развертывание и обслуживание всех сервисов. Вся конфигурация описана в коде и может быть воспроизведена за несколько команд.
## 📖 Содержание
### Железо и гипервизор
- [Железо](docs/01-hardware.md)
- [Гипервизор Proxmox](docs/02-hypervisor.md)
- [Виртуальные машины и LXC](docs/03-vms-lxcs.md)
### Сеть и доступ
- [Сеть и доступ](docs/04-network.md)
- [OlimpVPN — внешний VPN-сервер](docs/04b-olimpvpn.md)
- [Проксирование и SSL (NPM)](docs/07-proxy-ssl.md)
### Сервисы и данные
- [Samba файловые шары](docs/05-samba.md)
- [Сервисы и порты](docs/06-services.md) *(в разработке)*
- [Мониторинг и логирование](docs/08-monitoring.md)
### Управление конфигурацией (Ansible)
- [Общее описание репозитория](docs/09-ansible-overview.md)
- [Переменные и окружение](docs/09-ansible-variables.md)
- [Плейбуки и запуск](docs/09-ansible-playbooks.md)
- [Роли (roles)](docs/09-ansible-roles.md)
- [Архивные роли](docs/09-ansible-archive-roles.md)
- [Инвентарь](docs/09-ansible-inventory.md)
- [Защищённые данные (vault)](docs/09-ansible-vault.md)
### Эксплуатация
- [Безопасность](docs/10-security.md)
- [Резервное копирование](docs/11-backup.md)
- [Решение проблем](docs/12-troubleshooting.md)
- [Плановое обслуживание](docs/13-maintenance.md)
---
## 🚀 Краткий обзор
- **Гипервизор**: Proxmox VE 9.0 на Intel Core i7-8700, 12 потоков, 32 ГБ ОЗУ.
- **Хранилище**: RAID6 (4×8 ТБ) через LSI MegaRAID 9260-8i, логические тома для ВМ и LXC.
- **Сеть**: локальная подсеть 192.168.1.0/24, VPN-подсеть 192.168.45.0/24 (OpenVPN).
- **Домен**: zailon.ru → внешний IP 188.73.191.202.
- **Внешний VPN**: OlimpVPN (VLESS + Reality) на VPS 2.27.50.20 (Финляндия) — обход блокировок.
- **Основные сервисы**: Jellyfin, Immich, Nextcloud, Bitwarden, GitLab, Grafana и др.
- **Автоматизация**: Ansible, все роли используют Docker Compose, шаблоны Jinja2, обработчики, переменные разделены на `group_vars/all.yml` и `vault.yml`.
---
## 📝 Статус
Документация актуальна на 25 марта 2026 года. Регулярно обновляется по мере изменений в инфраструктуре.

View File

@ -1,108 +1,108 @@
# 01. 🖥️ Железо
## 💾 Сервер (Proxmox Host)
| Параметр | Значение |
|---------------------|--------------------------------------------------------------------------|
| **Модель** | MSI H310M PRO-VD (MS-7B33) |
| **Процессор** | Intel Core i7-8700, 6 ядер / 12 потоков, 3.20 ГГц (макс. 4.60 ГГц) |
| **Оперативная память** | 2×16 ГБ DDR4, 2667 МГц (Samsung) |
| **Системные диски (Proxmox)** | 2× Intel SSDSC2KB240G8 (240 ГБ, SATA) в зеркале (ZFS) |
| **Диск для vmsystem (LVM)** | Intel SSDSC2KB960G8L (960 ГБ, SATA) используется для быстрых данных ВМ |
| **Дисковый массив** | LSI MegaRAID SAS 9260-8i, RAID6 (4×8 ТБ) → полезный объём ~14.55 ТБ |
| **Диски массива** | 4× Seagate ST8000NM0075 (8 ТБ, SAS, HDD), прошивка E003 |
| **Сетевые интерфейсы** | Realtek RTL8111/8168/8211/8411 (enp2s0), подключён к vmbr0 |
| **Корпус** | Jonsbo N4 NAS, Micro-ATX, размеры 300×286×228 мм |
| **Блок питания** | Formula AC SX-400, SFX, 400 Вт, 80 мм вентилятор, защита от перегрузки и КЗ |
| **Дополнительно** | 🎬 Видео Intel UHD Graphics 630 (для возможного аппаратного декодирования) |
## 🗄️ Схема хранения данных
```mermaid
graph TD
subgraph "Физические диски"
SSD240_1[Intel SSD 240GB<br/>sdc]
SSD240_2[Intel SSD 240GB<br/>sdd]
SSD960[Intel SSD 960GB<br/>sdb]
RAID6[RAID6 массив 14.55TB<br/>4× Seagate 8TB]
end
subgraph "Логические тома"
ZFS_mirror[ZFS mirror<br/>Proxmox система]
LVM_vmsystem[LVM thin<br/>vmsystem]
LVM_storage[LVM thin<br/>storage]
end
SSD240_1 --> ZFS_mirror
SSD240_2 --> ZFS_mirror
SSD960 --> LVM_vmsystem
RAID6 --> LVM_storage
subgraph "Использование"
ZFS_mirror --> Proxmox[Proxmox VE]
LVM_vmsystem --> VM[Системные диски ВМ/LXC]
LVM_storage --> Data[Медиа, игры, книги]
end
```
## 🔍 Подробно о хранилище
### 🛡️ RAID-контроллер
- **Модель**: LSI MegaRAID SAS 9260-8i
- **Прошивка**: FW Package 12.13.0-0154, FW Version 2.130.383-2315
- **Диски**: 4× Seagate ST8000NM0075 (8 ТБ, SAS, HDD) с прошивкой E003
- **Конфигурация**: RAID6, один виртуальный диск 14.553 ТБ
### 📦 Логические тома LVM
На массиве созданы два LVM-тома (thin pool):
- `storage` для больших данных (медиа, книги, игры)
- `vmsystem` для системных дисков ВМ и LXC
### 💿 Системные SSD (ZFS mirror)
- Два диска Intel SSDSC2KB240G8 (240 ГБ, SATA) объединены в ZFS-зеркало:
- `/dev/sdc` серийный номер `BTYF90350E69240AGN`
- `/dev/sdd` серийный номер `BTYF90350FC6240AGN`
- Используются для установки Proxmox и системных файлов гипервизора.
### 🚀 Диск для vmsystem (LVM)
- Intel SSDSC2KB960G8L (960 ГБ, SATA), серийный номер `PHYF121102FC960CGN`
- Используется как отдельный LVM-том для размещения дисков ВМ и LXC, требующих быстрой работы (системные диски, базы данных).
## 🧩 Материнская плата и BIOS
- **Производитель**: Micro-Star International Co., Ltd.
- **Модель**: H310M PRO-VD (MS-7B33)
- **BIOS**: American Megatrends Inc., версия 1.E0, дата выпуска 07/10/2024
## ⚡ Блок питания
- **Модель**: Formula AC SX-400
- **Форм-фактор**: SFX
- **Мощность**: 400 Вт
- **Вентилятор**: 80 мм
- **Защиты**: OVP, OCP, SCP (защита от повышения напряжения и короткого замыкания)
- **Разъёмы**: 20+4 pin (основной), 3× SATA, 1× Molex (4-pin), без питания для видеокарты
## 🖥️ Корпус
- **Тип**: Jonsbo N4 NAS (Micro-ATX)
- **Габариты**: 300×286×228 мм
- **Вес**: 4.9 кг
- **Отсеки**: 2× 2.5"
- **Слоты расширения**: 4
- **Макс. высота кулера CPU**: 70 мм
- **Макс. длина видеокарты**: 230 мм
## ⚙️ Энергопотребление и охлаждение
- Блок питания обеспечивает достаточную мощность для текущей конфигурации (без дискретной видеокарты).
- Корпус имеет один вентилятор на выдув, плюс активное охлаждение процессора и блока питания.
## 📈 Производительность
- RAID6 обеспечивает отказоустойчивость (можно потерять до двух дисков).
- Скорость чтения/записи ограничена интерфейсом SAS-6G и производительностью HDD.
- Для задач, требующих быстрого доступа (базы данных), используется отдельный SSD (960 ГБ).
---
**Связанные разделы:**
- [Гипервизор Proxmox](02-hypervisor.md)
- [Виртуальные машины и LXC](03-vms-lxcs.md)
# 01. 🖥️ Железо
## 💾 Сервер (Proxmox Host)
| Параметр | Значение |
|---------------------|--------------------------------------------------------------------------|
| **Модель** | MSI H310M PRO-VD (MS-7B33) |
| **Процессор** | Intel Core i7-8700, 6 ядер / 12 потоков, 3.20 ГГц (макс. 4.60 ГГц) |
| **Оперативная память** | 2×16 ГБ DDR4, 2667 МГц (Samsung) |
| **Системные диски (Proxmox)** | 2× Intel SSDSC2KB240G8 (240 ГБ, SATA) в зеркале (ZFS) |
| **Диск для vmsystem (LVM)** | Intel SSDSC2KB960G8L (960 ГБ, SATA) используется для быстрых данных ВМ |
| **Дисковый массив** | LSI MegaRAID SAS 9260-8i, RAID6 (4×8 ТБ) → полезный объём ~14.55 ТБ |
| **Диски массива** | 4× Seagate ST8000NM0075 (8 ТБ, SAS, HDD), прошивка E003 |
| **Сетевые интерфейсы** | Realtek RTL8111/8168/8211/8411 (enp2s0), подключён к vmbr0 |
| **Корпус** | Jonsbo N4 NAS, Micro-ATX, размеры 300×286×228 мм |
| **Блок питания** | Formula AC SX-400, SFX, 400 Вт, 80 мм вентилятор, защита от перегрузки и КЗ |
| **Дополнительно** | 🎬 Видео Intel UHD Graphics 630 (для возможного аппаратного декодирования) |
## 🗄️ Схема хранения данных
```mermaid
graph TD
subgraph "Физические диски"
SSD240_1[Intel SSD 240GB<br/>sdc]
SSD240_2[Intel SSD 240GB<br/>sdd]
SSD960[Intel SSD 960GB<br/>sdb]
RAID6[RAID6 массив 14.55TB<br/>4× Seagate 8TB]
end
subgraph "Логические тома"
ZFS_mirror[ZFS mirror<br/>Proxmox система]
LVM_vmsystem[LVM thin<br/>vmsystem]
LVM_storage[LVM thin<br/>storage]
end
SSD240_1 --> ZFS_mirror
SSD240_2 --> ZFS_mirror
SSD960 --> LVM_vmsystem
RAID6 --> LVM_storage
subgraph "Использование"
ZFS_mirror --> Proxmox[Proxmox VE]
LVM_vmsystem --> VM[Системные диски ВМ/LXC]
LVM_storage --> Data[Медиа, игры, книги]
end
```
## 🔍 Подробно о хранилище
### 🛡️ RAID-контроллер
- **Модель**: LSI MegaRAID SAS 9260-8i
- **Прошивка**: FW Package 12.13.0-0154, FW Version 2.130.383-2315
- **Диски**: 4× Seagate ST8000NM0075 (8 ТБ, SAS, HDD) с прошивкой E003
- **Конфигурация**: RAID6, один виртуальный диск 14.553 ТБ
### 📦 Логические тома LVM
На массиве созданы два LVM-тома (thin pool):
- `storage` для больших данных (медиа, книги, игры)
- `vmsystem` для системных дисков ВМ и LXC
### 💿 Системные SSD (ZFS mirror)
- Два диска Intel SSDSC2KB240G8 (240 ГБ, SATA) объединены в ZFS-зеркало:
- `/dev/sdc` серийный номер `BTYF90350E69240AGN`
- `/dev/sdd` серийный номер `BTYF90350FC6240AGN`
- Используются для установки Proxmox и системных файлов гипервизора.
### 🚀 Диск для vmsystem (LVM)
- Intel SSDSC2KB960G8L (960 ГБ, SATA), серийный номер `PHYF121102FC960CGN`
- Используется как отдельный LVM-том для размещения дисков ВМ и LXC, требующих быстрой работы (системные диски, базы данных).
## 🧩 Материнская плата и BIOS
- **Производитель**: Micro-Star International Co., Ltd.
- **Модель**: H310M PRO-VD (MS-7B33)
- **BIOS**: American Megatrends Inc., версия 1.E0, дата выпуска 07/10/2024
## ⚡ Блок питания
- **Модель**: Formula AC SX-400
- **Форм-фактор**: SFX
- **Мощность**: 400 Вт
- **Вентилятор**: 80 мм
- **Защиты**: OVP, OCP, SCP (защита от повышения напряжения и короткого замыкания)
- **Разъёмы**: 20+4 pin (основной), 3× SATA, 1× Molex (4-pin), без питания для видеокарты
## 🖥️ Корпус
- **Тип**: Jonsbo N4 NAS (Micro-ATX)
- **Габариты**: 300×286×228 мм
- **Вес**: 4.9 кг
- **Отсеки**: 2× 2.5"
- **Слоты расширения**: 4
- **Макс. высота кулера CPU**: 70 мм
- **Макс. длина видеокарты**: 230 мм
## ⚙️ Энергопотребление и охлаждение
- Блок питания обеспечивает достаточную мощность для текущей конфигурации (без дискретной видеокарты).
- Корпус имеет один вентилятор на выдув, плюс активное охлаждение процессора и блока питания.
## 📈 Производительность
- RAID6 обеспечивает отказоустойчивость (можно потерять до двух дисков).
- Скорость чтения/записи ограничена интерфейсом SAS-6G и производительностью HDD.
- Для задач, требующих быстрого доступа (базы данных), используется отдельный SSD (960 ГБ).
---
**Связанные разделы:**
- [Гипервизор Proxmox](02-hypervisor.md)
- [Виртуальные машины и LXC](03-vms-lxcs.md)
- [Резервное копирование](11-backup.md)

View File

@ -1,45 +1,45 @@
# 02. Гипервизор Proxmox
## Версия и окружение
| Параметр | Значение |
|--------------------|----------------------------------------|
| **Версия Proxmox** | pve-manager 9.0.11 |
| **Ядро** | Linux 6.14.11-4-pve |
| **Архитектура** | x86_64 |
| **Хостнейм** | Olimp |
| **IP-адрес** | 192.168.1.200 |
## Хранилища
| Имя | Тип | Содержимое | Расположение |
|-----------|-----------|---------------------------------|----------------------------------|
| `local` | Directory | ISO, шаблоны, бэкапы | `/var/lib/vz` (на системном SSD) |
| `storage` | LVM-thin | Диски ВМ и LXC для больших данных | RAID6 массив (14.55 ТБ) |
| `vmsystem`| LVM-thin | Диски ВМ и LXC для систем | SSD 894.3 ГБ |
## Сеть
- Мост: `vmbr0` с IP 192.168.1.200/24, физический интерфейс `enp2s0` (Realtek)
- Все виртуальные машины и LXC подключаются к `vmbr0`, получая адреса из подсети 192.168.1.0/24
- Для управления используется SSH (ключи) и веб-интерфейс на порту 8006
## Виртуализация
- LXC-контейнеры (привилегированные/непривилегированные) — большинство сервисов
- Полноценные ВМ (KVM) — Nextcloud (205), VPN (213), некоторые резервные копии
- Поддержка аппаратной виртуализации (VT-x) включена
## Мониторинг гипервизора
- На самом хосте Olimp запущен **node_exporter** (порт 9100) для сбора метрик в VictoriaMetrics
- Используется **Proxmox VE Exporter** для мониторинга состояния виртуальных машин и хранилищ
- Логи отправляются через **Promtail** (если настроен) в Loki
---
**Связанные разделы:**
- [Железо](01-hardware.md)
- [Виртуальные машины и LXC](03-vms-lxcs.md)
- [Сеть](04-network.md)
# 02. Гипервизор Proxmox
## Версия и окружение
| Параметр | Значение |
|--------------------|----------------------------------------|
| **Версия Proxmox** | pve-manager 9.0.11 |
| **Ядро** | Linux 6.14.11-4-pve |
| **Архитектура** | x86_64 |
| **Хостнейм** | Olimp |
| **IP-адрес** | 192.168.1.200 |
## Хранилища
| Имя | Тип | Содержимое | Расположение |
|-----------|-----------|---------------------------------|----------------------------------|
| `local` | Directory | ISO, шаблоны, бэкапы | `/var/lib/vz` (на системном SSD) |
| `storage` | LVM-thin | Диски ВМ и LXC для больших данных | RAID6 массив (14.55 ТБ) |
| `vmsystem`| LVM-thin | Диски ВМ и LXC для систем | SSD 894.3 ГБ |
## Сеть
- Мост: `vmbr0` с IP 192.168.1.200/24, физический интерфейс `enp2s0` (Realtek)
- Все виртуальные машины и LXC подключаются к `vmbr0`, получая адреса из подсети 192.168.1.0/24
- Для управления используется SSH (ключи) и веб-интерфейс на порту 8006
## Виртуализация
- LXC-контейнеры (привилегированные/непривилегированные) — большинство сервисов
- Полноценные ВМ (KVM) — Nextcloud (205), VPN (213), некоторые резервные копии
- Поддержка аппаратной виртуализации (VT-x) включена
## Мониторинг гипервизора
- На самом хосте Olimp запущен **node_exporter** (порт 9100) для сбора метрик в VictoriaMetrics
- Используется **Proxmox VE Exporter** для мониторинга состояния виртуальных машин и хранилищ
- Логи отправляются через **Promtail** (если настроен) в Loki
---
**Связанные разделы:**
- [Железо](01-hardware.md)
- [Виртуальные машины и LXC](03-vms-lxcs.md)
- [Сеть](04-network.md)
- [Мониторинг](07-monitoring.md)

60
docs/03-vms-lxcs.md Normal file
View File

@ -0,0 +1,60 @@
# 03. Виртуальные машины и LXC
## Общая таблица
| VMID | Имя | Тип | IP-адрес | Роль | Статус |
|------|----------|--------|---------------|-------------------------------|----------|
| 201 | gateway | LXC | 192.168.1.201 | Nginx Proxy Manager, Heimdall | running |
| 202 | data | LXC | 192.168.1.202 | Bitwarden, Mealie, BookStack | running |
| 203 | media | LXC | 192.168.1.203 | Jellyfin, Audiobookshelf, Calibre-web, Ampache, Samba | running |
| 204 | photo | LXC | 192.168.1.204 | Immich | running |
| 205 | nextcloud| VM | 192.168.1.205 | Nextcloud (Debian 12) | running |
| 206 | talk | LXC | 192.168.1.206 | Snikket (XMPP), Mumble, TeamSpeak | running |
| 207 | games | LXC | 192.168.1.207 | Valheim, другие игры, Samba | running |
| 208 | manage | LXC | 192.168.1.208 | MeshCentral, Grafana, Loki | running |
| 209 | git | LXC | 192.168.1.209 | GitLab CE | running |
| 210 | ansible | LXC | 192.168.1.210 | Управляющий хост Ansible | running |
| 211 | torrent | LXC | 192.168.1.211 | qBittorrent, TorrServer | running |
| 212 | game | VM | 192.168.1.212 | (остановлен) | stopped |
| 213 | vpn | VM | 192.168.1.213 | VPN-шлюз (заглушка) | running |
| 214 | mediatest| LXC | - | Тестовая среда | stopped |
| 228 | manage | LXC | - | (дубль, остановлен) | stopped |
| 232 | jellyfinbkp | LXC | - | Резервная копия Jellyfin | stopped |
| 234 | gameserverbkp | LXC | - | Резервная копия игр | stopped |
| 237 | gamebkp | LXC | - | Резервная копия игр | stopped |
| 300 | TempUbuntu2404 | VM | - | Тестовая ВМ | stopped |
| 301 | tempubuntu2404priv | VM | - | Тестовая ВМ | stopped |
## Распределение ресурсов
### Пример для основных контейнеров
| Имя | CPU (ядер) | RAM (МБ) | Диск (основной том) |
|----------|------------|----------|--------------------------|
| gateway | 2 | 2048 | vmsystem (8 ГБ) |
| data | 2 | 4096 | storage + vmsystem |
| media | 4 | 8192 | storage (8.6 ТБ) |
| photo | 2 | 4096 | storage (200 ГБ) |
| talk | 2 | 2048 | storage (6 ГБ) |
| games | 4 | 8192 | storage (3.9 ТБ) |
| manage | 2 | 2048 | storage + vmsystem |
| git | 4 | 8192 | storage + vmsystem |
| ansible | 1 | 512 | vmsystem (5 ГБ) |
| torrent | 2 | 2048 | storage + vmsystem |
## Подробности о хранилищах для ВМ
### storage (RAID6)
- Используется для больших данных: медиа, книги, базы данных некоторых сервисов
- Тома для ВМ/LXC: `vm-203-disk-0` (8.6 ТБ), `vm-207-disk-0` (3.9 ТБ), `vm-203-disk-2` (530 ГБ) и др.
### vmsystem (SSD 894 ГБ)
- Используется для системных дисков (ОС) и баз данных, требующих быстрого доступа
- Тома для ВМ/LXC: `vm-205-disk-0` (10 ГБ), `vm-205-disk-1` (150 ГБ) и др.
---
**Связанные разделы:**
- [Железо](01-hardware.md)
- [Гипервизор](02-hypervisor.md)
- [Сервисы и порты](05-services.md)

212
docs/04-network.md Normal file
View File

@ -0,0 +1,212 @@
# 04. Сеть и доступ
## Топология
Инфраструктура объединяет устройства в локальной подсети `192.168.1.0/24`. Доступ из внешней сети осуществляется через маршрутизатор TP-Link с белым IP-адресом `188.73.191.202`, на который делегирован домен `zailon.ru`. Для удалённого подключения к внутренним ресурсам используется OpenVPN и OlimpVPN (VLESS).
```mermaid
graph TD
Internet(Интернет) --> Router(Роутер TP-Link)
Router --> LAN(Локальная сеть 192.168.1.0/24)
Router -->|Внешний IP 188.73.191.202| Domain(zailon.ru)
LAN --> Proxmox(Proxmox Host 192.168.1.200)
Proxmox --> VM1(LXC / ВМ 201-213)
Router -->|VPN| OlimpVPN[OlimpVPN 2.27.50.20]
OlimpVPN -->|VLESS:2054| LAN
```
*Все виртуальные машины и контейнеры подключены к локальной сети через мост vmbr0.*
---
## Маршрутизатор (TP-Link)
- **Модель**: TP-Link (предположительно Archer C6/A6 или аналогичный)
- **Локальный IP**: 192.168.1.1
- **Внешний IP**: 188.73.191.202 (статический)
### Перенаправление портов (Port Forwarding)
| Имя сервиса | Внешний порт | Внутренний порт | IP устройства | Протокол | Назначение |
|-------------|--------------|-----------------|---------------|----------|------------|
| snikket | 3478 | 3478 | 192.168.1.206 | Все | XMPP / STUN |
| snikket | 50000-50100 | 50000-50100 | 192.168.1.206 | UDP | XMPP медиа |
| snikket | 5222 | 5222 | 192.168.1.206 | TCP | XMPP клиенты |
| snikket | 5349 | 5349 | 192.168.1.206 | TCP | XMPP TLS |
| Enshrouded | 15636 | 15636 | 192.168.1.212 | Все | Игровой сервер |
| Mumble | 45131 | 45131 | 192.168.1.206 | Все | Голосовой чат |
| virsing | 27015-27016 | 27015-27016 | 192.168.1.207 | Все | Игровой сервер |
| Virsing | 9876-9877 | 9876-9877 | 192.168.1.207 | Все | Игровой сервер |
| SOTH | 9700 | 9700 | 192.168.1.207 | UDP | Игровой сервер |
| SOTH | 8766 | 8766 | 192.168.1.207 | UDP | Игровой сервер |
| valheim | 2456-2458 | 2456-2458 | 192.168.1.207 | Все | Valheim |
| HTTPS | 443 | 443 | 192.168.1.201 | Все | Nginx Proxy Manager |
| HTTP | 80 | 80 | 192.168.1.201 | Все | Nginx Proxy Manager (редирект) |
> **Примечание**: некоторые порты (например, 15636, 27015-27016, 9876-9877) ведут на остановленные ВМ (212, 207) и могут быть закрыты.
---
## VPN-сервисы
### OpenVPN (домашний)
На роутере включён OpenVPN-сервер с настройками:
- **Тип сервиса**: UDP
- **Порт**: 1194
- **VPN-подсеть**: 192.168.45.0/24
- **Клиентский доступ**: только домашняя сеть (192.168.1.0/24)
Используется для удалённого подключения к домашней сети с мобильных устройств и ноутбуков.
### OlimpVPN (VLESS, внешний сервер)
| Параметр | Значение |
|----------|----------|
| **Сервер** | 2.27.50.20 (Финляндия) |
| **Домен** | charon.zailon.ru |
| **Протокол** | VLESS + Reality + XHTTP |
| **Порт** | 2054 |
| **Панель управления** | https://charon.zailon.ru:45131/olimp-styx/ |
| **URI подписки** | /charon-cerberus/ |
#### Конфигурация inbound
```yaml
Название: OlimpVpn
Протокол: VLESS
Порт: 2054
Транспорт: XHTTP
Безопасность: Reality
Reality параметры:
Target: cloud.zailon.ru:443
SNI: cloud.zailon.ru
uTLS: chrome
Public Key: TOyddQCTdSpycmO20uiLOqMABuKabpwVhw57tWmvJws
Short IDs: 174fc0, 568a8044d80a, b211, ...
SpiderX: /
XHTTP параметры:
Path: /remote.php/dav/upload
Mode: stream-one
Padding Bytes: 100-1000
```
#### Подключение клиентов
Формат ссылки VLESS:
```
vless://UUID@2.27.50.20:2054?type=xhttp&encryption=none&path=%2Fremote.php%2Fdav%2Fupload&security=reality&pbk=PUBLIC_KEY&fp=chrome&sni=cloud.zailon.ru&sid=SHORT_ID&sp=%2F#ClientName
```
Автоматическая подписка:
```
https://charon.zailon.ru:45131/charon-cerber/CLIENT_ID
```
> **Примечание**: подробная инструкция по установке и управлению — в [документации OlimpVPN](04b-olimpvpn.md).
---
## DNS
Домен `zailon.ru` делегирован на внешний IP `188.73.191.202`. Все поддомены `*.zailon.ru` также указывают на этот IP через записи типа A.
| Поддомен | Назначение | Целевой хост |
|----------|------------|--------------|
| `charon.zailon.ru` | Панель OlimpVPN | 2.27.50.20 (VPS) |
| `nc.zailon.ru` | Nextcloud | 188.73.191.202 → 192.168.1.201 |
| `cloud.zailon.ru` | Reality SNI / Nextcloud | 188.73.191.202 → 192.168.1.201 |
| `*.zailon.ru` | Wildcard для сервисов | 188.73.191.202 |
DNS-серверы:
- Внешние: стандартные провайдера (или публичные, например 8.8.8.8)
- Локально: системный resolver на каждом хосте (127.0.0.53)
---
## Локальная сеть
- **Подсеть**: 192.168.1.0/24
- **Шлюз**: 192.168.1.1 (роутер)
- **DHCP**: включён на роутере, диапазон раздачи 192.168.1.100192.168.1.200 (статические адреса для серверов заданы вручную)
- **Статические IP-адреса серверов**: см. раздел [Виртуальные машины и LXC](03-vms-lxcs.md)
### Ключевые хосты
| Хост | IP | Назначение |
|------|-----|------------|
| Роутер | 192.168.1.1 | Шлюз, DHCP, OpenVPN |
| NPM | 192.168.1.201 | Nginx Proxy Manager, SSL-терминация |
| Proxmox | 192.168.1.200 | Хост виртуализации |
| media (LXC) | 192.168.1.203 | Jellyfin, Samba, yt-dlp, xray-прокси |
| talk (LXC) | 192.168.1.206 | Snikket (XMPP), Mumble |
---
## Безопасность сети
- **Wi-Fi**: WPA2-PSK (рекомендуется обновление до WPA3)
- **Гостевая сеть**: отсутствует
- **VLAN**: не используются
- **Доступ к панели 3X-UI**:
- HTTPS + Let's Encrypt
- Секретный URI: `/olimp-styx/`
- Секретный subscription URI: `/charon-cerber/`
- Рекомендуется ограничить доступ по IP при возможности
### Fail2ban (опционально для 3X-UI)
```yaml
# В docker-compose.yml 3X-UI:
environment:
XUI_ENABLE_FAIL2BAN: "true"
XUI_FAIL2BAN_PORT: "45131"
XUI_FAIL2BAN_MAX_RETRY: "5"
XUI_FAIL2BAN_BAN_TIME: "3600"
```
---
## Мониторинг сети
- Сбор метрик через node_exporter (порт 9100) на всех хостах
- Логи роутера не собираются (ограниченные возможности TP-Link)
- Логи 3X-UI: `docker logs 3xui_app --tail 100 -f`
---
## Бэкапы конфигурации
### OlimpVPN (3X-UI)
Автоматические еженедельные бэкапы на Nextcloud:
- **Скрипт**: `/opt/3x-ui/backup.sh`
- **Cron**: `0 3 * * 0` (воскресенье, 03:00)
- **Хранилище**: `nc.zailon.ru/VPN_Backups/3x-ui/`
- **Состав**: база данных, сертификаты, docker-compose.yml
```bash
# Ручной бэкап
cd /opt/3x-ui
tar -czf backup_$(date +%Y%m%d).tar.gz db/ cert/ docker-compose.yml
# Восстановление
docker compose down
tar -xzf backup_*.tar.gz -C /opt/3x-ui/
docker compose up -d
```
> **Важно**: токены и пароли хранятся отдельно, не включаются в бэкап.
---
**Связанные разделы:**
- [Виртуальные машины и LXC](03-vms-lxcs.md)
- [OlimpVPN — полная документация](08-olimpvpn.md)
- [Сервисы и порты](06-services.md)
- [Проксирование и SSL (NPM)](07-proxy-ssl.md)
- [Безопасность](10-security.md)

414
docs/04b-olimpvpn.md Normal file
View File

@ -0,0 +1,414 @@
# OlimpVPN — внешний VPN-сервер
**Сервер**: 2.27.50.20 (Финляндия, VPS)
**Домен**: charon.zailon.ru
**Протокол**: VLESS + Reality + XHTTP
**Порт VPN**: 2054
**Панель управления**: https://charon.zailon.ru:45131/olimp-styx/
---
## 📋 Содержание
1. [Назначение](#назначение)
2. [Архитектура](#архитектура)
3. [Установка и настройка](#установка-и-настройка)
4. [Конфигурация Xray](#конфигурация-xray)
5. [Управление клиентами](#управление-клиентами)
6. [Бэкапы и восстановление](#бэкапы-и-восстановление)
7. [Мониторинг](#мониторинг)
8. [Решение проблем](#решение-проблем)
---
## Назначение
OlimpVPN — внешний VPN-сервер на базе 3X-UI (Xray-core), предназначенный для:
- **Обхода географических блокировок** (YouTube, стриминговые сервисы)
- **Защиты трафика** в ненадёжных сетях (общественный Wi-Fi, мобильный интернет)
- **Доступа к домашней инфраструктуре** через LXC-контейнер с прокси (media, 192.168.1.203)
**Отличие от домашнего OpenVPN:**
| Параметр | OpenVPN (домашний) | OlimpVPN (внешний) |
|----------|-------------------|-------------------|
| **Расположение** | 192.168.1.1 (роутер) | 2.27.50.20 (Финляндия) |
| **Назначение** | Доступ к домашней сети | Обход блокировок, анонимность |
| **Протокол** | OpenVPN (UDP 1194) | VLESS + Reality + XHTTP (TCP 2054) |
| **Маскировка** | Нет | Reality (маскировка под HTTPS) |
| **Клиенты** | Доступ к 192.168.1.0/24 | Доступ в интернет через VPS |
---
## Архитектура
```mermaid
graph LR
Client[Клиент] -->|VLESS:2054| OlimpVPN[OlimpVPN 2.27.50.20]
OlimpVPN -->|Reality| Target[cloud.zailon.ru:443]
OlimpVPN -->|Прокси| Internet[Интернет]
OlimpVPN -->|Xray-прокси| LXC[LXC media 192.168.1.203]
LXC -->|yt-dlp| YouTube[YouTube]
```
### Компоненты
| Компонент | Версия | Назначение |
|-----------|--------|------------|
| **3X-UI** | latest (Docker) | Панель управления Xray |
| **Xray-core** | 26.2.6+ | Ядро обработки трафика |
| **Docker** | latest | Контейнеризация 3X-UI |
| **Nginx** | системный | SSL для панели (Let's Encrypt) |
| **Certbot** | системный | Автообновление SSL |
### Сетевая схема
```mermaid
graph TD
subgraph "Внешний мир"
Internet[Интернет]
Cloudflare[Cloudflare]
end
subgraph "VPS Финляндия (2.27.50.20)"
Xray[Xray:2054]
Panel[3X-UI:45131]
Cert[Certbot:80/443]
end
subgraph "Домашняя сеть (192.168.1.0/24)"
LXC[LXC media: xray-прокси]
NPM[Nginx Proxy Manager]
NC[Nextcloud]
end
Client[Клиент VPN] -->|HTTPS| Xray
Client -->|HTTPS| Panel
Xray -->|Reality SNI| Cloudflare
Xray -->|Прокси| Internet
LXC -->|Xray-туннель| Xray
NPM -->|SSL| Panel
```
---
## Установка и настройка
### Требования
- VPS с Debian/Ubuntu (минимум 1 ядро, 512 МБ ОЗУ, 10 ГБ диск)
- Домен с A-записью на IP сервера
- Открытые порты: 80, 443, 2054, 45131
### 1. Установка Docker и 3X-UI
```bash
# Создаем директорию
mkdir -p /opt/3x-ui
cd /opt/3x-ui
# Создаем docker-compose.yml
cat > docker-compose.yml << 'EOF'
services:
3xui:
image: ghcr.io/mhsanaei/3x-ui:latest
container_name: 3xui_app
hostname: OlimpVPN
volumes:
- $PWD/db/:/etc/x-ui/
- $PWD/cert/:/root/cert/
environment:
XRAY_VMESS_AEAD_FORCED: "false"
XUI_ENABLE_FAIL2BAN: "true"
tty: true
network_mode: host
restart: unless-stopped
EOF
# Запускаем
docker compose up -d
```
### 2. Настройка SSL сертификата
```bash
# Устанавливаем certbot
apt update && apt install certbot python3-certbot-nginx -y
# Получаем сертификат
certbot --nginx -d charon.zailon.ru \
--email zailon@bk.ru \
--agree-tos \
--non-interactive
# Копируем в папку 3X-UI
mkdir -p /opt/3x-ui/cert
cp /etc/letsencrypt/live/charon.zailon.ru/fullchain.pem /opt/3x-ui/cert/public.crt
cp /etc/letsencrypt/live/charon.zailon.ru/privkey.pem /opt/3x-ui/cert/private.key
chmod 644 /opt/3x-ui/cert/public.crt
chmod 600 /opt/3x-ui/cert/private.key
# Перезапускаем контейнер
docker restart 3xui_app
```
### 3. Настройка панели 3X-UI
1. Откройте: `https://charon.zailon.ru:45131/olimp-styx/`
2. Логин/пароль по умолчанию: `admin/admin`
3. **Смените пароль немедленно!**
#### Основные настройки панели
| Параметр | Значение |
|----------|----------|
| Домен панели | charon.zailon.ru |
| Порт панели | 45131 |
| Корневой путь URL | /olimp-styx/ |
| Продолжительность сессии | 360 минут |
| URI подписки | /charon-cerber/ |
#### Настройка сертификатов
| Параметр | Значение |
|----------|----------|
| Путь к публичному ключу | /root/cert/public.crt |
| Путь к приватному ключу | /root/cert/private.key |
---
## Конфигурация Xray
### Inbound настройки (ID: 1)
| Параметр | Значение |
|----------|----------|
| Название | OlimpVpn |
| Протокол | VLESS |
| Порт | 2054 |
| Транспорт | XHTTP |
| Безопасность | Reality |
### Reality параметры
```yaml
Target: cloud.zailon.ru:443
SNI: cloud.zailon.ru
uTLS: chrome
Public Key: TOyddQCTdSpycmO20uiLOqMABuKabpwVhw57tWmvJws
Private Key: uLdWyWif7JrihRy49jTJmBMasEWyElsIXiuQkxwQVm8
Short IDs:
- 174fc0
- 568a8044d80a
- b211
- 2fbcaed79
- 1b4d7dd
- 04c250ad0b
- 4260c819008e7
SpiderX: /
```
### XHTTP параметры
```yaml
Path: /remote.php/dav/upload
Mode: stream-one
Padding Bytes: 100-1000
Uplink HTTP Method: POST
Session Placement: Default (path)
Sequence Placement: Default (path)
```
### Открытые порты на VPS
```bash
22 - SSH
80 - HTTP (для получения SSL)
443 - HTTPS (для панели и веб-трафика)
2054 - VLESS VPN (основной порт)
45131 - Панель 3X-UI
2096 - Внутренний порт 3X-UI (localhost)
```
---
## Управление клиентами
### Добавление нового клиента
1. В панели 3X-UI: **Inbounds****OlimpVpn** → **Клиенты**
2. Нажмите **+ Добавить клиента**
3. Заполните:
- **Email**: имя-клиента (например: `user-tel`, `user-comp`)
- **Лимит трафика**: 0 (безлимитно) или укажите в ГБ
- **Срок действия**: никогда или выберите дату
4. Нажмите **OK**
### Генерация ссылки подключения
1. Найдите клиента в списке
2. Нажмите на иконку **QR Code** (📱)
3. Скопируйте ссылку VLESS или отсканируйте QR-код
#### Формат ссылки VLESS
```
vless://UUID@2.27.50.20:2054?type=xhttp&encryption=none&path=%2Fremote.php%2Fdav%2Fupload&security=reality&pbk=PUBLIC_KEY&fp=chrome&sni=cloud.zailon.ru&sid=SHORT_ID&sp=%2F#ClientName
```
#### Пример для Hiddify / v2rayNG
```
vless://68f44a38-396d-48da-b832-79b5dc5716ab@2.27.50.20:2054?type=xhttp&encryption=none&path=%2Fremote.php%2Fdav%2Fupload&security=reality&pbk=TOyddQCTdSpycmO20uiLOqMABuKabpwVhw57tWmvJws&fp=chrome&sni=cloud.zailon.ru&sid=174fc0&sp=%2F#OlimpVpn-client
```
### Автоматическая подписка
Клиенты могут использовать автоматическую подписку для обновления конфигурации:
```
https://charon.zailon.ru:45131/charon-cerberus/CLIENT_ID
```
Где `CLIENT_ID` — уникальный идентификатор клиента (указан в панели 3X-UI).
---
## Бэкапы и восстановление
### Автоматические бэкапы
| Параметр | Значение |
|----------|----------|
| **Скрипт** | `/opt/3x-ui/backup.sh` |
| **Расписание** | `0 3 * * 0` (воскресенье, 03:00 +05) |
| **Локальное хранилище** | `/opt/3x-ui/backups/` |
| **Nextcloud** | `nc.zailon.ru/Admin/Домашний Сервер/OlimpBackup/OlimpVPN/` |
| **Состав бэкапа** | `db/`, `cert/`, `docker-compose.yml` |
| **Хранение локально** | 30 дней |
### Ручной запуск бэкапа
```bash
/opt/3x-ui/backup.sh
```
### Восстановление из бэкапа
```bash
# 1. Скачать последний бэкап с Nextcloud
LATEST=$(curl -s -u "Zailon:TOKEN" \
"https://nc.zailon.ru/remote.php/dav/files/Zailon/Admin/Домашний%20Сервер/OlimpBackup/OlimpVPN/" \
-X PROPFIND -H "Depth: 1" | \
grep -oP '3x-ui_backup_\d+_\d+\.tar\.gz' | tail -1)
curl -s -u "Zailon:TOKEN" \
"https://nc.zailon.ru/remote.php/dav/files/Zailon/Admin/Домашний%20Сервер/OlimpBackup/OlimpVPN/${LATEST}" \
-o /tmp/restore.tar.gz
# 2. Остановить сервис
cd /opt/3x-ui && docker compose down
# 3. (Опционально) Создать резервную копию текущей конфигурации
tar -czf /opt/3x-ui/pre_restore_$(date +%Y%m%d).tar.gz -C /opt/3x-ui db cert docker-compose.yml
# 4. Восстановить файлы
tar -xzf /tmp/restore.tar.gz -C /opt/3x-ui/
chown -R root:root /opt/3x-ui/
chmod 600 /opt/3x-ui/cert/private.key
# 5. Запустить сервис
docker compose up -d
# 6. Проверить статус
docker ps | grep 3xui
docker logs 3xui_app --tail 20
```
---
## Мониторинг
```bash
# Логи бэкапа
tail -f /var/log/3x-ui-backup.log
# Локальные бэкапы
ls -lh /opt/3x-ui/backups/
# Проверка на Nextcloud (WebDAV)
curl -u "Zailon:TOKEN" \
"https://nc.zailon.ru/remote.php/dav/files/Zailon/Admin/Домашний%20Сервер/OlimpBackup/OlimpVPN/" \
-X PROPFIND -H "Depth: 1" | grep -oP '<d:href>\K[^<]+' | tail -5
# Проверка crontab
crontab -l
# Проверка таймзоны
timedatectl | grep "Time zone"
```
---
## Решение проблем
#### Ошибка 401 Unauthorized
```bash
# Пересоздать токен приложения в Nextcloud:
# Настройки → Безопасность → Приложения паролей → Создать новый
# Обновить NEXTCLOUD_PASS в /opt/3x-ui/backup.sh
```
#### Ошибка 404 Not Found
```bash
# Проверить путь к папке (регистр и пробелы важны!)
# Правильный формат: /Admin/Домашний%20Сервер/OlimpBackup/OlimpVPN/
```
#### Бэкап не создаётся
```bash
# Проверить права на запись
ls -la /opt/3x-ui/backups/
# Проверить место на диске
df -h /opt/3x-ui
# Проверить логи cron
journalctl -u cron -n 20
```
#### Время в логах неверное
```bash
# Установить таймзону
timedatectl set-timezone Asia/Yekaterinburg
# Перезапустить cron
systemctl restart cron
```
### Чеклист обслуживания
- [ ] **Еженедельно**: Проверять `/var/log/3x-ui-backup.log` после воскресенья
- [ ] **Ежемесячно**: Убедиться что бэкапы есть на Nextcloud
- [ ] **Ежеквартально**: Протестировать восстановление на тестовом окружении
- [ ] **При смене пароля Nextcloud**: Обновить `NEXTCLOUD_PASS` в скрипте
- [ ] **Перед обновлением 3X-UI**: Сделать ручной бэкап
---
> ⚠️ **Важно**: Токен приложения `2Fpz6-ocGSz-rRbaZ-efoa3-EDATz` имеет доступ только к WebDAV. Никогда не используйте основной пароль аккаунта в скриптах!
---
## Связанные разделы
- [Сеть и доступ](04-network.md) — общая топология сети
- [Виртуальные машины и LXC](03-vms-lxcs.md) — LXC media с xray-прокси
- [Безопасность](10-security.md) — политики безопасности
- [Резервное копирование](11-backup.md) — общая стратегия бэкапов
---
*Документ обновлен: 25 марта 2026*
*Версия 3X-UI: latest (Docker)*
*Сервер: 2.27.50.20 (Финляндия)*

226
docs/05-samba.md.md Normal file
View File

@ -0,0 +1,226 @@
# 🔒 Samba Настройка и правила Безопасности в инфраструктуре Olimp
📚 **Полная документация по безопасной настройке Samba в домашней инфраструктуре**
---
## 📑 Содержание
- [🎯 Цели](#-цели)
- [📂 Шары](#-шары)
- [📁 Права файловой системы](#-права-файловой-системы)
- [🖥️ Клиенты](#-клиенты)
- [✅ Проверка](#-проверка)
- [🔄 Откат](#-откат)
- [📊 Статистика](#-статистика)
- [📞 Контакты](#-контакты)
- [Добавление пользователя](#-контакты)
---
## 🎯 Цели
- 🔐 Убрать гостевой доступ
- 👤 Ввести авторизацию пользователей
- 📁 Настроить права Linux
- 💻 Обеспечить работу Windows + Docker (qBittorrent)
---
## 📂 Шары
### 📺 Media сервер (`192.168.1.203`)
```ini
[Films]
comment = Films Library
path = /mnt/video/films
browseable = yes
read only = yes
valid users = @mediaread
write list = zailon qb
force group = mediaread
create mask = 0644
directory mask = 0755
```
---
### 🎮 Games сервер (`192.168.1.207`)
```ini
[Games]
comment = Games Library
path = /mnt/games/
browseable = yes
read only = yes
valid users = @mediaread
write list = zailon qb
force group = mediaread
create mask = 0644
directory mask = 0755
```
---
## 📁 Права файловой системы
### Media
```bash
# Владелец и группа
sudo chown -R zailon:mediaread /mnt/video/ /mnt/audio/ /mnt/books/ /mnt/abooks/
# Папки
sudo find /mnt/video/ /mnt/audio/ /mnt/books/ /mnt/abooks/ -type d -exec chmod 775 {} \;
# Файлы
sudo find /mnt/video/ /mnt/audio/ /mnt/books/ /mnt/abooks/ -type f -exec chmod 664 {} \;
```
### Games
```bash
sudo chown -R zailon:mediaread /mnt/games/
sudo find /mnt/games/ -type d -exec chmod 775 {} \;
sudo find /mnt/games/ -type f -exec chmod 664 {} \;
```
---
## 🖥️ Клиенты
### 🧲 Torrent (`192.168.1.211`)
```bash
sudo mkdir -p /etc/smb-creds
sudo nano /etc/smb-creds/qb
sudo chmod 600 /etc/smb-creds/qb
```
#### `/etc/fstab`
```ini
//192.168.1.203/Films /mnt/video/films cifs rw,credentials=/etc/smb-creds/qb,uid=1000,gid=1003,file_mode=0644,dir_mode=0755,vers=3.0 0 0
//192.168.1.207/Games /mnt/games cifs rw,credentials=/etc/smb-creds/qb,uid=1000,gid=1003,file_mode=0644,dir_mode=0755,vers=3.0 0 0
```
Применение:
```bash
sudo mount -a
```
---
### 🪟 Windows
```cmd
net use \\\\192.168.1.203\\Films /user:zailon
net use \\\\192.168.1.207\\Games /user:zailon
```
Очистка:
```cmd
net use * /delete /yes
net stop workstation /y
net start workstation
```
---
## ✅ Проверка
### Серверы
```bash
pdbedit -L
testparm
getent group mediaread
```
### Torrent
```bash
mount | grep cifs
cat /etc/smb-creds/qb
```
### Docker test
```bash
docker exec qbittorrent touch /mnt/video/films/test.txt
docker exec qbittorrent rm /mnt/video/films/test.txt
```
---
## 🔄 Откат
⚠️ **Не рекомендуется**
```ini
guest ok = yes
```
```bash
sudo systemctl restart smbd nmbd
```
---
## 📊 Статистика
| Параметр | Значение |
|----------|----------|
| Серверов | 2 |
| Шаров | 13 |
| Пользователей | 3 |
| Групп | 1 (`mediaread`) |
| Гостевой доступ | ❌ |
---
## 📞 Контакты
| Параметр | Значение |
|----------|----------|
| Домен | zailon.ru |
| Сеть | 192.168.1.0/24 |
| VPN | 192.168.45.0/24 |
| Media | 192.168.1.203 |
| Games | 192.168.1.207 |
| Torrent | 192.168.1.211 |
---
## 🎉 Результат
✅ Гостевой доступ отключён
✅ Доступ только по пользователям
✅ Права корректны
✅ Docker пишет в шару
✅ Windows подключается
---
## Добавление пользователя
- На media (192.168.1.203):
```bash
sudo useradd -M -s /usr/sbin/nologin pilum
sudo usermod -aG mediaread pilum
sudo smbpasswd -a pilum
sudo systemctl restart smbd nmbd
```
- На games (192.168.1.207):
```bash
sudo useradd -M -s /usr/sbin/nologin pilum
sudo usermod -aG mediaread pilum
sudo smbpasswd -a pilum
sudo systemctl restart smbd nmbd
```

165
docs/06-services.md Normal file
View File

@ -0,0 +1,165 @@
# 06. Сервисы и порты
В этом разделе представлен полный список сервисов, запущенных в инфраструктуре, их порты и способ доступа.
## 🧭 Обозначения
| Символ | Значение |
|--------|----------|
| 🌐 | Доступен из внешней сети через NPM |
| 🔒 | Доступен только внутри локальной сети или по VPN |
| 📦 | Docker-контейнер |
| 🐧 | Системный сервис (LXC/ВМ) |
---
## 🚪 Gateway (192.168.1.201)
| Сервис | Порт | Доступ | Контейнер | Описание |
|--------|------|--------|-----------|----------|
| NPM (HTTP) | 80 | 🌐 | npm | Редирект на HTTPS |
| NPM (HTTPS) | 443 | 🌐 | npm | Проксирование всех доменов |
| NPM (Admin) | 81 | 🔒 | npm | Веб-интерфейс управления |
| Heimdall | 45131 → 80 | 🌐 | heimdall | Дашборд, доступен по `olimp.zailon.ru` |
---
## 📀 Data (192.168.1.202)
| Сервис | Порт | Доступ | Контейнер | Описание |
|--------|------|--------|-----------|----------|
| Bitwarden | 45131 → 80 | 🌐 | vaultwarden | Менеджер паролей, `bw.zailon.ru` |
| Mealie | 45132 → 80 | 🌐 | mealie | Планировщик рецептов, `cook.zailon.ru` |
| BookStack | 45133 → 80 | 🌐 | bookstack | База знаний, `book.zailon.ru` и `mnemozailon.ru` |
---
## 🎬 Media (192.168.1.203)
| Сервис | Порт | Доступ | Контейнер | Описание |
|--------|------|--------|-----------|----------|
| Jellyfin | 45131 → 8096 | 🌐 | jellyfin | Медиасервер, `jellyfin.zailon.ru` |
| Audiobookshelf | 45132 → 80 | 🌐 | audiobookshelf | Аудиокниги, `ab.zailon.ru` |
| Calibre-web | 45133 → 80 | 🌐 | calibre-web | Электронные книги, `calibre.zailon.ru` |
| Ampache | 45134 → 80 | 🌐 | ampache | Музыкальный сервер, `music.zailon.ru` |
| Samba (шары) | 139, 445 | 🔒 | системный | Файловые шары (см. раздел [Samba](05-samba.md)) |
---
## 📸 Photo (192.168.1.204)
| Сервис | Порт | Доступ | Контейнер | Описание |
|--------|------|--------|-----------|----------|
| Immich (Server) | 45131 → 2283 | 🌐 | immich-server | Фото-стек, `photo.zailon.ru` |
| Immich (ML) | 3003 | 🔒 | immich-machine-learning | Машинное обучение для Immich |
| PostgreSQL | 5432 | 🔒 | immich-postgres | База данных Immich |
| Valkey | 6379 | 🔒 | immich-redis | Кэш-сервер Immich |
---
## ☁️ Nextcloud (192.168.1.205) — ВМ
| Сервис | Порт | Доступ | Описание |
|--------|------|--------|----------|
| Nextcloud (HTTP) | 80 | 🌐 | Редирект на HTTPS, `cloud.zailon.ru`, `nc.zailon.ru` |
| Nextcloud (HTTPS) | 443 | 🌐 | |
| MySQL | 3306 | 🔒 | Локальная БД |
| Redis | 6379 | 🔒 | Кэш |
---
## 💬 Talk (192.168.1.206)
| Сервис | Порт | Доступ | Контейнер | Описание |
|--------|------|--------|-----------|----------|
| Snikket (XMPP) | 8443 → 5281 | 🌐 | snikket | Мессенджер, `chat.zailon.ru` |
| Snikket (Web) | 5280 | 🔒 | snikket-proxy | Веб-прокси Snikket |
| Mumble | 45131 → 64738 | 🔒 | mumble-server | Голосовой чат, прямой проброс 45131 (TCP+UDP) |
| TeamSpeak | 9987 (UDP) | 🔒 | teamspeak | Голосовой чат, прямой проброс |
| TeamSpeak (Query) | 10011 | 🔒 | teamspeak | Управление через API |
---
## 🎮 Games (192.168.1.207)
| Сервис | Порт | Доступ | Контейнер | Описание |
|--------|------|--------|-----------|----------|
| Valheim | 2456-2458 (UDP) | 🌐 | valheim-server | Игровой сервер, проброс на роутере |
| Samba (игры) | 139, 445 | 🔒 | системный | Шара `/mnt/games/` |
---
## 📊 Manage (192.168.1.208)
| Сервис | Порт | Доступ | Контейнер | Описание |
|--------|------|--------|-----------|----------|
| Grafana | 45132 → 3000 | 🌐 | grafana | Визуализация метрик, `mon.zailon.ru` |
| MeshCentral | 45131 → 443 | 🌐 | meshcentral | Удалённое управление |
| VictoriaMetrics | 8428 | 🔒 | victoria-metrics | Хранилище метрик |
| Loki | 3100 | 🔒 | loki | Хранилище логов |
| Promtail | 9080 | 🔒 | promtail | Сбор логов (на всех хостах) |
---
## 🧩 Git (192.168.1.209)
| Сервис | Порт | Доступ | Контейнер | Описание |
|--------|------|--------|-----------|----------|
| GitLab (HTTP) | 45130 → 80 | 🌐 | gitlab | Веб-интерфейс, `git.zailon.ru` |
| GitLab (HTTPS) | 45131 → 443 | 🌐 | gitlab | |
| GitLab SSH | 2222 (проброс) | 🔒 | gitlab | Git через SSH (внешний порт 2222) |
---
## 🧰 Ansible (192.168.1.210)
| Сервис | Порт | Доступ | Описание |
|--------|------|--------|----------|
| SSH | 22 | 🔒 | Управление всеми хостами через Ansible |
---
## 🧲 Torrent (192.168.1.211)
| Сервис | Порт | Доступ | Контейнер | Описание |
|--------|------|--------|-----------|----------|
| qBittorrent (Web) | 8080 | 🌐 | qbittorrent | Веб-интерфейс, `qb.zailon.ru` |
| qBittorrent (Torrent) | 6881 (UDP/TCP) | 🌐 | qbittorrent | Прямой проброс на роутере |
| TorrServer | 45132 → 8090 | 🔒 | torrserver | Торрент-плеер |
---
## 🌐 OlimpVPN (2.27.50.20 — Финляндия)
| Сервис | Порт | Доступ | Контейнер | Описание |
|--------|------|--------|-----------|----------|
| 3X-UI Panel | 45131 | 🌐 | 3xui_app | Веб-интерфейс управления, `charon.zailon.ru:45131/olimp-styx/` |
| Xray (VLESS Reality) | 2054 | 🌐 | 3xui_app | Основной VPN-протокол, VLESS + XHTTP + Reality |
| Xray (внутренний) | 2096 | 🔒 | 3xui_app | Внутренний порт Xray (localhost) |
| Let's Encrypt | 80/443 | 🌐 | — | SSL сертификаты (certbot на хосте) |
---
## 🧾 Итоговая таблица внешних портов на роутере
| Порт/диапазон | Протокол | Назначение |
|---------------|----------|------------|
| 80 | TCP | Редирект на HTTPS (NPM) |
| 443 | TCP | Nginx Proxy Manager (все HTTPS) |
| 3478 | TCP/UDP | Snikket (TURN/STUN) |
| 5222 | TCP | Snikket (XMPP client) |
| 5349 | TCP | Snikket (TLS) |
| 15636 | TCP/UDP | Enshrouded (игра, возможно неактивна) |
| 2456-2458 | UDP | Valheim |
| 27015-27016 | TCP/UDP | Игры (неактивны?) |
| 9876-9877 | TCP/UDP | Игры (неактивны?) |
| 50000-50100 | UDP | Snikket (медиа) |
---
**Связанные разделы:**
- [Сеть и доступ](04-network.md)
- [Samba](05-samba.md)
- [Проксирование и SSL (NPM)](07-proxy-ssl.md)
- [Безопасность](10-security.md)

105
docs/07-proxy-ssl.md Normal file
View File

@ -0,0 +1,105 @@
# 07. Проксирование и SSL (Nginx Proxy Manager)
## Обзор
**Nginx Proxy Manager (NPM)** запущен в Docker-контейнере на хосте `gateway` (192.168.1.201). Он принимает входящие HTTP/HTTPS-запросы на порты 80 и 443 и проксирует их к внутренним сервисам. SSL-сертификаты автоматически выпускаются и обновляются через Let's Encrypt.
## Заголовки безопасности
Для защиты веб-сервисов рекомендуется добавлять следующие HTTP-заголовки для каждого проксируемого домена (настройка в интерфейсе NPM → Advanced):
```nginx
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options SAMEORIGIN always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), camera=(), microphone=(), payment=()" always;
```
### Назначение заголовков
| Заголовок | Назначение |
|-----------|------------|
| **Strict-Transport-Security (HSTS)** | Заставляет браузер всегда использовать HTTPS, предотвращая атаки понижения протокола. |
| **X-Content-Type-Options** | Запрещает браузеру выполнять MIME-sniffing, снижая риск атак типа XSS. |
| **X-Frame-Options** | Защищает от clickjacking, разрешая встраивание только в страницы того же источника. |
| **Referrer-Policy** | Контролирует, какая информация о referer передаётся при переходе на другие сайты. |
| **Permissions-Policy** | Отключает ненужные API (геолокация, камера, микрофон) для всех страниц. |
## Глобальная конфигурация NPM
Глобальные настройки находятся в `/etc/nginx/nginx.conf` внутри контейнера. Основные параметры:
```nginx
client_max_body_size 2000m; # максимальный размер загружаемого файла (2 ГБ)
proxy_read_timeout 90s; # таймаут чтения прокси
set_real_ip_from 10.0.0.0/8; # доверенные подсети для определения реального IP
set_real_ip_from 172.16.0.0/12;
set_real_ip_from 192.168.0.0/16;
real_ip_header X-Real-IP;
real_ip_recursive on;
```
- **client_max_body_size 2000m** позволяет загружать большие файлы (например, видео в Jellyfin).
- **proxy_read_timeout 90s** защищает от зависания долгих запросов.
- **set_real_ip_from** определяет реальный IP клиента, что важно для корректной работы логирования и ограничений.
## Доступ к админке NPM
Административный интерфейс доступен по адресу `https://192.168.1.201:81` (только локально). Учётные данные хранятся в зашифрованном виде во встроенной базе данных SQLite.
## Проксируемые домены
Список всех активных прокси (актуально на 20 марта 2026):
| Домен | Бэкенд | SSL | Статус |
|-------|--------|-----|--------|
| ab.zailon.ru | http://192.168.1.203:45132 | Let's Encrypt | Online |
| book.zailon.ru | http://192.168.1.202:45133 | Let's Encrypt | Online |
| bw.zailon.ru | http://192.168.1.202:45131 | Let's Encrypt | Online |
| chat.zailon.ru | https://192.168.1.206:8443 | Let's Encrypt | Online |
| cloud.zailon.ru | http://192.168.1.213:45131 | Let's Encrypt | Online |
| cook.zailon.ru | http://192.168.1.202:45132 | Let's Encrypt | Online |
| git.zailon.ru | http://192.168.1.209:45130 | Let's Encrypt | Online |
| jellyfin.zailon.ru | http://192.168.1.203:45131 | Let's Encrypt | Online |
| mnemozailon.ru | http://192.168.1.202:45133 | Let's Encrypt | Online |
| mon.zailon.ru | http://192.168.1.208:45132 | Let's Encrypt | Online |
| music.zailon.ru | http://192.168.1.203:45132 | Let's Encrypt | Online |
| nc.zailon.ru | https://192.168.1.205:443 | Let's Encrypt | Online |
| olimp.zailon.ru | http://192.168.1.201:45131 | Let's Encrypt | Online |
| oracul.zailon.ru | http://192.168.1.208:45131 | Let's Encrypt | Online |
| photo.zailon.ru | http://192.168.1.204:45131 | Let's Encrypt | Online |
| qb.zailon.ru | http://192.168.1.211:8080 | Let's Encrypt | **Offline** |
> **Проблема:** `qb.zailon.ru` отображается как Offline. Необходимо проверить доступность qBittorrent на порту 8080 и корректность прокси-правила.
## Мониторинг NPM
- Логи NPM собираются **Promtail** (на gateway) и отправляются в **Loki**.
- В Grafana настроены дашборды для отслеживания ошибок и статистики запросов.
- Ключевые метрики: количество запросов, коды ответов (4xx, 5xx), загрузка сертификатов.
## Проблемы и рекомендации
### 🔴 Отсутствие заголовков безопасности
Большинство прокси не имеют настроенных заголовков HSTS, X-Content-Type-Options и других. Это повышает риски атак. **Рекомендуется** добавить заголовки для всех публичных доменов через интерфейс NPM (вкладка Advanced).
### 🟡 Использование тега `latest`
Образ NPM (`jc21/nginx-proxy-manager:latest`) обновляется неконтролируемо. **Рекомендуется** зафиксировать версию в `docker-compose.yml` (например, `jc21/nginx-proxy-manager:2.12.3`).
### 🟠 Прокси с Offline статусом
`qb.zailon.ru` недоступен. Проверьте:
- Запущен ли контейнер qBittorrent на хосте `torrent`?
- Слушает ли он порт 8080 (`ss -tulnwp | grep 8080`)?
- Корректно ли правило прокси (IP и порт)?
### 🟢 Мониторинг
Убедитесь, что логи NPM попадают в Loki. Проверьте конфигурацию Promtail на gateway. В Grafana создайте дашборд для отслеживания ошибок 5xx и истечения сертификатов.
---
**Связанные разделы:**
- [Сервисы и порты](06-services.md)
- [Сеть и доступ](04-network.md)
- [Мониторинг и логирование](08-monitoring.md)
- [Безопасность](10-security.md)

169
docs/08-monitoring.md Normal file
View File

@ -0,0 +1,169 @@
# 08. Мониторинг и логирование
## Обзор
Для централизованного мониторинга и сбора логов используется стек:
- **VictoriaMetrics** хранилище временных рядов (метрики)
- **Grafana** визуализация и дашборды
- **Loki** хранение логов
- **Promtail** сбор и отправка логов
- **Node Exporter** системные метрики на всех хостах
- **cAdvisor** метрики Docker-контейнеров (включён на некоторых хостах)
- **Proxmox VE Exporter** сбор метрик гипервизора
Все компоненты работают на хосте `manage` (192.168.1.208) в Docker-контейнерах, за исключением Node Exporter и Promtail, которые установлены на каждом хосте.
## Структура сбора данных
```mermaid
graph LR
subgraph Хосты
NE[Node Exporter :9100]
PT[Promtail :9080]
CA[cAdvisor :8080]
end
NE --> VM[VictoriaMetrics :8428]
CA --> VM
PT --> Loki[Loki :3100]
VM --> Grafana[Grafana :45132]
Loki --> Grafana
Proxmox[Proxmox VE Exporter] --> VM
```
# 08. Мониторинг и логирование
## Метрики
### Node Exporter
Установлен на всех хостах (включая Proxmox). Собирает:
- Загрузка CPU, память, диски, сеть
- uptime, количество процессов
- метрики ядра (TCP, UDP, etc.)
Порт: `9100`
### cAdvisor
Собирает метрики Docker-контейнеров:
- CPU, память, сеть, диски на уровне контейнера
- количество контейнеров, их статусы
Порт: `8080`
Включён на хостах: `gateway`, `data`, `media`, `photo`, `talk`, `games`, `manage` (фактически везде, где есть Docker, хотя в Ansible роль `cadvisor` закомментирована уточнить)
### Proxmox VE Exporter
Собирает метрики гипервизора:
- состояние ВМ и LXC (CPU, память, диски, сеть)
- нагрузка на хранилища
- статус кластера
Порт: `9223`
Запущен на хосте `olimp` (Proxmox). Аутентификация через API-токен (пользователь `pve_exporter@pve`).
### VictoriaMetrics
Хранилище временных рядов. Принимает метрики от:
- Node Exporter (все хосты)
- cAdvisor (хосты с Docker)
- Proxmox VE Exporter
- vmagent (если используется)
Порт: `8428`
Запущен на хосте `manage` в Docker-контейнере.
## Логи
### Promtail
Установлен на каждом хосте, где есть сервисы. Собирает логи:
- системные логи (syslog, auth)
- логи Docker-контейнеров (через драйвер `json-file`)
- логи приложений (например, NPM, Jellyfin) из файлов
Конфигурация Promtail находится в `/etc/promtail/promtail.yaml` на каждом хосте. Отправляет логи в Loki по порту `3100`.
### Loki
Хранилище логов на хосте `manage`. Retention: 30 дней. Доступен для запросов из Grafana.
Порт: `3100`
Запущен в Docker-контейнере.
## Визуализация (Grafana)
Grafana доступна по домену `mon.zailon.ru`. Используются дашборды:
- **Node Exporter Full** системные метрики всех хостов
- **Docker Monitoring** метрики контейнеров (cAdvisor)
- **Proxmox** состояние ВМ и хранилищ
- **Loki Logs** просмотр логов
- **NPM** статистика запросов (если настроен сбор логов NPM)
### Доступ
- Администратор: `admin` / пароль (хранится в Ansible Vault)
- URL: `https://mon.zailon.ru`
## Алерты
Алерты настроены через **Grafana Alerting**. Основные правила:
| Условие | Действие |
|---------|----------|
| Высокая загрузка CPU (>90% в течение 15 мин) | Уведомление в Telegram (если настроено) |
| Недоступность хоста (Node Exporter down) | Уведомление |
| Ошибки 5xx в NPM > 10 за 5 мин | Уведомление |
| Низкое свободное место на диске (<10%) | Уведомление |
*Конкретные правила могут уточняться.*
## Настройка через Ansible
Все компоненты мониторинга управляются Ansible. Роли:
- `promtail` установка и настройка Promtail
- `grafana` развёртывание Grafana, импорт дашбордов
- `loki` настройка Loki
- `node_exporter` установка Node Exporter (входит в роль `base_setup`)
- `cadvisor` развёртывание cAdvisor (закомментирована)
Переменные заданы в `group_vars/all.yml`:
```yaml
monitoring_ports:
node_exporter: 9100
cadvisor: 8080
proxmox_exporter: 9223
vmagent: 8429
victoriametrics: 8428
loki: 3100
promtail: 9080
grafana_admin_password: "{{ vault_grafana_admin_password }}"
loki_retention_days: 30
```
## Проблемы и рекомендации
### 🔴 cAdvisor не включён на всех хостах
В плейбуке `olimp-deploy.yml` роль `cadvisor` закомментирована. Если нужны метрики контейнеров на всех хостах, следует её включить.
### 🟡 Отсутствие алертов на логи
Настроены только метрики. Желательно добавить алерты на появление в логах критических событий (например, `error`, `panic`, `failed`). Это можно сделать через Loki Alerting.
### 🟢 Мониторинг роутера и внешних устройств
Сейчас собираются метрики только с серверов. Хорошо бы добавить мониторинг роутера (SNMP) и умных устройств (например, через ping).
### 🟠 Настройка дашбордов
Проверьте, что все дашборды корректно отображают данные. Для NPM нужно убедиться, что логи попадают в Loki и настроен соответствующий источник данных.
---
**Связанные разделы:**
- [Проксирование и SSL (NPM)](07-proxy-ssl.md)
- [Управление конфигурацией (Ansible)](09-ansible.md)
- [Безопасность](10-security.md)

174
docs/09-ansible-overview.md Normal file
View File

@ -0,0 +1,174 @@
# 09. Ansible — общее описание репозитория
## 🎯 Цель репозитория
Автоматизированное развертывание и обслуживание всех сервисов домашнего мультимедиа центра.
Сервер стал полноценной частью семьи: дети смотрят мультфильмы, жена слушает аудиокниги, все общаются через голосовой чат или текстовые сообщения с друзьями.
Данный репозиторий создан для того, чтобы:
- В случае непредвиденной ситуации кто-то из близких мог разобраться в конфигурации и продолжить поддержку сервера.
- Я сам мог не помнить всех деталей настройки, которые делал несколько лет назад, и быстро находить нужную информацию.
- Воспроизводить развертывание сервисов на новом оборудовании при необходимости.
Вся конфигурация описана в виде кода (Infrastructure as Code) с использованием Ansible.
---
## 🖥️ Управляемые хосты
Хосты представляют собой LXC-контейнеры в Proxmox, каждый отвечает за свою группу сервисов.
Файл инвентаря: `inventories/hosts`
### Группы и хосты
| Группа | Хост | IP-адрес | Назначение |
|------------------|-----------|-------------|-----------------------------------------|
| `pve-server` | proxmox | 192.168.1.200 | Гипервизор Proxmox |
| `gateway-server` | gateway | 192.168.1.201 | Шлюз, VPN, роутинг |
| `data-server` | data | 192.168.1.202 | Хранилище данных, Samba |
| `media-server` | media | 192.168.1.203 | Медиасервисы (Jellyfin, Audiobookshelf)|
| `photo-server` | photo | 192.168.1.204 | Фото (Immich) |
| `talk-server` | talk | 192.168.1.206 | Коммуникации (Snikket, Mumble) |
| `games-server` | games | 192.168.1.207 | Игровые серверы (Minecraft) |
| `manage-server` | manage | 192.168.1.208 | Управление (Heimdall, NPM, Grafana) |
| `git-server` | git | 192.168.1.209 | GitLab |
| `ansible-server` | ansible | 192.168.1.210 | Хост, с которого запускается Ansible |
| `torrent-server` | torrent | 192.168.1.211 | Торренты (qBittorrent, TorrServer) |
Все хосты используют Python 3 как интерпретатор (`ansible_python_interpreter=/usr/bin/python3`).
---
## 🛠️ Технологии и подходы
- **Ansible** — управление конфигурацией.
- **Docker Compose** — все сервисы запускаются в контейнерах, конфигурация генерируется через шаблоны.
- **Jinja2** — шаблонизация конфигурационных файлов (docker-compose.yml, конфиги сервисов).
- **Handlers** — перезапуск сервисов только при изменении конфигурации.
- **Групповые переменные** — единый файл `group_vars/all.yml` для общих настроек.
- **Ansible Vault** — хранение секретов (пароли, токены) в `vault.yml`.
- **Модульность** — каждая роль отвечает за один сервис или задачу.
- **Идемпотентность** — повторный запуск плейбука не ломает существующую конфигурацию.
---
## 📂 Структура репозитория
| Каталог / файл | Описание |
|------------------------------|----------------------------------------------------------------------------------------|
| `arhive_roles/` | Роли, которые не используются активно (сохранены для истории) |
| `group_vars/` | Переменные для всех хостов (файл `all.yml`) |
| `inventories/` | Файлы инвентаря (хосты, группы) |
| `roles/` | Основные роли — каждый сервис или задача |
| `olimp-deploy.yml` | Главный плейбук, включающий все роли |
| `vault.yml` | Зашифрованный файл с секретами (редактируется через `ansible-vault`) |
### Основные роли (`roles/`)
| Роль | Назначение |
|-----------------------|-------------------------------------------------|
| ampache | Музыкальный стриминг-сервер |
| audiobookshelf | Сервер для аудиокниг и подкастов |
| base_setup | Базовая настройка системы (обновление, пакеты) |
| bitwarden | Менеджер паролей (Vaultwarden) |
| bookstack | Вики / база знаний |
| cadvisor | Мониторинг Docker-контейнеров |
| calibre-web | Веб-интерфейс для библиотеки Calibre |
| docker | Установка Docker и Docker Compose |
| flibusta | Зеркало библиотеки Флибуста (Z-Library) |
| gitlab | GitLab CE |
| grafana | Визуализация метрик (Grafana + VictoriaMetrics) |
| heimdall | Стартовая страница (дашборд) |
| immich | Фотогалерея / альтернатива Google Photos |
| jellyfin | Медиасервер (видео, музыка) |
| loki | Система сбора и хранения логов |
| mealie | Менеджер рецептов |
| meshcentral | Удалённое управление компьютерами |
| minecraft | Игровой сервер Minecraft |
| mumble | Голосовой чат (Mumble) |
| npm | Nginx Proxy Manager |
| promtail | Агент сбора логов для Loki |
| proxmox_base_setup | Базовая настройка хостов Proxmox |
| proxmox_monitoring | Мониторинг Proxmox (pve_exporter) |
| qbittorrent | Торрент-клиент |
| snikket | Коммуникационный сервер (XMPP) |
| system_cleanup | Очистка системы (логи, временные файлы) |
| teamspeak | Голосовой сервер TeamSpeak |
| torrserver | Торрент-стриминг (TorrServer) |
### Архивные роли (`arhive_roles/`)
| Роль | Описание |
|---------------------|-----------------------------------------------------|
| dashy | Альтернативный дашборд (не используется) |
| [delete]pve_monitoring | Старая версия мониторинга Proxmox (удалена) |
| matrix | Сервер Matrix (неактивен) |
---
## 📋 Требования к окружению
Для работы с репозиторием необходимы:
- **Ansible** (ядро): версия 2.18.10
- **Коллекции**: установлена `community.docker` 4.8.1 (используется для управления Docker Compose)
- **Python**: 3.12.3 на управляющем хосте
- **Jinja2**: 3.1.2
- **Доступ по SSH** ко всем хостам (настройки в `ansible.cfg` или через переменные)
- **Docker и Docker Compose** установлены на целевых хостах (обеспечивается ролью `docker`)
- **Ansible Vault** пароль для расшифровки `vault.yml` (должен быть доступен при запуске)
**Установленные пакеты Python:**
- `ansible` 11.11.0
- `docker` 7.1.0
**Команды для проверки:**
```bash
ansible --version
# ansible [core 2.18.10]
ansible-galaxy collection list | grep community.docker
# community.docker 4.8.1
pip list | grep -E "ansible|docker"
# ansible 11.11.0
# docker 7.1.0
```
---
## 👨‍🏫 Для новичков: что такое Ansible?
Если вы никогда раньше не работали с Ansible, вот краткое введение:
- **Ansible** — это инструмент автоматизации. Вы описываете желаемое состояние системы в YAML-файлах, а Ansible приводит систему к этому состоянию.
- **Плейбук** (playbook) — главный файл, который содержит список «пьес» (plays). Каждая пьеса выполняется на определённой группе хостов и включает набор задач (tasks).
- **Роль** (role) — набор задач, переменных, шаблонов и обработчиков, объединённых для решения одной задачи (например, установка Jellyfin). Это помогает организовать код.
- **Задача** (task) — конкретное действие: создать каталог, скопировать файл, запустить Docker-контейнер и т.д.
- **Модуль** — встроенная функция Ansible (например, `docker_compose`, `copy`, `file`).
- **Переменные** — хранят значения, которые могут меняться (пути, порты, имена пользователей). Определяются в `group_vars`, `host_vars`, внутри ролей или в плейбуке.
- **Шаблон Jinja2** — файл с расширением `.j2`, в который подставляются переменные. Используется для генерации конфигов.
- **Обработчик** (handler) — задача, которая выполняется только в том случае, если её уведомила другая задача (например, перезапуск сервиса после изменения конфига).
- **Ansible Vault** — шифрование секретных данных (паролей, ключей) в YAML-файлах.
**Базовые команды:**
```bash
# Проверка синтаксиса плейбука
ansible-playbook olimp-deploy.yml --syntax-check
# Запуск плейбука (с запросом пароля vault)
ansible-playbook olimp-deploy.yml --ask-vault-pass
# Запуск только определённой роли (тег)
ansible-playbook olimp-deploy.yml --tags jellyfin
# Проверка подключения ко всем хостам
ansible all -i inventories/hosts -m ping
```
В следующих разделах документации каждый элемент будет разобран подробно, с примерами и пояснениями.
---
## 📝 Статус
Документация актуальна на 23 марта 2026 года. По мере изменений в инфраструктуре разделы будут обновляться.

View File

@ -0,0 +1,156 @@
# 09. Ansible — плейбуки и запуск
## 🎯 Основной плейбук: `olimp-deploy.yml`
Это главный плейбук, который управляет развёртыванием всех сервисов. Он разбит на секции по группам хостов (определены в `inventories/hosts`). Каждая секция включает:
- Загрузку секретов из `vault.yml`.
- Применение ролей, специфичных для данной группы.
- Использование тегов для гибкого запуска отдельных частей.
---
## 🧩 Структура плейбука
Плейбук последовательно обрабатывает группы хостов в следующем порядке:
1. **Все хосты, кроме Proxmox** (`all:!pve-server`)
- Роль `base_setup` — базовая настройка (пакеты, время, SSH-ключи).
- Роль `system_cleanup` — удаление ненужных пакетов.
- Роль `promtail` — агент сбора логов.
2. **Proxmox** (`pve-server`)
- Роль `proxmox_base_setup` — настройка Proxmox (репозитории, обновления).
- Роль `proxmox_monitoring` — установка pve_exporter, node_exporter.
3. **Gateway** (`gateway-server`)
- Роль `docker` — установка Docker и Docker Compose.
- Роль `npm` — Nginx Proxy Manager.
- Роль `heimdall` — дашборд Heimdall.
- (Роль `dashy` закомментирована, не используется.)
4. **Data** (`data-server`)
- Роль `docker`
- Роль `mealie` — менеджер рецептов.
- Роль `bookstack` — вики.
- Роль `bitwarden` — менеджер паролей (Vaultwarden).
5. **Media** (`media-server`)
- Роль `docker`
- Роль `ampache` — музыкальный стриминг.
- Роль `audiobookshelf` — аудиокниги.
- Роль `calibre-web` — веб-интерфейс для библиотеки Calibre.
- Роль `jellyfin` — медиасервер.
- Роль `flibusta` — зеркало библиотеки Флибуста.
6. **Photo** (`photo-server`)
- Роль `docker`
- Роль `immich` — фотогалерея.
7. **Talk** (`talk-server`)
- Роль `docker`
- Роль `mumble` — голосовой чат.
- Роль `snikket` — XMPP-сервер.
- (Роль `teamspeak` закомментирована.)
8. **Games** (`games-server`)
- Роль `docker`
- (Роль `minecraft` закомментирована)
9. **Manage** (`manage-server`)
- Роль `docker`
- Роль `meshcentral` — удалённое управление.
- Роль `grafana` — визуализация метрик.
- Роль `loki`сбор и хранение логов.
10. **Git** (`git-server`)
- Роль `docker`
- Роль `gitlab` — GitLab CE.
11. **Torrent** (`torrent-server`)
- Роль `docker`
- Роль `torrserver` — стриминг торрентов.
- Роль `qbittorrent` — торрент-клиент.
12. **Тестовый хост** (`testtalk-server`)
- Роль `docker`
- Роль `snikket` (используется для тестирования).
---
## 🏷️ Теги
Каждая роль имеет тег, что позволяет запускать только её:
| Тег | Роль | Назначение |
|------------------------|----------------------------|----------------------------------|
| `deploy_base` | base_setup | Базовая настройка |
| `deploy_cleanup` | system_cleanup | Очистка системы |
| `deploy_promtail` | promtail | Агент логов |
| `deploy_proxmox_base` | proxmox_base_setup | Настройка Proxmox |
| `deploy_proxmox_monitoring` | proxmox_monitoring | Мониторинг Proxmox |
| `deploy_docker` | docker | Установка Docker |
| `deploy_npm` | npm | Nginx Proxy Manager |
| `deploy_heimdall` | heimdall | Heimdall |
| `deploy_mealie` | mealie | Mealie |
| `deploy_bookstack` | bookstack | Bookstack |
| `deploy_bitwarden` | bitwarden | Bitwarden/Vaultwarden |
| `deploy_ampache` | ampache | Ampache |
| `deploy_audiobookshelf`| audiobookshelf | Audiobookshelf |
| `deploy_calibre_web` | calibre-web | Calibre Web |
| `deploy_jellyfin` | jellyfin | Jellyfin |
| `deploy_flibusta` | flibusta | Flibusta |
| `deploy_immich` | immich | Immich |
| `deploy_mumble` | mumble | Mumble |
| `deploy_snikket` | snikket | Snikket (XMPP) |
| `deploy_meshcentral` | meshcentral | MeshCentral |
| `deploy_grafana` | grafana | Grafana + VictoriaMetrics |
| `deploy_loki` | loki | Loki |
| `deploy_gitlab` | gitlab | GitLab |
| `deploy_torrserver` | torrserver | TorrServer |
| `deploy_qbittorrent` | qbittorrent | qBittorrent |
---
## 🚀 Запуск плейбука
### Полный запуск (все роли)
```bash
ansible-playbook olimp-deploy.yml --ask-vault-pass
```
### Запуск только определённой роли (по тегу)
```bash
ansible-playbook olimp-deploy.yml --tags deploy_jellyfin --ask-vault-pass
```
### Запуск на конкретном хосте
```bash
ansible-playbook olimp-deploy.yml --limit media-server --ask-vault-pass
```
### Проверка синтаксиса
```bash
ansible-playbook olimp-deploy.yml --syntax-check
```
### Сухой запуск (dry-run)
```bash
ansible-playbook olimp-deploy.yml --check --ask-vault-pass
```
---
## 📌 Примечания
- Некоторые роли закомментированы (`dashy`, `teamspeak`, `minecraft`), так как они либо не используются, либо требуют дополнительной настройки.
- Все роли, где есть секреты, используют `vault.yml`, поэтому обязательно указывать `--ask-vault-pass` или настроить `vault_password_file`.
---
*Далее: [Роли (roles)](09-ansible-roles.md)*

View File

@ -0,0 +1,210 @@
# 09. Ansible — общие роли (common)
Этот документ описывает роли, которые применяются на нескольких хостах или обеспечивают базовую функциональность.
---
## 1. base_setup
### Назначение
Базовая настройка всех хостов (кроме Proxmox). Выполняется первой.
### Структура
```mermaid
graph TD
base_setup/ --> handlers/
base_setup/ --> tasks/
handlers/ --> main.yml
tasks/ --> main.yml
```
### Выполняемые задачи
- Установка базовых пакетов (`base_packages`).
- Создание пользовательских директорий (`custom_directories`).
- Настройка временной зоны (`timezone`).
- Настройка локали (`system_locale`).
- Добавление публичных SSH-ключей (`ssh_public_keys`).
### Используемые переменные (из `group_vars/all.yml`)
- `timezone`
- `system_locale`
- `base_packages`
- `custom_directories`
- `ssh_public_keys`
### Обработчики
- `reload systemd` — применяется, если были изменения в юнитах (редко).
### Примечания
- Роль идемпотентна: повторный запуск не меняет уже существующие настройки.
---
## 2. docker
### Назначение
Установка Docker Engine и Docker Compose на целевой хост.
### Структура
```mermaid
graph TD
docker/ --> tasks/
tasks/ --> main.yml
```
### Выполняемые задачи
- Добавление официального репозитория Docker.
- Установка пакетов: `docker-ce`, `docker-ce-cli`, `containerd.io`, `docker-compose-plugin`.
- Запуск и включение службы Docker.
- Добавление пользователя `admin_user` в группу `docker`.
### Используемые переменные
- `admin_user` (из `group_vars/all.yml`) — пользователь, добавляемый в группу `docker`.
### Примечания
- Не требует обработчиков; Docker управляется системой.
- После установки можно запускать контейнеры от имени администратора.
---
## 3. system_cleanup
### Назначение
Удаление ненужных пакетов и очистка системы.
### Структура
```mermaid
graph TD
system_cleanup/ --> defaults/
system_cleanup/ --> tasks/
defaults/ --> main.yml
tasks/ --> main.yml
```
### Выполняемые задачи
- Удаление пакетов из списка `cleanup_packages`.
- Автоматическое удаление неиспользуемых зависимостей (`apt autoremove`).
- Очистка кэша пакетов (`apt autoclean`).
### Используемые переменные
- `cleanup_packages` (из `group_vars/all.yml`) — список пакетов для удаления.
- (В `defaults/main.yml` задан пустой список, переопределяется в групповых переменных.)
### Примечания
- Роль безопасна: удаляет только явно указанные пакеты.
- Рекомендуется запускать периодически для поддержания чистоты системы.
---
## 4. promtail
### Назначение
Установка и настройка Promtail — агента сбора логов для Loki.
### Структура
```mermaid
graph TD
promtail/ --> handlers/
promtail/ --> tasks/
promtail/ --> templates/
handlers/ --> main.yml
tasks/ --> main.yml
templates/ --> promtail-config.yml.j2
templates/ --> promtail-service.yml.j2
```
### Выполняемые задачи
- Создание пользователя `promtail`.
- Создание директорий для конфигурации и данных.
- Генерация конфигурации из шаблона `promtail-config.yml.j2`.
- Установка systemd-сервиса из шаблона `promtail-service.yml.j2`.
- Запуск и включение сервиса.
### Используемые переменные (из `group_vars/all.yml`)
- `monitoring_ports.promtail` — порт для работы Promtail.
- `loki_server_host` и `loki_server_port` — адрес Loki.
- `promtail_config_dir` — директория конфигурации.
- `promtail_data_dir` — директория для позиций.
### Обработчики
- `restart promtail` — перезапуск сервиса при изменении конфигурации.
### Примечания
- Promtail отправляет логи только на указанный Loki.
- Настраивается только на серверах из `monitoring_groups.promtail_servers`.
---
## 5. proxmox_base_setup
### Назначение
Базовая настройка хостов Proxmox (гипервизоров).
### Структура
```mermaid
graph TD
proxmox_base_setup/ --> handlers/
proxmox_base_setup/ --> tasks/
handlers/ --> main.yml
tasks/ --> main.yml
```
### Выполняемые задачи
- Настройка репозиториев Proxmox (переключение на No-subscription).
- Обновление системы.
- Установка дополнительных пакетов (если указаны).
- Настройка времени и локали (аналогично `base_setup`).
### Используемые переменные
- `timezone`, `system_locale` — как в `base_setup`.
### Обработчики
- `reload systemd` — при изменениях.
### Примечания
- Применяется только к группе `pve-server`.
---
## 6. proxmox_monitoring
### Назначение
Настройка мониторинга на Proxmox: установка Node Exporter и Proxmox Exporter.
### Структура
```mermaid
graph TD
proxmox_monitoring/ --> handlers/
proxmox_monitoring/ --> tasks/
proxmox_monitoring/ --> templates/
handlers/ --> main.yml
tasks/ --> main.yml
templates/ --> node_exporter.service.j2
templates/ --> pve_exporter_config.yml.j2
templates/ --> storcli_metrics.sh.j2
```
### Выполняемые задачи
- Установка Node Exporter (для сбора метрик ОС).
- Установка Proxmox Exporter (для сбора метрик PVE).
- Генерация конфигурации Proxmox Exporter с токеном доступа.
- Создание systemd-сервисов для обоих экспортеров.
- (Опционально) Установка скрипта `storcli_metrics.sh` для сбора метрик RAID-контроллера (если LSI MegaRAID).
### Используемые переменные (из `group_vars/all.yml`)
- `monitoring_ports.node_exporter`
- `monitoring_ports.proxmox_exporter`
- `pve_exporter_user`, `pve_exporter_token_name`, `pve_exporter_token_value`
- `admin_user`
### Обработчики
- `restart node_exporter` — перезапуск Node Exporter.
- `restart proxmox_exporter` — перезапуск Proxmox Exporter.
### Примечания
- Токен для Proxmox Exporter хранится в `vault.yml`.
- Node Exporter собирает метрики хоста, Proxmox Exporter — метрики виртуальных окружений.
---
*Далее: [Роли Gateway](09-ansible-roles-gateway.md)*

View File

@ -0,0 +1,489 @@
# 09. Ansible — переменные и окружение
## 🎯 Общие сведения
Переменные в этом репозитории разделены по уровням:
- **Глобальные** — определены в `group_vars/all.yml` и применяются ко всем хостам.
- **Рольные** — могут переопределяться внутри ролей (в `defaults/main.yml` или `vars/main.yml`), но в основном используются глобальные для единообразия.
- **Секретные** — вынесены в `vault.yml` (зашифрованы) и подставляются через переменные вида `{{ vault_* }}`.
Файл `group_vars/all.yml` структурирован по разделам, каждый из которых отвечает за определённую группу настроек. Ниже приведено подробное описание каждой переменной.
---
## 🌍 Общие настройки
| Переменная | Тип | Значение / Пример | Назначение | Используется в ролях |
|--------------------|------------|---------------------------------------|------------------------------------------------------------------------------------------------|--------------------------------------------|
| `timezone` | string | `Asia/Yekaterinburg` | Часовой пояс системы. | `base_setup` |
| `system_locale` | string | `ru_RU.UTF-8` | Локаль системы. | `base_setup` |
| `x11_display_host` | string | `192.168.1.101` | Хост для X11-проброса (используется редко). | (не используется в текущих ролях) |
| `admin_user` | string | `root` | Пользователь, от имени которого выполняются административные задачи. | `base_setup`, `proxmox_base_setup` |
| `base_packages` | list | `[curl, wget, ...]` | Список базовых пакетов, устанавливаемых на всех хостах. | `base_setup` |
| `custom_directories`| list | `[/opt/scripts, /etc/apt/keyrings]` | Каталоги, которые необходимо создать на каждом хосте. | `base_setup` |
| `ssh_public_keys` | list | список публичных ключей | SSH-ключи для доступа к хостам (добавляются в `authorized_keys`). | `base_setup` |
| `cleanup_packages` | list | `[gparted]` | Пакеты, которые нужно удалить (устаревшие или ненужные). | `system_cleanup` |
---
## 🌐 Сетевые настройки
| Переменная | Тип | Значение | Назначение |
|--------------------|------------|------------------------------|------------------------------------------------------------------------------------------------|
| `server_ips` | dict | `olimp: 192.168.1.200` и т.д.| Словарь с IP-адресами всех сервисных хостов. Используется для ссылок в других переменных. |
Эти IP используются для настройки мониторинга (списки хостов для Node Exporter, Promtail), а также для указания расположения сервисов (например, в `qbittorrent_shares` ссылки на SMB-шары).
---
## 📊 Мониторинг и логирование
### Порты
| Переменная | Значение | Назначение |
|--------------------------------|----------|-------------------------------------------------|
| `monitoring_ports.node_exporter` | 9100 | Порт Node Exporter. |
| `monitoring_ports.proxmox_exporter` | 9223 | Порт Proxmox Exporter. |
| `monitoring_ports.vmagent` | 8429 | Порт VMagent (VictoriaMetrics agent). |
| `monitoring_ports.victoriametrics` | 8428 | Порт VictoriaMetrics. |
| `monitoring_ports.loki` | 3100 | Порт Loki. |
| `monitoring_ports.promtail` | 9080 | Порт Promtail. |
### Группы серверов для мониторинга
| Переменная | Значение (пример) | Назначение |
|------------------------------------|-----------------------------------------------|-----------------------------------------------------------------|
| `monitoring_groups.node_exporter_servers` | список IP-адресов всех хостов, кроме, возможно, некоторых | Хосты, на которых запускается Node Exporter (роль `proxmox_monitoring` и др.). |
| `monitoring_groups.proxmox_servers` | `[{{ server_ips.olimp }}]` | Хосты Proxmox, для которых нужен Proxmox Exporter. |
| `monitoring_groups.promtail_servers` | список IP-адресов (все, кроме Proxmox) | Хосты, на которых запускается Promtail для сбора логов. |
### Proxmox Exporter
| Переменная | Значение | Назначение |
|-----------------------------|------------------------------|--------------------------------------------------------------------------------------|
| `pve_exporter_user` | `pve_exporter@pve` | Пользователь в Proxmox для экспорта метрик. |
| `pve_exporter_token_name` | `grafana` | Имя токена для доступа. |
| `pve_exporter_token_value` | `{{ vault_pve_exporter_token }}` | Токен (секрет) для аутентификации. Хранится в vault. |
### VictoriaMetrics и Grafana
| Переменная | Значение | Назначение |
|------------------------------------|------------------------------|----------------------------------------------------------------------------|
| `victoriametrics_retention_months` | 2 | Срок хранения метрик (месяцев). |
| `victoriametrics_version` | `v1.101.0` | Версия VictoriaMetrics. |
| `grafana_version` | `11.2.0` | Версия Grafana. |
| `grafana_admin_user` | `admin` | Имя администратора Grafana. |
| `grafana_admin_password` | `{{ vault_grafana_admin_password }}` | Пароль администратора (vault). |
| `grafana_root_url` | `https://mon.zailon.ru` | Внешний URL для доступа к Grafana. |
### Loki
| Переменariable | Значение | Назначение |
|--------------------------|----------|-----------------------------------------------|
| `loki_version` | `2.9.2` | Версия Loki. |
| `loki_retention_days` | 30 | Срок хранения логов (дней). |
### cAdvisor
| Переменная | Значение | Назначение |
|--------------------|--------------|--------------------------------------------------------|
| `cadvisor_enabled` | true | Включает развёртывание cAdvisor. |
| `cadvisor_base_dir`| `/opt/cadvisor` | Базовый каталог для данных cAdvisor. |
| `cadvisor_port` | 8080 | Порт cAdvisor. |
---
## 🚪 Сервисы Gateway (хост 192.168.1.201)
| Переменная | Значение | Назначение | Роль |
|--------------------------------------|----------------------------------|-----------------------------------------------------------------|------------|
| `npm_base_dir` | `/opt/npm` | Базовый каталог Nginx Proxy Manager. | `npm` |
| `npm_data_dir` | `/opt/npm/data` | Каталог данных NPM. | `npm` |
| `npm_letsencrypt_dir` | `/opt/npm/letsencrypt` | Каталог сертификатов Let's Encrypt. | `npm` |
| `heimdall_base_dir` | `/opt/heimdall` | Базовый каталог Heimdall. | `heimdall` |
| `heimdall_config_dir` | `/opt/heimdall/config` | Каталог конфигурации Heimdall. | `heimdall` |
| `heimdall_port` | `45131` | Порт Heimdall (проброшен на хост). | `heimdall` |
| `dashy_base_dir` | `/opt/dashy` | Базовый каталог Dashy (архивная роль, не используется). | `arhive_roles/dashy` |
| `dashy_config_dir` | `/opt/dashy/config` | Конфигурация Dashy. | `arhive_roles/dashy` |
| `dashy_port` | `45132` | Порт Dashy. | `arhive_roles/dashy` |
| `dashy_domain` | `start.zailon.ru` | Домен для Dashy. | `arhive_roles/dashy` |
---
## 💾 Сервисы Data (хост 192.168.1.202)
### Bitwarden (Vaultwarden)
| Переменная | Значение | Назначение | Роль |
|------------------------------------|---------------------------------|--------------------------------------------------------|--------------|
| `bitwarden_base_dir` | `/mnt/bitwarden` | Базовый каталог. | `bitwarden` |
| `bitwarden_data_dir` | `/mnt/bitwarden/vw-data` | Каталог данных. | `bitwarden` |
| `bitwarden_port` | `45131` | Порт веб-интерфейса. | `bitwarden` |
| `bitwarden_admin_token` | `{{ vault_bitwarden_admin_token }}` | Токен для админ-панели (vault). | `bitwarden` |
| `bitwarden_websocket_enabled` | true | Включить WebSocket для уведомлений. | `bitwarden` |
| `bitwarden_signups_allowed` | false | Разрешить регистрацию новых пользователей. | `bitwarden` |
| `bitwarden_smtp_host` | `smtp.mail.ru` | SMTP-сервер для отправки писем. | `bitwarden` |
| `bitwarden_smtp_port` | `465` | Порт SMTP. | `bitwarden` |
| `bitwarden_smtp_ssl` | true | Использовать SSL/TLS для SMTP. | `bitwarden` |
| `bitwarden_smtp_username` | `zailon@bk.ru` | Логин для SMTP. | `bitwarden` |
| `bitwarden_smtp_password` | `{{ vault_bitwarden_smtp_password }}` | Пароль для SMTP (vault). | `bitwarden` |
| `bitwarden_smtp_from` | `zailon@bk.ru` | Адрес отправителя. | `bitwarden` |
| `bitwarden_domain` | `https://bw.zailon.ru` | Внешний домен Bitwarden. | `bitwarden` |
### Mealie
| Переменная | Значение | Назначение | Роль |
|------------------------------------|---------------------------------|--------------------------------------------------------|----------|
| `mealie_base_dir` | `/mnt/mealie` | Базовый каталог. | `mealie` |
| `mealie_data_dir` | `/mnt/mealie/data` | Каталог данных. | `mealie` |
| `mealie_port` | `45132` | Порт. | `mealie` |
| `mealie_db_type` | `sqlite` | Тип базы данных (sqlite/postgresql). | `mealie` |
| `mealie_db_password` | `{{ vault_mealie_db_password }}` | Пароль для базы данных (если используется postgres). | `mealie` |
### Bookstack
| Переменная | Значение | Назначение | Роль |
|------------------------------------|---------------------------------|--------------------------------------------------------|-------------|
| `bookstack_base_dir` | `/mnt/bookstack` | Базовый каталог. | `bookstack` |
| `bookstack_config_dir` | `/mnt/bookstack/config` | Конфигурация. | `bookstack` |
| `bookstack_uploads_dir` | `/mnt/bookstack/uploads` | Загруженные файлы. | `bookstack` |
| `bookstack_db_dir` | `/mnt/bookstack/db` | Каталог базы данных (SQLite). | `bookstack` |
| `bookstack_port` | `45133` | Порт. | `bookstack` |
---
## 🎬 Сервисы Media (хост 192.168.1.203)
Общая переменная `service_config_base: "/mnt/service"` используется для всех ролей этого хоста.
### Jellyfin
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|-----------|
| `jellyfin_base_dir` | `{{ service_config_base }}/jellyfin` | Базовый каталог. | `jellyfin`|
| `jellyfin_config_dir` | `{{ jellyfin_base_dir }}/config` | Конфигурация. | `jellyfin`|
| `jellyfin_cache_dir` | `{{ jellyfin_base_dir }}/cache` | Кэш. | `jellyfin`|
| `jellyfin_logs_dir` | `{{ jellyfin_base_dir }}/logs` | Логи. | `jellyfin`|
| `jellyfin_media_path` | `/mnt/video` | Путь к медиафайлам (видео). | `jellyfin`|
| `jellyfin_port` | `45131` | Порт. | `jellyfin`|
| `jellyfin_hw_acceleration` | true | Включить аппаратное ускорение (VAAPI). | `jellyfin`|
### Audiobookshelf
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|-------------------|
| `audiobookshelf_base_dir` | `{{ service_config_base }}/audiobookshelf` | Базовый каталог. | `audiobookshelf` |
| `audiobookshelf_config_dir` | `{{ audiobookshelf_base_dir }}/config` | Конфигурация. | `audiobookshelf` |
| `audiobookshelf_db_dir` | `{{ audiobookshelf_base_dir }}/db` | Каталог базы данных. | `audiobookshelf` |
| `audiobookshelf_port` | `45132` | Порт. | `audiobookshelf` |
### Calibre Web
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|---------------|
| `calibre_base_dir` | `{{ service_config_base }}/calibre` | Базовый каталог. | `calibre-web` |
| `calibre_library_dir` | `/mnt/books/calibre` | Каталог библиотеки Calibre. | `calibre-web` |
| `calibre_config_dir` | `{{ calibre_base_dir }}/config` | Конфигурация. | `calibre-web` |
| `calibre_web_port` | `45133` | Порт. | `calibre-web` |
| `calibre_web_db_path` | `{{ calibre_config_dir }}/app.db` | Путь к файлу базы данных. | `calibre-web` |
| `calibre_web_enable_uploading` | true | Разрешить загрузку книг. | `calibre-web` |
| `calibre_web_enable_conversion` | true | Разрешить конвертацию книг. | `calibre-web` |
| `calibre_web_enable_registration` | false | Разрешить регистрацию новых пользователей. | `calibre-web` |
| `calibre_web_enable_webdav` | true | Включить WebDAV. | `calibre-web` |
| `calibre_web_enable_opds` | true | Включить OPDS-каталог. | `calibre-web` |
### Ampache
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|-----------|
| `ampache_base_dir` | `{{ service_config_base }}/ampache` | Базовый каталог. | `ampache` |
| `ampache_config_dir` | `{{ ampache_base_dir }}/config` | Конфигурация. | `ampache` |
| `ampache_logs_dir` | `{{ ampache_base_dir }}/logs` | Логи. | `ampache` |
| `ampache_mysql_dir` | `{{ ampache_base_dir }}/mysql` | Каталог MySQL (данные). | `ampache` |
| `ampache_port` | `45134` | Порт. | `ampache` |
### Flibusta (Z-Library зеркало)
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|-------------|
| `flibusta_base_dir` | `/mnt/service/flibusta` | Базовый каталог. | `flibusta` |
| `flibusta_source_archives_dir` | `/mnt/books/flibusta` | Каталог с архивами книг (исходные данные). | `flibusta` |
| `flibusta_web_port` | `45137` | Порт веб-интерфейса. | `flibusta` |
| `flibusta_db_port` | `45138` | Порт базы данных (PostgreSQL). | `flibusta` |
| `flibusta_db_user` | `flibusta` | Пользователь БД. | `flibusta` |
| `flibusta_db_password` | `{{ vault_flibusta_db_password }}` | Пароль БД (vault). | `flibusta` |
| `flibusta_db_name` | `flibusta` | Имя базы данных. | `flibusta` |
---
## 📸 Сервисы Photo (хост 192.168.1.204)
### Immich
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|-----------|
| `immich_base_dir` | `/mnt/immich` | Базовый каталог. | `immich` |
| `immich_port` | `45131` | Порт веб-интерфейса. | `immich` |
| `immich_db_username` | `postgres` | Пользователь PostgreSQL. | `immich` |
| `immich_db_password` | `{{ vault_immich_db_password }}` | Пароль БД (vault). | `immich` |
| `immich_db_name` | `immich` | Имя БД. | `immich` |
| `immich_version` | `release` | Версия Immich (release последняя стабильная). | `immich` |
---
## 💬 Сервисы Talk (хост 192.168.1.206)
### Mumble
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|-----------|
| `mumble_base_dir` | `/mnt/mumble` | Базовый каталог. | `mumble` |
| `mumble_data_dir` | `{{ mumble_base_dir }}/data` | Данные. | `mumble` |
| `mumble_port` | `45131` | Порт клиентского подключения. | `mumble` |
| `mumble_ice_port` | `6502` | Порт ICE (интерфейс управления). | `mumble` |
| `mumble_max_users` | `100` | Максимальное количество пользователей. | `mumble` |
| `mumble_server_password` | `{{ vault_mumble_server_password }}` | Пароль для доступа к серверу (если требуется). | `mumble` |
| `mumble_superuser_password` | `{{ vault_mumble_superuser_password }}` | Пароль суперпользователя (vault). | `mumble` |
### Matrix (Synapse) архивная роль
Переменные для Matrix находятся в `arhive_roles/matrix`. Мы их перечислим кратко, так как роль не используется.
| Переменная | Значение | Назначение |
|------------------------------------|------------------------------|-------------------------------------------------|
| `matrix_base_dir` | `/mnt/matrix` | Базовый каталог. |
| `matrix_data_dir` | `/mnt/matrix/data` | Данные Synapse. |
| `matrix_config_dir` | `/mnt/matrix/config` | Конфигурация. |
| `matrix_media_dir` | `/mnt/matrix/media` | Медиафайлы. |
| `matrix_postgres_dir` | `/mnt/matrix/postgres` | Данные PostgreSQL. |
| `matrix_port` | `45132` | Порт. |
| `matrix_domain` | `matrix.zailon.ru` | Домен. |
| `matrix_server_name` | `matrix.zailon.ru` | Имя сервера. |
| `matrix_registration_enabled` | false | Разрешена регистрация. |
| `matrix_postgres_user` | `synapse` | Пользователь БД. |
| `matrix_postgres_password` | `{{ vault_matrix_postgres_password }}` | Пароль БД. |
| `matrix_postgres_db` | `synapse` | Имя БД. |
| `matrix_synapse_secret` | `{{ vault_matrix_synapse_secret }}` | Секрет. |
| `matrix_macaroon_secret` | `{{ vault_matrix_macaroon_secret }}` | Секрет. |
| `matrix_form_secret` | `{{ vault_matrix_form_secret }}` | Секрет. |
### Snikket (XMPP)
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|-----------|
| `snikket_base_dir` | `/mnt/snikket` | Базовый каталог. | `snikket` |
| `snikket_data_dir` | `/mnt/snikket/snikket_data` | Данные сервера. | `snikket` |
| `snikket_nginx_custom_dir` | `/mnt/snikket/nginx-custom` | Кастомные настройки nginx. | `snikket` |
| `snikket_backup_dir` | `/backup/snikket` | Каталог резервных копий. | `snikket` |
| `snikket_domain` | `chat.zailon.ru` | Домен XMPP-сервера. | `snikket` |
| `snikket_admin_email` | `zailon@bk.ru` | Email администратора. | `snikket` |
| `snikket_external_ip` | `188.73.191.202` | Внешний IP сервера (для TURN). | `snikket` |
| `snikket_http_port` | 8080 | HTTP-порт. | `snikket` |
| `snikket_https_port` | 8443 | HTTPS-порт. | `snikket` |
| `snikket_xmpp_port` | 5222 | XMPP-порт (клиент). | `snikket` |
| `snikket_component_port` | 5349 | Порт для компонентов. | `snikket` |
| `snikket_turn_port` | 3478 | TURN-порт. | `snikket` |
| `snikket_turn_tls_port` | 5349 | TURN с TLS. | `snikket` |
| `snikket_rtp_min_port` | 50000 | Минимальный порт RTP. | `snikket` |
| `snikket_rtp_max_port` | 50100 | Максимальный порт RTP. | `snikket` |
| `snikket_enable_acme` | false | Отключить автоматические сертификаты ACME. | `snikket` |
| `snikket_disable_tls` | true | Отключить TLS (используется прокси nginx). | `snikket` |
| `snikket_trusted_proxy` | `*` | Доверенные прокси. | `snikket` |
| `snikket_max_file_size` | `500M` | Максимальный размер файла. | `snikket` |
| `snikket_image_tag` | `dev` | Тег образа Snikket (dev последняя dev-версия). | `snikket` |
| `snikket_create_initial_invite` | false | Не создавать приглашение автоматически. | `snikket` |
| `snikket_backup_enabled` | true | Включить автоматическое резервное копирование. | `snikket` |
| `snikket_backup_retention_days` | 30 | Хранить бэкапы 30 дней. | `snikket` |
| `snikket_admin_password` | `{{ vault_snikket_admin_password }}` | Пароль администратора (vault). | `snikket` |
| `snikket_invite_token` | `{{ vault_snikket_invite_token }}` | Токен для приглашений (vault). | `snikket` |
### TeamSpeak
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|-------------|
| `teamspeak_base_dir` | `/mnt/teamspeak` | Базовый каталог. | `teamspeak` |
| `teamspeak_data_dir` | `/mnt/teamspeak/data` | Данные сервера. | `teamspeak` |
| `teamspeak_logs_dir` | `/mnt/teamspeak/logs` | Логи. | `teamspeak` |
| `teamspeak_query_port` | `10011` | Порт Query API. | `teamspeak` |
| `teamspeak_voice_port` | `9987` | Голосовой порт (UDP). | `teamspeak` |
| `teamspeak_file_port` | `30033` | Порт передачи файлов. | `teamspeak` |
---
## 🎮 Сервисы Games (хост 192.168.1.207)
### Minecraft
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|-------------|
| `minecraft_base_dir` | `/mnt/minecraft` | Базовый каталог. | `minecraft` |
| `minecraft_data_dir` | `/mnt/minecraft/data` | Данные сервера. | `minecraft` |
| `minecraft_port` | `25565` | Игровой порт. | `minecraft` |
| `minecraft_memory` | `4G` | Выделяемая память. | `minecraft` |
| `minecraft_version` | `1.21.1` | Версия Minecraft. | `minecraft` |
| `minecraft_neoforge_version` | `21.1.0` | Версия NeoForge (моды). | `minecraft` |
| `minecraft_type` | `NEOFORGE` | Тип сервера (Vanilla/Forge/NeoForge). | `minecraft` |
| `minecraft_eula` | `true` | Принятие EULA. | `minecraft` |
| `minecraft_motd` | `Minecraft @ zailon.ru` | Текст MOTD. | `minecraft` |
| `minecraft_online_mode` | `true` | Проверка лицензий. | `minecraft` |
| `minecraft_mods` | список URL-адресов модов | Список модов для загрузки. | `minecraft` |
---
## 🛠️ Сервисы Manage (хост 192.168.1.208)
### MeshCentral
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|---------------|
| `meshcentral_base_dir` | `/opt/meshcentral` | Базовый каталог. | `meshcentral` |
| `meshcentral_data_dir` | `/mnt/mesh/meshcentral-data` | Данные. | `meshcentral` |
| `meshcentral_files_dir` | `/mnt/mesh/meshcentral-files` | Файлы. | `meshcentral` |
| `meshcentral_backup_dir` | `/mnt/mesh/meshcentral-backup` | Бэкапы. | `meshcentral` |
| `meshcentral_port` | `45131` | Порт веб-интерфейса. | `meshcentral` |
### Grafana
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|-----------|
| `grafana_base_dir` | `/mnt/grafana` | Базовый каталог. | `grafana` |
| `grafana_data_dir` | `/mnt/grafana/data` | Данные Grafana. | `grafana` |
| `grafana_config_dir` | `/mnt/grafana/config` | Конфигурация. | `grafana` |
| `grafana_vm_data_dir` | `/mnt/grafana/victoriametrics` | Данные VictoriaMetrics. | `grafana` |
| `grafana_vmagent_tmp_dir` | `/mnt/grafana/vmagent/tmp` | Временная директория VMagent. | `grafana` |
| `grafana_vmagent_config` | `/mnt/grafana/vmagent/vmagent.yaml` | Конфиг VMagent. | `grafana` |
| `grafana_port` | `45132` | Порт Grafana. | `grafana` |
### Loki
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|-----------|
| `loki_base_dir` | `/mnt/loki` | Базовый каталог. | `loki` |
| `loki_config_dir` | `/mnt/loki/config` | Конфигурация. | `loki` |
| `loki_data_dir` | `/mnt/loki/data` | Данные Loki. | `loki` |
| `loki_server_host` | `{{ server_ips.manage }}` | IP-адрес, на котором слушает Loki. | `loki` |
| `loki_server_port` | `{{ monitoring_ports.loki }}` | Порт Loki. | `loki` |
### Promtail
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|-------------|
| `promtail_config_dir` | `/etc/promtail` | Каталог конфигурации Promtail. | `promtail` |
| `promtail_data_dir` | `/var/lib/promtail` | Данные Promtail (позиции). | `promtail` |
---
## 📦 Сервисы Git (хост 192.168.1.209)
### GitLab
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|-----------|
| `gitlab_base_dir` | `/mnt/git` | Базовый каталог. | `gitlab` |
| `gitlab_config_dir` | `/mnt/git/config` | Конфигурация GitLab. | `gitlab` |
| `gitlab_logs_dir` | `/mnt/git/logs` | Логи. | `gitlab` |
| `gitlab_data_dir` | `/mnt/git/data` | Данные (репозитории, база данных). | `gitlab` |
| `gitlab_backup_dir` | `/mnt/git/backup` | Резервные копии. | `gitlab` |
| `gitlab_http_port` | `45130` | HTTP-порт (внешний). | `gitlab` |
| `gitlab_ssh_port` | `2222` | SSH-порт для git-операций. | `gitlab` |
| `gitlab_version` | `17.5.5-ce.0` | Версия GitLab CE. | `gitlab` |
| `gitlab_hostname` | `git.zailon.ru` | Внутреннее имя хоста. | `gitlab` |
| `gitlab_external_url` | `https://git.zailon.ru` | Внешний URL. | `gitlab` |
| `gitlab_root_password` | `{{ vault_gitlab_root_password }}` | Пароль root (vault). | `gitlab` |
---
## 🧲 Сервисы Torrent (хост 192.168.1.211)
### qBittorrent
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|---------------|
| `qbittorrent_base_dir` | `/mnt/service/qbittorrent` | Базовый каталог. | `qbittorrent` |
| `qbittorrent_config_dir` | `/mnt/service/qbittorrent/appdata` | Конфигурация. | `qbittorrent` |
| `qbittorrent_downloads_dir` | `/mnt/service/qbittorrent/downloads` | Каталог загрузок (локальный). | `qbittorrent` |
| `qbittorrent_puid` | 1000 | ID пользователя для контейнера. | `qbittorrent` |
| `qbittorrent_pgid` | 1003 | ID группы. | `qbittorrent` |
| `qbittorrent_port_webui` | 8080 | Порт веб-интерфейса. | `qbittorrent` |
| `qbittorrent_port_torrent` | 6881 | Порт для торрент-трафика. | `qbittorrent` |
| `qbittorrent_smb_credentials_dir` | `/etc/smb-creds` | Каталог для файлов с учетными данными SMB. | `qbittorrent` |
**SMB-учетные данные:**
| Переменная | Значение | Назначение |
|------------------------------------|----------------------------------|-------------------------------------------------------|
| `qbittorrent_smb_creds.olimp.username` | `Olimp` | Логин для шары Olimp. |
| `qbittorrent_smb_creds.olimp.password` | `{{ vault_smb_olimp_password }}` | Пароль (vault). |
| `qbittorrent_smb_creds.olimp.file` | `olimp` | Имя файла с креденшелами. |
| `qbittorrent_smb_creds.qb.username` | `qb` | Логин для шары qb. |
| `qbittorrent_smb_creds.qb.password` | `{{ vault_samba_password_qb }}` | Пароль (vault). |
| `qbittorrent_smb_creds.qb.file` | `qb` | Имя файла. |
**SMB-шары (монтируемые):**
Переменная `qbittorrent_shares` — список словарей с параметрами монтирования. Каждый элемент содержит:
- `name` — название (используется в пути монтирования).
- `src` — UNC-путь к шаре.
- `dest` — точка монтирования в контейнере.
- `credential` — ссылка на учётные данные (olimp или qb).
- `opts` — параметры монтирования.
Эти шары монтируются на хост через `fstab` (роль `qbittorrent` обеспечивает это) и затем пробрасываются в контейнер.
### TorrServer
| Переменная | Значение | Назначение | Роль |
|------------------------------------|----------------------------------|-------------------------------------------------------|-------------|
| `torrserver_base_dir` | `/mnt/service/torrserver` | Базовый каталог. | `torrserver`|
| `torrserver_config_dir` | `/mnt/service/torrserver/config` | Конфигурация. | `torrserver`|
| `torrserver_torrents_dir` | `/mnt/service/torrserver/torrents` | Каталог с торрент-файлами. | `torrserver`|
| `torrserver_port` | `45132` | Порт веб-интерфейса. | `torrserver`|
---
## 🔐 Секретные переменные (vault)
Переменные, начинающиеся с `vault_`, хранятся в зашифрованном файле `vault.yml`. Они используются в вышеперечисленных ролях. Для редактирования используется команда:
```bash
ansible-vault edit vault.yml
```
Пароль vault должен быть известен администратору.
Список vault-переменных (не включая их значения):
- `vault_pve_exporter_token`
- `vault_grafana_admin_password`
- `vault_bitwarden_admin_token`
- `vault_bitwarden_smtp_password`
- `vault_mealie_db_password`
- `vault_flibusta_db_password`
- `vault_immich_db_password`
- `vault_mumble_server_password`
- `vault_mumble_superuser_password`
- `vault_matrix_postgres_password`
- `vault_matrix_synapse_secret`
- `vault_matrix_macaroon_secret`
- `vault_matrix_form_secret`
- `vault_snikket_admin_password`
- `vault_snikket_invite_token`
- `vault_gitlab_root_password`
- `vault_smb_olimp_password`
- `vault_samba_password_qb`
---
## 📌 Примечания
- Большинство переменных предназначены для использования в **шаблонах Docker Compose** (файлы `docker-compose.yml.j2`). В них переменные подставляются через Jinja2.
- Для мониторинга используются группы хостов, заданные через IP-адреса, что позволяет гибко настраивать, какие сервисы мониторить.
- Все пути к данным вынесены в переменные, что облегчает миграцию на другое хранилище при необходимости.
- Переменные, связанные с портами, используют схему: для каждого сервиса выделен уникальный порт в диапазоне 451xx, чтобы избежать конфликтов при пробросе на хост.
---
## 🔗 Исходные файлы
- [`group_vars/all.yml`](../group_vars/all.yml) — полный файл с переменными.
- [`vault.yml`](../vault.yml) — зашифрованный файл с секретами (требуется пароль).
---
[Плейбуки и запуск](09-ansible-playbooks.md)*

253
docs/09-ansible.md Normal file
View File

@ -0,0 +1,253 @@
# 09. Управление конфигурацией (Ansible)
## Обзор
Для автоматизации развёртывания и поддержки инфраструктуры используется **Ansible**. Управляющий хост — `ansible` (192.168.1.210). Все конфигурации хранятся в репозитории, секреты зашифрованы с помощью Ansible Vault.
## Структура репозитория
```
## Структура репозитория
Реальный вид каталога Ansible на хосте `ansible`:
```
/opt/servers/Olimp/
├── arhive_roles # устаревшие/экспериментальные роли
│   ├── dashy
│   ├── [delete]pve_monitoring
│   └── matrix
├── group_vars
│   └── all.yml # общие переменные (несекретные)
├── inventories
│   └── hosts # файл инвентаря
├── olimp-deploy.yml # основной playbook
├── README.md # описание проекта
├── roles # актуальные роли
│   ├── ampache
│   ├── audiobookshelf
│   ├── base_setup
│   ├── bitwarden
│   ├── bookstack
│   ├── cadvisor
│   ├── calibre-web
│   ├── docker
│   ├── flibusta
│   ├── gitlab
│   ├── grafana
│   ├── heimdall
│   ├── immich
│   ├── jellyfin
│   ├── loki
│   ├── mealie
│   ├── meshcentral
│   ├── minecraft
│   ├── mumble
│   ├── npm
│   ├── promtail
│   ├── proxmox_base_setup
│   ├── proxmox_monitoring
│   ├── qbittorrent
│   ├── system_cleanup
│   ├── teamspeak
│   └── torrserver
└── vault.yml # зашифрованные секрет
```
**Примечание:** папка `arhive_roles` содержит роли, которые не используются в основном playbook, но сохранены для справки или возможного будущего использования. Основные роли находятся в `roles/`. Инвентарь расположен в `inventories/hosts` (вместо стандартного `inventory/hosts`).
## Инвентарь (`inventory/hosts`)
Хосты сгруппированы по ролям:
```
[infra]
proxmox ansible_host=192.168.1.200 int_ip=192.168.1.200
gateway ansible_host=192.168.1.201 int_ip=192.168.1.201
data ansible_host=192.168.1.202 int_ip=192.168.1.202
media ansible_host=192.168.1.203 int_ip=192.168.1.203
photo ansible_host=192.168.1.204 int_ip=192.168.1.204
talk ansible_host=192.168.1.206 int_ip=192.168.1.206
games ansible_host=192.168.1.207 int_ip=192.168.1.207
manage ansible_host=192.168.1.208 int_ip=192.168.1.208
git ansible_host=192.168.1.209 int_ip=192.168.1.209
ansible ansible_host=192.168.1.210 int_ip=192.168.1.210
torrent ansible_host=192.168.1.211 int_ip=192.168.1.211
test ansible_host=192.168.1.212 int_ip=192.168.1.212
[pve-server]
proxmox
[gateway-server]
gateway
[data-server]
data
[media-server]
media
[photo-server]
photo
[talk-server]
talk
[games-server]
games
test
[manage-server]
manage
[git-server]
git
[ansible-server]
ansible
[torrent-server]
torrent
```
## Playbook (`olimp-deploy.yml`)
Основной playbook запускает роли для каждой группы хостов с тегами для выборочного применения.
```
- hosts: all:!pve-server
roles:
- {role: base_setup, tags: deploy_base}
- {role: system_cleanup, tags: deploy_cleanup}
- {role: promtail, tags: deploy_promtail}
- hosts: pve-server
roles:
- { role: proxmox_base_setup, tags: deploy_proxmox_base }
- { role: proxmox_monitoring, tags: deploy_proxmox_monitoring }
- hosts: gateway-server
roles:
- { role: docker, tags: deploy_docker }
- { role: npm, tags: deploy_npm }
- { role: heimdall, tags: deploy_heimdall }
- hosts: data-server
roles:
- { role: docker, tags: deploy_docker }
- { role: mealie, tags: deploy_mealie }
- { role: bookstack, tags: deploy_bookstack }
- { role: bitwarden, tags: deploy_bitwarden }
# ... остальные группы аналогично
```
## Переменные
### Общие переменные (`group_vars/all.yml`)
Содержат несекретные настройки:
- временная зона, локали
- список IP-адресов всех серверов
- порты для мониторинга
- пути к каталогам для сервисов
- публичные SSH-ключи
- списки пакетов для установки
Пример:
```
timezone: Asia/Yekaterinburg
system_locale: ru_RU.UTF-8
server_ips:
olimp: "192.168.1.200"
gateway: "192.168.1.201"
# ... остальные
monitoring_ports:
node_exporter: 9100
cadvisor: 8080
loki: 3100
promtail: 9080
base_packages:
- curl
- wget
- htop
- git
# ...
```
### Секреты (`group_vars/vault.yml`)
Все пароли, токены и другие чувствительные данные хранятся в зашифрованном файле `vault.yml`. Шифрование выполняется командой:
```
ansible-vault encrypt group_vars/vault.yml
```
Пример содержимого (незашифрованный вид):
```
vault_bitwarden_admin_token: "super_secret_token"
vault_bitwarden_smtp_password: "smtp_password"
vault_mealie_db_password: "mealie_db_pass"
vault_immich_db_password: "immich_db_pass"
vault_mumble_server_password: "mumble_pass"
vault_mumble_superuser_password: "mumble_super_pass"
vault_matrix_postgres_password: "matrix_db_pass"
vault_matrix_synapse_secret: "synapse_secret"
vault_matrix_macaroon_secret: "macaroon_secret"
vault_matrix_form_secret: "form_secret"
vault_samba_password_qb: "qb_samba_pass"
grafana_admin_password: "strong_grafana_pass"
# ... и другие
```
## Запуск плейбуков
Для применения конфигурации используется команда:
```
ansible-playbook -i inventory/hosts olimp-deploy.yml --ask-vault-pass
```
Для запуска только определённых тегов:
```
ansible-playbook -i inventory/hosts olimp-deploy.yml --tags deploy_docker --ask-vault-pass
```
## Пример роли (docker)
Роль `docker` выполняет установку Docker и настройку мониторинга. Ключевые задачи:
- Установка зависимостей (`apt-transport-https`, `ca-certificates`, `curl`, `gnupg`, `lsb-release`)
- Добавление GPG-ключа Docker и репозитория
- Установка `docker-ce`, `docker-ce-cli`, `containerd.io`, `docker-compose-plugin`
- Запуск и включение службы Docker
- Развёртывание скрипта `docker_metrics.sh` для сбора метрик в Node Exporter
- Создание systemd-таймера для регулярного сбора метрик
- Обновление `runc` до версии 1.2.4 (если требуется)
## Проблемы и рекомендации
### 🔴 Хранение паролей в открытом виде в `all.yml`
На момент аудита некоторые пароли (например, `grafana_admin_password`) находились в `all.yml` в открытом виде. **Немедленно перенести их в `vault.yml` и зашифровать.**
### 🟡 Использование тегов и ролей
Некоторые роли закомментированы (например, `cadvisor`, `minecraft`). Если они не используются, следует удалить их из плейбука, чтобы избежать путаницы.
### 🟢 Версионирование и резервное копирование
Рекомендуется хранить репозиторий Ansible в Git (локальном или на GitLab) и регулярно делать резервные копии `vault.yml` с паролем.
### 🟠 Управление SSH-ключами
В `all.yml` заданы публичные ключи. Необходимо убедиться, что на всех хостах нет лишних ключей, а вход по паролю отключён.
---
**Связанные разделы:**
- [Виртуальные машины и LXC](03-vms-lxcs.md)
- [Сеть и доступ](04-network.md)
- [Мониторинг и логирование](08-monitoring.md)
- [Безопасность](10-security.md)

344
docs/10-security.md Normal file
View File

@ -0,0 +1,344 @@
# 10. Безопасность
## Обзор
В этом разделе собраны текущие проблемы безопасности инфраструктуры и план их устранения. Документ основан на результатах аудита, проведённого в марте 2026 года.
> **Последнее обновление**: 1 апреля 2026
> **Применено на хостах**: `torrent` (192.168.1.211), `Olimp` (Proxmox VE)
> **В процессе**: применение на остальных хостах
---
## Текущее состояние
| Область | Статус | Комментарий |
|---------|--------|-------------|
| SSH (парольная аутентификация) | ✅ | Отключена на всех хостах |
| SSH (вход root) | ✅ | Запрещён (`PermitRootLogin no`) на `torrent`, применяется на остальных |
| Пользователь `zailon` | ✅ | Создан с правами `sudo`, SSH-ключи настроены |
| SSH-ключи | ✅ | Управляются централизованно через Ansible |
| Samba (протокол) | ✅ | Обновлён до `SMB2` на `media` |
| Samba (шифрование) | 🟡 | `smb encrypt = desired` (пока не `required` из-за совместимости) |
| UFW / фаервол | 🔴 | Отключён на всех LXC и ВМ |
| Хранение паролей в Ansible | ✅ | Все секреты перенесены в `vault.yml` и зашифрованы |
| Заголовки безопасности в NPM | 🔴 | Отсутствуют для большинства прокси |
| Docker-образы | 🟡 | Используется тег `latest` на части сервисов |
| Обновления систем | 🟡 | Требуют периодического применения |
| Мониторинг | ✅ | Node Exporter, Promtail, VictoriaMetrics настроены |
| Резервное копирование | ✅ | **Proxmox Backup Server настроен и протестирован** |
---
## ✅ Решённые проблемы
### 1. Вход root по SSH — ИСПРАВЛЕНО
- **Описание**: На всех хостах разрешён вход под пользователем `root` через SSH. При компрометации ключа злоумышленник получает полный контроль над системой.
- **Что сделано**:
- Создан пользователь `zailon` с правами `sudo`
- Настроены SSH-ключи из `ssh_public_keys`
- В `/etc/ssh/sshd_config` установлено `PermitRootLogin no`
- Применено через Ansible на хосте `torrent`
- **Проверка**:
```bash
ssh zailon@192.168.1.211
ssh root@192.168.1.211
grep PermitRootLogin /etc/ssh/sshd_config
```
- **Статус**: ✅ Применено на всех хостах
### 2. Пароли в открытом виде в Ansible — ИСПРАВЛЕНО
- **Описание**: В файле `group_vars/all.yml` присутствовали пароли в открытом виде.
- **Что сделано**:
- Все секреты перенесены в `group_vars/vault.yml`
- Файл зашифрован через `ansible-vault encrypt vault.yml`
- В `all.yml` остались только публичные переменные
- **Список зашифрованных переменных**:
```yaml
vault_zailon_password: "..."
vault_grafana_admin_password: "..."
vault_gitlab_root_password: "..."
vault_bitwarden_admin_token: "..."
vault_bitwarden_smtp_password: "..."
vault_mealie_db_password: "..."
vault_flibusta_db_password: "..."
vault_immich_db_password: "..."
vault_mumble_server_password: "..."
vault_mumble_superuser_password: "..."
vault_matrix_postgres_password: "..."
vault_matrix_synapse_secret: "..."
vault_matrix_macaroon_secret: "..."
vault_matrix_form_secret: "..."
vault_matrix_admin_password: "..."
vault_snikket_admin_password: "..."
vault_snikket_invite_token: "..."
vault_smb_olimp_password: "..."
vault_samba_password_qb: "..."
vault_pve_exporter_token: "..."
```
- **Запуск playbook с vault**:
```bash
ansible-playbook -i inventories/hosts olimp-deploy.yml --ask-vault-pass
echo "your_vault_password" > ~/.vault_pass
chmod 600 ~/.vault_pass
ansible-playbook -i inventories/hosts olimp-deploy.yml --vault-password-file ~/.vault_pass
```
- **Статус**: ✅ Завершено
### 3. Samba использует SMB1 — ИСПРАВЛЕНО
- **Описание**: На хосте `media` в конфигурации Samba был установлен `server min protocol = NT1` (SMB1), что уязвимо к атакам типа EternalBlue.
- **Что сделано**:
- В `/etc/samba/smb.conf` на хосте `media` изменено:
```ini
[global]
server min protocol = smb2
smb encrypt = desired
```
- Проверена работа клиентов (Windows, Android, Docker)
- **Статус**: ✅ Завершено на `media` `games`
### 4. Резервное копирование не было настроено — ИСПРАВЛЕНО
- **Описание**: Отсутствовала автоматическая система резервного копирования конфигураций, баз данных и пользовательских данных.
- **Что сделано** (апрель 2026):
- **Установлен Proxmox Backup Server** (PBS) в LXC контейнере (CT 220)
- **Создано хранилище** на ZFS dataset `rpool/pbs-backups` (187 GB, SSD mirror)
- **Настроено хранилище** `ssd-backups` с дедупликацией и компрессией ZSTD
- **PBS подключён** к Proxmox VE как `pbs-ssd`
- **Настроены бэкапы** для критичных систем:
- LXC контейнеры: 201-211 (gateway, data, media, photo, talk, games, manage, git, ansible, torrent)
- VM: 205 (Nextcloud), 213 (VPN)
- **Расписание**: ежедневно в 02:30 и 22:30
- **Retention политика**: Keep Last 7, Keep Daily 7, Keep Weekly 2
- **Режим**: Snapshot (без остановки сервисов)
- **Исключены** большие диски (16TB RAID6 массив)
- **Восстановление протестировано**: CT 201 → CT 216 (успешно)
- **Архитектура**:
```
Proxmox VE Host (Olimp)
├─ ZFS Pool: rpool (2x240GB SSD mirror)
│ └─ Dataset: rpool/pbs-backups (187 GB)
│ └─ Mounted to: /rpool/pbs-backups
└─ LXC Container (CT 220) - Proxmox Backup Server
└─ Mount: /mnt/backups → /rpool/pbs-backups
└─ Datastore: ssd-backups
```
- **Команды управления**:
```bash
zfs list rpool/pbs-backups
zpool list rpool
pct exec 220 -- proxmox-backup-client datastore stats ssd-backups
```
- **Восстановление**:
```bash
pct restore <new-vmid> pbs-ssd:backup/ct/<ctid>/<backup-time>
qm restore <new-vmid> pbs-ssd:backup/vm/<vmid>/<backup-time>
```
- **Статус**: ✅ Работает, требует мониторинга места
- **Примечание**: PBS развёрнут на том же хосте что и Proxmox VE (временное решение до появления отдельного сервера). Рекомендуется настроить репликацию на внешний носитель или облако.
---
## 🔴 Критические проблемы (требуют внимания)
### 1. Отсутствие фаервола на всех LXC
- **Описание**: UFW отключён на всех LXC-контейнерах. Сервисы доступны из всей локальной сети без ограничений.
- **Решение**: Включить UFW на каждом хосте с минимально необходимыми правилами:
```yaml
- name: Enable UFW with default deny
ufw:
state: enabled
policy: deny
direction: incoming
become: yes
- name: Allow SSH from trusted subnets
ufw:
rule: allow
port: 22
proto: tcp
from: "{{ item }}"
loop:
- "192.168.1.0/24"
- "192.168.45.0/24"
become: yes
- name: Allow Samba from trusted subnets
ufw:
rule: allow
port: "{{ item }}"
proto: tcp
from: "192.168.1.0/24"
loop:
- 139
- 445
become: yes
- name: Allow HTTP/HTTPS for NPM
ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- 80
- 443
become: yes
```
- **План**: Создать роль `ufw_setup` и применить ко всем хостам
- **Срок**: В течение недели
### 2. Отсутствие заголовков безопасности в NPM
- **Описание**: Для публичных прокси не настроены заголовки безопасности: HSTS, X-Content-Type-Options, X-Frame-Options.
- **Решение**: Через веб-интерфейс NPM → Proxy Hosts → Edit → Advanced → Custom locations добавить:
```nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'" always;
```
- **Применить ко всем публичным доменам**: `*.zailon.ru`
- **Срок**: В течение недели
---
## 🟠 Проблемы высокого приоритета
### 1. Использование Docker-образов с тегом `latest`
- **Описание**: Образы обновляются неконтролируемо, что может привести к несовместимости.
- **Решение**: Зафиксировать версии в `docker-compose.yml`:
```yaml
services:
npm:
image: jc21/nginx-proxy-manager:2.12.3
```
- **План**: Пройтись по всем `docker-compose.yml` и зафиксировать версии
- **Срок**: В течение месяца
### 2. Необновлённые системы
- **Описание**: На хостах накапливаются обновления пакетов.
- **Решение**:
- Регулярно запускать `apt update && apt upgrade` через Ansible
- Настроить `unattended-upgrades` для автоматических обновлений безопасности
```yaml
- name: Install unattended-upgrades
apt:
name: unattended-upgrades
state: present
become: yes
- name: Configure unattended-upgrades
copy:
content: |
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::Automatic-Reboot "false";
dest: /etc/apt/apt.conf.d/50unattended-upgrades
become: yes
```
- **Статус**: 🟡 В процессе
---
## 🟡 Проблемы среднего приоритета
### 1. Шифрование Samba: `desired` вместо `required`
- **Описание**: `smb encrypt = desired` допускает незашифрованные соединения.
- **Решение**: После тестирования всех клиентов в VPN изменить на `required`:
```ini
[global]
smb encrypt = required
```
- **Статус**: 🟡 Отложено до полной проверки совместимости
### 2. Отсутствие алертов на логи в Grafana
- **Описание**: Нет правил для оповещения при ошибках в логах.
- **Решение**: Настроить правила в Grafana → Alerting на основе Loki:
```logql
{job="promtail", filename="/var/log/auth.log"} |= "Failed password" | rate() > 5
{job="promtail", container="nginx-proxy-manager"} |= "error"
```
- **Статус**: 🟡 В планах
### 3. cAdvisor не включён на всех хостах
- **Описание**: Метрики Docker-контейнеров собираются не везде.
- **Решение**: Раскомментировать роль `cadvisor` в `olimp-deploy.yml` при необходимости.
- **Статус**: 🟡 По мере необходимости
---
## 🟢 Рекомендации по улучшению
| Задача | Описание | Приоритет |
|--------|----------|-----------|
| Автоматические обновления | Настроить `unattended-upgrades` на всех хостах | 🟢 |
| Сегментация сети | Выделить VLAN для IoT и гостевой сети | 🟢 |
| Мониторинг роутера | Сбор SNMP-метрик с TP-Link | 🟢 |
| Двухфакторная аутентификация | Включить 2FA в Grafana, GitLab, Bitwarden | 🟢 |
| Регулярный аудит | Запускать Lynis/OpenVAS раз в 3 месяца | 🟢 |
| Оффсайт-бэкапы | Настроить репликацию PBS в облако (Backblaze B2/Wasabi) | 🟢 |
---
## 📋 План действий
| Задача | Приоритет | Срок | Статус |
|--------|-----------|------|--------|
| Применить настройку SSH (root+zailon) на всех хостах | 🔴 | 1 день | 🔄 В процессе |
| Включить UFW на всех хостах | 🔴 | 1 неделя | ⏳ Ожидает |
| Добавить заголовки безопасности в NPM | 🔴 | 1 неделя | ⏳ Ожидает |
| Зафиксировать версии Docker-образов | 🟠 | 1 месяц | ⏳ Ожидает |
| Настроить unattended-upgrades | 🟢 | 1 месяц | ⏳ Ожидает |
| Настроить алерты на логи | 🟡 | По необходимости | ⏳ Ожидает |
| Настроить репликацию PBS (оффсайт) | 🟢 | 2 месяца | ⏳ Ожидает |
---
## 🔐 Чек-лист применения изменений
Перед запуском playbook на всех хостах:
```bash
chmod 600 /root/.ssh/id_rsa
ansible-vault view vault.yml --ask-vault-pass | grep zailon
ansible-playbook -i inventories/hosts olimp-deploy.yml -l torrent --check --diff --ask-vault-pass
ansible-playbook -i inventories/hosts olimp-deploy.yml -l torrent --ask-vault-pass
ssh zailon@192.168.1.211
ansible-playbook -i inventories/hosts olimp-deploy.yml --ask-vault-pass
```
> ⚠️ **Важно**: Не закрывайте текущую SSH-сессию `root`, пока не проверите вход под `zailon` в отдельном окне!
---
## 📊 Мониторинг безопасности
```bash
zfs list rpool/pbs-backups
zpool list rpool
pct exec 220 -- proxmox-backup-client datastore stats ssd-backups
pct exec 220 -- df -h /mnt/backups
```
---
**Связанные разделы**:
- [05. Samba файловые шары](05-samba.md)
- [07. Проксирование и SSL (NPM)](07-proxy-ssl.md)
- [08. Мониторинг и логирование](08-monitoring.md)
- [09. Управление конфигурацией (Ansible)](09-ansible.md)
- [11. Резервное копирование](11-backup.md)

1159
docs/11-backup.md Normal file

File diff suppressed because it is too large Load Diff

289
docs/12-troubleshooting.md Normal file
View File

@ -0,0 +1,289 @@
# 12. Решение проблем
В этом разделе собраны типичные проблемы, возникающие при эксплуатации инфраструктуры, и способы их устранения.
## Содержание
- [SSH: не удаётся подключиться](#ssh-не-удаётся-подключиться)
- [Samba: не монтируются шары](#samba-не-монтируются-шары)
- [NPM: сертификат не выпускается](#npm-сертификат-не-выпускается)
- [Docker: контейнер не запускается](#docker-контейнер-не-запускается)
- [Proxmox: ВМ не стартует](#proxmox-вм-не-стартует)
- [Grafana: нет данных](#grafana-нет-данных)
- [Immich: не загружаются фото](#immich-не-загружаются-фото)
- [Jellyfin: аппаратное ускорение не работает](#jellyfin-аппаратное-ускорение-не-работает)
- [Общие проверки](#общие-проверки)
---
## SSH: не удаётся подключиться
### Симптомы
- `Connection refused`
- `Permission denied (publickey)`
- Таймаут подключения
### Проверка
1. Доступен ли хост по сети:
```bash
ping 192.168.1.201
```
2. Слушает ли SSH:
```bash
ssh -v user@192.168.1.201
```
3. Проверьте файрвол на хосте:
```bash
ufw status
iptables -L -n -v | grep 22
```
4. Проверьте конфиг SSH на хосте:
```bash
grep -E '^(PermitRootLogin|PasswordAuthentication|PubkeyAuthentication)' /etc/ssh/sshd_config
```
### Решение
- Если порт не слушается: `systemctl status sshd`
- Если файрвол блокирует: разрешить порт 22 из нужной подсети
- Если проблема с ключами: убедиться, что ключ добавлен в `~/.ssh/authorized_keys` и права на файлы корректны (`600` для ключа, `700` для `.ssh`)
---
## Samba: не монтируются шары
### Симптомы
- `mount error(13): Permission denied`
- `mount error(112): Host is down`
- В Windows не видит шару
### Проверка
1. Работает ли Samba на сервере:
```bash
systemctl status smbd
```
2. Правильный ли протокол (версия SMB):
```bash
smbclient -L //192.168.1.203 -U zailon
```
3. Проверка конфигурации:
```bash
testparm
```
### Решение
- Убедиться, что пользователь существует в Samba:
```bash
pdbedit -L
```
- Проверить `hosts allow` в `smb.conf` должна быть разрешена подсеть клиента
- Для Docker-контейнеров (qbittorrent) проверить, что учётные данные в `/etc/smb-creds/qb` корректны и файл имеет права `600`
- Если используется шифрование `required`, убедиться, что клиент его поддерживает (для Windows 10/11 включено по умолчанию)
---
## NPM: сертификат не выпускается
### Симптомы
- В интерфейсе NPM сертификат в статусе `Error`
- Ошибка `Failed to issue certificate` в логах
### Проверка
1. Доступен ли домен из интернета:
```bash
dig ab.zailon.ru
```
2. Открыт ли порт 443 на роутере
3. Логи NPM:
```bash
docker logs npm 2>&1 | grep -i error
```
### Решение
- Убедиться, что DNS-запись `A` для домена указывает на внешний IP `188.73.191.202`
- Убедиться, что порт 443 на роутере проброшен на `192.168.1.201:443`
- Если используется Let's Encrypt, проверить, что не превышен лимит запросов
- Для внутренних доменов (без публичного доступа) использовать самоподписанные сертификаты или DNS-челлендж
---
## Docker: контейнер не запускается
### Симптомы
- `docker start` выдаёт ошибку
- Контейнер падает сразу после запуска
- В логах ошибки
### Проверка
1. Посмотреть логи контейнера:
```bash
docker logs <container_name>
```
2. Проверить, нет ли конфликта портов:
```bash
docker ps -a
ss -tulnwp | grep <port>
```
3. Проверить права на монтированные тома:
```bash
ls -la /path/to/mount
```
### Решение
- Исправить ошибки в конфигурации (обычно они видны в логах)
- Освободить занятый порт или изменить маппинг портов в `docker-compose.yml`
- Убедиться, что пользователь внутри контейнера имеет доступ к смонтированным папкам (UID/GID)
---
## Proxmox: ВМ не стартует
### Симптомы
- Ошибка `TASK ERROR: unable to open file '/etc/pve/nodes/olimp/qemu-server/205.conf'`
- Ошибка `kvm: no such device`
- ВМ зависает на старте
### Проверка
1. Статус служб Proxmox:
```bash
systemctl status pve-cluster pvedaemon qemu-server
```
2. Проверить наличие свободного места на хранилище:
```bash
pvesm status
```
3. Посмотреть логи:
```bash
journalctl -u pvedaemon -f
```
### Решение
- Если проблема с конфигурационным файлом восстановить из бэкапа (см. раздел 11)
- Если не хватает памяти остановить другие ВМ или увеличить ресурсы
- Если ошибка KVM убедиться, что виртуализация включена в BIOS и модули загружены:
```bash
lsmod | grep kvm
```
---
## Grafana: нет данных
### Симптомы
- Дашборды не отображают метрики
- Ошибка `No data` или `Data source not found`
### Проверка
1. Доступен ли источник данных (VictoriaMetrics, Loki):
```bash
curl http://192.168.1.208:8428/api/v1/query?query=up
curl http://192.168.1.208:3100/loki/api/v1/query_range?query={job="node_exporter"}
```
2. Работает ли Promtail на хостах:
```bash
systemctl status promtail
```
3. Проверить конфигурацию источников данных в Grafana (Settings → Data Sources)
### Решение
- Перезапустить VictoriaMetrics, Loki, Promtail
- Проверить сетевые доступы между `manage` и другими хостами (порты 8428, 3100, 9080)
- Убедиться, что файлы конфигурации Promtail корректны (пути к логам, метки)
---
## Immich: не загружаются фото
### Симптомы
- Ошибка загрузки в веб-интерфейсе или приложении
- Файлы не появляются в библиотеке
### Проверка
1. Статус контейнеров Immich:
```bash
docker ps | grep immich
```
2. Логи сервера:
```bash
docker logs immich_server | tail -50
```
3. Доступность хранилища:
```bash
df -h /mnt/immich
```
### Решение
- Проверить права на папку загрузок: должны быть доступны пользователю внутри контейнера (обычно 1000:1000)
- Убедиться, что база данных PostgreSQL работает и доступна
- Проверить конфигурацию обратного прокси (NPM) не обрезает ли большие файлы (должно быть `client_max_body_size 2000m`)
---
## Jellyfin: аппаратное ускорение не работает
### Симптомы
- Высокая загрузка CPU при воспроизведении
- В логах ошибки `Failed to open VAAPI device`
### Проверка
1. Наличие устройства `/dev/dri` в контейнере:
```bash
docker exec jellyfin ls -la /dev/dri
```
2. Установлены ли драйверы на хосте:
```bash
apt list --installed | grep -E 'intel-media-va-driver|mesa-va-drivers'
```
### Решение
- Добавить в `docker-compose.yml`:
```yaml
devices:
- /dev/dri:/dev/dri
```
- Установить драйверы на хосте `media`:
```bash
apt install intel-media-va-driver-non-free
```
- Включить аппаратное ускорение в настройках Jellyfin (Администрирование → Воспроизведение → Аппаратное ускорение → VAAPI)
---
## Общие проверки
Если проблема не локализована, выполните следующие шаги:
1. **Логи** первое, что нужно смотреть:
- Системные: `journalctl -xe`
- Docker: `docker logs <container>`
- Samba: `tail -f /var/log/samba/log.smbd`
2. **Сеть** проверить доступность и открытые порты:
```bash
ping 192.168.1.200
traceroute 192.168.1.200
nmap -p 22,80,443 192.168.1.201
```
3. **Диски** проверить свободное место:
```bash
df -h
pvesm status # на Proxmox
```
4. **Файрвол** временно отключить для теста:
```bash
ufw disable # только для теста!
```
5. **Перезагрузка** иногда помогает:
```bash
reboot
```
---
**Связанные разделы:**
- [Сеть и доступ](04-network.md)
- [Samba файловые шары](05-samba.md)
- [Проксирование и SSL (NPM)](07-proxy-ssl.md)
- [Мониторинг и логирование](08-monitoring.md)

264
docs/13-maintenance.md Normal file
View File

@ -0,0 +1,264 @@
# 13. Плановое обслуживание
Регулярное обслуживание инфраструктуры необходимо для обеспечения стабильности, безопасности и производительности. В этом разделе описан регламент работ, включая обновления, очистку и фиксацию версий.
## Содержание
- [Обновление системы](#обновление-системы)
- [Обновление Docker-образов](#обновление-docker-образов)
- [Фиксация версий](#фиксация-версий)
- [Очистка логов и временных файлов](#очистка-логов-и-временных-файлов)
- [Очистка Docker](#очистка-docker)
- [Проверка резервных копий](#проверка-резервных-копий)
- [Проверка сертификатов](#проверка-сертификатов)
- [Ротация паролей](#ротация-паролей)
- [Регламент обслуживания](#регламент-обслуживания)
---
## Обновление системы
### Пакеты ОС (apt)
Для всех хостов (Proxmox, LXC, ВМ) регулярно выполняйте обновление пакетов безопасности и критических исправлений.
**Ручное обновление:**
```bash
apt update
apt list --upgradable # посмотреть список
apt upgrade -y # обновить пакеты
apt autoremove -y # удалить ненужные зависимости
```
**Автоматические обновления безопасности:**
На всех хостах следует настроить `unattended-upgrades`:
```bash
apt install unattended-upgrades
dpkg-reconfigure --priority=low unattended-upgrades # включить автоматические обновления
```
Конфигурация `/etc/apt/apt.conf.d/50unattended-upgrades` должна содержать:
```
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::Automatic-Reboot "false";
```
### Обновление Proxmox
Proxmox обновляется через стандартный `apt`, но после обновления ядра требуется перезагрузка. Желательно планировать перезагрузку гипервизора в окно обслуживания.
```bash
apt update
apt dist-upgrade -y
pveversion -v # проверить версию
reboot
```
---
## Обновление Docker-образов
### Просмотр текущих версий
```bash
docker ps --format "table {{.Image}}\t{{.Names}}"
```
### Обновление образа
1. Остановить контейнер:
```bash
docker stop <container>
```
2. Удалить контейнер (если не используется `--rm`):
```bash
docker rm <container>
```
3. Обновить образ (если используется тег `latest`):
```bash
docker pull <image>:latest
```
Или загрузить фиксированную версию.
4. Запустить контейнер заново (обычно через `docker-compose up -d`).
### Обновление через docker-compose
```bash
cd /path/to/service
docker-compose pull
docker-compose up -d --remove-orphans
```
### Рекомендация
- Избегать использования `:latest` в production. Зафиксировать версии (см. раздел ниже).
- Перед обновлением критических сервисов (Bitwarden, GitLab, базы данных) сделать резервную копию.
---
## Фиксация версий
### Docker-образы
В `docker-compose.yml` указывайте конкретную версию образа вместо `latest`. Пример:
```yaml
services:
npm:
image: jc21/nginx-proxy-manager:2.12.3 # вместо :latest
# ...
```
Актуальные версии можно найти в документации сервисов или на Docker Hub.
### Пакеты ОС
Для важных компонентов (например, ядро, Docker, базы данных) можно фиксировать версии с помощью `apt-mark hold`:
```bash
apt-mark hold docker-ce
apt-mark unhold docker-ce # когда нужно обновить
```
---
## Очистка логов и временных файлов
### Логи системные
Логи в `/var/log` ротируются автоматически (`logrotate`). Проверить конфигурацию:
```bash
cat /etc/logrotate.conf
```
Принудительная ротация логов:
```bash
logrotate -f /etc/logrotate.conf
```
### Логи Docker
Docker логи по умолчанию не ротируются, но можно настроить их ограничение в `/etc/docker/daemon.json`:
```json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
```
После изменения перезапустить Docker:
```bash
systemctl restart docker
```
### Временные файлы
Очистка `/tmp` (обычно очищается при перезагрузке). Можно настроить `systemd-tmpfiles` для регулярной очистки.
---
## Очистка Docker
### Удаление неиспользуемых образов, контейнеров, томов
```bash
docker system prune -a -f # удалить всё неиспользуемое
docker volume prune -f # удалить неиспользуемые тома
docker image prune -a -f # удалить неиспользуемые образы
```
### Просмотр занимаемого места
```bash
docker system df
```
---
## Проверка резервных копий
Регулярно проверяйте, что резервные копии создаются и могут быть восстановлены.
- Проверка логов Proxmox Backup Server (или VZDump) на наличие ошибок.
- Тестовое восстановление на изолированной среде (хотя бы раз в квартал).
- Проверка, что бэкапы не устарели (срок хранения).
---
## Проверка сертификатов
### Let's Encrypt (NPM)
Сертификаты обновляются автоматически, но иногда процесс может зависнуть.
Проверить статус:
- В интерфейсе NPM: SSL Certificates → статус каждого сертификата.
- В логах NPM:
```bash
docker logs npm 2>&1 | grep -i "renew"
```
### Ручное обновление (если нужно)
В NPM есть кнопка "Renew Now". Также можно перезапустить контейнер:
```bash
docker restart npm
```
---
## Ротация паролей
Рекомендуется менять пароли для:
- Административных учётных записей (Grafana, GitLab, NPM, Bitwarden)
- Пользователей Samba
- Пользователей баз данных
- Ansible Vault (пароль шифрования)
Периодичность: раз в 612 месяцев.
---
## Регламент обслуживания
| Действие | Периодичность | Ответственный | Примечание |
|----------|---------------|---------------|------------|
| Обновление пакетов безопасности (unattended-upgrades) | Ежедневно | Автоматически | Настроено через unattended-upgrades |
| Проверка наличия обновлений пакетов (apt) | Еженедельно | Администратор | `apt list --upgradable` |
| Обновление критических пакетов (вручную) | Еженедельно | Администратор | После проверки совместимости |
| Обновление Docker-образов | Раз в месяц | Администратор | Сначала тестовые, потом prod |
| Очистка логов и временных файлов | Ежемесячно | Администратор | `docker system prune`, `logrotate` |
| Проверка резервных копий | Ежемесячно | Администратор | Просмотр логов PBS, тестовое восстановление |
| Проверка сертификатов | Ежемесячно | Администратор | В NPM; автоматическое обновление обычно работает |
| Тестовое восстановление из бэкапа | Раз в квартал | Администратор | На изолированной среде |
| Ротация паролей | Раз в 612 месяцев | Администратор | Обновить пароли в Ansible Vault и в сервисах |
| Аудит безопасности (полный) | Раз в год | Администратор | Использовать Lynis, OpenVAS |
### Окна обслуживания
- Плановые работы, требующие перезагрузки или остановки сервисов, проводить в выходные дни (суббота, 2:005:00) или в наименее загруженное время.
- Перед любыми изменениями делать резервную копию критических данных.
- После обновлений проверять работоспособность ключевых сервисов (NPM, Samba, Jellyfin, Immich).
---
**Связанные разделы:**
- [Управление конфигурацией (Ansible)](09-ansible.md)
- [Безопасность](10-security.md)
- [Резервное копирование](11-backup.md)
- [Решение проблем](12-troubleshooting.md)