diff --git a/README.md b/README.md index acefae9..e829e93 100644 --- a/README.md +++ b/README.md @@ -11,13 +11,13 @@ - [Виртуальные машины и LXC](docs/03-vms-lxcs.md) - [Сеть и доступ](docs/04-network.md) - [Samba – файловые шары](docs/05-samba.md) -- [Сервисы и порты](docs/06-services.md) *(в разработке)* -- [Проксирование и SSL (NPM)](docs/07-proxy-ssl.md) *(в разработке)* -- [Мониторинг и логирование](docs/08-monitoring.md) *(в разработке)* -- [Управление конфигурацией (Ansible)](docs/09-ansible.md) *(в разработке)* -- [Безопасность](docs/10-security.md) *(в разработке)* -- [Резервное копирование](docs/11-backup.md) *(в разработке)* -- [Решение проблем](docs/12-troubleshooting.md) *(в разработке)* +- [Сервисы и порты](docs/06-services.md) +- [Проксирование и SSL (NPM)](docs/07-proxy-ssl.md) +- [Мониторинг и логирование](docs/08-monitoring.md) +- [Управление конфигурацией (Ansible)](docs/09-ansible.md) +- [Безопасность](docs/10-security.md) +- [Резервное копирование](docs/11-backup.md) +- [Решение проблем](docs/12-troubleshooting.md) ## 🚀 Краткий обзор diff --git a/docs/08-monitoring.md b/docs/08-monitoring.md new file mode 100644 index 0000000..8a995c4 --- /dev/null +++ b/docs/08-monitoring.md @@ -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) \ No newline at end of file diff --git a/docs/09-ansible.md b/docs/09-ansible.md new file mode 100644 index 0000000..26d317f --- /dev/null +++ b/docs/09-ansible.md @@ -0,0 +1,243 @@ +# 09. Управление конфигурацией (Ansible) + +## Обзор + +Для автоматизации развёртывания и поддержки инфраструктуры используется **Ansible**. Управляющий хост — `ansible` (192.168.1.210). Все конфигурации хранятся в репозитории, секреты зашифрованы с помощью Ansible Vault. + +## Структура репозитория + +``` +ansible/ +├── inventory/ +│ └── hosts # файл инвентаря +├── group_vars/ +│ ├── all.yml # общие переменные (несекретные) +│ └── vault.yml # зашифрованные секреты +├── roles/ +│ ├── base_setup/ # базовая настройка всех хостов +│ ├── system_cleanup/ # удаление ненужных пакетов +│ ├── docker/ # установка Docker, настройка мониторинга +│ ├── npm/ # Nginx Proxy Manager +│ ├── heimdall/ # Heimdall дашборд +│ ├── mealie/ # Mealie +│ ├── bookstack/ # BookStack +│ ├── bitwarden/ # Bitwarden (Vaultwarden) +│ ├── ampache/ # Ampache +│ ├── audiobookshelf/ # Audiobookshelf +│ ├── calibre-web/ # Calibre-web +│ ├── jellyfin/ # Jellyfin +│ ├── flibusta/ # Flibusta +│ ├── immich/ # Immich +│ ├── mumble/ # Mumble +│ ├── teamspeak/ # TeamSpeak +│ ├── minecraft/ # Minecraft (закомментирована) +│ ├── meshcentral/ # MeshCentral +│ ├── grafana/ # Grafana +│ ├── loki/ # Loki +│ ├── gitlab/ # GitLab +│ ├── torrserver/ # TorrServer +│ ├── qbittorrent/ # qBittorrent +│ ├── promtail/ # Promtail (сбор логов) +│ ├── cadvisor/ # cAdvisor (закомментирована) +│ ├── proxmox_base_setup/ # настройка Proxmox хоста +│ └── proxmox_monitoring/ # настройка Proxmox VE Exporter +└── olimp-deploy.yml # основной playbook +``` + +## Инвентарь (`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) \ No newline at end of file