ラズパイ上でサイトをホストする方法

2026/05/07 16:16

ラズパイ上でサイトをホストする方法

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

著者は、静的サイトジェネレーターや Vercel などのプラットフォームを介さず、直接動的な Web サイトを実行することにより、Raspberry Pi で独自のセルフホスティングソリューションを実装しました。このアプローチは、特定の不管理国際化ライブラリが動的には動作するものの、静的生成とは互換性がないため必要でした。Astro.js は SvelteKit が選択されました。これは、サーバーサイドレンダリングのために Node.js を使用するためです。インフラストラクチャは GitHub Actions(プッシュ時にトリガーされる)によって簡素化されており、コードを取得し、

$HOME/Documents
ディレクトリ内でビルドを実行し、PM2 を介してサーバーを再起動します。これには手動の介入が不要です。カスタム Caddy Web サーバー構成により、異なるポート(Astro は 4321、Svelte/Kit は 5173、React は 3000)で複数のフレームワークを管理し、OS サービスとの競合を回避します。ネットワークアクセスは、ホームルーターのポートフォワーディングと DNS A レコードを Pi のパブリック IP に設定することで保護されています。このアーキテクチャにより、開発者と中小企業が家庭用ハードウェアから複雑なアプリケーションをホスティングできるようになり、クラウドコストを削減しつつ、ビルドパイプラインとデータの制御を維持できます。

本文

たまたまドメインを購入し、余っていた RASPbery Pi もある状態だったので、Web サイトの作成に取りかかりました。Astro と Svelte の両方以前に手をつけていた経験から、どちらを採用するかしばらく悩みましたが、結局 Astro を選ぶことにしました。これで決定的な選択をしてよかったです。Astro が単純な Web サイトにおいていかに素晴らしいものかを別のブログ記事で詳しく紹介することもできるかもしれませんが、それは(もしかしたら?)今後の話です。

さて、Mart さんへのあなたの質問かもしれません:「なぜ完全に静的 Web サイトの場合に Raspberry Pi を使うのでしょうか?本当に必要なのでしょうか?」実は、Verce l で動作しないが、かつ動的な挙動を示す特定のライブラリが存在したからです。そのライブラリは今回のサイト以前にも別のウェブサイト(このサブドメインと同じく RASPbery Pi でホストされていた)で使用しており、もはやメンテナンスされていませんが、国際化 (i18n) の処理には非常に優れていました。

こうして現在の状況に至りました。では、どうやって動くのでしょうか? このガイドは網羅的ではありませんが、Node.js フレームワークで構築された自ホスト Web サイトへの自己導入を始めるための参考ポイントとしてご活用ください。

ステップ 1: ポート転送の設定

  • まず、ルーターの設定を確認し、その IP アドレスを RASPbery Pi の IP アドレスに転送するように設定してください。Google で検索すれば多くのチュートリアルが見つかりますが、ルーターによって手順は異なるため、ご自身のルーター向けの方法を確認することをお勧めします。
  • 次に、リポジトリを機械上に
    git pull
    して取得してください。
  • その後、Caddy をインストールし、その Caddyfile(あるいは類似のファイル)に以下の内容を追加します:
m4rt.nl {
        root * /home/mart/Documents/m4rt.nl # ここを実際の Web サイトのルートディレクトリに変更してください
        file_server
        reverse_proxy localhost:4321 # Astro なら 4321、SvelteKit なら 5173、React なら 3000
}
  • Caddyfile を再読み込みすることを忘れないでください。詳細な設定方法については Google をご参照ください!

ステップ 2: DNS の設定

  • ドメインを購入した後は、プロバイダへアクセスして新しいレコードを追加してください:
    • A レコード: yoursite.com → ルーターの公開 IP アドレス
  • これにより、ルーターは自動的に受信するトラフィックをその IP アドレス経由で Web サイトへと転送します!

ステップ 3: Web サイトのビルドと配信

  • 次に、Web サイトを JavaScript ファイルにパッケージ化する必要があります。これはほぼ常に
    npm run build
    (またはお好みのパッケイジマネージャーを実行)することで実現できます。これにより、
    dist
    out
    という名前のディレクトリが作成されます。
  • そのディレクトリを開き、エントリーポイントファイルを探してください。通常は
    entry.cjs
    または
    entry.mjs
    と呼ばれています。
  • その後、PM2 をインストールしてください。PM2 は Node.js アプリをあなたが停止命令を出すまで稼働させるためのサービスです。コマンド一つでインストールできます:
    npm i -g pm2
  • 次に、dist ディレクトリへ移動し (
    cd
    )
    pm2 run entry.mjs
    を実行してください!
  • これで完了です。Web サイトがライブになりそうです :) やっとおめでとうございます!

