← Обзор трека · Как проходит выкатка
Ручной откат Go API
План, ещё не внедрено
Порядок ниже — целевое поведение из backend#42 и infra#69. Это объяснение будущего workflow, а не инструкция к уже существующей кнопке.
Выбор прежнего релиза
Оператор открывает ручной Rollback workflow в GitHub Actions на
main. Кнопка «↩️ Откатить» в Telegram только открывает страницу workflow и ничего не переключает сама. Старое Telegram-сообщение не определяет цель.Workflow читает
productionDeployments с точным digest и выбирает цель:Последняя попытка Автоматическая цель Успешна Предыдущая успешная версия с другим digest Завершилась failureилиerrorПоследний успешный выпуск Незавершена или неизвестна Цель автоматически не выбирается При необходимости оператор может указать полный Git SHA конкретной прежней успешной выкатки.
До доступа к VPS workflow проверяет SHA цели, находит её успешный Deployment с digest нужного backend package и подтверждает доступность образа по digest в GHCR.
Опубликованный образ без успешной проверки production целью не становится. Если для одного SHA записаны разные digest, цель неоднозначна: workflow отказывает, а не выбирает один из образов молча. Неверный SHA, отсутствие подходящей успешной записи и недоступный образ тоже дают отказ до VPS.
Переключение и проверка
- После предварительной проверки workflow входит в тот же
productionenvironment, что и обычная выкатка. Оба запуска используют одну concurrency-группу и ограничениеPRODUCTION_ENABLED. - Вызывается тот же playbook Ansible с
backend_image_refпо digest. - После запуска подтверждаются образ нового контейнера, его
healthyи ответ публичного API через HTTPS. - Только после этих проверок откат получает статус
successв GitHub Deployment и успешную карточку в Backend / Releases. Автоматического отката при ошибке нет.
Ожидаемый результат
Для выбора цели отдельный SSH-запрос на VPS не нужен. История Deployments показывает последний подтверждённый результат выкатки, а не гарантирует, что API работает сейчас: контейнер мог упасть или быть удалён. Поэтому версия «до» в карточке не выдаётся за фактически работающую.
Успешный откат подтверждает выбранный digest, healthy и публичный API через HTTPS. Карточка отдельно называет последнюю подтверждённую выкатку из GitHub и фактически проверенный результат нового запуска. Если после переключения состояние API нельзя подтвердить, результат показывается как «неизвестно» со ссылкой на логи.
Если что-то пошло не так
| Этап | Что можно утверждать |
|---|---|
| Цель не прошла предварительную проверку | VPS не трогали; workflow сообщает причину отказа |
| Подготовка или переключение прервались | Показан последний подтверждённый Deployment; фактическая версия после сбоя — «неизвестно» |
| Новый контейнер запущен, но проверка не прошла | Указаны этап сбоя и ссылка на логи; успех не объявляется |
| Образ и API проверены, а отправка в Telegram не удалась | Deployment остаётся успешным; ошибка уведомления видна в workflow |
Откат образа не откатывает схему и данные PostgreSQL.