Режим обслуживания позволяет администраторам свести операции записи к минимуму на время проведения регламентных работ. Его основная цель — заблокировать все внешние действия, изменяющие внутреннее состояние базы данных PostgreSQL, а также файлов, Git-репозиториев и хранилищ образов контейнеров.
Когда режим обслуживания включён, уже запущенные действия завершаются за короткое время, поскольку новые действия перестают поступать, а изменения внутреннего состояния минимальны. В таком состоянии проще выполнять различные регламентные работы.
Режим обслуживания разрешает большинство внешних действий, которые не изменяют внутреннее состояние.
На уровне HTTP блокируются запросы с методами POST, PUT, PATCH и DELETE.
Включение режима обслуживания
Включите режим обслуживания от имени администратора одним из следующих способов:
- Через веб-интерфейс:
- Перейдите в раздел «Admin» → «Настройки» → «Основные».
- Разверните раздел «Режим обслуживания» и установите флажок «Включить режим обслуживания».
- При необходимости добавьте текст сообщения, которое будет отображаться в баннере.
- Нажмите «Сохранить изменения».
-
Через API:
Выполните следующий запрос:
curl --request PUT --header "PRIVATE-TOKEN: $ADMIN_TOKEN" \ "<instance-url>/api/v4/application/settings?maintenance_mode=true"
Отключение режима обслуживания
Отключите режим обслуживания одним из следующих способов:
- Через Веб-интерфейс:
- Перейдите в раздел «Admin» → «Настройки» → «Основные».
- Разверните раздел «Режим обслуживания» и снимите флажок «Включить режим обслуживания».
- Нажмите «Сохранить изменения».
-
Через API:
Выполните следующий запрос:
curl --request PUT --header "PRIVATE-TOKEN: $ADMIN_TOKEN" \ "<instance-url>/api/v4/application/settings?maintenance_mode=false"
Особенности работы в режиме обслуживания
Когда режим обслуживания включён, в верхней части интерфейса отображается баннер. При необходимости для него можно задать собственное сообщение.
При попытке выполнить недопустимую операцию записи пользователь получит сообщение об ошибке.
В некоторых случаях визуальная реакция на действие может вводить в заблуждение. Например, при добавлении проекта в избранное кнопка «В избранное» меняется на «Убрать из избранного». Это связано с тем, что интерфейс обновляется до получения результата POST-запроса.
Действия администратора
Администраторы могут по-прежнему редактировать настройки приложения. Это позволяет отключить режим обслуживания после его включения.
Аутентификация
Все пользователи могут входить в систему и выходить из неё, но создание новых пользователей блокируется.
Если на время обслуживания запланирована синхронизация LDAP, она будет завершена с ошибкой, поскольку создание пользователей отключено. По той же причине будет завершено с ошибкой создание пользователей на основе SAML и других провайдеров OmniAuth.
Когда создание пользователя блокируется при входе через LDAP, пользователь видит сообщение о том, что инстанс находится в режиме обслуживания (только для чтения), а не стандартную ошибку запрета доступа.
Операции с Git
Все операции чтения Git продолжают работать, включая git clone и git pull.
Все операции записи завершаются с ошибкой — как через командную строку, так и через web-редактор. При этом отображается следующее сообщение:
Git push is not allowed because this instance is currently in (read-only) maintenance mode.
Запросы на слияние и задачи
Все операции записи, не перечисленные в исключениях, завершаются с ошибкой. Например, пользователь не может изменить запрос на слияние или задачу.
Входящая почта
Создание ответов на задачи, новых задач (включая задачи Service Desk) и запросов на слияние по электронной почте завершается с ошибкой. Обработчики входящей почты пропускают обработку, пока включён режим обслуживания.
Исходящая почта
Уведомления по электронной почте продолжают приходить, но письма, для отправки которых требуется запись в базу данных (например, для сброса пароля), не доставляются.
REST API
Для большинства JSON-запросов методы POST, PUT, PATCH и DELETE блокируются. API возвращает ответ 503
с сообщением об ошибке system is in maintenance mode и заголовком Retry-After.
Разрешены только следующие запросы:
| HTTP-запрос | Разрешённые маршруты | Примечания |
|---|---|---|
POST |
/admin/application_settings/general |
Обновление настроек приложения в интерфейсе администратора |
PUT |
/api/v4/application/settings |
Обновление настроек приложения через API |
POST |
/users/sign_in |
Вход пользователей в систему |
POST |
/users/sign_out |
Выход пользователей из системы |
POST |
/oauth/token |
Получение OAuth-токенов |
POST |
/admin/session, /admin/session/destroy |
Использование режима администратора (Admin Mode) |
POST |
Пути, оканчивающиеся на /compare |
Сравнение ревизий Git |
POST |
*.git/git-upload-pack |
Выполнение git pull и git clone |
POST |
/api/v4/internal |
Маршруты внутреннего API |
POST |
/admin/sidekiq |
Управление фоновыми задачами в разделе «Admin» |
GraphQL API
Запросы POST /api/graphql разрешены, но GraphQL-мутации блокируются со следующим сообщением об ошибке: You cannot perform write operations on a read-only instance.
Непрерывная интеграция
Во время обслуживания действуют следующие ограничения:
- новые задачи и конвейеры не запускаются ни по расписанию, ни вручную;
- задачи, которые уже выполнялись на момент включения режима обслуживания, продолжают отображаться в интерфейсе со статусом
running, даже если они завершились на раннере; - задачи в состоянии
runningне завершаются по таймауту после превышения лимита времени проекта; - конвейеры нельзя запустить, перезапустить или отменить. Новые задачи в существующих конвейерах также не создаются;
- статус раннеров в разделе «Admin» → «Раннеры» не обновляется.
После отключения режима обслуживания новые задачи снова начинают выполняться.
Задачи, которые были в состоянии running до включения режима обслуживания, возобновляются, а их логи снова обновляются.
После отключения режима обслуживания рекомендуется перезапустить конвейеры, которые были в состоянии running на момент включения режима обслуживания.
Развёртывания
Развёртывания не выполняются, поскольку связанные с ними конвейеры не завершаются. Отключите автоматические развёртывания на время режима обслуживания и снова включите их после завершения работ.
Хранилище образов контейнеров
Команда docker push завершается следующей ошибкой:
denied: requested access to the resource is denied
При этом операция docker pull продолжает работать.
Реестр пакетов
Реестр пакетов позволяет устанавливать пакеты, но не публиковать их.
Фоновые задачи
Фоновые задачи (включая cron-задачи и задачи Sidekiq) продолжают выполняться как обычно, поскольку они не отключаются автоматически.
Так как фоновые задачи выполняют операции, которые могут изменить внутреннее состояние инстанса, на время режима обслуживания может потребоваться отключить часть из них или все задачи целиком.
Чтобы отслеживать очереди и отключать задачи:
- Перейдите в раздел «Admin» → «Мониторинг» → «Фоновые задачи».
- В панели Sidekiq выберите «Cron» и отключите задачи по отдельности или все сразу, нажав «Disable All».
Управление инцидентами
Функции управления инцидентами ограничены. Создание алертов и инцидентов полностью приостановлено, а связанные с ними уведомления и оповещения не отправляются.
Флаги функций
- Флаги функций разработки нельзя включать или отключать через API, но можно переключать через консоль Rails.
- Сервис флагов функций продолжает отвечать на запросы проверки состояния флагов, но переключать сами флаги нельзя.