「認証・HTTPS・レート制限を別々のNginxディレクティブに分散して書くのが管理しづらい。YAMLで一括管理できるリバースプロキシに移行したい」
そんな悩みを持つLinuxサーバー管理者向けに、この記事ではTraefikをDockerで起動してOllamaのAPIを保護する手順を解説する。OllamaがUbuntu Serverにsystemdサービスとして稼働している前提で進める。自動HTTPS・BasicAuth・レート制限・IP制限をYAMLファイル2枚で完結させる構成を段階的に組み立てていく。
この記事のポイント
・Traefikはtraefik.yml+dynamic.ymlの2ファイルでBasicAuth・HTTPS・レート制限を一括管理できる
・dynamic.ymlはwatch:trueで変更を自動反映するためTraefik再起動なしで設定変更が効く
・docker-compose.ymlにextra_hostsを設定することでコンテナ内からホストのOllama(11434番)へ接続できる
・Let's Encrypt証明書はTraefik内蔵のACMEクライアントが自動取得・自動更新するためcertbotは不要
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
TraefikをNginxと比較したときの特徴
TraefikはGoで書かれたモダンなリバースプロキシで、Let's Encrypt証明書の取得・更新が内蔵されている。NginxでHTTPS化する場合はcertbotを別途インストールしてcronで更新タスクを管理するが、TraefikはLet's Encrypt統合が静的設定ファイルへの数行の記述で完結する。
NginxがApache風のディレクティブ構文を採用しているのに対し、TraefikはYAMLまたはTOML形式で書く。「proxy_passとlocationの書き方を毎回調べる」という場面が減り、設定の見通しが良くなる。
可観測性の面でも特徴がある。Traefikはアクティブなルートやミドルウェアの状態を確認できる管理ダッシュボードをオプションで有効化できる。情シス主導でローカルLLMを社内導入する場面では、どのドメインがどのバックエンドへ向いているかを視覚的に把握できる点が運用上便利だ。
Nginxとの主な違いをまとめると以下の通り。
・設定形式: Nginx=ディレクティブ構文 / Traefik=YAML/TOML
・HTTPS証明書: Nginx=certbotが別途必要 / Traefik=内蔵ACMEクライアントが自動取得
・設定変更の反映: Nginx=nginx -t → reload必須 / Traefik=watch:trueで自動反映
・ダッシュボード: Nginx=なし(別途導入が必要) / Traefik=内蔵(オプション有効化)
前提確認:OllamaとDockerの稼働チェック
1. Ollamaがloopbackで待ち受けていることを確認する
まずOllamaがlocalhostのみでリッスンしていることを確認する。systemdサービスの環境変数を確認するには以下のコマンドを使う。$ sudo systemctl show ollama --property=Environment # Environment=OLLAMA_HOST=127.0.0.1 $ curl -s http://127.0.0.1:11434/api/tags # {"models":[{"name":"llama3.3:70b-instruct-q4_0","modified_at":"...","size":...}]}
2. DockerとDocker Composeが利用できることを確認する
TraefikはDockerコンテナとして起動する。未インストールの場合は公式手順に従ってインストールする。$ docker --version # Docker version 27.3.1, build ce12230 $ docker compose version # Docker Compose version v2.29.7
Traefikコンテナ起動に必要なファイル構成を準備する
1. 作業ディレクトリを作成する
Traefikの設定ファイルをまとめるディレクトリを用意する。$ mkdir -p ~/traefik $ cd ~/traefik
2. 静的設定ファイル(traefik.yml)を作成する
`traefik.yml`はTraefikの起動時設定を記述するファイルだ。エントリポイント・Let's Encrypt設定・設定プロバイダーの3つを定義する。$ cat > ~/traefik/traefik.yml << 'EOF' api: dashboard: false log: level: INFO entryPoints: web: address: ":80" http: redirections: entryPoint: to: websecure scheme: https permanent: true websecure: address: ":443" certificatesResolvers: letsencrypt: acme: email: admin@example.com storage: /letsencrypt/acme.json httpChallenge: entryPoint: web providers: file: filename: /etc/traefik/dynamic.yml watch: true EOF
`watch: true`を設定することで、`dynamic.yml`を変更するとTraefikが再起動なしで設定を自動反映する。ルート追加やミドルウェア設定変更のたびに`docker compose restart`が不要になる。
3. 動的設定ファイル(dynamic.yml)の初期ファイルを作成する
この後の手順でルートやミドルウェアの設定を追記する。まず空の定義を置いておく。$ cat > ~/traefik/dynamic.yml << 'EOF' http: {} EOF
4. Let's Encrypt証明書の保存ファイルを用意する
$ mkdir -p ~/traefik/letsencrypt $ touch ~/traefik/letsencrypt/acme.json $ chmod 600 ~/traefik/letsencrypt/acme.json
5. htpasswdファイルの空ファイルを作成する
docker-compose.ymlでマウントするため先にファイルを作成しておく。後のステップでユーザーを追加する。$ touch ~/traefik/.htpasswd
TraefikをDocker Composeで起動する
1. docker-compose.ymlを作成する
$ cat > ~/traefik/docker-compose.yml << 'EOF' services: traefik: image: traefik:v3.3 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 - ./dynamic.yml:/etc/traefik/dynamic.yml:ro - ./letsencrypt:/letsencrypt - ./.htpasswd:/etc/traefik/.htpasswd:ro extra_hosts: - "host.docker.internal:host-gateway" EOF
2. コンテナを起動してログを確認する
$ cd ~/traefik $ docker compose up -d $ docker compose logs traefik # traefik | time="..." level=info msg="Configuration loaded from file: /etc/traefik/dynamic.yml" # traefik | time="..." level=info msg="Starting provider file"
Ollamaへのルートと自動HTTPSをdynamic.ymlに定義する
1. ルーターとサービスを定義する
`dynamic.yml`を以下の内容に書き換える。`ollama.example.com`は実際のFQDNに変更すること。DNSが対象サーバーのパブリックIPを指していることを事前に確認する。$ cat > ~/traefik/dynamic.yml << 'EOF' http: routers: ollama: rule: "Host(`ollama.example.com`)" entryPoints: - websecure service: ollama tls: certResolver: letsencrypt services: ollama: loadBalancer: servers: - url: "http://host.docker.internal:11434" EOF
2. HTTPS接続を確認する
DNSが正しく設定されていれば、Traefikは自動でLet's Encryptへのチャレンジを行い証明書を取得する。チームに公開するモデルの選定に迷う場合は別記事も参考にしてほしい。$ curl -s -o /dev/null -w "%{http_code}" https://ollama.example.com/api/tags # 200 $ curl -sI http://ollama.example.com/api/tags | head -1 # HTTP/1.1 301 Moved Permanently
BasicAuthミドルウェアでAPIにパスワードを設定する
1. htpasswdコマンドでユーザーを登録する
`apache2-utils`がインストールされていない場合は先にインストールする。$ sudo apt install -y apache2-utils # 最初のユーザー(-c でファイル新規作成) $ htpasswd -c ~/traefik/.htpasswd alice # New password: # Re-type new password: # Adding password for user alice # 2人目以降は -c なし $ htpasswd ~/traefik/.htpasswd bob # Adding password for user bob
2. BasicAuthミドルウェアをdynamic.ymlに追加する
ルーターにミドルウェアを適用し、ミドルウェアの定義を追加する。$ cat > ~/traefik/dynamic.yml << 'EOF' http: routers: ollama: rule: "Host(`ollama.example.com`)" entryPoints: - websecure middlewares: - ollama-auth service: ollama tls: certResolver: letsencrypt services: ollama: loadBalancer: servers: - url: "http://host.docker.internal:11434" middlewares: ollama-auth: basicAuth: usersFile: "/etc/traefik/.htpasswd" EOF
3. 認証の動作を確認する
`.htpasswd`ファイルの変更はTraefikの再起動が必要になる(動的設定ファイルの変更と異なる点だ)。ファイルを変更した後は`docker compose restart traefik`を実行する。$ docker compose restart traefik # 認証なし → 401 $ curl -s -o /dev/null -w "%{http_code}" https://ollama.example.com/api/tags # 401 # 認証あり → 200 $ curl -u alice:mypassword https://ollama.example.com/api/tags # {"models":[{"name":"llama3.3:70b-instruct-q4_0",...}]}
レート制限とIP制限でGPU過負荷・乱用を防ぐ
LLMのAPIは1リクエストあたりのGPU負荷が高い。悪意あるリクエストや設定ミスによる大量連投でサーバーが応答不能になる前に制限を設ける。1. rateLimit設定をdynamic.ymlに追加する
`middlewares`セクションに`ollama-ratelimit`を追加し、routerの`middlewares`リストにも加える。routers: ollama: # ... middlewares: - ollama-auth - ollama-ratelimit middlewares: ollama-auth: basicAuth: usersFile: "/etc/traefik/.htpasswd" ollama-ratelimit: rateLimit: average: 10 period: "1m" burst: 3
2. IPアドレス制限を追加する
社内ネットワークからのアクセスのみに限定する場合は`ipAllowList`ミドルウェアを追加する。TraefikはNginxのsatisfy allに相当する複数ミドルウェアの組み合わせができる(全て通過が必須)。middlewares: ollama-ipallow: ipAllowList: sourceRange: - "192.168.1.0/24" - "10.0.0.0/8"
よくあるトラブルと対処法
実際の設定でつまずきやすいポイントを4つ挙げる。**TraefikがConfigurationエラーで起動しない**
YAMLのインデントミスが最多原因だ。タブ文字の使用は禁止でスペース2個インデントを徹底する。`docker compose logs traefik 2>&1 | grep -i error`でエラー内容を確認してから修正する。
**502 Bad Gatewayになる**
TraefikからOllamaへ到達できていない。コンテナ内から直接接続テストを行う。
$ docker compose exec traefik wget -q -O - http://host.docker.internal:11434/api/tags # {"models":[...]}
**証明書が取得できない**
Let's EncryptはドメインのDNSがサーバーのパブリックIPに向いており、かつ80番ポートが外部から到達できる状態でないとHTTPチャレンジが失敗する。`docker compose logs traefik | grep -i acme`でACME関連のエラーを確認する。ファイアウォールで80番が閉じていることが多い。
**認証設定が反映されない**
`dynamic.yml`の変更は自動反映されるが、`.htpasswd`ファイルの変更は`docker compose restart traefik`が必要だ。ユーザーを追加・削除したあとの再起動を忘れないこと。
まとめ
Traefikを使ったOllamaのリバースプロキシ構成は`traefik.yml`と`dynamic.yml`の2ファイルで完結する。Nginxのようにcertbotの別管理が不要で、Let's Encrypt統合が静的設定に内蔵されている点が大きな違いだ。ルートやミドルウェアの追加はdynamic.ymlを編集するだけで自動反映される。| 設定項目 | 設定ファイル | 代表的なコマンド・設定値 |
|---|---|---|
| エントリポイント | traefik.yml | entryPoints.web.address: ":80" |
| 自動HTTPS | traefik.yml | certificatesResolvers.letsencrypt.acme.httpChallenge |
| OllamaへのルーティングURL | dynamic.yml | http://host.docker.internal:11434 |
| BasicAuth | dynamic.yml + .htpasswd | htpasswd -c ~/traefik/.htpasswd alice |
| レート制限 | dynamic.yml | rateLimit.average: 10 / period: "1m" |
| IP制限 | dynamic.yml | ipAllowList.sourceRange: ["192.168.1.0/24"] |
| 設定反映方法 | dynamic.yml変更 | 自動反映(watch: true)/.htpasswd変更時のみdocker compose restart traefik |
ローカルLLMのセキュア公開を2日間のハンズオンで体験する
Traefikの設定ファイルやLet's EncryptのACMEチャレンジは、手を動かさないと挙動が掴みにくい。YAMLの書き方・自動証明書取得の仕組み・BasicAuthの動作を実機で確かめたい方向けに、「ローカルAIマスターセミナー」を開催しています。
少人数(最大8名)ZOOMハンズオン形式で実施しています。
・Ubuntu ServerでローカルLLMを構築する方法|Ollamaで機密データを外に出さず業務AIを動かす完全ガイド
・社内でChatGPTが使えないときの代替手段|機密データを守るローカルLLMという選択肢
・ローカルLLMのモデルを比較する方法|Llama3.3・Mistral・Gemma・Phi-4をUbuntuで使い分けるポイント
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:OllamaをTailscaleのプライベートネットワーク経由で公開する方法|ゼロコンフィグVPNでチームがどこからでもローカルLLMに安全接続する手順
- この記事の属するカテゴリ:ローカルLLMへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます