Ответ
Для production-запуска приложений в Linux я использую systemd как наиболее надежное решение. Вот мой типичный workflow:
1. Создание systemd-сервиса:
sudo nano /etc/systemd/system/myapp.service
2. Конфигурация сервиса (реальный пример из моего проекта):
[Unit]
Description=Payment Service API
Documentation=https://github.com/company/payment-service
After=network.target postgresql.service redis.service
Requires=postgresql.service
Wants=redis.service
[Service]
Type=exec
User=appuser
Group=appuser
WorkingDirectory=/opt/payment-service
# Основной процесс
ExecStart=/usr/local/bin/payment-service --config /etc/payment/config.yaml
# Перезагрузка конфига по сигналу
ExecReload=/bin/kill -HUP $MAINPID
# Ограничения ресурсов
LimitNOFILE=65536
LimitNPROC=4096
MemoryMax=2G
CPUQuota=80%
# Перезапуск при падении
Restart=on-failure
RestartSec=5s
StartLimitInterval=100s
StartLimitBurst=3
# Переменные окружения
Environment="NODE_ENV=production"
EnvironmentFile=/etc/default/payment-service
# Безопасность
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=/var/log/payment /var/lib/payment
[Install]
WantedBy=multi-user.target
3. Создание пользователя и настройка прав:
sudo useradd -r -s /bin/false appuser
sudo mkdir -p /opt/payment-service /var/log/payment
sudo chown -R appuser:appuser /opt/payment-service /var/log/payment
4. Запуск и управление:
# Загрузить конфигурацию
sudo systemctl daemon-reload
# Включить автозагрузку
sudo systemctl enable myapp
# Запустить сервис
sudo systemctl start myapp
# Проверить статус
sudo systemctl status myapp -l
# Посмотреть логи
sudo journalctl -u myapp -f --since "10 minutes ago"
5. Альтернативы для специфичных случаев:
-
Docker контейнеры с
restart: always:# docker-compose.yml services: app: image: myapp:latest restart: unless-stopped deploy: resources: limits: memory: 2G -
Supervisor для Python-приложений:
[program:myapp] command=/venv/bin/gunicorn app:app directory=/opt/myapp user=appuser autostart=true autorestart=true stderr_logfile=/var/log/myapp.err.log stdout_logfile=/var/log/myapp.out.log
6. Мониторинг и обслуживание:
# Проверка использования ресурсов
systemd-cgtop
# Метрики для Prometheus
curl -s http://localhost:9100/metrics | grep myapp
# Graceful shutdown при деплое
sudo systemctl reload myapp # для Type=notify
sudo systemctl kill -s SIGTERM myapp
Ключевые преимущества systemd: централизованное управление, интеграция с journald для логов, cgroups для изоляции ресурсов и надежные механизмы перезапуска.