
2026/05/09 0:10
Raspberry Pi Zero を搭載したシステム上で、RAM 内メモリを使用してウェブサイトを配信します。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
本ドキュメントは、Raspberry Pi Zero における革新的なウェブホスティングアーキテクチャを概説しており、ローカルでディスクレス方式での動作と外部の TierHive VPS の組み合わせにより、
zero.btxx.org にホストされた安全かつ低コストのプライベートサーバーを実現します。本システムは Alpine Linux を完全にメモリ上から実行する「ディスクレスモード」を採用することで、Pi Zero の 512MB RAM の制約を克服しており、microSD カードは lbu および dd を使用した永続化のための専用ストレージとしてのみ利用します。初期設定には一時的なハードウェア(モニター、HDMI アダプター、キーボード)が必要ですが、最初の起動後では SD カードを物理的に抜いても動作が中断することはありません。TLS 終端やトラフィックフォワーディングといったリソース集約的なタスクは、年間約 4 ドル(128MB RAM)という手頃な価格の TierHive VPS にオフロードされ、同 VPS の HAProxy サービスにより自動 SSL 更新も処理されます。トラフィックは socat を用いて再度 Pi へ転送されます。ローカルでのサービス提供には darkhttpd や nginx などの軽量オプションが使用され、変更は rsync を用いてローカルで同期されます。SSH へのアクセスには dropbear が推奨され、動的 IP 管理には DuckDNS が利用されており、限られたローカルリソースを外部インフラストラクチャのデレlegation により最適化する方法を実証しています。本文
2026 年 5 月 8 日
私のマイクロサイト
zero.btxx.org は、Alpine Linux が動作する Raspberry Pi Zero v1.3 からパブリックインターネットへ配信されています。
最も素晴らしい点は? それはディスクレスであり、完全にメモリ上で動作していることです!
Pi Zero は総容量 512MB のメモリしか持っておらず、そのうち約 40MB が Alpine Linux の動作に占有されていることを考えると、これほど印象的なのはさらなることですが。最近は RAM も豊富で安いので……。まあ、そうですね。
ともかく、生きている時代は素晴らしいですね!Pi Zero を使って独自のウェブサイトを実行したい方は、ぜひこの記事をフォローしてください!
ローカル側のハードウェア
なぜ 512MB の microSD カードが必要なのか?
| 項目 | 説明 |
|---|---|
| Raspberry Pi Zero v1.3 | 主要な計算ユニットです。 |
| 512MB+ の microSD カード | インストールと RAM へのブートに引き続き必要です。 |
| Waveshare Ethernet HAT(オプション) | OTG アダプターでも代用可能です。 |
| Ethernet ケーブル | ネットワーク接続用。 |
| Micro USB パワーコード / パワーアダプタ | 電源供給用。 |
| クーリングケース(オプション) | 保護と空気の循環に役立ちます。 |
これにより、イメージのバックアップ作業が大幅に簡素化されます(この記事の後半で詳しく説明します)。RAM の最大容量が 512MB に限られているため、必要な分を超えるデータをバックアップするのを避けるのが合理的です。
Alpine の初期インストールに一時的に必要な追加ハードウェア:
- モニター
- HDMI から mini-HDMI アダプタ
- キーボード
外部側のハードウェア
私は TLS 終端処理を Pi Zero 上で直接扱うことを避けたいと考えているため、安全なトラフィックを別の小型の VPS を通じて経路化します。現在使用しているのはTierHive(紹介リンクあり)で、これまでは素晴らしいサービスを提供してくれています。まだアルファ版ですが、個人的な実験としては十分です。
私は TierHive を選択したのは、低価格とプリビルドされた HAProxy 構成オプションがあったためです。
VPS のスペック
| スペック | 詳細 |
|---|---|
| OS | Alpine Linux |
| RAM | 128 MB |
| ストレージ | 1 GB(NVMe) |
| CPU | 1 vCPU |
| コスト | 〜4 ドル/年 |
しかし、今はその詳細には触れなくて大丈夫です。すぐに詳しく説明します!クラウドフレッドルフのような無料サービスや、別のプロバイダーを使用することも可能です。
microSD カードの準備
以下は macOS で実行した手順です。異なる OS を使用している場合は手順が異なります。Alpine イメージのダウンロード時、
で終わるファイルを確保してください(microSD カードに直接 tar 内容を展開するため)..tar.gz
- SD カードを挿入し、
でディスクを確認します。今回の例では SD カードはdiskutil list
に位置しています。/dev/disk4 - カードを消去し FAT32 として再パーティション分けする:
diskutil eraseDisk FAT32 ALPINE MBRFormat /dev/disk4 - Alpine の tar バラファイルをカードに展開する:
tar xzf alpine-rpi-*.tar.gz -C /Volumes/ALPINE - macOS の不要なファイルを削除して外す:
find /Volumes/ALPINE -name '._*' -delete rm -rf /Volumes/ALPINE/.Spotlight-V100 rm -rf /Volumes/ALPINE/.fseventsd rm -rf /Volumes/ALPINE/.Trashes diskutil eject /dev/disk4
次に、microSD カードを Pi Zero に挿入します。Pi をモニターとキーボードに接続し、起動させてください。
ディスクレスモードの Alpine Linux
Pi が Alpine ライブ環境へとブートしたら、root ユーザーでログインします(パスワード不要)。SD カードは
/dev/mmcblk0 になっていることを確認してください。
通常なら
setup-alpine を実行してインストーラーを進めますが、まず lbu の構成を行う必要があります。これにより、設定とサイトファイルを SD カード上に保存し、再起動後も永続的な変更を保持できるようにします。
setup-lbu mmcblk0p1 mkdir -p /media/mmcblk0p1/cache setup-apkcache /media/mmcblk0p1/cache lbu commit -d
の実行には特に注意してください。 システムにパッケージのインストール/削除やファイルの変更を行った際は、毎回このコマンドを実行する必要があります。そうしないと、後続の再起動や停電で情報が失われてしまいます。lbu commit -d
これで準備ができたら、
setup-alpine を実行してインストールを続けます。ここで行う手順は以下の通りです:
- キーボード: 使用するものを選択
- ホスト名: Pi の名前を設定
- ネットワーク: eth0 の設定
- DNS: 8.8.8.8 でも問題ありません(または任意のもの)
- タイムゾーン: お住まいの地域に合わせて選択
- ミラー:
を押して、あなたの場所から最も高速なミラーを選択f - SSH サーバー: dropbear が他より非常に軽量です。強くおすすめします!
- root パスワード: セットしてください
- ディスク: 重要! ここでは「なし」を選択してください。これによりディスクレスモードが維持されます。
設定/APK キャッシュの保存先について尋ねられた際は、既に前構成した
/media/mmcblk0p1/cache がデフォルトとして設定されているはずです。これをそのままにしておいてください。
これでインストール完了後、システムを再起動できます。起動しログインすると、以下のコマンドで RAM 上で動作しているか確認できます:
mount | grep "^/ "
ルートディレクトリ(
/)が tmpfs または ramfs でマウントされていれば、RAM 上で動作しています。やった!
ソフトウェア
darkhttpd
基本的な HTTP のみの配信が必要で(TLS は VPS が担当するのを忘れないでください)、限られたリソース向けには
darkhttpd が最適な Web サーバーオプションです。起動時に動作を維持するためのランタイム設定をインストール・設定しましょう:
# インストールコマンドのプレースホルダー
次に、
/etc/init.d/darkhttpd にランタイムファイルを作成します:
#!/sbin/openrc-run description="darkhttpd static web server" command="/usr/bin/darkhttpd" command_args="/var/www/example.com --port <desired-port-number> --maxconn 20" command_background=true pidfile="/run/darkhttpd.pid" depend() { need net }
すぐに動作させておきましょう:
chmod +x /etc/init.d/darkhttpd rc-update add darkhttpd default rc-service darkhttpd start
ここではウェブサイトファイルを
/var/www 下に配置しています。再起動時にこれらファイルを失わないよう、必ず lbu にこのディレクトリを含めることを忘れず!
lbu include /etc/init.d/darkhttpd lbu include /var/www
また
maxconn パラメータにも注目してください。必要に応じて調整してください。これで完了です!
nginx
Web サーバーに対して少し柔軟性や制御性を求めたい場合は、常に nginx を使用することができます。
# インストールコマンドのプレースホルダー
次に
/etc/nginx/http.d/yourdomain.com.conf にドメイン固有の設定ファイルを作成します:
server { listen 8080; server_name yourdomain.com; root /var/www/yourdomain.com; index index.html; try_files $uri $uri/ =404; error_page 404 /404; location = /404 { internal; } }
darkhttpd で使用した同じルールを適用して、再起動または電源オフ時のファイル永続化を保証します:
rc-update add nginx default rc-service nginx start lbu include /etc/nginx lbu include /var/www
rsync
ローカルマシンからこの Raspberry Pi への変更を同期するには
rsync が必要です:
# インストールコマンドのプレースホルダー
SCP を使用したり、FTP クライアントで直接ファイルを転送する方が好む場合は、これをスキップしても構いません。これは個人的な好みの問題です。
lbu
Pi に必要な/欲しい全てのものを揃えたので、microSD カード上に再起動後も永続的に保持したいこれらの設定およびウェブサイトファイルをすべて含めます:
# 例: 以前構成した項目を含める lbu commit -d
私たちの最終的なソフトウェアスタックの一覧:
- dropbear(インストール時のセットアップ)
- darkhttpd
- lbu
- rsync
ポートの開放
外部の VPS を TLS 終端処理に使用するため、ローカルネットワーク上では単一のポートのみを開く必要があります(今回の例では
80 ですが、任意のものを使用してください)。家のネットワークは様々であるため、ここでの詳細説明には入りません。重要なのはポート 80 を開放することと、Raspberry Pi Zero デバイスの IP アドレスをターゲットにする点です(トラブルを避けるため、静的 IP の設定も推奨されます)。以下の指示で指定されたターゲットポートに特に注意してください。
重要: インターネットサービスプロバイダー(ISP)が家庭用ネットワークにダイナミック IP を割り当てている場合は、DDNS の某种形の構成が必要です。私の推奨は DuckDNS です。
TierHive VPS
我々のニーズに対しては、VPS の低エンド仕様に実質的にしか必要ありません:
- Alpine Linux
- 128MB メモリ
- 1GB ストレージ
標準的な Alpine コンフィグレーションとして、通常通り上記をセットアップしてインストールしてください。完了したら、VPS セットアップページの SSH ターゲットを使用してログインします。
この VPS に必要な主なパッケージは
socat の一つだけです。TierHive が NAT VPS プロバイダーであるため、socat を使用してインターネットトラフィックをローカルの Raspberry Pi Zero に経路化します。
# socat のインストールプレースホルダー apk add socat
次に
/etc/local.d/forward.start を作成します:
#!/bin/sh socat TCP-LISTEN:80,fork,reuseaddr TCP:<your-home-ip>:48080 &
<your-home-ip> を実際の家庭用 IP アドレスまたは DDNS ホスト名、および 48080 をルーターでポートフォワードした外部ポートに置き換えてください。
また、ルーターが適切にポートをフォワーディングしていることを確認してください。例えば:
- TCP 48080 -> Pi:
TierHive HAProxy
次に、TierHive の HAProxy エッジサービスを新しくセットアップした VPS に結びつけます。TierHive アドミンの「HAProxy」メニューに移動し、「Add Domain」を選択してください。カスタムドメインを入力し、DNS レコードへの TXT ファイル追加手順に従ってください。これはドメイン認証に使用されます。
それが確認されたら、「Configure Backends」ボタンをクリックします。その後、以下の設定を行います:
- Single Server(シングルサーバー)
- Regional Access(地域アクセス)
- VPS サーバーを選択(ドロップダウンからご自身の VPS を選択)
- ポートを設定(今回の例では 80)
- 保存!
これらの変更は約 5 分かかって反映されます。完了すると、TierHive の HAProxy が/tiny/VPS の前に実行され、ローカルの Pi Zero を指すようになります!
VPS 上の TLS 終端処理
ここで停止しても機能するウェブサイトはできますが、大きな問題点は TLS の欠如です。2026 年のウェブサイトには好ましくありません。良い知らせは、TierHive は HAProxy サービス内に自動 SSL 更新機能を内蔵していることです。HAProxy アドミンページのドメイン設定内で「Active SSL」をクリックするだけです。
反映に少し時間がかかっても大丈夫です!これで TLS ハンドシェイクはすべて TierHive が処理し、Pi は静的コンテンツの配信に集中できるようになります。
バックアップ
このセットアップではバックアップが非常に簡単です。同じネットワーク上からは単に以下のコマンドを実行するだけです:
ssh root@YOUR-PI-ZERO-IP "dd if=/dev/mmcblk0 bs=4M" > zero-backup.img
これはバイト単位での完全な複製(バイトフォアバイトクローン)です。新しいカードにフラッシュすると、現在の microSD カードと同じように起動します。ただし、新しい SD カードのサイズは現在のものと同じかそれ以上であること!
また、Pi が完全に起動したら microSD カードを自由に取り外すことができ、ディスクレスモードのためです。その後、カードを別のデバイスに挿入して直接バックアップすることもでき、不安定なネットワーク接続への依存を排除できます!
Happy Hosting!
これで完了です。一見すると少し複雑に見えるかもしれませんが、始める頃には結構簡単だと保証します。
この投稿が他者にセルフホスティングを試すきっかけになれば幸いです!