自サーバー案
自分のサーバーに置く道
マネージドに預けるのが今の標準ですが、置き場所を自分で決めなければならないこともあります。社内からしか見えない場所に置きたい、既に借りているサーバーに相乗りしたい、といった事情です。この回は選択演習です。今すぐ必要でなければ、読んで手順を書き出すだけで構いません。
自分のサーバーに置くと決めた瞬間、マネージドが代わりにやっていたことが全部こちらの仕事になります。中でも大きいのが動かし続けることです。
npm run start だけでは足りない
サーバーに入って npm run start と打てば、fleama は動きます。ですが、その接続を切った時点で終わります。サーバーを再起動しても戻ってきません。何かの拍子に落ちたら、誰かが気づいて手で立ち上げ直すまで止まったままです。
そこで Linux に元から入っている systemd に面倒を見てもらいます。systemd は、決められた設定どおりにプログラムを起動し、落ちたら起こし直し、サーバーの起動時にも一緒に立ち上げてくれる仕組みです。
ユニットファイルを1枚書く
面倒を見てほしい相手のことは、ユニットファイルという1枚のテキストで伝えます。fleama-next.service という名前で置きます。中身は名前と値を並べただけで、大事なのは4つです。
WorkingDirectory は、どのフォルダで動かすかです。ここが違うと .next が見つかりません。
ExecStart は、何を実行するかです。npm run start にあたるコマンドを、省略しない絶対パスで書きます。systemd はログインしたときのような環境を持たないので、npm だけでは見つけられません。
Restart は、落ちたあとどうするかです。always にしておけば、止まるたびに起こし直してくれます。
WantedBy は、いつ一緒に立ち上げるかです。multi-user.target にしておくと、サーバーの起動時に自動で始まります。
完成例を読んでみましょう。これは fleama とは別の、読書メモのアプリです。
ini
[Unit]
Description=reading-notes
After=network.target
[Service]
Type=simple
User=reader
WorkingDirectory=/srv/reading-notes
ExecStart=/usr/bin/npm run start
Restart=always
Environment=NODE_ENV=production
Environment=PORT=3000
[Install]
WantedBy=multi-user.targetWorkingDirectory はビルド済みのアプリを置いたフォルダです。ExecStart の /usr/bin/npm は、この例で npm がある場所です。どちらも / から始まる絶対パスで、実際の置き場所に合わせます。Environment=名前=値 はプロセスに環境変数を渡す行です。ここでは NODE_ENV で本番用の動作を選び、PORT で待ち受ける番号を指定しています。その他の行は起動順や実行ユーザーなどの準備です。この回では4設定の役割を読み取れば十分です。
書いたら systemctl enable --now fleama-next で有効にします。この先の細かいところは「サーバー構築入門」で扱います。ここでは、ファイル1枚で常駐させられると分かれば十分です。
演習
完成済みの fleama-next.service を読み、4つの設定がそれぞれ何のためのものかを自分の言葉で画面にまとめます。