Пара 25 / Резерв
Game day: выпуск с аварией Работать по ролям, сохранить факты, восстановить сервис и написать разбор инцидента.
Работать по ролям, сохранить факты, восстановить сервис и написать разбор инцидента. Команда из 2–3 человек распределяет роли: координатор формулирует симптом и следующий шаг, оператор выполняет адресные действия, наблюдатель ведёт временную линию. Если участников двое, координатор ведёт журнал. Никто не «чинит всё» параллельно без согласования, иначе теряется причинность. Область эксперимента — собственный Compose project на localhost; production-сервер курса не является полигоном. Перед стартом есть backup, исходная версия и smoke. Цель — восстановить пользовательский путь и показать доказательства, а не угадать тайную команду преподавателя.
Контекст Один координирует, другой проверяет, третий фиксирует.
Работать по ролям, сохранить факты, восстановить сервис и написать разбор инцидента.
Команда из 2–3 человек распределяет роли: координатор формулирует симптом и следующий шаг, оператор выполняет адресные действия, наблюдатель ведёт временную линию. Если участников двое, координатор ведёт журнал. Никто не «чинит всё» параллельно без согласования, иначе теряется причинность. Область эксперимента — собственный Compose project на localhost; production-сервер курса не является полигоном. Перед стартом есть backup, исходная версия и smoke. Цель — восстановить пользовательский путь и показать доказательства, а не угадать тайную команду преподавателя.
Роли уменьшают хаос Один координирует, другой проверяет, третий фиксирует.
01 Координатор
02 Оператор
03 Наблюдатель
04 Общий журнал
Аналогия: пожарная команда делит задачи, а не все бегут к одному вентилю.
Команда из 2–3 человек распределяет роли: координатор формулирует симптом и следующий шаг, оператор выполняет адресные действия, наблюдатель ведёт временную линию. Если участников двое, координатор ведёт журнал. Никто не «чинит всё» параллельно без согласования, иначе теряется причинность. Область эксперимента — собственный Compose project на localhost; production-сервер курса не является полигоном. Перед стартом есть backup, исходная версия и smoke. Цель — восстановить пользовательский путь и показать доказательства, а не угадать тайную команду преподавателя.
Восстановление раньше большого рефакторинга Уменьшаем воздействие обратимым изменением.
01 Симптом / факты
→ 02 Снижение воздействия
→ 03 Smoke
→ 04 Причина / профилактика
Аналогия: сначала останавливаем течь, потом меняем конструкцию водопровода.
Если причина связана с новым выпуском и есть проверенный v1, возврат может быть быстрее исправления сложного кода. Сначала сохраняем достаточные факты, чтобы не потерять возможность расследования, затем возвращаем сервис. Нельзя удалять volume, менять весь firewall или переустанавливать Docker в ответ на локальный отказ. После восстановления повторяем исходный пользовательский запрос, проверяем версию, ошибки и данные. Коренная причина может потребовать отдельной работы; не заявляем её устранённой, если выполнен только rollback.
Разбор без поиска виноватого Объясняем, как условия позволили ошибке пройти.
01 Воздействие
→ 02 Временная линия
→ 03 Условия сбоя
→ 04 Конкретное улучшение
Аналогия: расследование аварии улучшает систему, а не только находит фамилию.
Postmortem содержит воздействие, временную линию, подтверждённую причину, восстановление и улучшения с владельцем. Пишем «проверка не покрывала неверный MODEL_PATH», а не «Петя невнимательный». Для каждого улучшения нужна связь с причиной: тест конфигурации, smoke после выпуска, точная версия, restore-check. Не перечисляем десять абстрактных best practices. Оцениваем ход рассуждения и честность доказательств. Если причину не нашли полностью, укажите, какая гипотеза осталась и какие данные нужны.
Команды и наблюдения Ubuntu / Bash, lab; преподаватель выбирает один сценарий
bash scripts/smoke.sh
# Scenario: missing model artifact on the next launch
MODEL_PATH=/app/models/missing.json docker compose up -d --force-recreate app
docker compose ps
docker compose logs --tail 30 app
MODEL_PATH=/app/models/model.json docker compose up -d --force-recreate app
bash scripts/smoke.shСценарий проводится только в учебном lab. Перед началом остановите конфликтующие ручные запуски и подготовьте backup. Ожидаемое наблюдение: app не проходит запуск с отсутствующим артефактом; журнал называет причину; корректный путь восстанавливает пользовательский запрос.
Разбор результата app не проходит запуск с отсутствующим артефактом; журнал называет причину; корректный путь восстанавливает пользовательский запрос.
Сценарий проводится только в учебном lab. Перед началом остановите конфликтующие ручные запуски и подготовьте backup.
Ключ сценариев: порт — сверить URL и ss/docker compose ps; артефакт — проверить MODEL_PATH и журнал раннего отказа; задержка — сравнить latency и конфигурацию, вернуть DELAY_MS=0; остановка — start app и smoke. Не внедряйте настоящую потерю данных. Если команда застряла, подсказка первого уровня — выбрать слой DNS/TCP/HTTP/process/config, второго — показать релевантный лог, третьего — предложить обратимое восстановление.
На macOS Game day выполняется в своём Docker/Compose project. Для native Mac используйте lsof вместо ss; системные службы macOS и личные данные не затрагиваются.
docker compose ps
docker compose logs --tail 30 app
bash scripts/smoke.shКоманды macOS необходимо проверить на конкретном устройстве. Game day выполняется в своём Docker/Compose project. Для native Mac используйте lsof вместо ss; системные службы macOS и личные данные не затрагиваются.
Командная аварийная тренировка За 5 минут запишите baseline: версия, healthz, predict, число событий. Преподаватель выбирает неверный порт клиента, отсутствующий артефакт, DELAY_MS=1000 или остановку app. За 20 минут восстановите сервис по runbook, фиксируя команды и время. За 15 минут напишите postmortem и предложите одну профилактику, затем поменяйтесь ролями и повторите короткий сценарий. Работа в парах: один оператор, второй проверяет гипотезу. Смена ролей в середине. Ключ сценариев: порт — сверить URL и ss/docker compose ps; артефакт — проверить MODEL_PATH и журнал раннего отказа; задержка — сравнить latency и конфигурацию, вернуть DELAY_MS=0; остановка — start app и smoke. Не внедряйте настоящую потерю данных. Если команда застряла, подсказка первого уровня — выбрать слой DNS/TCP/HTTP/process/config, второго — показать релевантный лог, третьего — предложить обратимое восстановление.
Что должно получиться incident-report.md с доказанным восстановлением и одним улучшением.
Изменения ограничены своим lab; исходный volume сохранён; все настройки вернулись к baseline.
Ключ сценариев: порт — сверить URL и ss/docker compose ps; артефакт — проверить MODEL_PATH и журнал раннего отказа; задержка — сравнить latency и конфигурацию, вернуть DELAY_MS=0; остановка — start app и smoke. Не внедряйте настоящую потерю данных. Если команда застряла, подсказка первого уровня — выбрать слой DNS/TCP/HTTP/process/config, второго — показать релевантный лог, третьего — предложить обратимое восстановление.
Ошибка для диагностики Устранив симптом, команда заявляет, что коренная причина доказана без журнала и проверки.
Симптом → Гипотеза → Проверка
Ключ сценариев: порт — сверить URL и ss/docker compose ps; артефакт — проверить MODEL_PATH и журнал раннего отказа; задержка — сравнить latency и конфигурацию, вернуть DELAY_MS=0; остановка — start app и smoke. Не внедряйте настоящую потерю данных. Если команда застряла, подсказка первого уровня — выбрать слой DNS/TCP/HTTP/process/config, второго — показать релевантный лог, третьего — предложить обратимое восстановление.
Основные выводы Воздействие, временная линия, восстановление и конкретное улучшение. Только если причина доказана и именно это действие её устраняет; обычно это восстановление. Воздействие, временная линия, восстановление и конкретное улучшение.
Только если причина доказана и именно это действие её устраняет; обычно это восстановление.
После пары Подготовить итоговую демонстрацию и проверить все инструкции на чистом окружении.
Конспект, команды и разбор → Проверьте критерии сдачи и дайте возможность повторной попытки. Первоисточники: https://sre.google/sre-book/managing-incidents/ https://sre.google/sre-book/postmortem-culture/
Пара 26 / Резерв
Итог: воспроизводимый и наблюдаемый сервис Показать полный путь от чистого checkout до проверенного выпуска и восстановления.
Показать полный путь от чистого checkout до проверенного выпуска и восстановления. Итоговый комплект: код, артефакт, версия окружения, тесты, Dockerfile, Compose, метрики, dashboard, runbook, release-report и restore-report. README объясняет условия, команды запуска, ожидаемый результат и типичные ошибки. Не требуем Kubernetes и Terraform: надёжный маленький сервис полезнее набора неосмысленных конфигураций. Демонстрация начинается из копии проекта без .venv, контейнера и локальных скрытых настроек. Допускается заранее скачанный базовый образ, если сеть аудитории нестабильна; это явно записывается как условие, а не скрывается.
Контекст README должен вести нового человека по реальному пути.
Показать полный путь от чистого checkout до проверенного выпуска и восстановления.
Итоговый комплект: код, артефакт, версия окружения, тесты, Dockerfile, Compose, метрики, dashboard, runbook, release-report и restore-report. README объясняет условия, команды запуска, ожидаемый результат и типичные ошибки. Не требуем Kubernetes и Terraform: надёжный маленький сервис полезнее набора неосмысленных конфигураций. Демонстрация начинается из копии проекта без .venv, контейнера и локальных скрытых настроек. Допускается заранее скачанный базовый образ, если сеть аудитории нестабильна; это явно записывается как условие, а не скрывается.
Передача проекта README должен вести нового человека по реальному пути.
01 Чистая копия
→ 02 Инструкция
→ 03 Проверки
→ 04 Рабочий пользовательский путь
Аналогия: хорошо оснащённая мастерская может работать с новой сменой.
Итоговый комплект: код, артефакт, версия окружения, тесты, Dockerfile, Compose, метрики, dashboard, runbook, release-report и restore-report. README объясняет условия, команды запуска, ожидаемый результат и типичные ошибки. Не требуем Kubernetes и Terraform: надёжный маленький сервис полезнее набора неосмысленных конфигураций. Демонстрация начинается из копии проекта без .venv, контейнера и локальных скрытых настроек. Допускается заранее скачанный базовый образ, если сеть аудитории нестабильна; это явно записывается как условие, а не скрывается.
Доказательства по слоям Состояния «написано», «проверено» и «запущено» не взаимозаменяемы.
01 Код / SHA
→ 02 Тесты / образ
→ 03 Запуск / smoke
→ 04 Наблюдение / восстановление
Аналогия: проект здания, акт испытаний и заселённый дом подтверждают разные стадии.
Код в репозитории показывает намерение. Тесты показывают пройденные проверки. Образ показывает упаковку. Работающий контейнер показывает процесс. Smoke показывает выбранный пользовательский путь, dashboard — наблюдение во времени, restore-check — восстановление конкретной копии. Каждый шаг имеет предел доказательства. Студент должен назвать, что именно проверено и что остаётся вне курса: высокая доступность, качество реальной модели, большие данные, внешняя production-нагрузка. Это зрелая инженерная привычка, а не повод обесценивать учебный результат.
Дальнейший маршрут Следующий инструмент выбираем по проблеме проекта.
01 Linux / Git
→ 02 Контейнеры / CI
→ 03 Наблюдаемость
→ 04 Следующая реальная задача
Аналогия: карта страны помогает выбрать маршрут, но не требует посетить все города за одну поездку.
После курса студент умеет работать с Linux, Git, контейнерами, CI и базовой наблюдаемостью. Kubernetes нужен при задачах оркестрации, а не как обязательный фон любого Python-скрипта. Infrastructure as Code полезен, когда окружения нужно воспроизводить и изменять управляемо. MLOps добавит управление данными, экспериментами, модельными артефактами и качеством, но основы доставки уже понятны. roadmap.sh используем как карту возможных направлений: нельзя пройти всю карту за три месяца без потери понимания. Каждый студент выбирает следующую конкретную проблему своего проекта и объясняет выбор.
Команды и наблюдения Ubuntu / Bash, новая учебная копия
python3 -m unittest discover -s tests -v
docker compose config --quiet
docker compose up -d --build
bash scripts/smoke.sh
docker compose -f compose.yaml -f compose.monitoring.yaml up -d
python3 scripts/load.py --requests 30 --concurrency 2
bash scripts/backup.shИтоговая демонстрация выполняется в новой папке/Compose project с отдельными портами либо после безопасной остановки старого проекта без удаления данных. Ожидаемое наблюдение: Новая копия запускается по README; тесты и smoke проходят; metrics доступны, backup проверяемый.
Разбор результата Новая копия запускается по README; тесты и smoke проходят; metrics доступны, backup проверяемый.
Итоговая демонстрация выполняется в новой папке/Compose project с отдельными портами либо после безопасной остановки старого проекта без удаления данных.
Оценка из 100: Linux/диагностика 20, Git/воспроизводимость 15, Docker/Compose 20, CI/контракт 15, наблюдаемость 15, восстановление и объяснение 15. Для каждого пункта есть наблюдаемое доказательство в docs/assessment.md. Повторная попытка после обратной связи разрешена; личные секреты в репозитории требуют немедленной безопасной коррекции до зачёта. Отсутствие дорогого ноутбука не снижает оценку: команда может демонстрировать на одном готовом рабочем месте.
На macOS Итог можно защищать на macOS с Docker Desktop. Linux-specific знания проверяются объяснением и предыдущим упражнением Ubuntu. В README обязательно укажите ОС, CPU-архитектуру и отличия команды.
python3 -m unittest discover -s tests -v
docker compose config --quiet
docker compose up -d --build
bash scripts/smoke.shКоманды macOS необходимо проверить на конкретном устройстве. Итог можно защищать на macOS с Docker Desktop. Linux-specific знания проверяются объяснением и предыдущим упражнением Ubuntu. В README обязательно укажите ОС, CPU-архитектуру и отличия команды.
Защита проекта За 5 минут покажите запуск и SHA, объясните структуру проекта. За 3 минуты покажите нормальный и неправильный запрос, тест и метрику. За 5 минут восстановите выбранный безопасный отказ по runbook. За 2 минуты объясните backup/rollback и ограничения результата; рецензент запускает одну команду из README. Работа в парах: один оператор, второй проверяет гипотезу. Смена ролей в середине. Оценка из 100: Linux/диагностика 20, Git/воспроизводимость 15, Docker/Compose 20, CI/контракт 15, наблюдаемость 15, восстановление и объяснение 15. Для каждого пункта есть наблюдаемое доказательство в docs/assessment.md. Повторная попытка после обратной связи разрешена; личные секреты в репозитории требуют немедленной безопасной коррекции до зачёта. Отсутствие дорогого ноутбука не снижает оценку: команда может демонстрировать на одном готовом рабочем месте.
Что должно получиться Итоговый репозиторий и 15-минутная демонстрация команды.
Команды воспроизводимы; ошибки обработаны; секретов нет; мониторинг и восстановление подтверждены.
Оценка из 100: Linux/диагностика 20, Git/воспроизводимость 15, Docker/Compose 20, CI/контракт 15, наблюдаемость 15, восстановление и объяснение 15. Для каждого пункта есть наблюдаемое доказательство в docs/assessment.md. Повторная попытка после обратной связи разрешена; личные секреты в репозитории требуют немедленной безопасной коррекции до зачёта. Отсутствие дорогого ноутбука не снижает оценку: команда может демонстрировать на одном готовом рабочем месте.
Ошибка для диагностики Проект работает только с неизвестным локальным .env или исправленным вручную контейнером.
Симптом → Гипотеза → Проверка
Оценка из 100: Linux/диагностика 20, Git/воспроизводимость 15, Docker/Compose 20, CI/контракт 15, наблюдаемость 15, восстановление и объяснение 15. Для каждого пункта есть наблюдаемое доказательство в docs/assessment.md. Повторная попытка после обратной связи разрешена; личные секреты в репозитории требуют немедленной безопасной коррекции до зачёта. Отсутствие дорогого ноутбука не снижает оценку: команда может демонстрировать на одном готовом рабочем месте.
Основные выводы Он обнаружит скрытые предположения, которые автор считает очевидными. По реальной проблеме проекта и необходимому результату. Он обнаружит скрытые предположения, которые автор считает очевидными.
По реальной проблеме проекта и необходимому результату.
После пары После курса выбрать один следующий шаг и написать план проверки его пользы для своего проекта.
Конспект, команды и разбор → Проверьте критерии сдачи и дайте возможность повторной попытки. Первоисточники: https://roadmap.sh/devops https://roadmap.sh/mlops