TraefikでImmichをルーティング

LXCコンテナを作成し、traefikをインストール、DNS-01チャレンジでSSL/TLS証明書を取得して、HTTPSでImmichまでアクセスできるところまでの手順を載せる。

構成

Proxmoxサーバがあり、その上にImmich用のVMとTraefik用のLXCコンテナを立てる。
サーバにはIntel NICが搭載されていて、SR-IOVでVMやLXCコンテナにVFを割り当てられるようになっている。

LXCコンテナ作成

リバースプロキシということで、トラフィック振り分けの能力を高めるために、NICを1つ追加し、SR-IOV VFを割り当てる

vi /etc/pve/lxc/1064.conf

以下の設定を追加

lxc.apparmor.profile: unconfined
lxc.net.1.type: phys
lxc.net.1.link: enp2s0f1v1
lxc.net.1.flags: up
lxc.net.1.ipv4.address: 192.0.2.2/24
lxc.net.1.ipv4.gateway: 192.0.2.1

PVEのGUIでコンテナをスタートさせ、エラーが起きなかったらOK

traefikインストール

バイナリを/usr/bin/traefikに配置し、systemdでサービス化する方法を取る

バイナリダウンロード

以下からダウンロードできる
https://github.com/traefik/traefik/releases/latest

今回はDebian, x64なのでtraefik_v3.6.5_linux_amd64.tar.gzを選択
PCでダウンロードしてコンテナにSCPで送る

scp ./traefik_v3.6.5_linux_amd64.tar.gz root@192.0.2.2:/root

コンテナで解凍、/usr/bin/traefikに配置

tar -zxvf ./traefik_v3.6.5_linux_amd64.tar.gz
mv ./traefik /usr/bin/

Traefik設定ファイル作成

以下からサンプルが見られる
https://github.com/traefik/traefik/blob/master/traefik.sample.yml

サンプルを参考に設定ファイルをつくる

Install Configuration

mkdir /etc/traefik
vi /etc/traefik/traefik.yml

内容を以下のようにする
とりあえず、HTTP:80で待ち受ける&ルーティングできるようにする
プロバイダはファイルを利用する

global:
  checkNewVersion: true
  sendAnonymousUsage: false

entryPoints:
  web:
    address: :80

  websecure:
    address: :443

log:
  filePath: /var/log/traefik/traefik.log
  level: INFO

api:
  dashboard: true
  insecure: true

providers:
  file:
    directory: /etc/traefik/conf.d/
    watch: true

Routing Configuration

mkdir /etc/traefik/conf.d
vi /etc/traefik/conf.d/routing.yml

内容を以下のようにする
写真管理アプリであるImmichをルーティングしてみる

http:
  routers:
    immich:
      rule: "Host(`photos.mydomain.com`)"
      service: immich-service
      entryPoints:
        - web

  services:
    immich-service:
      loadBalancer:
        servers:
          - url: "http://{IMMICH_SERVER_IP}:2283"

動作確認(1回目)

ここまで書けたら一旦起動してみてダッシュボードが表示されるか、またサービスをルーティングしてくれるか確認する

traefikを起動

/usr/bin/traefik --configFile=/etc/traefik/traefik.yml

/var/log/traefik/traefik.logが生成されるので、別シェルを起動しtailでログを監視するとよい。

tail -f /var/log/traefik/traefik.log

Webブラウザを起動し、http://{traefikのIP}:8080/dashboard/にアクセスし、traefikのダッシュボードにアクセスできるかを確認する
下のような画面が表示されればOK
ダッシュボード

また、http://photos.mydomain.comにアクセスするとImmichのログイン画面が出るかも確認する
Immichログイン

確認できたら、traefikを起動したシェルでCtrl+Cでtraefikを停止させる

Traefik設定ファイル作成(続き)

今回はDNS-01チャレンジによってLet’s EncryptからSSL/TLS証明書を取得するため、その設定も入れる
なお、DNSプロバイダはCloudflareを選んだ

/etc/traefik/traefik.ymlに以下の設定を追加する
http通信はhttpsにリダイレクトするようにも設定する

entryPoints:
  web:
    address: :80
    http:    # http以下を追加
      redirections:
        entryPoint:
          to: websecure
          scheme: https

  websecure:
    address: :443
    http:    # http以下を追加
      tls:
        certResolver: cloudflare-dns
        domains:
          - main: "mydomain.com"
            sans:
              - "*.mydomain.com"

certificatesResolvers:    # certificatesResolvers以下を追加
  cloudflare-dns:
    acme:
      email: "you@mydomain.com"
      storage: "/etc/traefik/acme.json"
      dnsChallenge:
        provider: cloudflare
        delayBeforeCheck: 10

