Перейти к содержанию

Как остановить и запустить Почту

Назначение документа

При эксплуатации Почты вам может понадобиться выключить сервера или ВМ, на которых расположены сервисы Почты. Перед тем как выключить сервера, нужно корректно остановить сервисы Почты. Выключение серверов без остановки Почты может привести к некорректной работе Почты в будущем.

В документе описана процедура остановки и запуска Почты: какие контейнеры и в каком порядке нужно остановить, как вывести из работы один из серверов для обслуживания.

Действия при установке на 1 ВМ

Как остановить Почту

Нужно на сервере с Почтой последовательно выполнить следующие команды:

systemctl stop onpremise-container-*

systemctl stop onpremise-mail.target 

docker ps -q | xargs -r docker stop

Как запустить Почту

Нужно на сервере с Почтой последовательно выполнить следующие команды:

systemctl start onpremise-mail.target 

systemctl start onpremise-container-*

Как остановить Почту при кластерной установке

Рассмотрим процесс остановки кластерной инсталляции на 8 машин:

  • 1 ВМ отводится под мониторинг;
  • 2 ВМ — под фронты;
  • 2 ВМ — под базы данных;
  • 3 ВМ — под хранилища.

При кластерной установке Почты нет универсального алгоритма остановки сервисов. Конкретные действия зависят от того, как распределены контейнеры по ВМ и серверам в вашем кластере. Есть 3 важных правила:

  1. Контейнеры infraetcd* отключаются в самом конце.
  2. Контейнеры mailetcd*, orchestrator* и consul* отвечают за репликацию БД и не могут быть выключены раньше баз данных. То есть сначала должны быть отключены контейнеры на ВМ, отведенных под базы данных (кроме infraetcd*).
  3. Если один из контейнеров в двух предыдущих правилах должен остаться включенным, то нельзя отключать контейнеры calico-libnetwork*, calico-node* и bind*. Эти контейнеры отвечают за работу сети.

Чаще всего алгоритм выглядит следующим образом:

  1. Остановить все контейнеры и сервисы на ВМ, отведенных под фронты.
  2. На ВМ, отведенных под хранилища, остановить все контейнеры кроме mailetcd*, orchestrator* и consul*. При этом не отключать контейнеры calico-libnetwork*, calico-node* и bind*.
  3. На ВМ, отведенных под базы данных, остановить все контейнеры кроме infraetcd*. При этом не отключать контейнеры calico-libnetwork*, calico-node* и bind*.
  4. Остановить все контейнеры и сервисы на ВМ, отведенных под хранилища.
  5. Остановить все контейнеры и сервисы на ВМ, отведенных под базы данных.
  6. Остановить все контейнеры и сервисы на ВМ, отведенных под мониторинг.

Перед началом остановки Почты рекомендуем остановить установщик:

systemctl stop deployer

Обзор команд для остановки сервисов и контейнеров

Все контейнеры останавливаются следующей командой:

systemctl stop onpremise-container-*

Чтобы контейнеры не перезапускались, нужно выполнить команду:

systemctl stop onpremise-mail.target 

Чтобы не останавливать определенные контейнеры можно использовать следующую команду:

systemctl stop $(systemctl list-units --no-legend | grep onpremise-container | grep -v infraetcd | grep -v consul | grep -v mailetcd | grep -v bind | grep -v calico | grep -v orchestrator | awk '{print $1}' | tr '\n' ' ')
  • list-units --no-legend — убирает служебные символы вывода systemctl: «●». Они появляются при выводе больших списков.
  • awk '{print $1}' — выводит первый столбец в результатах вывода команды systemctl. В первом столбце находятся названия контейнеров.
  • tr '\n' ' ' — заменяет перенос строк на пробелы. Это нужно, чтобы терминал не воспринимал названия контейнеров как отдельные команды.
  • Флаг -v обозначает, что нужно исключить из вывода systemctl контейнеры, содержащие указанную строку.

Перед тем как останавливать контейнеры на ВМ рекомендуем выполнить команду:

echo "systemctl stop $(systemctl list-units --no-legend | grep onpremise-container | grep -v infraetcd | grep -v consul | grep -v mailetcd | grep -v bind | grep -v calico | grep -v orchestrator | awk '{print $1}' | tr '\n' ' ')"

Она выведет окончательный вид команды, которая находится внутри кавычек:

systemctl stop <список контейнеров>

Скопируйте эту команду в текстовый редактор и с помощью поиска в редакторе убедитесь, что в списке нет контейнеров, которые должны работать.

Шаг 1. Остановка ВМ, отведенных под фронты

Ситуация А: на ВМ, отведенных под фронты, не расположено контейнеров mailetcd* и infraetcd*.

Тогда выполните следующие команды:

systemctl stop onpremise-container-*

systemctl stop onpremise-mail.target 

docker ps -q | xargs -r docker stop

Ситуация Б: на ВМ, отведенной под фронт, установлены контейнеры mailetcd* или infraetcd*. Не выключайте контейнеры, отвечающие за работу сети: calico-libnetwork*, calico-node*, bind*. Не выключайте контейнеры mailetcd* и infraetcd*.

Чтобы выключить все контейнеры, кроме указанных, выполните команду:

systemctl stop $(systemctl list-units --no-legend | grep onpremise-container | grep -v infraetcd | grep -v consul | grep -v mailetcd | grep -v bind | grep -v calico | grep -v orchestrator | awk '{print $1}' | tr '\n' ' ')

Шаг 2. Остановка контейнеров на ВМ, отведенных под хранилища

