
シリーズ:Bun × PM2 サーバー運用入門 ( 2 / 3 )
1
基礎:プロセス管理の必要性
2
導入:PM2の基本操作
3
運用:ログ・自動起動・デプロイ
前回はBun単体で本番運用しようとしたときの問題点(クラッシュ時の無自動再起動・ターミナル依存・ログ消失)と、それを解決するPM2を選ぶ理由を整理しました。
今回はいよいよ手を動かします。PM2をインストールしてBunアプリをバックグラウンドで動かし、 「クラッシュしても自動で復活する」 様子を実際に確認します。つまずきやすいポイントもまとめてあるので、詰まったときはトラブルシュートのセクションを確認してください。
🔍 前提条件
第1回で作成した bun-server-demo/server.ts を使います。まだの方は第1回を先に読んでください。Node.js(npm)がインストールされていることも必要です。
PM2をインストールする
PM2はnpmでグローバルインストールします。-g フラグでどのディレクトリからでも使えるようになります。
STEP 1
npm install -g pm2インストールが完了したら確認します。
pm2 --version
# 5.x.x ← バージョン番号が出ればOK🔍 npmが入っていない場合
Node.jsをインストールするとnpmも同時に入ります。 nodejs.org からLTS版をインストールしてください。BunだけでなくNode.jsも入れておくことを推奨します(PM2自体はNode.jsで動くため)。
PM2でBunアプリを起動する
PM2でBunを使う場合、 「インタープリター(実行エンジン)としてbunを指定する」 ことがポイントです。指定しないとNode.jsで実行されてしまいます。
方法A:コマンドラインで直接起動(まず試すとき)
STEP 2-A
pm2 start server.ts --interpreter bun --name my-server
[PM2] Starting /path/to/bun-server-demo/server.ts in fork_mode (1 instance)
[PM2] Done.
┌────┬──────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │
├────┼──────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┤
│ 0 │ my-server │ default │ N/A │ fork │ 12345 │ 0s │ 0 │
└────┴──────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┘この表が出れば起動成功です。ブラウザで http://localhost:3000 にアクセスして Hello, Bun! 🎉 が表示されることを確認してください。
💡 オプションの意味
--interpreter bun でBunを実行エンジンとして指定します。 --name はpm2内でのアプリ名です。後述のコマンドでこの名前を使って操作します。
方法B:ecosystem.config.js で管理(本番推奨)
STEP 2-B
コマンドラインで毎回オプションを書くのは大変です。設定をファイルに書き出しておくのが本番では定番です。 ecosystem.config.js というファイルを作ります。
pm2 ecosystem
[PM2] Generating sample ecosystem.config.js ✓生成されたファイルをBun向けに書き換えます。
module.exports = {
apps: [
{
name: "my-server", // PM2内でのアプリ名
script: "./server.ts", // 実行するファイル
interpreter: "bun", // ← Bunを使う! 最重要設定
watch: false, // 本番ではfalse(trueにすると変更検知で再起動)
instances: 1, // 起動するプロセス数(第3回でクラスター化)
env: {
NODE_ENV: "production",
PORT: 3000,
},
},
],
};設定ファイルを使って起動します。
pm2 start ecosystem.config.js
[PM2] Applying action restartProcessId on app [my-server](ids: [ 0 ])
[PM2] [my-server](0) ✓
┌────┬──────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │
├────┼──────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┤
│ 0 │ my-server │ default │ N/A │ fork │ 23456 │ 0s │ 0 │
└────┴──────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┘
Bun × PM2で本番運用する 自動起動・ログ管理・ecosystem.config.js
基本コマンド一覧
PM2の日常操作はこの6コマンドで9割カバーできます。 my-server の部分は自分がつけたアプリ名に置き換えてください。
| コマンド | 用途 |
|---|---|
| pm2 list | 起動中のアプリ一覧を表示。status・CPU・メモリ・再起動回数が確認できる。 |
| pm2 stop my-server | アプリを停止する。プロセスは削除されず、pm2 listには残り続ける。 |
| pm2 restart my-server | アプリを再起動する。コードを更新したあとに使う。 |
| pm2 delete my-server | アプリをPM2から完全に削除する。pm2 listから消える。 |
| pm2 logs my-server | アプリのログをリアルタイムで表示。デバッグのときに使う。 |
| pm2 monit | 全アプリのCPU・メモリ・ログをリアルタイムで監視するダッシュボード。Ctrl+Cで終了。 |
pm2 list の読み方
pm2 list
┌────┬──────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ memory │
├────┼──────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0 │ my-server │ fork │ 0 │ online │ 0% │ 42mb │
└────┴──────────────┴──────────┴──────┴───────────┴──────────┴──────────┘| 列名 | 意味 | 確認ポイント |
|---|---|---|
| id | PM2内の連番ID | 名前の代わりにIDで操作も可能(例: pm2 stop 0 ) |
| ↺ | 再起動回数 | この数が増えていたらクラッシュが起きている |
| status | プロセスの状態 | online が正常、 errored は異常終了 |
| cpu | CPU使用率 | 常に高い場合は処理の見直しが必要 |
| memory | メモリ使用量 | じわじわ増え続ける場合はメモリリークの疑い |
クラッシュしても自動で復活することを確認する
PM2の最大の魅力を体感しましょう。前回と同様にクラッシュエンドポイントを叩きます。
# クラッシュを起こす
curl http://localhost:3000/crash
# すぐにpm2 listを確認する
pm2 list
#│ 0 │ my-server │ fork │ 1 │ online │ 0% │ 38mb │
# ↺ が 1 に増えているが status は online → 自動で再起動された!
# アクセスも復活している
curl http://localhost:3000
#Hello, Bun! 🎉✨ 確認できたこと
クラッシュしても ↺ が増えるだけでサービスは自動復活します。Bun単体では「誰かが手動で再起動するまでダウンしたまま」だったのとの差は歴然です。
ログをリアルタイムで確認する
# リアルタイムで流れるログを見る(Ctrl+C で抜ける)
pm2 logs my-server
#[TAILING] Tailing last 15 lines for [my-server] process (change the value with --lines option)
#/root/.pm2/logs/my-server-out.log last 15 lines:
#0|my-server | 起動しました → http://localhost:3000
#/root/.pm2/logs/my-server-error.log last 15 lines:
#0|my-server | error: 意図的なクラッシュ
# 直近100行だけ見たい場合
pm2 logs my-server --lines 100🔍 ログファイルの保存場所
PM2のログは自動的に ~/.pm2/logs/ に保存されます。 アプリ名-out.log (標準出力)と アプリ名-error.log (エラー出力)の2ファイルに分かれます。ターミナルを閉じても記録が残り続けます。
トラブルシュート
Bun × PM2でよくあるつまずきポイントをまとめます。
❓ pm2 start server.ts したら SyntaxError が出る
--interpreter bun を忘れているか、ecosystem.config.jsの interpreter: "bun" が抜けています。指定しないとNode.jsがTypeScriptを解釈しようとして失敗します。
❓ bun: command not found と言われる
PM2はシステムの PATH からbunを探します。bunのインストール後にターミナルを再起動していない場合は再起動してください。それでも解決しない場合は which bun で場所を確認し、フルパス(例: /home/user/.bun/bin/bun )をinterpreterに指定します。
which bun
# /home/user/.bun/bin/bun
# ecosystem.config.js で直接パスを指定
interpreter: "/home/user/.bun/bin/bun",❓ status: errored になって起動しない
pm2 logs my-server でエラーログを確認してください。port が既に使われている( EADDRINUSE )、ファイルパスが間違っている、などが主な原因です。
❓ PM2を再起動するたびに pm2 start し直すのが面倒
それは次回(第3回)で解決します。 pm2 startup と pm2 save を使うと、OS再起動後に自動でアプリが立ち上がるようになります。
📌 第2回のまとめ
PM2の基本操作をマスターしました。クラッシュ時の自動再起動・バックグラウンド実行・ログの永続保存、これら3つはすでに実現できています。次回はさらに一歩進んで、 OS再起動後の自動起動・ログローテーション・デプロイ設定 を学び、本番で安心して使えるレベルに仕上げます。
📝 ▶ 次のステップ
次は「 」を解説します
