Мониторинг¶
Стек: Prometheus + Grafana + Loki | Сервер: 10.99.87.5 | URL: https://monitor.karmann.tech
Инфраструктура¶
| Компонент | Версия | Порт | Контейнер |
|---|---|---|---|
| Grafana | 12.1.0 | 3001 | grafana-grafana-1 |
| Prometheus | 3.5.0 | 9091 | grafana-prometheus-1 |
| Loki | 3.5.3 | 3101 | grafana-loki-1 |
| Blackbox Exporter | v0.25.0 | 9115 | grafana-blackbox-1 |
| Node Exporter | v1.9.1 | 9101 | grafana-node-exporter-1 |
Docker Compose: /opt/grafana/docker-compose.yml на 10.99.87.5
Prometheus retention: 7 дней / 20 GB.
Prometheus: таргеты из Ansible¶
Source of truth: Ansible inventory
Все Prometheus targets генерируются из Ansible inventory (hosts.yml, YAML, 305+ хостов).
Добавил/убрал сервер в inventory → прогнал playbook → Prometheus подхватит.
Процедура обновления таргетов¶
# 1. Изменить inventory (группы vpn, vpn_remnawave, vpn_wl_proxy, api_vpn, api_db)
vim ansible/shiva-ansible/inventory/hosts.yml
# 2. Задеплоить
cd ansible/shiva-ansible
ansible-playbook playbooks/update-prometheus.yml
# 3. Prometheus подхватит через 5 минут (file_sd refresh_interval)
Если Ansible недоступен — сгенерить JSON локально из шаблонов, залить SCP:
scp -o ProxyJump="root@212.70.189.60:2255" targets/*.json root@10.99.87.5:/opt/grafana/prometheus/targets/
./scripts/ssh-internal.sh 10.99.87.5 "docker compose -f /opt/grafana/docker-compose.yml restart prometheus"
Структура файлов¶
/opt/grafana/prometheus/
├── prometheus.yml # Основной конфиг (из prometheus.yml.j2)
├── alert-rules.yml # Prometheus alert rules
└── targets/ # file_sd JSON (из inventory)
├── vpn-servers.json # Группа: vpn (56 серверов, HTTPS+auth)
├── remnawave.json # Группа: vpn_remnawave минус дубли с vpn
├── wl-proxies.json # Группа: vpn_wl_proxy / whitelist-vk-*
├── infra-https.json # Группы: api_vpn + vpn-app02 (4 сервера, HTTPS+auth)
└── infra-plain.json # Группа: api_db (3 сервера, plain HTTP)
Ansible шаблоны: roles/grafana/templates/targets/*.json.j2
Jobs (16)¶
| Job | Тип | Targets | Описание |
|---|---|---|---|
| vpn-servers | file_sd | 48 | VPN серверы (HTTPS+auth) |
| remnawave | file_sd | 15 | Remnawave ноды (HTTPS+auth, дедупликация с vpn) |
| wl-proxies | file_sd | 11 | WL stream прокси (HTTPS+auth) |
| infra-https | file_sd | 4 | API/backend серверы (HTTPS+auth) |
| infra-plain | file_sd | 3 | Database серверы (plain HTTP) |
| mysql-exporter | static | 3 | MySQL exporters (:9104) |
| redis-exporter | static | 3 | Redis exporters (:9121) |
| URA | static | 2 | URA серверы |
| vpn-config-service | static | 1 | VPN Config Service /metrics |
| backend-app-metrics | static | 1 | Spring Boot actuator |
| prometheus-self | static | 1 | Docker node-exporter (self) |
| blackbox-* | static | 3 | HTTP/TCP probes |
| support-monitor | static | 1 | Support monitor |
| xray-health-checker | static | 1 | VLESS health checker |
Итого: 97 targets (84 UP, 13 DOWN — после S01 cleanup 25 Mar 2026)
Datasources Grafana (4)¶
| Имя | Тип | Хост |
|---|---|---|
| prometheus | Prometheus | localhost:9090 (docker network) |
| loki | Loki | localhost:3100 (docker network) |
| MySQL ShivaVPN | MySQL | 10.99.87.62 |
| PostgreSQL VPN Config | PostgreSQL | 10.99.87.249:5434 |
Dashboards (~50)¶
| Папка | Кол-во | Описание |
|---|---|---|
| Business | 2 | Выручка, ARPU, подписки, когортный анализ |
| Product | 2 | Онлайн 24h, карта мира |
| DevOps | 4 | VPN operations, server details, WL proxy, sync queue |
| Infrastructure | 3 | Fleet overview, Node Exporter Full, MySQL |
| Security | 1 | Заблокированные IP |
| Traffic per Server | 34 | Автогенерация grafana_sync worker |
| v2/ | 7 | Abuse, geographic, activity, remnawave, SLA, API security, logs |
| Legacy | 4 | Старые дашборды |
Alert Rules (Grafana Alerting)¶
| Алерт | Datasource | Contact | Интервал |
|---|---|---|---|
| VPN: Sync Stale | PostgreSQL | tg-vpn | 1h |
| VPN: Mass Server Drop | PostgreSQL | tg-vpn | 1h |
| VPN: Online Zero | PostgreSQL | tg-vpn | 1h |
| VPN: Sync Errors | PostgreSQL | tg-vpn | 1h |
| VPN: Sync Queue Overflow | Prometheus | tg-vpn | 1h |
| VPN: Online Crash >50% | PostgreSQL | tg-vpn | 1h |
| RAM / CPU / DISK / Inodes | Prometheus | tg | 4h |
Contact Points:
| Имя | Telegram | Назначение |
|---|---|---|
| tg | -1003053411512 | Общий канал |
| tg-vpn | 28795547 (zardes) | VPN алерты |
AlertManager удалён
AlertManager (10.99.87.2:9093) удалён из конфига — connection refused, недоступен.
Prometheus alert-rules.yml (16 правил) стреляют в пустоту — идёт миграция в Grafana Alerting.
Все рабочие алерты — через Grafana Alerting (10 правил).
Диск (10.99.87.5)¶
| Путь | Размер | Использовано |
|---|---|---|
| / | 48G | ~35G (77%) |
| Prometheus TSDB | ~14G | — |
| Loki data | ~3.5G | — |
Операции¶
Проверить статус таргетов¶
# Количество UP/DOWN
./scripts/ssh-internal.sh 10.99.87.5 "docker exec grafana-prometheus-1 \
wget -qO- http://localhost:9090/api/v1/targets" 2>/dev/null | \
python3 -c "import json,sys; d=json.load(sys.stdin); \
up=sum(1 for t in d['data']['activeTargets'] if t['health']=='up'); \
down=sum(1 for t in d['data']['activeTargets'] if t['health']=='down'); \
print(f'{up} UP, {down} DOWN, {up+down} total')"
Перезагрузить Prometheus конфиг¶
./scripts/ssh-internal.sh 10.99.87.5 "docker compose -f /opt/grafana/docker-compose.yml restart prometheus"
Рестарт Grafana¶
Loki: проверить¶
Uptime Kuma¶
Внешний мониторинг доступности VPN серверов.
python3 scripts/kuma-sync.py diff # Расхождения
python3 scripts/kuma-sync.py sync --remove # Синхронизировать
python3 scripts/kuma-sync.py list # Все мониторы
После изменения серверов
Запускать kuma-sync.py sync --remove для актуализации.
См. также: Каталог метрик · Grafana Dashboards · Runbooks · DevOps скрипты