Runbook
Это предварительный runbook. Исходные raw-данные по инфраструктурным репозиториям (deployer, infrastructure, apps) пусты — процедуры составлены на основе архитектурного контекста и общих практик Kubernetes/Helm. Все команды и шаги требуют валидации на staging перед использованием в production. Не используйте эти инструкции без предварительной проверки DevOps-командой.
Деплой
Стандартный деплой
Ниже описана ожидаемая последовательность на основе архитектурного контекста. Конкретные команды уточняйте у DevOps-команды.
- Убедиться, что CI/CD pipeline завершился успешно
- Мерж в main-ветку, как правило, запускает автоматический деплой через ArgoCD
- Helm chart обновляет Kubernetes deployment
- Pod verification выполняет smoke-тесты
- Проверить Sentry на отсутствие новых ошибок
Ручной деплой через Deployer
Репозиторий dot.mind/devops/deployer предоставляет пайплайн для разового ручного деплоя зонтичного чарта dumatel-system в namespace dev01:
# Запускается вручную из GitLab CI (ветка main)
# Переменные: KUBECONFIG_DINA (base64), DOCKER_REGISTRY_USER, DOCKER_REGISTRY_PASSWORD
helm registry login -u "$DOCKER_REGISTRY_USER" -p "$DOCKER_REGISTRY_PASSWORD" cr.selcloud.ru
helm dependency build charts/dumatel-system/
helm upgrade --install dumatel-system --namespace dev01 charts/dumatel-system/
Откат
- Определить проблемный релиз в Helm history
- Откат к предыдущей версии (предполагаемая команда:
helm rollback <release> <revision>— уточните revision у DevOps) - Проверить pod health после отката
- Зафиксировать инцидент
Типичные инциденты
Pod в CrashLoopBackOff
Симптомы: Pod перезагружается каждые несколько секунд.
Диагностика:
kubectl logs <pod> --previous # Логи предыдущего запуска
kubectl describe pod <pod> # События и причины рестарта
Частые причины:
- Неверные environment variables (NATS_HOST, DATABASE_URL)
- Нехватка памяти (OOMKilled)
- Ошибка инициализации БД (миграции не применены)
Решение:
- Проверить configmap и secrets
- Увеличить resource limits при OOMKilled
- При ошибке миграций — запустить миграцию вручную
NATS JetStream недоступен
Симптомы: Сообщения не обрабатываются, consumer lag растёт.
Диагностика:
kubectl get pods -l app=nats # Статус NATS pods
nats stream ls # Список потоков
nats consumer info <stream> <consumer> # Статус consumer
Решение:
- Перезапустить NATS pods при необходимости
- Проверить network policies
- Очистить stuck consumers:
nats consumer rm <stream> <consumer>
Высокий response time
Симптомы: P95 latency > 5s, пользователи жалуются на медленность.
Диагностика:
- Проверить CPU/Memory через
kubectl top pods - Проверить PostgreSQL slow query log
- Проверить NATS consumer lag
Решение:
- Масштабировать HPA:
kubectl scale deployment <name> --replicas=<N> - Оптимизировать медленные запросы
- Добавить индексы при необходимости
Ошибки отправки email (Gull)
Симптомы: Email не доставляются, ошибки в Sentry.
Диагностика:
- Проверить логи Gull worker
- Проверить SMTP connectivity
- Проверить очередь NATS для email-задач
Решение:
- Проверить SMTP credentials в secrets
- При массовой блокировке — связаться с провайдером
- Retry через Orker автоматически повторит неудачные попытки
Управление базой данных
Миграции
# Проверить текущую версию
alembic current
# Применить все миграции
alembic upgrade head
# Откатить последнюю
alembic downgrade -1
# Проверить целостность
alembic upgrade head && alembic downgrade base # CI тест
Важно: миграции управляются централизованно через пакет sqlalchemy-models-and-migrations.
Бэкапы
- PostgreSQL: автоматические бэкапы через
pgbackrest(роль Ansibleansible/roles/pgbackrest/подтверждена в инфраструктурном репозитории). Расписание бэкапов не зафиксировано в raw-данных — уточняйте у DevOps-команды. - Проверка восстановления — периодически
Контакты
| Роль | Канал |
|---|---|
| On-call инженер | По расписанию |
| Backend team | Slack/Teams |
| DevOps team | Slack/Teams |
| Sentry | https://sentry.io (проект Думатель) |