Проект: {PROJECT_NAME}
Последнее обновление: {ДАТА}
Для кого: Операторы, дежурные, SRE
Назначение: Пошаговые инструкции для типичных операционных задач
Когда использовать:
- Нужно быстро выполнить задачу
- Дежурный не знаком с проектом
- Срочная проблема в production
# Статус
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
Цель: Развернуть новую версию в 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
Симптом: 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. Если НЕ ОК - эскалировать (позвать разработчиков)
Симптом: Алерт "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% - нужно больше места (эскалировать)
Симптом: Пользователи жалуются на тормоза
Цель: Диагностировать и ускорить
Время: 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. Проверить стало ли лучше
# Если НЕТ - эскалировать
Когда: Потеря данных, критичная ошибка в БД
Время: 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. Уведомить команду
Severity: WARNING
Реакция:
Команды:
top -bn1 | head -20
systemctl restart {PROJECT_NAME}
Severity: CRITICAL
Реакция:
Команды:
ps aux --sort=-%mem | head -10
systemctl restart {PROJECT_NAME}
free -h
Severity: CRITICAL
Реакция:
Severity: CRITICAL
Реакция:
Команды:
systemctl restart {PROJECT_NAME}
systemctl status {PROJECT_NAME}
journalctl -u {PROJECT_NAME} -n 50
Severity: WARNING
Реакция:
Команды:
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)
## Отчёт дежурства {ДАТА}
**Дежурный:** {ИМЯ}
**Время:** {ВРЕМЯ_НАЧАЛА} - {ВРЕМЯ_ОКОНЧАНИЯ}
### Статус систем
- Приложение: ✅ OK / ⚠️ Проблемы / ❌ Down
- БД: ✅ OK / ⚠️ Проблемы / ❌ Down
- Диск: {ПРОЦЕНТ}% использовано
- CPU: {ПРОЦЕНТ}% avg
- Memory: {ПРОЦЕНТ}% использовано
### Инциденты
- {ВРЕМЯ}: {ОПИСАНИЕ_ИНЦИДЕНТА}
- Severity: CRITICAL/WARNING/INFO
- Действия: {ЧТО_СДЕЛАНО}
- Результат: Resolved / Escalated
### Выполненные задачи
- [ ] Еженедельное обслуживание
- [ ] {ДРУГИЕ_ЗАДАЧИ}
### Проблемы требующие внимания
- {ПРОБЛЕМА_1}
- {ПРОБЛЕМА_2}
### Рекомендации
- {РЕКОМЕНДАЦИЯ_1}
Последнее обновление: {ДАТА}
Составил: {АВТОР}
Версия Runbook: 1.0