Ответ вслух Middle systemd и журналы спрашивают часто обновлено

Юнит для своего приложения

Вопрос

Нужно запустить Node.js-приложение на сервере без Docker так, чтобы оно поднималось при загрузке и перезапускалось при падении. Расскажи, как напишешь юнит systemd.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Создаю /etc/systemd/system/app.service. В [Unit] описание и порядок: After=network-online.target postgresql.service плюс Wants=network-online.target.

Что должно прозвучать в ответе

  • Файл в `/etc/systemd/system/app.service`, секции Unit, Service, Install

  • `After=`/`Wants=` на сеть и базу, чтобы был правильный порядок

  • `User=` отдельный непривилегированный пользователь, `WorkingDirectory`, `EnvironmentFile` для конфигурации и секретов

  • `Restart=on-failure`, `RestartSec`, понимание лимита частоты запусков

  • `WantedBy=multi-user.target`, затем `daemon-reload` и `enable --now`

  • Логи в stdout, читаю через `journalctl -u`; ограничения `MemoryMax`, `NoNewPrivileges`, `ProtectSystem`

Что могут спросить следом

  • Как сделать graceful-остановку?
  • Как запускать по расписанию задачу этого приложения?
  • Почему не pm2 или nohup?

Разбор

Создаю /etc/systemd/system/app.service. В [Unit] описание и порядок: After=network-online.target postgresql.service плюс Wants=network-online.target. В [Service] запуск от отдельного пользователя без shell, WorkingDirectory=/srv/app, переменные из EnvironmentFile=/etc/app/env с правами 600, ExecStart=/usr/bin/node server.js на переднем плане. Restart=on-failure и RestartSec=5, помня про лимит: после пяти падений за десять секунд systemd сдастся. Для остановки по умолчанию придёт SIGTERM, приложение должно его обработать, а TimeoutStopSec задаёт, сколько ждать до SIGKILL. Для безопасности NoNewPrivileges=yes, ProtectSystem=strict с ReadWritePaths для нужных каталогов, PrivateTmp=yes, при желании MemoryMax. В [Install] WantedBy=multi-user.target. Затем daemon-reload, enable --now app, проверяю systemctl status и journalctl -u app -f. Логи пишу в stdout: журнал сам добавит время и метку юнита.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.