Yusuke

【備忘録】 Node.jsのアプリをsystemdに登録し、サービスとして設定する

Fri Jan 05 2024 Updated: Thu Jul 04 2024
#備忘録
#Linux
#開発

はじめに

Node.jsのプログラムをsystemdに登録してデーモン化した際、いくつか躓いた点があったので備忘録として残しておきます。

開発・実行環境

以下の環境で実行しています。

パッケージマネージャーとしてyarnを使用しており、Node.js, yarnともにvoltaで管理しています。

プロジェクトパス

ユーザー名を user1 とし、/home/user1/nodejs-app にプロジェクトがあると仮定します。

実行について

上記のプロジェクトルートにある start.sh というシェルスクリプトで起動することを前提とします。

以下のようなファイルです。

PATH=$PATH:$HOME/.volta/bin

yarn install
nohup yarn run start &

ここでPATHを通す必要があります。

これがないとsystemdでの実行の際、yarn コマンドが見つからずエラーを吐いてしまうので、忘れないようにしましょう。

また、chmod u+x start.sh で実行権限を与えてください。

systemdへの登録

/etc/systemd/system/<name>.service ファイルを作成します。

今回は nodejs-app.service とします。

cd /etc/systemd/system/
touch nodejs-app.service

nodejs-app.service は以下のように記述します。

ネットワークを使用するため、network-online.target を設定しています。

[Unit]
Description=Node.js App
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/bin/bash /home/user1/nodejs-app/start.sh
User=user1
WorkingDirectory=/home/user1/nodejs-app
Restart=always
Type=forking

[Install]
WantedBy=multi-user.target

設定を更新し、systemdに設定を反映させます。

nano nodejs-app.service
systemctl daemon-reload

試しに起動してみましょう。

systemctl start nodejs-app.service

正常に起動できているかどうかはstatusで確認できます。

systemctl status nodejs-app.service

Active: active (running) となっていればOKです。

各種コマンド

ログを確認したい場合は journalctl コマンドを使用します。

journalctl -u nodejs-app.service | less

エラーを吐くなどし、サービスを止めたい場合はstopコマンドを使いましょう。

systemctl stop nodejs-app.service

サービスの自動起動を有効にする

ここまで問題なければサービスの自動起動を有効にします。

正常に起動できていない場合は、ログを確認して修正してください。

systemctl enable nodejs-app.service

有効になっているかは以下で確認できます。

systemctl is-enabled nodejs-app.service

最後に再起動し、起動が確認できたら完了です!

reboot
systemctl status nodejs-app.service