簡単に自宅サーバーを公開！Cloudflare Quick TunnelsとDocker Composeでポート開放不要

# ポート開放不要で自宅サーバーを安全に公開する方法

:::note info
主なポイント
- ポート開放不要で自宅サーバーを安全に公開
- Cloudflare TunnelのQuick Tunnelsを利用して簡単に公開
- Docker ComposeとPythonのhttp.serverを組み合わせた手軽なセットアップ
:::

## はじめに

自宅サーバーをインターネットに公開する際、従来はルーターのポート開放や動的DNS（DDNS）の設定など、ネットワークに関する複雑な設定が必要でした。しかし、これらの手順は初心者にとってハードルが高く、セキュリティリスクも伴います。そこで、CloudflareのQuick Tunnels機能とDocker Composeを組み合わせることで、アカウント不要かつポート開放なしで簡単に自宅サーバーを公開する方法を紹介します。

## 必要なツールと技術

- **Docker Compose**
- **Cloudflare Tunnel（Quick Tunnels）**
- **Pythonのhttp.serverモジュール**

## 全体構成

本構成では、以下の2つのサービスをDocker Composeで管理します。

| サービス名      | 役割                                         | 使用イメージ                           |
| --------------- | -------------------------------------------- | -------------------------------------- |
| **web**       | Pythonのhttp.serverを用いた簡易ウェブサーバー | `python:3.9-slim-buster`               |
| **cloudflared** | Cloudflare Tunnelを利用して外部からのアクセスを可能にする | `cloudflare/cloudflared:latest`        |

## Docker Composeの設定

Docker Composeを使用することで、複数のコンテナを一元管理し、簡単に起動・停止が可能です。以下に示す `docker-compose.yml` ファイルは、Pythonのhttp.serverとCloudflare Tunnelを連携させるための設定例です。

```yaml
services:
  web:
    image: python:3.9-slim-buster
    entrypoint: python -m http.server 8000
  cloudflared:
    image: cloudflare/cloudflared:latest
    depends_on:
      - web
    command: tunnel --no-autoupdate --url http://web:8000
```

## 設定内容の詳細

### webサービス

Pythonの公式イメージを使用します。エントリーポイントとして `python -m http.server 8000` を指定することで、ポート8000番で簡易的なウェブサーバーを起動します。

### cloudflaredサービス

Cloudflare Tunnelの公式イメージを使用し、Pythonで起動したサーバーに依存して起動します。コマンドとして `tunnel --no-autoupdate --url http://web:8000` を指定することで、webサービスのポート8000番にトンネルを接続します。

## Cloudflare Quick Tunnelsの概要

Cloudflare Quick Tunnelsは、Cloudflareが提供するトンネリングサービスで、アカウントを作成せずに簡単に外部からのアクセスを自身のサーバーに接続することができます。従来のトンネリングサービスと異なり、設定が非常にシンプルで、初心者でも容易に利用可能です。

## サーバーの起動とトンネルURLの取得

Docker Composeを使用してサーバーをバックグラウンドで起動すると、Cloudflare Tunnelが生成する外部アクセス用のURLは毎回変動します。これを自動的に取得し、利用可能にするために以下のBashスクリプトを用意しました。

```bash
#!/bin/bash
mkdir -p data
docker compose logs cloudflared | grep "trycloudflare.com" | grep -o "https://[^ ]*trycloudflare.com" | head -n 1 > data/tunnel_url.txt
if [ -s data/tunnel_url.txt ]; then
    echo "Tunnel URL found:"
    cat data/tunnel_url.txt
else
    echo "Tunnel URL not found."
fi
```

## スクリプトの役割

- **ログの確認**: `docker compose logs cloudflared` コマンドでcloudflaredサービスのログを取得します。
- **URLの抽出**: `grep` コマンドを用いて、生成されたトンネルURL（`https://*.trycloudflare.com`）を抽出します。
- **ファイルへの保存**: 抽出したURLを `data/tunnel_url.txt` に保存します。
- **結果の表示**: URLが正常に取得できた場合は表示し、取得できなかった場合はエラーメッセージを表示します。

## 実際のセットアップ手順

### 1. 環境の準備

まず、DockerおよびDocker Composeがインストールされていることを確認してください。インストールされていない場合は、公式サイトの手順に従ってインストールを行ってください。

### 2. プロジェクトディレクトリの作成

次に、プロジェクト用のディレクトリを作成し、そこに移動します。

```bash
mkdir my-home-server
cd my-home-server
```

### 3. Docker Composeファイルの作成

上述の `docker-compose.yml` ファイルを作成します。任意のテキストエディタを使用して以下の内容を保存してください。

```yaml
services:
  web:
    image: python:3.9-slim-buster
    working_dir: /app
    volumes:
      - ./app:/app
    entrypoint: python -m http.server 8000
  cloudflared:
    image: cloudflare/cloudflared:latest
    depends_on:
      - web
    command: tunnel --no-autoupdate --url http://web:8000
```

### 4. サーバーの起動

Docker Composeを使用してサービスをバックグラウンドで起動します。

```bash
docker compose up -d
```

### 5. トンネルURLの取得

作成したBashスクリプトを実行して、生成されたトンネルURLを取得します。以下の手順で実行してください。

```bash
chmod +x get_tunnel_url.sh
./get_tunnel_url.sh
```

実行結果として、`data/tunnel_url.txt` にトンネルURLが保存されます。このURLをブラウザに入力することで、自宅サーバーにアクセスすることができます。

## まとめ

本記事では、Cloudflare TunnelのQuick Tunnels機能とDocker Compose、Pythonのhttp.serverを組み合わせることで、ポート開放不要かつアカウント不要で自宅サーバーを簡単に公開する方法を紹介しました。これにより、初心者でもセキュアかつ手軽にウェブサーバーをインターネットに公開することが可能になります。今後、自宅サーバーを利用したプロジェクトやサービスの公開にぜひ活用してみてください。

## 参考資料
- [Cloudflare Quick Tunnels公式ドキュメント](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/do-more-with-tunnels/trycloudflare/)
---