architect/_archive/2025-11-26-cleanup/templates/RUNBOOK.template.md

📘 RUNBOOK - Операционное руководство

Проект: {PROJECT_NAME}
Последнее обновление: {ДАТА}


📑 СОДЕРЖАНИЕ

  1. О документе
  2. Быстрые команды
  3. Запуск и остановка
  4. Типичные сценарии
  5. Алерты и реакция
  6. Процедуры обслуживания
  7. Контакты

📖 О ДОКУМЕНТЕ {#о-документе}

Для кого: Операторы, дежурные, SRE

Назначение: Пошаговые инструкции для типичных операционных задач

Когда использовать:
- Нужно быстро выполнить задачу
- Дежурный не знаком с проектом
- Срочная проблема в production


⚡ БЫСТРЫЕ КОМАНДЫ {#быстрые-команды}

Cheat Sheet

# Статус
systemctl status {PROJECT_NAME}

# Логи (последние 50)
journalctl -u {PROJECT_NAME} -n 50 --no-pager

# Логи (live)
journalctl -u {PROJECT_NAME} -f

# Перезапуск
systemctl restart {PROJECT_NAME}

# Проверка здоровья
curl http://localhost:{PORT}/health

# Диск
df -h

# Память
free -h

# CPU/процессы
top

# БД подключение
sudo -u postgres psql -U {DB_USER} -d {DB_NAME}

🎮 ЗАПУСК И ОСТАНОВКА {#запуск-и-остановка}

Запуск приложения

Когда: После перезагрузки сервера, после обновления

# 1. Проверить что БД запущена
systemctl status postgresql
# Если нет:
systemctl start postgresql

# 2. Запустить приложение
systemctl start {PROJECT_NAME}

# 3. Проверить статус (должен быть active)
systemctl status {PROJECT_NAME}

# 4. Проверить health check
sleep 10  # Подождать 10 секунд
curl http://localhost:{PORT}/health
# Ожидаем: {"status": "ok"}

# 5. Проверить логи на ошибки
journalctl -u {PROJECT_NAME} -n 20 | grep -i error
# Ожидаем: Нет ошибок

Если не запустилось: См. TROUBLESHOOTING.md


Остановка приложения

Когда: Перед обслуживанием, перед обновлением

# 1. Graceful stop (даёт завершить текущие запросы)
systemctl stop {PROJECT_NAME}

# 2. Проверить что остановилось
systemctl status {PROJECT_NAME}
# Ожидаем: inactive (dead)

# 3. Убедиться что порт освободился
lsof -i :{PORT}
# Ожидаем: Нет вывода (порт свободен)

Экстренная остановка (force kill):

systemctl kill {PROJECT_NAME}

Перезапуск приложения

Когда: После обновления, при зависании

# Обычный перезапуск
systemctl restart {PROJECT_NAME}

# Reload (без даунтайма, если поддерживается)
systemctl reload {PROJECT_NAME}

# После перезапуска ВСЕГДА проверять:
systemctl status {PROJECT_NAME}
curl http://localhost:{PORT}/health

🔄 ТИПИЧНЫЕ СЦЕНАРИИ {#типичные-сценарии}

Сценарий 1: Обновление приложения

Цель: Развернуть новую версию в production

Время: 10-15 минут

Шаги:

# 1. BACKUP БД (обязательно!)
/opt/{PROJECT_NAME}/scripts/backup-db.sh
# Проверить что бэкап создан
ls -lh /backup/ | tail -1

# 2. Перейти в папку проекта
cd /opt/{PROJECT_NAME}

# 3. Сохранить текущую версию (для rollback)
git log -1 --oneline > /tmp/version_before.txt

# 4. Обновить код
git fetch --tags
git checkout tags/v{VERSION}

# 5. Обновить зависимости
source venv/bin/activate
pip install -r requirements.txt

# 6. Применить миграции БД
alembic upgrade head

# 7. Перезапустить приложение
systemctl restart {PROJECT_NAME}

# 8. Проверка
sleep 10
systemctl status {PROJECT_NAME}
curl http://localhost:{PORT}/health
journalctl -u {PROJECT_NAME} -n 20 | grep -i error

# 9. Мониторить 10 минут
journalctl -u {PROJECT_NAME} -f
# Ctrl+C для выхода

# 10. Если ОК - уведомить команду
# Если НЕ ОК - rollback (см. ниже)

Rollback при проблемах:

# 1. Остановить приложение
systemctl stop {PROJECT_NAME}

# 2. Вернуть код
git checkout {PREVIOUS_VERSION}

# 3. Откатить миграции
alembic downgrade -1

# 4. Запустить
systemctl start {PROJECT_NAME}

# 5. Проверить
curl http://localhost:{PORT}/health

Сценарий 2: Приложение не отвечает

Симптом: Health check не проходит, 502 ошибка

Цель: Вернуть работоспособность

Время: 5 минут

Шаги:

# 1. Проверить статус
systemctl status {PROJECT_NAME}

# 2. Если crashed (exit-code) - смотреть логи
journalctl -u {PROJECT_NAME} -n 50 | tail -20

# 3. Перезапустить
systemctl restart {PROJECT_NAME}

# 4. Проверить
sleep 5
curl http://localhost:{PORT}/health

# 5. Если ОК - мониторить 5 минут
journalctl -u {PROJECT_NAME} -f

# 6. Если НЕ ОК - эскалировать (позвать разработчиков)

Сценарий 3: Диск заполнен

Симптом: Алерт "Disk usage > 90%"

Цель: Освободить место

Время: 10 минут

Шаги:

# 1. Проверить использование
df -h
du -sh /* | sort -h | tail -10

# 2. Очистить старые логи
find /var/log/{PROJECT_NAME}/ -name "*.log.*" -mtime +30 -delete

# 3. Очистить старые бэкапы (оставить последние 30 дней)
find /backup/ -name "*.sql" -mtime +30 -delete

# 4. Очистить /tmp
find /tmp/ -mtime +7 -delete

# 5. Проверить результат
df -h

# 6. Если < 80% - OK
# Если > 80% - нужно больше места (эскалировать)

Сценарий 4: Медленная работа

Симптом: Пользователи жалуются на тормоза

Цель: Диагностировать и ускорить

Время: 15-20 минут

Шаги:

# 1. Проверить CPU и память
top -bn1 | head -20

# 2. Проверить load average
uptime
# Если > количество ядер CPU - перегрузка

# 3. Проверить БД
sudo -u postgres psql {DB_NAME} -c "SELECT count(*) FROM pg_stat_activity;"
# Если > 50 подключений - проблема

# 4. Найти медленные запросы
sudo -u postgres psql {DB_NAME} -c "SELECT query, mean_time FROM pg_stat_statements WHERE mean_time > 1000 ORDER BY mean_time DESC LIMIT 5;"

# 5. VACUUM БД (может помочь)
sudo -u postgres psql {DB_NAME} -c "VACUUM ANALYZE;"

# 6. Перезапустить приложение (освободит память)
systemctl restart {PROJECT_NAME}

# 7. Проверить стало ли лучше
# Если НЕТ - эскалировать

Сценарий 5: Восстановление из бэкапа

Когда: Потеря данных, критичная ошибка в БД

Время: 30 минут

⚠️ ВНИМАНИЕ: Восстанавливать только по указанию tech lead!

Шаги:

# 1. Остановить приложение
systemctl stop {PROJECT_NAME}

# 2. Создать бэкап текущего состояния (на случай ошибки)
sudo -u postgres pg_dump {DB_NAME} > /tmp/backup_before_restore.sql

# 3. Выбрать файл бэкапа
ls -lh /backup/ | tail -10
# Выбрать нужный файл (например, backup_20251108.sql)

# 4. Восстановить БД
sudo -u postgres psql {DB_NAME} < /backup/backup_20251108.sql

# 5. Проверить данные
sudo -u postgres psql {DB_NAME} -c "SELECT count(*) FROM orders;"

# 6. Запустить приложение
systemctl start {PROJECT_NAME}

# 7. Проверить работоспособность
curl http://localhost:{PORT}/health

# 8. Уведомить команду

🚨 АЛЕРТЫ И РЕАКЦИЯ {#алерты-и-реакция}

Алерт: High CPU Usage (> 85%)

Severity: WARNING

Реакция:

  1. Проверить top (что жрёт CPU)
  2. Если {PROJECT_NAME} - перезапустить
  3. Если другое - эскалировать

Команды:

top -bn1 | head -20
systemctl restart {PROJECT_NAME}

Алерт: High Memory Usage (> 90%)

Severity: CRITICAL

Реакция:

  1. Проверить что жрёт память
  2. Перезапустить приложение
  3. Если не помогло - эскалировать

Команды:

ps aux --sort=-%mem | head -10
systemctl restart {PROJECT_NAME}
free -h

Алерт: Disk Full (> 90%)

Severity: CRITICAL

Реакция:

  1. Очистить логи и бэкапы (см. Сценарий 3)
  2. Если не помогло - эскалировать СРОЧНО

Алерт: Application Down

Severity: CRITICAL

Реакция:

  1. Перезапустить приложение
  2. Если не помогло - позвонить дежурному разработчику
  3. Не ждать > 5 минут

Команды:

systemctl restart {PROJECT_NAME}
systemctl status {PROJECT_NAME}
journalctl -u {PROJECT_NAME} -n 50

Алерт: SSL Certificate Expiring (< 30 days)

Severity: WARNING

Реакция:

  1. Обновить сертификат
  2. Уведомить команду

Команды:

certbot renew
systemctl reload nginx
certbot certificates

🔧 ПРОЦЕДУРЫ ОБСЛУЖИВАНИЯ {#процедуры-обслуживания}

Еженедельное обслуживание

Когда: Каждый понедельник, 09:00

Время: 30 минут

Чеклист:

# 1. Проверить статус
systemctl status {PROJECT_NAME}
systemctl status postgresql

# 2. Проверить ресурсы
df -h  # Диск < 80%
free -h  # Memory нормально
uptime  # Load average OK

# 3. Проверить логи на ошибки
journalctl -u {PROJECT_NAME} --since "7 days ago" | grep -i error | wc -l
# Должно быть < 100

# 4. Проверить бэкапы (должно быть 7 файлов за неделю)
ls -lh /backup/ | tail -10

# 5. Выполнить VACUUM БД
sudo -u postgres psql {DB_NAME} -c "VACUUM ANALYZE;"

# 6. Заполнить отчёт

Ежемесячное обслуживание

Когда: 1-го числа, 10:00

Время: 2 часа

Чеклист:

# 1. Все шаги из еженедельного обслуживания

# 2. Обновить зависимости (в dev сначала!)
pip list --outdated

# 3. Проверить security updates
apt list --upgradable | grep -i security

# 4. Очистить старые бэкапы
find /backup/ -name "*.sql" -mtime +30 -delete

# 5. Проверить SSL сертификаты
certbot certificates

# 6. Выполнить mini load test (опционально)

# 7. Заполнить отчёт обслуживания

📞 КОНТАКТЫ {#контакты}

Эскалация

Уровень 1: Дежурный оператор (вы)
- Решает типичные проблемы по Runbook
- Timeout: 15 минут

Уровень 2: Дежурный разработчик
- Телефон: {ТЕЛЕФОН}
- Telegram: {TELEGRAM}
- Звонить если > 15 минут не можете решить

Уровень 3: Tech Lead
- Телефон: {ТЕЛЕФОН}
- Звонить только при критичных проблемах (data loss, security breach)

Когда эскалировать немедленно

Когда эскалировать через 30 минут


📝 ШАБЛОН ОТЧЁТА ДЕЖУРСТВА

## Отчёт дежурства {ДАТА}

**Дежурный:** {ИМЯ}
**Время:** {ВРЕМЯ_НАЧАЛА} - {ВРЕМЯ_ОКОНЧАНИЯ}

### Статус систем
- Приложение: ✅ OK / ⚠️ Проблемы / ❌ Down
- БД: ✅ OK / ⚠️ Проблемы / ❌ Down
- Диск: {ПРОЦЕНТ}% использовано
- CPU: {ПРОЦЕНТ}% avg
- Memory: {ПРОЦЕНТ}% использовано

### Инциденты
- {ВРЕМЯ}: {ОПИСАНИЕ_ИНЦИДЕНТА}
  - Severity: CRITICAL/WARNING/INFO
  - Действия: {ЧТО_СДЕЛАНО}
  - Результат: Resolved / Escalated

### Выполненные задачи
- [ ] Еженедельное обслуживание
- [ ] {ДРУГИЕ_ЗАДАЧИ}

### Проблемы требующие внимания
- {ПРОБЛЕМА_1}
- {ПРОБЛЕМА_2}

### Рекомендации
- {РЕКОМЕНДАЦИЯ_1}

Последнее обновление: {ДАТА}
Составил: {АВТОР}
Версия Runbook: 1.0