- 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 сделает твою жизнь проще, но ответственность за стабильность приложения всё равно остаётся на тебе.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.