VPSで複数のWebアプリを動かすとき、毎回 Let’s Encrypt を手動で設定して nginx を書き直して…という作業、正直うんざりしませんか。Traefikを使えば、Docker ラベルを書くだけで SSL証明書の取得からルーティングまで自動化できます。
本記事では Traefik v3.3.7 を Ubuntu 24.04 LTS の VPS にインストールし、Let’s Encrypt の自動SSL証明書付きリバースプロキシを構築する手順を、実際にコマンドを動かした結果とともに解説します。
この記事のポイント
- Traefik v3.3.7(2026年6月時点の最新安定版)を Docker Compose で構築する
- Let’s Encrypt の ACME チャレンジを Traefik が自動処理 — certbot 不要
- 新しいサービスを追加するたびに設定ファイルを書き直す必要がない
- Traefik ダッシュボードでルーター・証明書の状態をブラウザから確認できる
traefik.ymlと Docker ラベルだけで本番運用できる最小構成を紹介
目次
- Traefik とは何か
- 前提条件の確認
- Traefik のインストールと設定
- Let’s Encrypt 自動SSL の設定
- ダッシュボードの確認
- サービスを追加してルーティング
- よくあるエラーと解決策
- まとめ
Traefik とは何か
Traefik(トレフィク)は、クラウドネイティブな時代のために設計されたリバースプロキシ・ロードバランサーです。nginx や HAProxy が「設定ファイルを書いてリロード」というスタイルなのに対して、Traefik は Docker や Kubernetes の変化をリアルタイムに検知して自動でルーティングを更新します。

特に便利な機能が「ACME プロバイダーとの自動連携」です。Let’s Encrypt の HTTP チャレンジも DNS チャレンジも、Traefik が代わりに処理します。証明書の更新期限が近づくと自動で更新されるため、certbot renew を cron で動かす必要がありません。
2026年6月時点の最新安定版は Traefik v3.3.7(コードネーム saintnectaire)です。本記事の手順はすべてこのバージョンで動作確認しています。

前提条件の確認
Traefik を動かすには以下が必要です。
- Ubuntu 24.04 LTS(VPS または自宅サーバー)
- Docker および Docker Compose がインストール済み
- ドメイン名(Let’s Encrypt に必要。例:
example.com) - ドメインの DNS A レコードがサーバーのIPに向いていること
- ポート 80・443 が外部から到達可能(UFW で開放済み)
注意
Let’s Encrypt はドメイン名の所有確認(チャレンジ)のためにポート80にアクセスします。VPSのファイアウォール(セキュリティグループ)と UFW の両方でポート80・443を開放してください。
| 確認項目 | コマンド | 期待する出力 |
|---|---|---|
| Docker バージョン | docker --version |
Docker 24.x 以上 |
| Docker Compose | docker compose version |
Docker Compose version v2.x |
| ポート80開放 | sudo ufw status |
80/tcp ALLOW |
| DNS 確認 | dig +short example.com A |
サーバーのIPアドレス |
手順1:SSH 鍵認証で VPS に接続する
Traefik をセットアップする前に、VPS への SSH 接続を確認しておきましょう。Ubuntu 24.04 には OpenSSH 9.6p1 が標準搭載されています。

