Перейти к содержанию

Мониторинг

Стек: 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

./scripts/ssh-internal.sh 10.99.87.5 "cd /opt/grafana && docker compose restart grafana"

Loki: проверить

./scripts/ssh-internal.sh 10.99.87.5 "curl -s http://localhost:3101/ready"

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 скрипты