Unit-файл для Node.js
systemd умеет всё, ради чего обычно ставят pm2: автозапуск, перезапуск при падении, логи.
[Unit]
Description=Node.js web
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=node
WorkingDirectory=/srv/web
Environment=NODE_ENV=production
Environment=PORT=3000
ExecStart=/usr/bin/node /srv/web/server.js
Restart=on-failure
RestartSec=3
TimeoutStopSec=20
[Install]
WantedBy=multi-user.target
systemctl daemon-reload systemctl enable --now web journalctl -u web -f
Node из nvm
Служба не читает .bashrc, поэтому команды node из nvm для неё нет. Узнайте полный путь и подставьте его:
which node # /home/deploy/.nvm/versions/node/v22.11.0/bin/node
Минус — путь меняется при смене версии. Надёжнее поставить Node из пакетов дистрибутива или NodeSource, тогда путь всегда /usr/bin/node.
Почему в ExecStart= нужен именно абсолютный путь и что ещё туда можно писать — параметр ExecStart.
pm2 → systemd
| pm2 | systemd |
|---|---|
pm2 start server.js | systemctl start web |
pm2 startup + pm2 save | systemctl enable web |
pm2 logs web | journalctl -u web -f |
pm2 restart web | systemctl restart web |
--max-memory-restart 500M | MemoryMax=500M (служба будет убита и перезапущена по Restart=) |
кластер -i 4 | шаблон web@.service и экземпляры web@3001…web@3004 |