ミニPCにDocker + Cloudflare Tunnelでセルフホスティング
自宅のミニPC 1台で複数のWebサービスを安全に公開する方法。ポート開放なしでCloudflare TunnelでHTTPSをつなぎ、Docker Composeで運用します。
要点まとめ
ミニPCでDocker Composeによりサービスを立ち上げ、Cloudflare Tunnel(cloudflared)でポート開放なしにドメインとHTTPSをつなぐ。ルーター設定も、固定IPも、証明書の更新も必要ない。
目次
クラウド料金は小さなプロジェクトには地味に負担です。私はこのブログを含むいくつかのサービスを、自宅のミニPC 1台に載せて運用しています。その方法を共有します。
なぜミニPCなのか
- 常時稼働していて、電気代は月数千ウォン程度
- Dockerさえあればデプロイ環境はクラウドと同じ
- トラフィックが増えたら、そのとき移せばいい
問題はただ1つ、「自宅ネットワークをどう安全に外へ公開するか」です。
ポートを開けないでください
伝統的にはルーターのポートフォワーディング + DDNS + 証明書更新をやります。面倒ですし、ホームネットワークをそのままインターネットに開くようなものなので危険です。
代わりにCloudflare Tunnelを使います。ミニPCで cloudflared がCloudflareへ外向きに接続を開き、トラフィックはそのトンネルを通って入ってきます。外向けに開けているインバウンドポートは0です。
사용자 → Cloudflare(HTTPS) → 터널 → 미니 PC 의 컨테이너
- 固定IP・ポートフォワーディング不要
- HTTPS証明書はCloudflareが自動処理
- 動的IPでも問題なし
Docker Composeでサービスをまとめる
各サービスはコンテナで立ち上げます。Next.jsアプリなら output: "standalone" でビルドして軽いイメージを作ります。
services:
blog:
build:
context: .
dockerfile: apps/blog/Dockerfile
container_name: why-next-blog
restart: unless-stopped
networks: [api]
networks:
api:
external: true # cloudflared 와 같은 네트워크
ポイントはcloudflaredと同じDockerネットワークに置くことです。そうしてこそ、トンネルがコンテナ名でサービスを見つけられます。
ドメインをつなぐ
Cloudflareダッシュボード(またはトンネル設定)でPublic Hostnameを1つ追加します。
blog.example.com → http://why-next-blog:3001
これで終わりです。docker compose up -d --build すれば、数分後にはドメインでサイトが開きます。
まとめ
- ミニPC + Docker = 安くてクラウドと同じデプロイ
- Cloudflare Tunnelでポート開放なしにHTTPSとドメイン
- cloudflaredと同じネットワークにコンテナを配置
- Public Hostnameで
ドメイン → コンテナ:ポートをマッピング
小さなサービスなら、この組み合わせだけで十分長く持ちます。私もこうやって複数のアプリを運用しながら、作ったものを増やしています。
よくある質問
自宅のIPが動的でも大丈夫ですか?
大丈夫です。Cloudflare TunnelはミニPCがCloudflareへ外向きに接続を開く方式なので、固定IP・ポートフォワーディング・DDNSは一切必要ありません。
費用はかかりますか?
Cloudflare Tunnel自体は無料です。ドメイン費用さえあれば始められます。
関連記事
- 💻 開発
Next.jsでMDXブログをゼロから作る - このブログの作り方
CMSなしでマークダウンファイルだけで動くブログをNext.js 16 App Routerで作った過程。フォルダ構成、MDX設定、SEOまで実際のコードの流れでまとめました。
- 💻 開発
アプリ5個を1つのリポジトリで - 個人開発者のTurborepoモノレポ
複数のアプリとWebを1つのリポジトリで管理するTurborepoモノレポの構成法。共通設定の共有、キャッシュでビルドを節約、アプリごとのデプロイまで実践目線でまとめました。
- 📚 学び
英語の単語は暗記せず「自分の文」に変えるべき理由
単語帳をいくら覚えても言葉が出てこない本当の理由と、今日目にしたものを自分の文に変えて記憶に残す方法をまとめました。