続いて、/etc/traefik/conf.d/routing.ymlに以下の設定を追加する

http:
  routers:
    immich:
      rule: "Host(`photos.mydomain.com`)"
      service: immich-service
      entryPoints:
        - websecure    # web から websecure に変更
      tls:
        certResolver: cloudflare-dns    # certResolver を追加

証明書ファイルを作成

/etc/traefik/traefik.ymlに書いたACMEのstorageのファイルを作成する
このファイルは権限が600である必要があるので、chmod 600で変更する。

touch /etc/traefik/acme.json
chmod 600 /etc/traefik/acme.json

CloudflareでAPIトークンを作成する

Cloudflareのダッシュボードから、アカウントの管理 > アカウントAPIトークン の画面に進み、「トークンを作成する」を選択する
APIトークンテンプレートから「ゾーンDNSを編集する」のテンプレートを使用する
APIトークン作成

権限の欄は「ゾーン、DNS、編集」、ゾーンリソースは「含む、特定のゾーン、{対象のドメイン}」を選択する
その後は表示される画面に従って進めて行くとトークンが作成される
APIトークン作成2

作成されたトークンは二度と表示されないため、控えておく

動作確認(2回目)

ここまで来たらSSL/TLS証明書が発行できるので、traefikを起動しhttps通信ができるか確認する
起動にあたっては、cloudflareのAPIトークンをtraefikに渡すために環境変数を設定する

export CF_API_EMAIL={cloudflareで登録しているメールアドレス}
export CF_DNS_API_TOKEN={作成したAPIトークン}

上記の環境変数を設定したシェルでtraefikを起動

/usr/bin/traefik --configFile=/etc/traefik/traefik.yml

Webブラウザを起動し、https://photos.mydomain.comにアクセスするとImmichのログイン画面が出るかも確認する
また、有効な証明書が表示されることも確認する

確認できたら、traefikのインストール、設定は完了

systemdでサービス化

コマンドラインで起動することはできたので、systemdを使ってサービス化する

サービス用のユーザを作成

useradd -r -s /sbin/nologin -U -M traefik
  • -r: システムアカウントを作成する
  • -s: ユーザーのログインシェルをフルパスで指定する /sbin/nologinを指定するとログイン不可になる
  • -U: ユーザーと同じ名前のグループを作成する
  • -M: ユーザーのホームディレクトリを作成しない

envファイル作成

cloudflare関連の環境変数を渡すためにenvファイルを作成する

vi /etc/traefik/env
CF_API_EMAIL={cloudflareで登録しているメールアドレス}
CF_DNS_API_TOKEN={作成したAPIトークン}

systemdユニットファイル作成

以下から雛形をダウンロードできる
https://github.com/traefik/traefik/blob/master/contrib/systemd/traefik.service

バイナリと同じようにSCPでコンテナにファイルを送り、/etc/systemd/system/traefik.serviceに配置

mv ./traefik.service /etc/systemd/system/

ユニットファイルを作成する

[Unit]
Description=Traefik
Documentation=https://doc.traefik.io/traefik/
After=network-online.target
AssertFileIsExecutable=/usr/bin/traefik
AssertPathExists=/etc/traefik/traefik.yml

[Service]
User=traefik
AmbientCapabilities=CAP_NET_BIND_SERVICE

Type=notify
EnvironmentFile=/etc/traefik/env
ExecStart=/usr/bin/traefik --configFile=/etc/traefik/traefik.yml
Restart=always
WatchdogSec=1s

[Install]
WantedBy=multi-user.target

traefikユーザで起動するので、acme.jsonやログファイルの権限の調整が必要になるかもしれない
サービスを起動して

サービス登録、起動

systemctl daemon-reload
systemctl enable traefik.service
systemctl start traefik.service

systemctl status traefikでエラーが出ていなかったらOK

systemctl status traefik
● traefik.service - Traefik
     Loaded: loaded (/etc/systemd/system/traefik.service; enabled; preset: enabled)
     Active: active (running) since Wed 2025-12-31 07:24:30 JST; 7min ago
 Invocation: 523e2eda1d884596a9b1603258540a50
       Docs: https://doc.traefik.io/traefik/
   Main PID: 8348 (traefik)
      Tasks: 8 (limit: 37563)
     Memory: 16.4M (peak: 19.5M)
        CPU: 423ms
     CGroup: /system.slice/traefik.service
             └─8348 /usr/bin/traefik --configFile=/etc/traefik/traefik.yml

Dec 31 07:24:30 traefik systemd[1]: Starting traefik.service - Traefik...
Dec 31 07:24:30 traefik systemd[1]: Started traefik.service - Traefik.

サービス起動後、再びImmichにアクセスできることを確認できれば構築完了

参考文献