Обычно на ВМ, отведенных под хранилища, располагаются контейнеры mailetcd*, orchestrator* и consul*. Эти контейнеры отвечают за репликацию баз данных, поэтому их можно выключить только после Шага 3. Также нельзя останавливать контейнер infraetcd*, он отключается последним.

Итого:

  • На ВМ есть контейнеры mailetcd*, orchestrator* и consul* — не выключайте эти контейнеры. Их нужно будет выключить на шаге 3.
  • Контейнеры infraetcd* должны остаться включенными.
  • Не останавливайте контейнеры, отвечающие за работу сети: calico-libnetwork*, calico-node*, bind*.

Чтобы выключить все контейнеры, кроме указанных, выполните команду:

systemctl stop $(systemctl list-units --no-legend | grep onpremise-container | grep -v infraetcd | grep -v consul | grep -v mailetcd | grep -v bind | grep -v calico | grep -v orchestrator | awk '{print $1}' | tr '\n' ' ')

Шаг 3. Остановка контейнеров на ВМ, отведенных под базы данных

Достаточно часто на ВМ, отведенных под базы данных, располагаются контейнеры infraetcd*. Они отключаются последними, поэтому нам нужно выключить все контейнеры кроме infraetcd*.

Если на ВМ установлен infraetcd*, то нельзя останавливать контейнеры, отвечающие за работу сети: calico-libnetwork*, calico-node*, bind*.

Итого:

  • Не выключаем infraetcd*.
  • Не выключаем mailetcd*, orchestrator* и consul*.
  • Не выключаем calico-libnetwork*, calico-node* и bind*.

Чтобы выключить все контейнеры, кроме указанных, выполните команду:

systemctl stop $(systemctl list-units --no-legend | grep onpremise-container | grep -v infraetcd | grep -v consul | grep -v mailetcd | grep -v bind | grep -v calico | grep -v orchestrator | awk '{print $1}' | tr '\n' ' ')

Шаг 4. Остановить контейнеры, отвечающие за репликацию БД

К шагу 4 инсталляция Почты должна иметь следующее состояние:

  • Все контейнеры infraetcd* включены.
  • Все контейнеры mailetcd*, orchestrator* и consul* включены.
  • На ВМ где находятся infraetcd*, mailetcd*, orchestrator* и consul* включены контейнеры calico-libnetwork*, calico-node*, bind*.

После того как мы остановили контейнеры на ВМ, отведенных под базы данных, можно останавливать контейнеры, отвечающие за репликацию БД. Обычно контейнеры mailetcd*, orchestrator* и consul* располагаются на ВМ, отведенных под хранилища.

Чтобы остановить контейнеры выполните команду:

systemctl stop $(systemctl | grep onpremise-container | grep -E -i "consul|mailetcd|orchestrator" |  awk '{print $1}' | tr '\n' ' ')

Если на ВМ нет контейнера infraetcd*, то можно последовательно выполнить следующие команды, чтобы остановить все контейнеры на ВМ:

systemctl stop onpremise-container-*

systemctl stop onpremise-mail.target 

docker ps -q | xargs -r docker stop

Шаг 5. Остановить все контейнеры на ВМ, отведенных под БД

К шагу 5 инсталляция Почты должна иметь следующее состояние:

  • Все контейнеры infraetcd* включены.
  • На ВМ где находятся infraetcd* включены контейнеры calico-libnetwork*, calico-node*, bind*.
  • Выключены все контейнеры mailetcd*, orchestrator* и consul*.

Теперь можно останавливать все контейнеры на ВМ, отведенных под базы данных:

systemctl stop onpremise-container-*

systemctl stop onpremise-mail.target 

docker ps -q | xargs -r docker stop

Шаг 6. Остановить контейнеры на оставшихся машинах

В самом конце нужно остановить все контейнеры на ВМ с контейнером infraetcd* и на ВМ, отведенной под мониторинг:

systemctl stop onpremise-container-*

systemctl stop onpremise-mail.target 

docker ps -q | xargs -r docker stop

После этого можно выключить сервера и виртуальные машины, на которых установлена Почта.

Как проверить, что Почта остановилась

  1. Проверьте, что нет работающих сервисов Почты:

    systemctl | grep onpremise-container | grep run
    
  2. Проверьте, что нет работающих контейнеров:

    docker ps -a | grep Up
    

Как запустить Почту при кластерной установке

  1. На всех ВМ выполните команду:

    systemctl start onpremise-mail.target 
    
  2. Выполните следующую команду на сервере с установщиком:

    systemctl start deployer
    
  3. Перейдите в веб-интерфейс установщика http://server-adress:8888. Здесь можно посмотреть на каких ВМ располагаются нужные для запуска контейнеры.

  4. Определите, на каких ВМ располагаются контейнеры infraetcd*, и выполните на них команду:

    systemctl start $(systemctl | grep onpremise-container-infraetcd | awk '{print $1}' | tr '\n' ' ')
    
  5. Определите, на каких ВМ располагаются контейнеры mailetcd*, и выполните на них команды:

    systemctl start $(systemctl | grep onpremise-container-mailetcd | awk '{print $1}' | tr '\n' ' ')
    
  6. Определите, на каких ВМ располагаются контейнеры consul*, и выполните на них команды:

    systemctl start $(systemctl | grep onpremise-container-consul | awk '{print $1}' | tr '\n' ' ')
    
  7. Запустите все контейнеры на ВМ, отведенных под базы данных:

    systemctl start onpremise-container-*
    
  8. Запустите все контейнеры на ВМ, отведенных под хранилища:

    systemctl start onpremise-container-*
    
  9. Запустите все контейнеры на ВМ, отведенных под мониторинг и фронты:

    systemctl start onpremise-container-*