- Home »

Как установить и управлять Supervisor на VPS с Ubuntu и Debian
Когда твой проект растёт, а бэкенд начинает состоять из десятка разных демонов, воркеров и микросервисов, становится критически важно держать всё это зоопарк под контролем. Supervisor — это одна из самых надёжных и проверенных временем систем для управления процессами на Linux-серверах. Если ты до сих пор перезапускаешь сервисы руками после каждого краша или перезагрузки сервера, то этот пост для тебя.
Сегодня разберём, как правильно установить и настроить Supervisor на твоём VPS с Ubuntu или Debian, научимся управлять процессами через веб-интерфейс и командную строку, а также рассмотрим несколько практических кейсов, которые точно пригодятся в продакшене.
Что такое Supervisor и зачем он нужен
Supervisor — это система мониторинга и управления процессами, написанная на Python. Основная задача — следить за тем, чтобы твои приложения работали стабильно, автоматически перезапускать их при сбоях и предоставлять удобный интерфейс для управления.
Ключевые возможности:
- Автоматический перезапуск — если процесс упал, Supervisor тут же его поднимет
- Веб-интерфейс — удобная панель для мониторинга всех процессов
- Логирование — централизованное управление логами приложений
- Группировка процессов — можно управлять связанными сервисами как единым целым
- XML-RPC API — для интеграции с другими системами мониторинга
Установка Supervisor на Ubuntu/Debian
Начнём с самого простого — устанавливаем Supervisor из стандартных репозиториев:
sudo apt update
sudo apt install supervisor
Проверяем, что сервис запустился:
sudo systemctl status supervisor
sudo systemctl enable supervisor
По умолчанию Supervisor будет автоматически запускаться при загрузке системы. Основные файлы конфигурации находятся в /etc/supervisor/
:
/etc/supervisor/supervisord.conf
— главный конфиг/etc/supervisor/conf.d/
— папка для конфигов отдельных программ/var/log/supervisor/
— логи Supervisor
Базовая настройка и веб-интерфейс
Откроем главный конфиг и включим веб-интерфейс:
sudo nano /etc/supervisor/supervisord.conf
Находим секцию [inet_http_server]
и раскомментируем её:
[inet_http_server]
port=127.0.0.1:9001
username=admin
password=your_secure_password
Перезапускаем Supervisor:
sudo systemctl restart supervisor
Теперь веб-интерфейс доступен по адресу http://your-server-ip:9001
. Если сервер находится за файрволом, не забудь открыть порт или использовать SSH-туннель:
ssh -L 9001:localhost:9001 user@your-server-ip
Создание конфигурации для приложения
Давайте создадим конфиг для простого Python-приложения. Создаём файл в /etc/supervisor/conf.d/
:
sudo nano /etc/supervisor/conf.d/myapp.conf
Пример конфигурации:
[program:myapp]
command=/usr/bin/python3 /path/to/your/app.py
directory=/path/to/your/
user=www-data
autostart=true
autorestart=true
startsecs=10
startretries=3
stdout_logfile=/var/log/supervisor/myapp.log
stderr_logfile=/var/log/supervisor/myapp_error.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
environment=PYTHONPATH="/path/to/your/",ENV="production"
Разберём основные параметры:
command
— команда для запуска приложенияdirectory
— рабочая директорияuser
— пользователь, от имени которого запускается процессautostart
— автозапуск при старте Supervisorautorestart
— перезапуск при паденииstartsecs
— время, которое процесс должен проработать, чтобы считаться успешно запущеннымstartretries
— количество попыток перезапуска
Управление процессами через командную строку
После создания конфига нужно обновить конфигурацию Supervisor:
sudo supervisorctl reread
sudo supervisorctl update
Основные команды для управления:
# Показать статус всех процессов
sudo supervisorctl status
# Запустить процесс
sudo supervisorctl start myapp
# Остановить процесс
sudo supervisorctl stop myapp
# Перезапустить процесс
sudo supervisorctl restart myapp
# Перезапустить все процессы
sudo supervisorctl restart all
# Показать логи
sudo supervisorctl tail myapp
sudo supervisorctl tail myapp stderr
# Очистить логи
sudo supervisorctl clear myapp
Продвинутые настройки и практические кейсы
Управление группами процессов
Когда у тебя есть связанные сервисы (например, несколько воркеров для обработки очередей), удобно группировать их:
[group:workers]
programs=worker1,worker2,worker3
priority=999
[program:worker1]
command=/usr/bin/python3 /path/to/worker.py --queue=high
directory=/path/to/your/
user=www-data
autostart=true
autorestart=true
[program:worker2]
command=/usr/bin/python3 /path/to/worker.py --queue=normal
directory=/path/to/your/
user=www-data
autostart=true
autorestart=true
[program:worker3]
command=/usr/bin/python3 /path/to/worker.py --queue=low
directory=/path/to/your/
user=www-data
autostart=true
autorestart=true
Теперь можно управлять всей группой:
sudo supervisorctl restart workers:*
sudo supervisorctl status workers:*
Настройка для Node.js приложений
Для Node.js приложений часто требуется специфическая настройка окружения:
[program:nodeapp]
command=/usr/bin/node /path/to/your/app.js
directory=/path/to/your/
user=www-data
autostart=true
autorestart=true
environment=NODE_ENV="production",PORT="3000"
stdout_logfile=/var/log/supervisor/nodeapp.log
stderr_logfile=/var/log/supervisor/nodeapp_error.log
killasgroup=true
stopasgroup=true
Параметры killasgroup
и stopasgroup
важны для Node.js, так как они гарантируют корректное завершение всех дочерних процессов.
Мониторинг ресурсов и уведомления
Supervisor можно интегрировать с системами мониторинга. Например, создадим простой скрипт для отправки уведомлений при перезапуске:
[program:myapp]
command=/usr/bin/python3 /path/to/your/app.py
directory=/path/to/your/
user=www-data
autostart=true
autorestart=true
stderr_events_enabled=true
stdout_events_enabled=true
И создадим event listener:
[eventlistener:crashnotifier]
command=/path/to/crash_notifier.py
events=PROCESS_STATE_EXITED
Сравнение с альтернативными решениями
Решение | Преимущества | Недостатки | Лучший use case |
---|---|---|---|
Supervisor | Простота настройки, веб-интерфейс, стабильность | Только для Unix-систем, нет встроенного балансировщика | Управление Python/Node.js приложениями |
systemd | Встроен в систему, мощная система зависимостей | Сложность настройки, нет веб-интерфейса | Системные сервисы, сложные зависимости |
PM2 | Встроенный балансировщик, кластеризация | Только для Node.js, больше overhead | Node.js приложения в production |
Docker + orchestration | Изоляция, масштабируемость | Сложность, overhead | Микросервисы, контейнеризация |
Мониторинг и отладка
Для эффективного мониторинга твоих процессов используй следующие подходы:
Настройка ротации логов
[program:myapp]
command=/usr/bin/python3 /path/to/your/app.py
stdout_logfile=/var/log/supervisor/myapp.log
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
redirect_stderr=true
Интеграция с внешними системами мониторинга
Supervisor предоставляет XML-RPC API для интеграции с Prometheus, Grafana и другими системами мониторинга:
# Проверка статуса через API
curl -u admin:password http://localhost:9001/RPC2
Безопасность и лучшие практики
- Не запускай процессы от root — всегда используй отдельных пользователей
- Ограничь доступ к веб-интерфейсу — используй файрвол или VPN
- Мониторь ресурсы — следи за потреблением CPU и памяти
- Регулярно обновляй — держи Supervisor в актуальном состоянии
- Настрой логирование — централизованно собирай логи приложений
Автоматизация и скрипты
Для автоматизации развёртывания можно создать скрипт, который генерирует конфиги Supervisor:
#!/bin/bash
# deploy_supervisor.sh
APP_NAME=$1
APP_PATH=$2
APP_USER=${3:-www-data}
cat > /etc/supervisor/conf.d/${APP_NAME}.conf << EOF
[program:${APP_NAME}]
command=python3 ${APP_PATH}
directory=$(dirname ${APP_PATH})
user=${APP_USER}
autostart=true
autorestart=true
startsecs=10
startretries=3
stdout_logfile=/var/log/supervisor/${APP_NAME}.log
stderr_logfile=/var/log/supervisor/${APP_NAME}_error.log
EOF
supervisorctl reread
supervisorctl update
supervisorctl start ${APP_NAME}
Интеграция с CI/CD
В процессе деплоя можно автоматически обновлять конфигурацию Supervisor:
# В твоём deployment скрипте
sudo supervisorctl stop myapp
# Обновляем код приложения
sudo supervisorctl start myapp
sudo supervisorctl status myapp
Интересные возможности и нестандартные применения
Управление cron-задачами
Supervisor можно использовать для запуска периодических задач вместо cron:
[program:periodic_task]
command=/usr/bin/python3 /path/to/periodic_task.py
directory=/path/to/your/
user=www-data
autostart=true
autorestart=false
startsecs=0
Мониторинг файловой системы
Supervisor отлично подходит для запуска демонов, которые следят за изменениями файлов:
[program:file_watcher]
command=/usr/bin/python3 /path/to/file_watcher.py
directory=/path/to/your/
user=www-data
autostart=true
autorestart=true
environment=WATCH_DIR="/path/to/watch"
Управление туннелями и прокси
Можно использовать для управления SSH-туннелями или прокси-серверами:
[program:ssh_tunnel]
command=/usr/bin/ssh -N -L 5432:localhost:5432 user@database-server
user=tunnel-user
autostart=true
autorestart=true
startsecs=5
startretries=999
Заключение и рекомендации
Supervisor — это надёжный и проверенный инструмент для управления процессами на продакшн-серверах. Он особенно хорош для:
- Python и Node.js приложений — простая настройка и отличная совместимость
- Небольших и средних проектов — когда Docker-оркестрация избыточна
- Команд, которые ценят простоту — веб-интерфейс понятен всем
- Монолитных приложений — когда нужно управлять несколькими связанными процессами
Не стоит использовать Supervisor, если:
- Ты планируешь масштабирование на несколько серверов
- Нужны сложные схемы балансировки нагрузки
- Приложение уже контейнеризовано
Для небольших проектов, которые размещаются на одном VPS, Supervisor остаётся одним из лучших выборов. Для более серьёзных нагрузок стоит рассмотреть выделенные серверы с более продвинутыми системами оркестрации.
Главное — не забывай мониторить свои процессы, настраивать алерты и регулярно проверять логи. Supervisor сделает твою жизнь проще, но ответственность за стабильность приложения всё равно остаётся на тебе.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.