自宅サーバーでアプリを公開しよう!

2026-05-17

はじめに

こんにちは,ぱうえるです. 皆さん,楽しく開発していますでしょうか?

私は普段,サーバーサイドの開発をしているのですが,2022 年に Heroku の無料枠が終了して以降,バックエンドを含むアプリケーションを無料でデプロイできるサービスをあまり見かけなくなってしまった気がします.せっかく Web 開発をするならサーバーサイドの開発も広く楽しんでもらいたいという思いから,自宅サーバーでアプリケーションを公開する方法をハンズオン形式で紹介します.

コードはここにおいてあるので,ぜひ試してみてください: https://github.com/kentakom1213/home-server-hands-on

内容に誤りや気になる点があれば,x.com/penguineeer からご連絡ください.

構成

今回はこんな感じの構成でアプリケーションを公開してみます.

0. 準備

PC

まずは,サーバー用パソコンを準備しましょう.スペックは気にせず適当なもので大丈夫です.今回は Linux (Ubuntu) が入っていることを想定していますが,頑張れば他の OS でもできると思います.私は, ・そこそこスペックの MiniPC ・2019 年製 MacBook Air(に Ubuntu をインストールしたもの) ・Raspberry Pi Zero などをサーバーとして使っています.程度の差こそあれどれも比較的ちゃんと動いているので,最初は余っている PC やラズパイなどで始めるのがお手軽でよさそうです.

ドメイン

Cloudflare Tunnel の利用は無料でもできますが,固定の URL で公開したい場合は Cloudflare Domain からドメインを取得する必要があります.安いものだと年間 $5 くらいから取得できるので,取ってみるのもおすすめです.

今回は,まず簡単に試すことを目的として,独自ドメインなしで使える Quick Tunnel を利用します.Quick Tunnel では trycloudflare.com で終わる一時的な URL が発行されます.

1. Docker コンテナで HTTP サーバーを立てよう

補足: PC のスペックが低く,Docker が動かない場合は直接 HTTP サーバーを立てても大丈夫です.その場合はポート番号を控えて,2 に進んでください.

1. Docker 環境がない場合,Install Docker Engine on Ubuntu からインストールしてください. 2. home-server-hands-on リポジトリをクローンしてください. 3. README の指示に従って,Go と Python の HTTP サーバーを立ててみましょう.

http://localhost:8000, http://localhost:8001 にアクセスして,中身が確認できたら完了です!

2. リバースプロキシで HTTP サーバーを統合しよう

リバースプロキシは,外部からサーバーへのリクエストを一旦受け取って,ローカルで動作している HTTP サーバーへ転送してくれるソフトウェアです.外部からのリクエストとローカルの HTTP サーバーの間にリバースプロキシを置くことで,複数アプリケーションへの振り分け,アクセス制御,負荷分散などを管理しやすくすることができます. 代表的なリバースプロキシには Apache や Nginx がありますが,今回は軽量で設定しやすい Caddy を使用して構築してみましょう.

1. 以下のリンクを参考に,Ubuntu に Caddy をインストールします. https://caddyserver.com/docs/install#debian-ubuntu-raspbian 2. Caddy のプロセスが有効化されているかを確認しましょう. $ sudo systemctl status caddy この時点で起動していない場合は,以下のコマンドで有効化します. $ sudo systemctl enable caddy 3. 設定ファイル (/etc/caddy/Caddyfile) を次のように編集します.

:80 {
    handle_path /python/* {
        reverse_proxy localhost:8000
    }

    handle_path /go/* {
        reverse_proxy localhost:8001
    }

    handle {
        header Content-Type "text/html; charset=utf-8"
        respond <<HTML
<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Home Server Hands-On</title>
</head>
<body>
  <h1>Home Server Hands-On</h1>
  <ul>
    <li><a href="/python/">Python + FastAPI</a></li>
    <li><a href="/go/">Go</a></li>
  </ul>
</body>
</html>
HTML 200
    }
}

4. 設定が正しくできているかチェックします. $ sudo caddy validate --config /etc/caddy/Caddyfile 5. 設定を反映します. $ sudo systemctl restart caddy

最後に,http;//localhost:80/python/http://localhost:80/go/ にそれぞれアクセスして,先程と同じページが表示されれば OK です!

3. Cloudflare Tunnel で外部に公開しよう

最後に,インターネットへのアプリの公開を目指します! Cloudflare Tunnel は,自宅サーバー上の Web アプリを,安全にインターネットに公開するための「トンネル」です.通常,自宅サーバー上のアプリをインターネットに公開するには,自宅のグローバル IP アドレスを外部に見せる必要があります.Cloudflare Tunnel を使うと,Cloudflare が外部からの入口となり,自宅サーバー側は Cloudflare へ接続するだけで済むため,自宅の IP アドレスを直接公開せずに安全にアプリを公開できます.

1. 以下のリンクから,サーバーに cloudflared をインストールしましょう. https://pkg.cloudflare.com/index.html#debian-any 2. 以下のコマンドで一時的なトンネルを作って公開します. $ cloudflared tunnel --url http://localhost:80

「Your quick Tunnel has been created!」という文字の下に trycloudflare.com で終わる URL が表示されていたら成功です.URL にアクセスすると,先程作成したアプリケーションを確認することができます!

注意: Quick Tunnel で発行された URL は,URL を知っている人なら誰でもアクセスできます.公開して困る情報や管理画面などは載せないようにしてください.認証を付けたい場合は,Cloudflare Access やアプリケーション側のログイン機能を組み合わせるのがおすすめです.

補足: 先程のコマンドで作成したトンネルは Quick Tunnel というもので,一時的な利用を想定したものです.アプリケーションを永続的に公開する場合は,前述の通りドメインを取得して,以下のリンクを参考に設定してみてください: https://developers.cloudflare.com/tunnel/

4. 最後に

今回は,自宅サーバー上で動かした HTTP サーバーを,Caddy と Cloudflare Tunnel で外部に公開するところまでを試してみました. 自宅サーバーはクラウドサービスと比べると自分で管理する手間がかかりますが,その分,自由にいじれる部分が多く,そして何より安いというメリットがあります! さらに,低スペックのマシンでも,Docker を使わずに HTTP サーバーを直接起動する構成にすれば,十分動作させることができると思います.

自宅サーバーで,楽しいサーバーサイド開発ライフを!