既存のサービスをCaddyでHTTPS化

TailscaleとCaddyを組み合わせることで、各サービスへ手軽にHTTPSでアクセス出来るようになりますが、先述したように、サブドメインでアクセスするためのワイルドカード証明書を使うにはDNS-01チャレンジが必要で、そのためにはドメインのDNSを外部プロバイダ(Cloudflare、Route53など)で管理している必要があるので、まずは手軽なポート番号を利用した方法で行います。

導入済みサービスの変更点

各サービス側(docker-compose.yml)

  • ports: を削除(ホストに直接公開しない)
  • caddy-net をネットワークに追加

Caddy側

  • docker-compose.ymlports: に使うポートを追加
  • Caddyfile にリバースプロキシのブロックを追加
  • docker exec caddy caddy reload でリロード

「NoteDiscovery」をHTTPS化

ここではシンプルなメモツール「NoteDiscovery」をHTTPS化する例で見ていきます。

NoteDiscoveryのdocker-compose.yml


まず、docker-compose.ymlを修正します。

sudo nano /opt/docker/notediscovery/docker-compose.yml
services:
  notediscovery:
    image: ghcr.io/gamosoft/notediscovery:latest
    container_name: notediscovery
#    ports:            ← コメントアウト
#      - "8000:8000"   ← コメントアウト
    volumes:
      - ./data:/app/data
    restart: unless-stopped
    environment:
      - TZ=Asia/Tokyo
    networks:          # ← 追加
      - caddy-net      # ← 追加
    healthcheck:
      test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"]
      interval: 60s
      timeout: 3s
      retries: 3
      start_period: 5s

networks:              # ← 追加
  caddy-net:           # ← 追加
    external: true     # ← 追加

Caddyのdocker-compose.yml

続いてCaddy側のdocker-compose.ymlを編集。ポートを追加します。

sudo nano /opt/docker/caddy/docker-compose.yml
ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
      - "8000:8000"      # ← 追加
      - "8000:8000/udp"  # ← 追加

Caddyfile

最後にCaddyfileを編集します。

sudo nano /opt/docker/caddy/config/Caddyfile

末尾に追記します。

Tailscaleアドレス.ts.net:8000 {
    reverse_proxy notediscovery:8000
}

設定を反映して起動

設定を反映します。

docker compose -f /opt/docker/notediscovery/docker-compose.yml up -d --force-recreate
docker compose -f /opt/docker/caddy/docker-compose.yml up -d --force-recreate

これで、「https://Tailscaleアドレス.ts.net:8000」で、NoteDiscoveryを利用出来るはずです。

新しいサービスを追加するたびにCaddyの docker-compose.yml を変更してコンテナ再作成が必要なのが唯一の手間です。これを自動化したいなら、caddy-docker-proxy が有効です。各サービスのdocker-compose.ymlにラベルを書くだけでCaddyfileへの追記もポート追加も不要になります。ただし設定が少し複雑になるので、今の構成に慣れてからでも遅くないです。

ちなみに、Caddyで振り分けるなら、DockerよりもLXDのほうがシンプルですね。

LXDの場合

各サービスを別々のコンテナ(VM的な環境)で動かして、ホストのCaddyで振り分けます。

[ブラウザ]
    ↓
[ホストのCaddy]
    ├── :443  → LXCコンテナA (Vaultwarden :80)
    ├── :8000 → LXCコンテナB (NoteDiscovery :8000)
    └── :3300 → LXCコンテナC (Linkwarden :3000)

Dockerと違って caddy-net への参加が不要で、LXCコンテナにはそれぞれIPが割り当てられるので:

# Caddyfileはこれだけ
Tailscaleアドレス.ts.net:8000 {
    reverse_proxy 10.x.x.101:8000
}

Docker vs LXD 比較

DockerLXD
ネットワーク設定caddy-net の管理が必要IPで直接指定、シンプル
サービスの独立性コンテナ間で共有完全に分離
リソース消費軽量やや重い
サービスごとの管理compose単位コンテナ単位でSSH可能
Caddyとの連携ポートマッピング必要IPで直接つなぐだけ

ただし現状すでにDockerで動いているなら、わざわざ移行するほどでもないです。新しいサーバーを立てるならLXDの方が管理しやすいと思います。

タイトルとURLをコピーしました