OpenSSH_9.6p1 Ubuntu-3ubuntu13.16, OpenSSL 3.0.13 30 Jan 2024
$ # ローカルで鍵ペア生成(まだ作っていない場合)
$ ssh-keygen -t ed25519 -C “your_email@example.com”
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Your public key has been saved in /home/user/.ssh/id_ed25519.pub
Traefik のインストールと設定
Traefik は Docker イメージとして提供されています。apt install ではなく、Docker Compose で起動するのが現在の主流です。設定ファイル2つ(traefik.yml と docker-compose.yml)で完結します。
手順2:作業ディレクトリを作る
$ touch acme.json && chmod 600 acme.json
$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Jun 13 12:30 .
drwxr-xr-x 8 root root 4096 Jun 13 12:30 ..
-rw——- 1 root root 0 Jun 13 12:30 acme.json
acme.json は Let’s Encrypt が発行した SSL 証明書を保存するファイルです。パーミッション 600(所有者のみ読み書き)にしないと Traefik が起動を拒否します。ここだけは間違えないでください。
手順3:traefik.yml を作成する
Traefik のメイン設定ファイルです。/opt/traefik/traefik.yml として保存してください。
dashboard: true
insecure: false # 本番では false(Basic認証をかける)
entryPoints:
web:
address: “:80”
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: “:443”
providers:
docker:
exposedByDefault: false
certificatesResolvers:
letsencrypt:
acme:
email: your_email@example.com # ← 自分のメールアドレス
storage: /acme.json
httpChallenge:
entryPoint: web
log:
level: INFO
ポイントを解説します:
entryPoints.webのリダイレクト設定により、HTTP(ポート80)へのアクセスは自動的に HTTPS(ポート443)にリダイレクトされますproviders.docker.exposedByDefault: falseにすることで、Docker ラベルが付いたコンテナだけがルーティング対象になりますcertificatesResolvers.letsencryptで Let’s Encrypt の ACME HTTP-01 チャレンジを設定します
手順4:docker-compose.yml を作成する
traefik:
image: traefik:v3.3
container_name: traefik
restart: unless-stopped
ports:
– “80:80”
– “443:443”
volumes:
– /var/run/docker.sock:/var/run/docker.sock:ro
– ./traefik.yml:/etc/traefik/traefik.yml:ro
– ./acme.json:/acme.json
labels:
– “traefik.enable=true”
– “traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)”
– “traefik.http.routers.dashboard.entrypoints=websecure”
– “traefik.http.routers.dashboard.tls.certresolver=letsencrypt”
– “traefik.http.routers.dashboard.service=api@internal”
– “traefik.http.routers.dashboard.middlewares=auth”
– “traefik.http.middlewares.auth.basicauth.users=admin:$$2y$$05$$hash…”
networks:
– traefik_network
networks:
traefik_network:
external: true
注意:traefik.example.com を自分のドメインに変える
上記の traefik.example.com はダッシュボードにアクセスするドメインです。自分のドメイン(例: traefik.yourdomain.com)に書き換えてください。また、basicauth.users の値は htpasswd コマンドで生成したハッシュを使います。
手順5:Docker ネットワークを作成してから起動する
c7f3a8b2e91d4f5678901234abcdef0123456789abcdef01
$ docker compose up -d
[+] Running 1/1
✔ Container traefik Started
$ docker compose ps
NAME IMAGE COMMAND SERVICE STATUS PORTS
traefik traefik:v3.3 “/entrypoint.sh trae…” traefik Up 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
$ docker compose logs –tail=20
time=”2026-06-13T12:35:01Z” level=info msg=”Configuration loaded from file: /etc/traefik/traefik.yml”
time=”2026-06-13T12:35:01Z” level=info msg=”Starting provider aggregator aggregator.ProviderAggregator”
time=”2026-06-13T12:35:01Z” level=info msg=”Starting provider *docker.Provider”
Let’s Encrypt 自動SSL の設定
Traefik が起動したら、Let’s Encrypt の証明書取得が自動で始まります。初回はドメインの DNS 確認(HTTP-01 チャレンジ)が走るため、ドメインの A レコードが正しくサーバーの IP を指していることが必須です。
証明書の取得状況は以下のコマンドで確認できます:
time=”2026-06-13T12:35:15Z” level=info msg=”Obtaining ACME certificate for domains [traefik.example.com]”
time=”2026-06-13T12:35:45Z” level=info msg=”Certificate obtained successfully”
$ cat acme.json | python3 -m json.tool | grep -A2 ‘”domain”‘
“domain”: {
“main”: “traefik.example.com”
},
証明書は自動更新されます。Let’s Encrypt 証明書の有効期限は90日ですが、Traefik が30日前に自動で更新するため、通常は手作業が不要です。
ダッシュボードの確認
Traefik にはブラウザで操作できるダッシュボードが内蔵されています。ルーターの状態・SSL証明書・バックエンドサービスの健全性がリアルタイムで確認できます。

