世界を動かす技術を、日本語で。

RAM上で動作するRaspberry Pi Zeroによるウェブサイトの提供

17時間前原文(btxx.org)

概要

  • Raspberry Pi ZeroAlpine Linux で完全メモリ運用のディスクレスWebサーバ構築例
  • 外部VPSHAProxy を活用しTLS終端や公開を実現
  • 最小限のハードウェア軽量ソフトウェア で省リソース運用
  • バックアップや設定の永続化 も簡単に対応可能
  • 自宅サーバ運用 の手順と注意点を具体的に解説

Raspberry Pi Zero+Alpine LinuxによるディスクレスWebサーバ構築

  • Raspberry Pi Zero v1.3 を利用した超小型Webサイト運用例
  • Alpine Linux をRAM上で動作させ、SDカードは設定・永続化用途のみ
  • microSDカード(512MB以上) は初期インストール・ブート時のみ必要
  • Waveshare Ethernet HAT やOTGアダプタで有線接続も可能
  • 消費電力・発熱が非常に低い ため冷蔵庫など密閉空間でも運用可能

必要なローカルハードウェア

  • Raspberry Pi Zero v1.3本体
  • 512MB以上のmicroSDカード
  • Ethernet HATまたはOTGアダプタ
  • Ethernetケーブル
  • Micro USB電源ケーブル
  • モニター・HDMIアダプタ・キーボード(初期設定時のみ)

外部公開用ハードウェア(VPS)

  • TierHive VPS (Alpine Linux 128MB RAM/1GB NVMe/1vCPU/年額約$4)
  • HAProxy Edgeサービス でTLS終端とドメイン認証を自動化
  • VPSから自宅Pi Zeroへのトラフィック転送は socat で実現

Alpine Linuxディスクレス運用手順

  • SDカードに tar.gz形式のAlpineイメージ を直接展開
  • FAT32でフォーマット後、Alpineイメージを展開し不要ファイル削除
  • Pi ZeroへSDカード挿入、モニター・キーボードを接続し起動
  • lbu/lbu commit -d で設定・サイトファイルの永続化を管理
  • setup-alpine で初期設定(キーボード/ホスト名/ネットワーク/タイムゾーン/ミラー/SSH/パスワード/ディスクレス選択)
  • ルート(/)が tmpfs/ramfs としてマウントされていればRAM運用成功

軽量Webサーバ・同期・永続化設定

  • darkhttpd :最小構成の静的Webサーバ(TLSはVPSで終端)
    • /etc/init.d/darkhttpdに起動スクリプト作成
    • サイトファイルは/var/www以下に配置
    • lbu includeで永続化対象に追加
  • nginx :より柔軟な設定が必要な場合に利用可能
    • サイト個別設定ファイルを/etc/nginx/http.d/に作成
    • rc-update/lbu includeで永続化
  • rsync :ローカルPCからPi Zeroへのファイル同期用
  • lbu commit -d :設定・サイトファイルの永続化コマンド

ポート開放・VPS連携・TLS終端

  • 自宅ルーターで Pi ZeroのHTTPポート(80等)を開放 し静的IP割当
  • DDNS(DuckDNS推奨) で動的IPにも対応
  • VPS上で socat を使い、インターネットからのトラフィックを自宅Piへ転送
  • TierHive HAProxy でドメイン認証・TLS終端・自動SSL更新
    • HAProxy管理画面でドメイン追加・TXT認証・バックエンド設定
    • 「Active SSL」ボタンで自動SSL化

バックアップ手順

  • Pi Zero起動後、SDカードを取り外して他デバイスでバックアップ可能
  • ネットワーク経由なら
    • ssh root@YOUR-PI-ZERO-IP "dd if=/dev/mmcblk0 bs=4M" > zero-backup.img
    • バイト単位のクローンイメージ作成・リストアも容易
  • RAM運用のため SDカードの寿命延長・高速化 が実現

まとめと自宅サーバ運用の魅力

  • 省リソース・低コスト・高効率 な自宅Webサーバ構築例
  • 外部VPS+HAProxy でセキュリティ(TLS)・可用性も確保
  • 巨大クラウド依存からの脱却 ・自己ホスティングの楽しさ
  • 手順はシンプル で学習にも最適、自宅サーバ入門におすすめ

Hackerたちの意見

