Compare commits
No commits in common. "ca183215eee225b7aa35ed4a73b91f0653273b30" and "7f06bc25c7b6c34f88d377e88290f3effa18f26a" have entirely different histories.
ca183215ee
...
7f06bc25c7
108
README.md
108
README.md
@ -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 года. Регулярно обновляется по мере изменений в инфраструктуре.
|
||||
@ -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)
|
||||
@ -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
60
docs/03-vms-lxcs.md
Normal 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
212
docs/04-network.md
Normal 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.100–192.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
414
docs/04b-olimpvpn.md
Normal 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
226
docs/05-samba.md.md
Normal 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
165
docs/06-services.md
Normal 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
105
docs/07-proxy-ssl.md
Normal 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
169
docs/08-monitoring.md
Normal 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
174
docs/09-ansible-overview.md
Normal 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 года. По мере изменений в инфраструктуре разделы будут обновляться.
|
||||
156
docs/09-ansible-playbooks.md
Normal file
156
docs/09-ansible-playbooks.md
Normal 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)*
|
||||
210
docs/09-ansible-roles-common.md
Normal file
210
docs/09-ansible-roles-common.md
Normal 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)*
|
||||
489
docs/09-ansible-variables.md
Normal file
489
docs/09-ansible-variables.md
Normal 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
253
docs/09-ansible.md
Normal 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
344
docs/10-security.md
Normal 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
1159
docs/11-backup.md
Normal file
File diff suppressed because it is too large
Load Diff
289
docs/12-troubleshooting.md
Normal file
289
docs/12-troubleshooting.md
Normal 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
264
docs/13-maintenance.md
Normal 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 (пароль шифрования)
|
||||
|
||||
Периодичность: раз в 6–12 месяцев.
|
||||
|
||||
---
|
||||
|
||||
## Регламент обслуживания
|
||||
|
||||
| Действие | Периодичность | Ответственный | Примечание |
|
||||
|----------|---------------|---------------|------------|
|
||||
| Обновление пакетов безопасности (unattended-upgrades) | Ежедневно | Автоматически | Настроено через unattended-upgrades |
|
||||
| Проверка наличия обновлений пакетов (apt) | Еженедельно | Администратор | `apt list --upgradable` |
|
||||
| Обновление критических пакетов (вручную) | Еженедельно | Администратор | После проверки совместимости |
|
||||
| Обновление Docker-образов | Раз в месяц | Администратор | Сначала тестовые, потом prod |
|
||||
| Очистка логов и временных файлов | Ежемесячно | Администратор | `docker system prune`, `logrotate` |
|
||||
| Проверка резервных копий | Ежемесячно | Администратор | Просмотр логов PBS, тестовое восстановление |
|
||||
| Проверка сертификатов | Ежемесячно | Администратор | В NPM; автоматическое обновление обычно работает |
|
||||
| Тестовое восстановление из бэкапа | Раз в квартал | Администратор | На изолированной среде |
|
||||
| Ротация паролей | Раз в 6–12 месяцев | Администратор | Обновить пароли в Ansible Vault и в сервисах |
|
||||
| Аудит безопасности (полный) | Раз в год | Администратор | Использовать Lynis, OpenVAS |
|
||||
|
||||
### Окна обслуживания
|
||||
|
||||
- Плановые работы, требующие перезагрузки или остановки сервисов, проводить в выходные дни (суббота, 2:00–5:00) или в наименее загруженное время.
|
||||
- Перед любыми изменениями делать резервную копию критических данных.
|
||||
- После обновлений проверять работоспособность ключевых сервисов (NPM, Samba, Jellyfin, Immich).
|
||||
|
||||
---
|
||||
|
||||
**Связанные разделы:**
|
||||
- [Управление конфигурацией (Ansible)](09-ansible.md)
|
||||
- [Безопасность](10-security.md)
|
||||
- [Резервное копирование](11-backup.md)
|
||||
- [Решение проблем](12-troubleshooting.md)
|
||||
Loading…
Reference in New Issue
Block a user