Raspberry Pi Zero でディスクレス・ウェブサイトをホストする

Raspberry Pi Zero は、おもちゃやレガシーデバイスとして片付けられがちですが、ミニマリストなコンピューティングに関心がある人々にとって、セルフホスティングのための強力なツールであり続けています。xngbuilds による最近のプロジェクトは、完全に RAM 上で動作する Pi Zero v1.3 から静的ウェブサイトを配信する方法を示しています。これは、ハードウェアの寿命を最大限に延ばし、オーバーヘッドを最小限に抑える「ディスクレス」構成です。

このアプローチは、小規模なハードウェアの限界を試したいと考えており、同時に、長期間の Raspberry Pi 運用において一般的な故障原因である、停電や SD カードの摩耗に対するシステムの耐性を確保したいと考えている人にとって、特に有用です。

アーキテクチャ:ローカル・ハードウェアと外部プロキシ

わずか 512MB の RAM を持つデバイスで、高性能かつ安全なサイトを維持するために、このプロジェクトはハイブリッド・アーキテクチャを採用しています。TLS (SSL) 終端の重い処理は小さな外部 VPS にオフロードされ、Pi Zero が HTTP を介して静的コンテンツを配信することだけに集中できるようにしています。

ローカル・ハードウェア・スタック

  • Raspberry Pi Zero v1.3: コアとなる計算ユニット。
  • 512MB microSD card: 初期の起動と永続的な設定ファイルの保存に使用。
  • Waveshare Ethernet HAT: 安定した有線接続を提供(OTG アダプターも代替案として存在)。
  • Alpine Linux: その極端な軽さと「ディスクレス・モード」で動作できる能力のために選定。

外部ハードウェア (The VPS)

暗号化ハンドシェイクによる Pi Zero の CPU 負荷を避けるため、低コストの VPS (この場合は TierHive) がゲートウェイとして使用されます。VPS は最小限のスペック (128MB RAM, 1vCPU) の Alpine Linux を実行し、socat を使用してパブリック・インターネットからのトラフィックをローカルの Pi Zero に転送します。

Alpine Linux をディスクレス・モードで実装する

プロジェクトの核心は Alpine Linux のディスクレス・モードです。この構成では、オペレーティング・システム全体が起動時に RAM にロードされます。システムが動作を開始すると、microSD カードは OS の動作に厳密にはもはや必要ではなくなり、ルート・ファイルシステムは tmpfs または ramfs としてマウントされます。

LBU による永続性の確保

システムは RAM 上で動作するため、起動後の変更(パッケージのインストールや設定ファイルの編集など)は、再起動時に失われます。これを解決するために、プロジェクトでは lbu (Local Backup Utility) を使用しています。

setup-lbu を実行することで、システムは特定のディレクトリ (例: /etc/var/www) を microSD カードに保存できます。lbu commit -d コマンドは、システムの現在の状態をディスクに保存するために使用され、これにより、次回の起動時にこれらの設定が復元されるようになります。

ソフトウェア・スタック

フットプリントを最小限に抑えるため、プロジェクトでは Apache やフル機能の Nginx のような重いウェブ・サーバーは避け、特化型で軽量なツールを好んで使用しています。

  • darkhttpd: 極めて小さく、設定不要の静的ウェブ・サーバー。起動時に自動的に開始されるように OpenRC サービスとして構成されています。
  • dropbear: 軽量な SSH サーバー。OpenSSH よりも大幅にリソース効率が高いです。
  • rsync: ローカルの開発マシンから Pi へ効率的にファイルを同期するために使用。

より多くの柔軟性が必要な場合は、Nginx も実行可能な代替案となりますが、より多くの設定と、同様の lbu 永続性ルールが必要になります。

ネットワーク・ルーティングと TLS 終端

トラフィックは、ユーザーからサイトへ、以下の経路を辿ります。

  1. Public DNS $\rightarrow$ VPS (HAProxy): VPS は TLS ハンドシェイクを処理し、SSL 証明書を自動的に管理します。
  2. VPS (socat) $\rightarrow$ Local Router: トラフィックは VPS から特定のポートを介してローカルのホーム IP へ転送されます。
  3. Local Router $\rightarrow$ Pi Zero: ルーターは外部ポートを Pi Zero の内部 IP のポート 80 へ転送します。

このセットアップは、Pi Zero が複雑な暗号化を処理する必要性を効果的に回避していますが、コミュニティの批評家たちは、Pi Zero は ChaCha20 のような最適化された暗号化方式を用いれば、技術的には TLS を処理する能力があることに言及しています。

コミュニティの洞察と反論

このプロジェクトは、Hacker News で、このようなセットアップの必要性と「印象深さ」を巡って活発な議論が巻き起こりました。

ハードウェアの能力について

一部のユーザーは、Pi Zero がプロジェクトで示唆されているよりもはるかに強力であると主張しました。あるユーザーが次のように述べています。

"A raspberry zero is more powerful than an enterprise server from the 1990s. A minimalist static website is not impressive."

他のユーザーは、Pi Zero が、本番環境レベルのクラウド・ストレージや、エミュレーション (BOX64) を介した x86 サーバーを動かすなど、より複雑なタスクを実行する能力があることを指摘しました。

「ディスクレス」の定義について

技術的な純粋主義者は、TFTP ブートのように Pi がまだ SD カードから起動しているため、真の「ディスクレス」とは言えないと指摘しました。真のディスクレス Pi は、ネットワークを介してブート・イメージをフェッチし、SD カードを完全に排除することになります。

セキュリティと寿命について

懐疑的な意見もありましたが、多くの人々が Alpine Linux の選択と tmpfs アプローチを称賛しました。OS を RAM 上で実行することで、 constant な書き込みサイクルを eliminating することで、Raspberry Pi プロジェクトにおける主要な故障原因である microSD カードの寿命を大幅に通り越して延ばすことができます。

結論

Pi Zero で静的サイトをホストすることは、経験豊富な sysadmin にとって些細なことのように見えるかもしれませんが、このプロジェクトは、回復力のある、オーバーヘッドの少ないシステムを構築するための実用的な設計図を提供しています。軽量な OS、RAM ベースの実行、および TLS 終端のための戦略的なプロキシを組み合わせることで、SD カードの破損に事実上ほぼ免疫を、かつリソースの使用を極めて効率的にするホスティング環境を構築することが可能です。

Sources