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のログイン画面が出るかも確認する
確認できたら、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を編集する」のテンプレートを使用する
権限の欄は「ゾーン、DNS、編集」、ゾーンリソースは「含む、特定のゾーン、{対象のドメイン}」を選択する
その後は表示される画面に従って進めて行くとトークンが作成される
作成されたトークンは二度と表示されないため、控えておく
動作確認(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にアクセスできることを確認できれば構築完了