Не так давно мы рассказывали, как запустить популярную систему удаленного доступа Aspia в Docker - https://t.me/interface31/6296/
И вот некоторое время назад пользователи начали сталкиваться с проблемами, перестает работать ретранслятор, но сам контейнер остается рабочим и Docker его не перезапускает.
С чем связаны падения ретранслятора пока непонятно, но по всем признакам проблема внешняя, так как на совершенно разных установках ретрансляторы падают практически одновременно.
Что делать? Перезапускать контейнеры руками? Но это не наш метод, да и где взять столько рук. Поэтому обратимся к средствам автоматизации, существует проект autoheal, который позволяет следить за здоровьем контейнера и перезапускать его, если что-то пошло не так.
Откроем docker-compose.yml в папке проекта Aspia и приведем его к следующему виду:
services:
aspia-server:
image: paprikkafox/aspia-server:latest
container_name: aspia-server
hostname: aspia.example.com
environment:
- EXTERNAL_IP=203.0.113.6
ports:
- "8070:8070"
- "8060:8060"
volumes:
- ./data/database:/var/lib/aspia:rw
- ./data/config:/etc/aspia:rw
restart: always
labels:
- "autoheal=true"
healthcheck:
test: ["CMD-SHELL", "pidof aspia_relay && pidof aspia_router || exit 1"]
interval: 10s
timeout: 5s
retries: 2
start_period: 15s
Мы добавили метку, чтобы autoheal мог контролировать данный контейнер и добавили проверки процессов роутера или ретранслятора, если хоть один из них упал, то после двух неудачных проверок контейнер перейдет в статус unhealthy.
Теперь создадим отдельную директорию:
mkdir /opt/autohealИ разместим в ней следующий docker-compose.yml:
services:
autoheal:
image: willfarrell/autoheal:latest
container_name: autoheal
restart: always
environment:
- TZ=Europe/Moscow
- AUTOHEAL_CONTAINER_LABEL=autoheal
- AUTOHEAL_DELAY=2
volumes:
- /var/run/docker.sock:/var/run/docker.sock
В данном случае мы отслеживаем только контейнеры с меткой autoheal=true и перезапускаем их с задержкой в 2 секунды.
Запускаем все это добро и радуемся жизни, схема рабочая, проверена на практике.
Но есть один неочевидный момент. По умолчанию autoheal запускается с опцией:
AUTOHEAL_ONLY_MONITOR_RUNNING=falseЭто означает, что он будет мониторить даже незапущенные контейнеры и автоматически будет поднимать их, даже если вы руками их остановите. Чтобы избежать этой ситуации добавьте в секцию environment опцию:
- AUTOHEAL_ONLY_MONITOR_RUNNING=trueПодобным образом мы можем отслеживать далеко не только Aspia, но и вообще любой сервис по любому нужному нам показателю, который не приводит к аварийному завершению контейнера, но влияет на его пользовательские характеристики. Главное – правильно написать условия проверки.
