Юнит для своего приложения
Вопрос
Нужно запустить Node.js-приложение на сервере без Docker так, чтобы оно поднималось при загрузке и перезапускалось при падении. Расскажи, как напишешь юнит systemd.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Файл в `/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 ошибок.