Когда unit падает, не начинайте с бесконечного restart. systemd уже сохранил причину и точное окружение запуска.
Порядок диагностики
systemctl status my-app.service --no-pager -l
journalctl -u my-app.service -b --no-pager -n 100
systemctl cat my-app.service
systemctl show my-app.service -p User -p Group -p WorkingDirectory -p Environment
Скопируйте команду из ExecStart и запустите её от того же пользователя:
sudo -u appuser -- /opt/my-app/bin/server --config /etc/my-app/config.yml
Частые причины: относительный путь, отсутствующий каталог, недоступный secret, занятый порт, неверный пользователь или переменная, которая была только в интерактивном shell. systemd не читает ваш .bashrc.
После изменения unit выполните systemd-analyze verify /etc/systemd/system/my-app.service, затем systemctl daemon-reload и systemctl restart my-app. Для обычной правки внешнего конфигурационного файла daemon-reload не требуется.
Не скрывайте сбой
Restart=always без паузы создаёт цикл и забивает журнал. Обычно подходят Restart=on-failure и RestartSec=5s. Ограничения запуска задавайте осознанно, а не отключайте. После исправления проверьте systemctl is-active, порт и реальный HTTP-запрос к сервису.
Официальные источники