
はじめに
こんにちは,ぱうえるです. 皆さん,楽しく開発していますでしょうか?
私は普段,サーバーサイドの開発をしているのですが,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 サーバーを直接起動する構成にすれば,十分動作させることができると思います.
自宅サーバーで,楽しいサーバーサイド開発ライフを!