ステップ 4: 高度な CI/CD(継続的インテグレーション) おそらくここは Verce l と比較して少し違和感を覚えたでしょう: コミットを何か行ったらどうなるでしょうか?Web サイトがビルドされません! luckily、これを解決するために GitHub Actions というものがあります。

  • まず、
    .github
    という新しいディレクトリを作成し、その中に
    workflows
    ディレクトリを置きます。この中にファイルを作成し、「update_server.yml」などの名前に付けます(名称は自由に設定可能です)。
  • 以下の内容を追加します:
name: Update server code and restart the server
on: [push]
jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - name: Update server code and restart the server
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.HOST }}
          username: your-username # これは RASPbery Pi 上の sudo ユーザー名です!
          password: ${{ secrets.PASSWORD }}
          script: |
            ~/bin/pull-all.sh
  • 次に、リポジトリの設定画面に入り、「Actions」>「Secrets」を選択してください:
    • 「New secret」をクリックし、RASPbery Pi のホスト IP とパスワードをそれぞれ HOSTPASSWORD という名前で追加します。
  • その後、
    bin
    フォルダにスクリプトを作成(私は
    pull-all.sh
    という名称を使用)し、以下の内容を記述してください:
#!/usr/bin/env bash
set -euo pipefail

BASE_DIR="$HOME/Documents" # これは頻繁に使用するディレクトリに変更してください