Raspberry Pi Zeroは、1990年代のエンタープライズサーバーよりもパワフルだよ。ミニマリストな静的ウェブサイトなんて、全然すごくない。もっといろいろ詰め込めるよね。

お、ちゃんと読み込んだ!HNの最初のページの約10%のページとは違って、死ぬほど重いけどね。

このベイプで動いてるウェブサイトの方がずっと面白かったよ。これらのデバイスのマイクを使って音声を聞こうとした人がいるのか気になるな。バックドア付きのベイプだね。

自分のメールドメインを約10年間、Zeroでホスティングしてたんだ。キャパは、キャリアの初めに使ってた80人の組織用の高価でデカいWin NT4マシンとほぼ同じくらいだった。結局、ZeroをRaspberry Pi 4に替えたんだけど、主にZeroのIOポートが面倒だったから(例えば、USBはホットプラグできない!)。RPi 4は個人用メールにはオーバースペックだけど、1W未満でアイドル状態だし、故障したら全機械をほぼタダで交換できるからね。これらのマシンの故障ポイントはSDカードで、だいたい4年くらいで壊れる。RAMディスクを設定すればもう少し長持ちするかもしれないけど、正直、SDカードの値段を考えるとそこまで時間をかける価値はないかな。

確かに、バルコニーのソーラーパネルを使って永久に動かすこともできるよね。https://solar.lowtechmagazine.com/about/the-solar-website/

まさにその通り。人々はこれらのデバイスでPi-Holeを普通に運用してるけど、それは「ウェブサイトを提供してる」だけじゃなくて、DNSサーバーとしても機能してるからね。

ESP32でシャッターをコントロールするための小さなウェブインターフェースを作ってるんだ。リクエストを解析せずに、常に同じレスポンスを返す実験もしてみたから、単一ページのウェブサーバーは簡単に作れるよ(その場合、画像や他のリソースをHTMLに埋め込む必要があるけどね)。でも、もちろんリクエストは解析してるよ。ページとアクション用に別々のルートが必要だから。これが自宅のLAN内にあるから、SSLも必要ないし。トラフィックが少ない限り、ESP32でもSSLができるかもしれないけど、私には関係ないかな。だって、インターネットには繋がってないし、外から接続したいときはWireGuardを使ってるから。

OPのリンクはPi Zeroのウェブサイトじゃないよ。こっちがRaspberry Piでホスティングされてる実際のウェブサイトだよ:https://zero.btxx.org/

ちょっと変な感じがするね。Piでウェブサイト自体(HTTP)を動かしてるけど、TLSはクラウドプロバイダーに任せてるから。だから、コンテンツはPiのRAMにあるけど、重い処理(TLSの終端)は他でやってるから、PiのCPU負荷がめっちゃ軽くなるんだ。

時々、これらのデモはリバースプロキシでキャッシュを有効にすることがあるんだ。だから、リクエストした小さなデモHTMLページに対して、実際にデモするはずの楽しい小さなコンピュータにたどり着けないこともあるかも。

そうそう、これ、いろんなところで見たことあるよ。「Wiiで動かす」っていうブログもあった気がするけど、同じようなことやってたよね。TLSは結構重いから、VPSやCloudflareを使うのは理解できる。でも、VPSを立ち上げるなら、なんでPiを使うの? 記事に出てくるVPSはRAMは少ないけど、ストレージは多いし。もうVPSでTLSの終端処理をやってるなら(RAMを一番使う部分)、全部そこでやっちゃった方がいいんじゃないかな。これは遊びのためだって分かってるけど、Pi Zeroって本当にTLSを処理するには遅すぎるの? 最適化されたTLSライブラリを使えば特に。今回の設定では、Piはすでにインターネットに直接接続されてるし、VPNも使ってないしね。ARM11は「速い」わけじゃないけど、1 GHzのARM11なら最適化されたTLSライブラリでTLS1.2の一部を扱えるんじゃないかな。

確かにちょっと変だね。Pi Zeroは、数秒間に数回の接続でHTTP/1.2とTLS 1.3を処理するのに十分な能力があるよ。このマシンは90年代に使ってたウェブサーバーの10倍の性能だし。しかも、すべてのウェブページはRAMから提供されるから、現代のOSは初回アクセス時に自動的にキャッシュするのが普通だよね。

「2026年にほとんどの人がTLSを使う方法」が変だとは思わないな。とはいえ、これは特に印象的でも面白くもない、ただのコンピュータがウェブサイトを提供してるだけだし。

