Raspberry PiでNode.jsウェブサイトをセルフホスティングする

多くの開発者にとって、セルフホスティングの魅力はコストだけでなく、コントロールにあります。VercelやNetlifyといったプラットフォームがシームレスなデプロイを提供する一方で、レガシーな動的ライブラリが必要だったり、環境全体を自分で管理したいといった特定の技術要件がある場合、ホームサーバーの方が適しています。

Raspberry Piをウェブサーバーとして使用することは、ネットワーク、サーバー管理、デプロイパイプラインの複雑さを学ぶ絶好の方法です。このガイドでは、Raspberry Pi上でNode.jsベースのウェブサイト(例えばAstroやSvelteで構築されたもの)をホスティングするためのシンプルな手順を示します。

アーキテクチャ:ルーターからブラウザへ

自宅ネットワークからウェブサイトを世界に公開するには、ローカルのプライベートIPと外部向けのパブリックIPの間を橋渡しする必要があります。

1. ポート転送とリバースプロキシ

最初のステップは、ルーターを設定して受信トラフィックをRaspberry Piの特定の内部IPアドレスへ転送することです。ルーターのインターフェースは機種によって大きく異なるため、使用しているハードウェアのマニュアルを確認する必要があります。

トラフィックがPiに到達したら、リクエストを処理しSSL証明書を管理する手段が必要です。CaddyはHTTPSを自動的に処理してくれるため、強く推奨されるツールです。Astroサイト用の典型的なCaddyfile設定は以下の通りです:

m4rt.nl {
    root * /home/mart/Documents/m4rt.nl
    file_server
    reverse_proxy localhost:4321
}

この構成では、Caddyが静的ファイルを直接提供し、ポート4321で動作するNode.jsプロセスへリクエストをプロキシします。

2. DNS設定

サーバーの設定が完了したら、ドメインを自宅ネットワークに向ける必要があります。これは、DNSプロバイダーの設定でAレコードを追加し、ドメイン(例:yoursite.com)をISPが提供するパブリックIPアドレスにマッピングすることで行います。

アプリケーションライフサイクルの管理

変更のたびにビルドスクリプトを手動で実行するのは非効率です。本番環境を構築するには、プロセスマネージャとデプロイパイプラインが必要です。

プロセスマネジメントにPM2を使用する

Node.jsアプリをデプロイする際、ターミナルセッションで開始コマンドを実行しただけでは、セッションが閉じたときにプロセスが終了してしまいます。PM2はバックグラウンドでアプリケーションを常駐させ、クラッシュした場合に自動で再起動する本番用プロセスマネージャです。

npm run buildを実行した後、エントリーポイントは以下のコマンドで起動できます: pm2 run entry.mjs

GitHub Actionsでデプロイを自動化する

最新のクラウドプラットフォームが提供する「push-to-deploy」体験を再現するために、GitHub Actionsを使ってCI/CDパイプラインを実装できます。ワークフローファイル(例:.github/workflows/update_server.yml)を作成すれば、リポジトリにコードをプッシュするたびにSSH経由でリモート更新をトリガーできます。

appleboy/ssh-actionを使用すると、ホストIPとパスワードをシークレットとして渡し、Piに安全に接続してローカルシェルスクリプトを実行し、更新処理を行うことができます。

アップデートスクリプト

堅牢なアップデートスクリプトは複数のプロジェクトを扱い、最新のコードを取得してビルドすることを保証すべきです。そのようなスクリプトのサンプルロジックは以下の通りです:

  1. ベースフォルダ内のディレクトリを順に処理する。
  2. .git フォルダが存在するか確認し、git pull を実行する。
  3. package.json があるNode.jsプロジェクトを特定し、特定のポートでビルドコマンドを実行する。
  4. 変更を反映させるためにすべてのPM2プロセスを再起動する。

セキュリティ上の考慮点と代替案

ポート転送はサイトをすぐに公開する最速の方法ですが、ホームネットワーク上のポートをインターネットに公開することになるため、セキュリティリスクが伴います。

この構成に関するコミュニティの議論でも指摘されているように、家庭用ファイアウォールに穴を開けるのは危険です。より安全な代替手段としてCloudflare Tunnelの使用が挙げられます。トンネルはサーバーとCloudflareネットワーク間に安全なアウトバウンド専用接続を確立し、ルーターでポートを開く必要をなくし、家庭のパブリックIPアドレスを外部から隠します。

Raspberry PiにCaddy、PM2、GitHub Actionsといったツールを組み合わせることで、開発者はリビングルームからでも完全に自動化されたプロフェッショナルレベルのホスティング環境を構築できます。

Sources