OllamaをTraefikリバースプロキシで保護する方法|自動HTTPS・BasicAuth・レート制限をYAML設定で一括管理する手順

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > ローカルLLM > OllamaをTraefikリバースプロキシで保護する方法|自動HTTPS・BasicAuth・レート制限をYAML設定で一括管理する手順
「OllamaをUbuntu Serverに構築してチームで使い始めたが、外部公開のためのNginx設定でproxy_passやlocationブロックの書き方が煩雑でつまずいている」
「認証・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は不要


OllamaをTraefikリバースプロキシで保護する方法|自動HTTPS・BasicAuth・レート制限をYAML設定で一括管理する手順

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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":...}]}

`OLLAMA_HOST=127.0.0.1`でモデル一覧が返れば問題ない。`0.0.0.0`になっている場合は`/etc/systemd/system/ollama.service.d/override.conf`で`127.0.0.1`に戻してからTraefikを構成する。

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

`email`の値は実際のメールアドレスに変更すること。Let's Encryptは証明書の期限が近づくとこのアドレスへ通知を送る。
`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

`acme.json`のパーミッションが600でないとTraefikが起動時に警告を出して証明書取得を拒否する。この手順は必須だ。

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

`extra_hosts`の`host.docker.internal:host-gateway`が重要なポイントだ。LinuxではDockerコンテナからホストのIPへ`host.docker.internal`でアクセスする設定がデフォルトで有効になっていない。この1行を追加することでTraefikコンテナがホスト側で動くOllamaの11434番ポートへ接続できるようになる。

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"

「Configuration loaded from 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

`watch: true`を設定しているためTraefikはファイルの変更を検知して数秒で設定を反映する。`docker compose restart`は不要だ。

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

HTTPSで200が返り、HTTPアクセスが301でリダイレクトされれば設定は成功だ。現時点では認証がないため次のステップで制限を追加する。

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",...}]}

認証なしで401、認証ありで200が返ればBasic認証は正常に機能している。

レート制限と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

`average: 10`・`period: "1m"`は1分あたり10リクエストまでという設定だ。`burst: 3`は瞬間的なバーストを3リクエストまで許容し、超過分は429 Too Many Requestsを返す。バッチ処理用途のチームには`average: 30`程度に緩める調整が必要な場合もある。

2. IPアドレス制限を追加する

社内ネットワークからのアクセスのみに限定する場合は`ipAllowList`ミドルウェアを追加する。TraefikはNginxのsatisfy allに相当する複数ミドルウェアの組み合わせができる(全て通過が必須)。

middlewares: ollama-ipallow: ipAllowList: sourceRange: - "192.168.1.0/24" - "10.0.0.0/8"

routerのmiddlewaresに`ollama-ipallow`を追加すれば有効になる。IPアドレス制限・BasicAuth・レート制限は全て独立したミドルウェアとして定義し、routerのmiddlewaresリストに並べるだけで組み合わせられる。

よくあるトラブルと対処法

実際の設定でつまずきやすいポイントを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":[...]}

このコマンドが失敗する場合は`extra_hosts: "host.docker.internal:host-gateway"`がdocker-compose.ymlに記述されているか、またはOllamaがsystemdで動いているかを確認する。
**証明書が取得できない**
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ハンズオン形式で実施しています。

>> ローカルAIマスターセミナーの詳細を確認する
ローカルLLMの構築・運用に関する関連記事もあわせて参考にしてください。

・Ubuntu ServerでローカルLLMを構築する方法|Ollamaで機密データを外に出さず業務AIを動かす完全ガイド
・社内でChatGPTが使えないときの代替手段|機密データを守るローカルLLMという選択肢
・ローカルLLMのモデルを比較する方法|Llama3.3・Mistral・Gemma・Phi-4をUbuntuで使い分けるポイント

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。