Пару вечеров я матерился: написал приложение, и сам понять хочу себя, когда оно перестаёт слушать. Оказалось — процесс падает, а сервис не хочет. Гнев сменился методичностью, когда я разложил по шагам: права на папку, переменные среды, лог сервиса, рестарт.

Нейтрально: чтобы приложение жило за пределами терминала, нужен процесс-менеджер — например, systemd. Он хранит команду запуска, окружение и перезапускает службу.

# /etc/systemd/system/myapp.service
[Unit]
Description=Pet сервис
After=network.target

[Service]
WorkingDirectory=/srv/myapp
EnvironmentFile=/srv/myapp/.env
ExecStart=/srv/myapp/.venv/bin/granian --interface wsgi myapp.wsgi --port 8000
Restart=always
User=www-data

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
journalctl -u myapp -f   # смотрим, почему падает

Когда после `journalctl` нашёл, что не находился модуль приложения из-за пути, — испытал облегчение почти истерическое. Деплой перестал быть случайностью: теперь я знаю, где жить его конфиг и где копать, когда молчит порт.