Runbook - типовые инциденты¶
⚠ VPN-туннель упал¶
Симптомы:
- В Telegram-боте /health показывает Tradex Replica: ❌
- В Metabase запросы к Tradex Replica падают
- Дашборды показывают пустые значения
Диагностика:
ssh root@$SERVER_IP
systemctl status openvpn-client@tradex
ip a show tun0 # должен быть IP 195.x.x.x или подобный
ping 172.16.130.36 # должно пинговаться
Решение:
Если не помогает - проверить срок VPN-сертификата:
openvpn --config /etc/openvpn/client/tradex.conf --verb 4 --tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384
# Лог покажет "TLS Error: TLS handshake failed" если сертификат истёк
→ Запрос CTO на обновление профиля.
⚠ Metabase не отвечает¶
Симптомы:
- http://$SERVER_IP/ показывает 502 Bad Gateway
- /healthz отвечает ok, /api/health - timeout
Диагностика:
docker compose -f /srv/tradex-analytics/docker-compose.yml ps
docker compose logs --tail=200 metabase
Часто причина - OOM (out of memory). Java heap = 2 GB на 4 GB сервере, при превышении - OOMKiller.
Решение:
Снижение нагрузки: проверить, нет ли «зависшего» SQL-запроса:
docker exec tradex-metabase-db psql -U metabase -d metabase -c "
SELECT pid, query, state, query_start FROM pg_stat_activity
WHERE state = 'active' ORDER BY query_start;
"
⚠ Materialized views не обновились¶
Симптомы:
- Cohort retention показывает старые данные (>1 день)
- /health от бота - Analytics DB OK, но last refresh > 24h назад
Диагностика:
journalctl -u tradex-ltv-refresh.service --since "24 hours ago"
cat /var/log/tradex-ltv-refresh.log | tail -50
Возможные причины: - VPN был down во время refresh - не успел скопировать staging - Long-running запрос держал блокировку - Disk full - copy не прошёл
Решение:
df -h /srv/tradex-analytics # проверка места
systemctl start tradex-ltv-refresh.service # ручной запуск
journalctl -u tradex-ltv-refresh.service -f
⚠ Telegram-бот не отвечает¶
Симптомы: - Команды бота не получают ответ - В Telegram - часы вращаются на сообщении
Диагностика:
Часто - проблема с подключением к Tradex Replica (VPN).
Решение:
docker compose restart tradex-analytics-bot
# Если бот спамит ошибками в ALERT_CHAT_ID - временно отключить через PUBLIC_ACCESS=false
⚠ Sanity-test упал¶
Симптомы:
- make sanity показывает FAIL
- Один из автотестов в sql/sanity_tests/ вернул false
Диагностика:
Тест печатает details с актуальной vs ожидаемой цифрой. По имени теста смотрим в sql/sanity_tests/NN_*.sql и в methodology/METRIC-REGISTRY.md.
Решение:
- Если расхождение <10% - возможно нормальный рост / маркетинг-кампания. Обновить baseline в SQL.
- Если 10-30% - проверить, не изменилась ли структура БД (новый тег? новый state?).
- Если >30% - 🔴 серьёзный bug, не игнорировать. Возможные причины:
- SoftClub перетегировал большую группу юзеров
- Был массовый импорт / удаление в
h_user - Сломалась VPN, кеш Metabase показывает старые данные
⚠ Disk space - заканчивается¶
Симптомы:
- df -h → /srv/tradex-analytics > 80%
- Бэкапы не пишутся
Решение:
# Чистка старых бэкапов
find /srv/tradex-analytics/backups -mtime +90 -delete
# Чистка docker
docker system prune -af
# Если всё равно мало - увеличить диск через TimeWeb API
# или добавить external storage volume
Контакты при инциденте¶
- Дмитрий (исполнитель): @dmitry_username, SLA по retainer - 1 рабочий день
- CTO Tradex (Tradex CTO): для проблем с VPN-сертификатом и доступом
Алерты от бота приходят в ALERT_CHAT_ID (личка Дмитрия) - не дублируются в общий чат, чтобы не спамить.