systemd は、Linux オペレーティングシステム向けの init システムおよびサービスマネージャーで、システムプロセスとサービスの起動と制御を管理します。
systemd を使用して Bun アプリケーションをデーモンとして実行するには、/lib/systemd/system/ に サービスファイル を作成する必要があります。
cd /lib/systemd/system
touch my-app.serviceこれはシステム起動時にアプリケーションを実行する一般的なサービスファイルです。これをテンプレートとして使用できます。YOUR_USER をアプリケーションを実行するユーザー名に置き換えてください。root として実行する場合は YOUR_USER を root に置き換えますが、セキュリティ上の理由から一般的には推奨されません。
各設定の詳細については、systemd ドキュメント を参照してください。
[Unit]
# アプリの説明
Description=My App
# ネットワーク利用可能後にアプリを起動
After=network.target
[Service]
# 通常は 'simple' を使用
# https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type= のいずれか
Type=simple
# アプリ起動時に使用するユーザー
User=YOUR_USER
# アプリケーションのルートディレクトリパス
WorkingDirectory=/home/YOUR_USER/path/to/my-app
# アプリ起動コマンド
# 絶対パスが必要
ExecStart=/home/YOUR_USER/.bun/bin/bun run index.ts
# 再起動ポリシー
# {no|on-success|on-failure|on-abnormal|on-watchdog|on-abort|always} のいずれか
Restart=always
[Install]
# アプリを自動的に起動
WantedBy=multi-user.targetアプリケーションが Web サーバーを起動する場合、デフォルトでは非 root ユーザーはポート 80 または 443 でリッスンできないことに注意してください。非 root ユーザーによって実行されたときに Bun がこれらのポートで永続的にリッスンできるようにするには、次のコマンドを使用します。このステップは root として実行する場合は不要です。
setcap CAP_NET_BIND_SERVICE=+eip ~/.bun/bin/bunサービスファイルが設定されたら、サービスを 有効化 できます。有効化すると、再起動時に自動的に起動します。これには sudo 権限が必要です。
systemctl enable my-app再起動せずにサービスを開始するには、手動で 開始 します。
systemctl start my-appsystemctl status でアプリケーションの状態を確認します。アプリが正常に起動している場合、次のような出力が表示されます。
systemctl status my-app● my-app.service - My App
Loaded: loaded (/lib/systemd/system/my-app.service; enabled; preset: enabled)
Active: active (running) since Thu 2023-10-12 11:34:08 UTC; 1h 8min ago
Main PID: 309641 (bun)
Tasks: 3 (limit: 503)
Memory: 40.9M
CPU: 1.093s
CGroup: /system.slice/my-app.service
└─309641 /home/YOUR_USER/.bun/bin/bun run /home/YOUR_USER/application/index.tsサービスを更新するには、サービスファイルの内容を編集してから、デーモンをリロードします。
systemctl daemon-reloadサービスユニット設定の完全なガイドについては、このページ を確認してください。または、一般的なコマンドのチートシートを参照してください。
systemctl daemon-reload # ファイルが変更されたことを systemd に通知
systemctl enable my-app # アプリを有効化(自動起動を許可)
systemctl disable my-app # アプリを無効化(自動起動をオフ)
systemctl start my-app # 停止しているアプリを起動
systemctl stop my-app # アプリを停止
systemctl restart my-app # アプリを再起動