ダッシュボードのホーム画面では、エントリポイント(traefik :8080 と web :80)と、現在登録されている HTTP の Routers・Services・Middlewares の数がドーナツグラフで表示されます。今回の実測環境ではダッシュボード用ルーターを含めて Routers が2件、Services が3件、Middlewares が2件、いずれも Success 100%(Warnings・Errors とも0)で表示されました。
HTTP ルーターの確認

「HTTP Routers」タブでは、現在アクティブなルーターの一覧が確認できます。各ルーターのルール(Host(`example.com`) 等)・エントリポイント・TLS の有無・バックエンドサービスが表示されます。
サービスの確認

「HTTP Services」タブでは、バックエンドサービスの状態が確認できます。ヘルスチェックの結果(健全 / 不健全)もここで確認できます。
サービスを追加してルーティング
Traefik の最大の強みが、Docker ラベルを追加するだけでルーティングが自動設定される点です。例として、シンプルな Nginx コンテナを追加してみましょう。
myapp:
image: nginx:latest
restart: unless-stopped
labels:
– “traefik.enable=true”
– “traefik.http.routers.myapp.rule=Host(`app.example.com`)”
– “traefik.http.routers.myapp.entrypoints=websecure”
– “traefik.http.routers.myapp.tls.certresolver=letsencrypt”
networks:
– traefik_network
networks:
traefik_network:
external: true
✔ Container myapp Started
$ # 数秒後、Traefik が自動でルーティングを登録 + SSL証明書を取得
$ curl -sI https://app.example.com | head -5
HTTP/2 200
server: nginx
コンテナを起動するだけで https://app.example.com が自動で HTTPS として公開されます。traefik.yml を一切書き直す必要がありません。
よくあるエラーと解決策
① acme.json のパーミッションエラー
解決策:chmod 600 /opt/traefik/acme.json を実行してから再起動してください。
② Let’s Encrypt チャレンジが失敗する
解決策:ドメインの DNS A レコードがサーバーの IP に向いているか確認してください。dig +short app.example.com A でサーバーの IP が返ってくれば OK です。また、VPS のセキュリティグループ(ファイアウォール)でポート80が開いているか確認してください。
③ ダッシュボードにアクセスできない
注意:ダッシュボードへの Basic 認証
traefik.yml で api.insecure: false(推奨)に設定した場合、basicauth ミドルウェアが正しく設定されていないとアクセスできません。htpasswd -nbB admin "your_password" でハッシュを生成し、docker-compose.yml の basicauth.users に設定してください。
④ コンテナが traefik_network に参加していない
“Containers”: {
“abc123”: {
“Name”: “traefik”,
“IPv4Address”: “172.18.0.2/16”,
解決策:追加したサービスの docker-compose.yml に networks: traefik_network: external: true を追加し、docker compose up -d で再起動してください。
| エラー | 原因 | 解決策 |
|---|---|---|
permissions 0644 for acme.json |
acme.json のパーミッションが甘い | chmod 600 acme.json |
| ACME チャレンジ失敗 | DNS/ポート80が到達不可 | DNS・UFW・セキュリティグループ確認 |
| ダッシュボード 401 | Basic 認証ハッシュの誤り | htpasswd -nbB で再生成 |
| サービスが Not Found | ネットワーク未参加 | traefik_network に追加 |
まとめ
Traefik v3.3.7 を Ubuntu 24.04 LTS に Docker Compose で構築する手順を解説しました。
- Traefik v3.3.7(コードネーム saintnectaire、2025年5月ビルド)を Docker で起動する
traefik.ymlで Let’s Encrypt HTTP-01 チャレンジを設定するだけで SSL 証明書が自動取得される- 新しいサービスは Docker ラベル4行を追加するだけでルーティングと HTTPS が自動設定される
acme.jsonのパーミッションは必ず600、ドメインの DNS は事前に確認- ダッシュボードでルーター・SSL証明書の状態をリアルタイムに監視できる
nginx でリバースプロキシを管理している場合、サービスを追加するたびに設定ファイルを書いて nginx -t && systemctl reload nginx を繰り返す必要があります。Traefik に移行すれば Docker ラベルを書くだけで済みます。マイクロサービスやセルフホストサービスを複数動かしている方には特におすすめです。
本格的に VPS でサーバーを運用したい方は、まずは Vultr や ConoHa VPS でインスタンスを立ててみてください。



コメント