'base'のRaspbianタイプのインストールは、opensshが動いていて、他にもsystemdから起動されたデーモンがたくさんバックグラウンドで動いていると、RAMの使用量が160MBくらいになることを考えると、TLS付きの標準的なapache2やnginxのセットアップには十分なRAMが残るよ。確かに同時リクエストをたくさん捌くのは無理だけど、ここでの他のコメントに同意するよ。ポート80/httpだけで運用して、二次的なTLSプロキシの後ろに置くのは、ラズベリーパイから「ウェブサイトを提供している」とは言えないね。

妊娠検査薬でDoomが動いてる映像を思い出すな。それが別のコンピュータが内蔵のAMOLEDディスプレイに表示してるだけだって分かったときは、なんかクールな成果が、重要な要素が他にオフロードされてるせいで無意味になっちゃった。

なんでここでTLSを提供する必要があるの?

Gentooを動かしてる自己ホスティングのPi Zero Wがあるよ。最初は冗談で始めたけど、実際に新しいカーネルリリースのテストに役立つから続けてる。数年前に面白いバグを見つけたんだ:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/lin... まだリリースよりも早くソフトウェアをビルドできるよ。システム全体を再コンパイルするのに大体1ヶ月かかるけどね :D

自分でCIランナーをホストして、Piでカーネル作業をやってるよ。ソフトウェア定義無線のこともやってる。無線のテストの時は、Piとフロントエンド、バッテリーパックを持って外に出ればいいから楽だよ。ちゃんとした光ファイバーのインターネットがある場所に引っ越したら、いくつかのサイドプロジェクトを何台かのPiでホストするつもり。

Raspberry Pi Zeroを安価なLinuxアプライアンスとして使い始めてからずっとそうだよ。最新のAlpine Linuxで起動させて、全部RAMから動かしてる。動いてるマシンからカードを抜いても問題ないし、電源が切れても簡単に耐えられる。カードが壊れたことなんて一度もないよ。

Raspberry Pi Zeroで完全なプロダクショングレードのクラウドストレージサービスを運営してるよ。https://getcloud.doshare.me これがRpiハードウェアの力だよ。最大で10,000の同時リクエストに対応できるし、ストレージももちろんあるけど、まだまだ強力すぎるね。

「Diskless」って、同じ人たちが「Serverless」って言葉を作ったんじゃないかな? あのPiはまだSDカードからブートしてるし。EthernetがあるPiは、TFTPを使って本当にディスクレスでブートできるよ。さらに、Pi4やPi5は、初期の「boot.img」FATパーティションをHTTP経由でどこからでも取得して、直接インターネットからブートできるんだ。これがディスクレスってことだね。

RAMベースのOSでは、ページサイズや計算リソースが大幅に減るんだ。OSが同じメモリを使って動いて、ディスクから読み込む代わりにアプリケーションのための重要なメモリ領域を消費しないからね。フルクラッシュとOSの間にあるのはスワップストレージだけ。macOSやWindowsはこれを実現することはできないけど、Linux/BSDとその最適化レベルのおかげで可能なんだ。もっと良い方法は、NVMe SSDからブートすることだね。Ethernetブートはネットワークに依存するから、ネットワークがダウンしているときにデバッグが必要な場合や、ネットワーク自体のエラーやバグをデバッグする必要があるときはどうするの?

PiZeroはかなりしっかりしたマシンだよ。2018年からPi Zeroでマイクロホームラボを運営してる。Cloudflareのトンネルの後ろにあるし、DietPi OSで必要なアプリを180MB内で動かしてる。稼働時間は約8ヶ月だね。

DietPi OSについて初めて聞いたけど、ヘッドレスディストリビューションを提供してるの?

もしかして俺がバカなのかもしれないけど、これの複雑さって何なの?なんでこれがワクワクするの?メモリで動いてるから?それともPiで動いてるから?新しいエンジニアじゃなきゃ、これって大したことないと思うんだけど。PiがTLSを扱えないって言ってる人たち、ちょっとおかしいよね。それも大したことないし。VPSが必要だって言ってる人たち、どれだけクラウドネイティブなの?ルーターでポートを開放すればいいだけだよ(勇気があればだけど)し、動的DNSサービスを使って正しいIPアドレスにポイントさせればいいんだから。

昔、32MBのRAMでVPS上にウェブサイトを運営してた人たちがいたけど、それで問題なかったよ。これの何が新しいの?