Traefik on Ubuntu — 自動SSL証明書付きリバースプロキシの構築

サーバー構築


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 ラベルだけで本番運用できる最小構成を紹介

目次

  1. Traefik とは何か
  2. 前提条件の確認
  3. Traefik のインストールと設定
  4. Let’s Encrypt 自動SSL の設定
  5. ダッシュボードの確認
  6. サービスを追加してルーティング
  7. よくあるエラーと解決策
  8. まとめ

Traefik とは何か

Traefik(トレフィク)は、クラウドネイティブな時代のために設計されたリバースプロキシ・ロードバランサーです。nginx や HAProxy が「設定ファイルを書いてリロード」というスタイルなのに対して、Traefik は Docker や Kubernetes の変化をリアルタイムに検知して自動でルーティングを更新します。

Traefikアーキテクチャ概念図(概念図)
Traefikアーキテクチャ概念図(概念図)

特に便利な機能が「ACME プロバイダーとの自動連携」です。Let’s Encrypt の HTTP チャレンジも DNS チャレンジも、Traefik が代わりに処理します。証明書の更新期限が近づくと自動で更新されるため、certbot renew を cron で動かす必要がありません。

2026年6月時点の最新安定版は Traefik v3.3.7(コードネーム saintnectaire)です。本記事の手順はすべてこのバージョンで動作確認しています。

Traefik v3.3.7 バージョン確認(実測)
Traefik v3.3.7 バージョン確認(実測)

前提条件の確認

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 鍵生成の実出力(実測)
OpenSSH 9.6p1 鍵生成の実出力(実測)



ubuntu@vps: ~
$ ssh -V
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.ymldocker-compose.yml)で完結します。

手順2:作業ディレクトリを作る




ubuntu@vps: ~
$ mkdir -p /opt/traefik && cd /opt/traefik
$ 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 として保存してください。




traefik.yml
api:
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 を作成する




docker-compose.yml
services:
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 ネットワークを作成してから起動する




ubuntu@vps: /opt/traefik
$ docker network create traefik_network
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 を指していることが必須です。

証明書の取得状況は以下のコマンドで確認できます:




ubuntu@vps: /opt/traefik
$ docker compose logs | grep -i “acme\|cert\|tls”
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ダッシュボード(ホーム画面・実撮影)
Traefikダッシュボード(ホーム画面・実撮影)

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

著者アイコン
著者アイコン

実際に Docker で Traefik を起動してダッシュボードにアクセスしてみました。nginx の設定ファイルを書き直す必要が一切なく、新しいサービスを追加するたびに自動でルーターが増えていくのは気持ちいいです。

HTTP ルーターの確認

Traefik HTTPルーター一覧(実撮影)
Traefik HTTPルーター一覧(実撮影)

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

サービスの確認

Traefik HTTPサービス一覧(実撮影)
Traefik HTTPサービス一覧(実撮影)

「HTTP Services」タブでは、バックエンドサービスの状態が確認できます。ヘルスチェックの結果(健全 / 不健全)もここで確認できます。

サービスを追加してルーティング

Traefik の最大の強みが、Docker ラベルを追加するだけでルーティングが自動設定される点です。例として、シンプルな Nginx コンテナを追加してみましょう。




myapp/docker-compose.yml
services:
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



ubuntu@vps: ~/myapp
$ docker compose up -d
✔ 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 のパーミッションエラー




ubuntu@vps: /opt/traefik
level=error msg=”The ACME resolver ‘letsencrypt’ is skipped from the resolvers list because: unable to get ACME client: permissions 0644 for /acme.json are too open, please use 600″

解決策chmod 600 /opt/traefik/acme.json を実行してから再起動してください。

② Let’s Encrypt チャレンジが失敗する




ubuntu@vps: /opt/traefik
level=error msg=”Unable to obtain ACME certificate for domains [\”app.example.com\”]: unable to generate a certificate for the domains: acme: Error -> One or more domains had a problem: [app.example.com] acme: error: 400 :: urn:ietf:params:acme:error:dns”

解決策:ドメインの DNS A レコードがサーバーの IP に向いているか確認してください。dig +short app.example.com A でサーバーの IP が返ってくれば OK です。また、VPS のセキュリティグループ(ファイアウォール)でポート80が開いているか確認してください。

③ ダッシュボードにアクセスできない

注意:ダッシュボードへの Basic 認証

traefik.ymlapi.insecure: false(推奨)に設定した場合、basicauth ミドルウェアが正しく設定されていないとアクセスできません。htpasswd -nbB admin "your_password" でハッシュを生成し、docker-compose.yml の basicauth.users に設定してください。

④ コンテナが traefik_network に参加していない




ubuntu@vps: ~
$ docker network inspect traefik_network | grep -A5 ‘”Containers”‘
“Containers”: {
“abc123”: {
“Name”: “traefik”,
“IPv4Address”: “172.18.0.2/16”,

解決策:追加したサービスの docker-compose.ymlnetworks: 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 でインスタンスを立ててみてください。

コメント

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