TailscaleとCaddyを組み合わせることで、各サービスへ手軽にHTTPSでアクセス出来るようになりますが、先述したように、サブドメインでアクセスするためのワイルドカード証明書を使うにはDNS-01チャレンジが必要で、そのためにはドメインのDNSを外部プロバイダ(Cloudflare、Route53など)で管理している必要があるので、まずは手軽なポート番号を利用した方法で行います。
導入済みサービスの変更点
各サービス側(docker-compose.yml)
ports:を削除(ホストに直接公開しない)caddy-netをネットワークに追加
Caddy側
docker-compose.ymlのports:に使うポートを追加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 比較
| Docker | LXD | |
|---|---|---|
| ネットワーク設定 | caddy-net の管理が必要 | IPで直接指定、シンプル |
| サービスの独立性 | コンテナ間で共有 | 完全に分離 |
| リソース消費 | 軽量 | やや重い |
| サービスごとの管理 | compose単位 | コンテナ単位でSSH可能 |
| Caddyとの連携 | ポートマッピング必要 | IPで直接つなぐだけ |
ただし現状すでにDockerで動いているなら、わざわざ移行するほどでもないです。新しいサーバーを立てるならLXDの方が管理しやすいと思います。