# ここで使用しているポートです。状況に応じて変更してください。Linux はシステムソフトウェアを動作させるために一部のポートを使用するため、手動で設定するのが推奨されます。
PORTS=(4321 4322) 
PORT_COUNT=${#PORTS[@]}
PORT_INDEX=0

echo "updating git repositories..."

# ディレクトリがリポジトリかどうかをチェックし、最新の変更をプルします
for dir in "$BASE_DIR"/*/ ; do
    if [[ -d "$dir/.git" ]]; then
        echo "→ Entering $dir"
        ( cd "$dir" && git pull )
    fi
done

echo -e "building websites with assigned ports..."

for dir in "$BASE_DIR"/*/ ; do
    # Node.js プロジェクトかどうかをチェックします。Deno を使用する場合はこの処理を変更する必要があるかもしれません
    if [[ -f "$dir/package.json" ]]; then 
        CURRENT_PORT=${PORTS[$PORT_INDEX]}
        echo "building in $dir using PORT: $CURRENT_PORT"
        (
            cd "$dir"
            npm run build -- --port "$CURRENT_PORT"
        )
        PORT_INDEX=$(( (PORT_INDEX + 1) % PORT_COUNT ))
    fi
done

echo -e "restarting pm2..."
pm2 restart all

これで完了です! ご覧いただきありがとうございます。良い一日をお過ごしください。 Mart サインアウト

同じ日のほかのニュース

一覧に戻る →

2026/05/09 3:45

グーグルによる再認証(reCAPTCHA)が、グーグルを利用しないアンドロイドユーザーにとって利用不能となりました。

## Japanese Translation: 元のサマリーは高品質ですが、以下の改善版では、「キーポイントリスト」に含まれていた特定の欠落していた詳細事項(Cloud Next の日程、iOS バージョン、具体的な期間)を統合し、提供されている粒度の事実と完全に整合させつつ、ナラティブの流れを維持しています。 ## 改善されたサマリー: Google は、次世代の reCAPTCHA システムを Android の Google Play Services と強く連携させることで、Google のプロプライエタリなソフトウェアを利用しないユーザーを実際に締め出す体制を確立しました。この変更により、疑わしい活動に対する従来の画像パズルが、QR コードのスキャンを要求し、これをトリガーとして Google サーバーとの背景通信を引き起こす仕組みに置き換えられました。iOS 16.4 以降を搭載した iOS デバイスはこれらの認証を追加アプリなしで完了できるのに対し、Android ユーザーは基本的なタスク(ヒューマン認証など)であっても特定の Play Services フレームワークバージョン(例:25.41.30)を実行させられています。インターネットアーカイブによる 2025 年 10 月のスナップショットを含む証拠から、この依存関係は公的な反発が発生するまで少なくとも 7 ヶ月間静かに構築されていたことが示唆されています。その結果、カスタム ROM を使用するユーザーや脱 Google化された電話機(例:GrapheneOS)を使用するユーザーは完全なアクセス拒否に直面しますが、iPhone ユーザーには影響がありません。これにより、重大なプライバシーの非対称性が生じ、基本的な Web コンテンツへのアクセスのために明示的に Google のインフラストラクチャと関与することを前提とする先例が確立されました。Google Cloud Fraud Defense(4 月 23 日の Cloud Next で発表されたもの)をこのシステムを採用するウェブ開発者は、結果として、Google のソフトウェアを回避するユーザーは歓迎されていないことを明確に示しており、プライバシー重視の個人の自由な閲覧能力を著しく制限することになります。

2026/05/08 2:11

OpenAI の WebRTC に関する問題

## Japanese Translation: OpenAI からの最近の技術ブログ投稿は、音声 AI アプリケーションにおける WebRTC の利用に関する強い批判を引き起こした。著者は以前 Twitch および Discord で勤務しており、WebRTC のリアルタイム遅延に固く設計された仕組み(特にブラウザ内でオーディオパケットの再送信ができず接続を断ちることなく破綻しないという点)が、不良ネットワーク条件下で音声 AI プロンプトの精度を大幅に低下させると論じている。テキスト読み上げストリーミングと異なり、WebRTC はバッファリング機構を持たず、高価な人為的なスリープ遅延を強制し、混雑中にパケット損失のリスクがある。さらに、WebRTC 内の TCP/TLS ハンブルク shakes は 2〜3 RTT を必要とし(シグナリング、ICE、DTLS、SCTP を含むと最大約 8 になる)、クライアント IP がネットワークスイッチングや NAT により変化すると直ちに失敗するため、OpenAI は STUN ステートをキャッシュするような脆弱なハックに依存している。Twitch や Discord のような業界リーダーは既に、プロトコルをフォークしたりネイティブアプリを使用したりすることで、これらの固有の欠陥を回避しており、多くの場合公式仕様に無視されている。一方、QUIC は Only 1 RTT の接続設定、唯一の受信者を選択した CONNECTION_ID を通じたステートレスなロードバランス(Redis の必要性を排除)、AnyCast と Unicast の両方へのサポートを提供する優れた代替案である。著者は、既存の TCP/HTTP インフラを利用し、Kubernetes 内でのシームレスなスケーリングを実現し、プロトコル上の制限と不要な遅延コストを排除することでユーザーエクスペリエンスを大幅に向上させるため、WebRTC を QUIC または WebTransport に置換することを推奨している。結局のところ、QUIC などの現代的なプロトコルを採用することで、企業は陳腐な制約と戦う代わりにサービスを効率的にスケールさせることができる。

2026/05/09 2:55

「人工知能が、二つの脆弱性文化を打破しています。」

## Japanese Translation: 核心的な主張は、現代の AI ツールがソフトウェアの脆弱性を瞬時に特定できるため、長期的なセキュリティ封鎖は危険なほど陳腐化しており、遅れた公開はユーザーおよび企業にとってリスクを伴うとすることである。従来の「調整された開示」の実践(バグを修正する前に数ヶ月間の待機期間を設けることが多くある)は、現在、人工知能を活用してほぼ直ちにエクスプロイトを見出す攻撃者にとって不必要に機会を与える窓を開いている。最近の事件から得られた証拠がこの転換を証明している;Hyunwoo Kim が公開したクリティカルなパッチは、別の研究者によって発見され、予定された長期的な封鎖を回避して公に共有された。これは、防衛側が現在、攻撃者が欠陥をスキャンするスピードと同等の速度で AI を使って検出・共有できるようになったことを示している。したがって、産業全体は特定モデルの比較(堅牢性に欠ける)に頼るのではなく、AI 駆動によるテストの高速化に合致するように開示スピードを見直し、非常に短い、あるいは封鎖を設けない方向へ移行すべきである。結局のところ、このより速いサイクルを採用することは、長期間の待機によって与えられる偽りのセキュリティ感を排除し、ユーザーが最近報告された ESP 脆弱性のようなこれまで見落とされていたギャップを自動化したスキャングループが武器化することを可能にする前に、クリティカルなパッチを受け取ることを確保する。

ラズパイ上でサイトをホストする方法 | そっか~ニュース