Traefikで躓いたところまとめ
各所で説明されている通り、個人でDockerによる運用であればnginxより、Traefikが便利です。
とはいえ、日本語記事がいかんせん少なく、「Apacheなら、XXX」「nginxなら、XXX」ということは多々あります。
Dockerを使うことによりネットワーク構成が複雑化し、余計にわかりにくくなったのも大きいと思います。
今回は主にこの記事を中心に構成しつつ、躓いたポイントを以下で紹介します。
なお、Autheliaによる認証追加は別記事でもう少し細かく紹介します。
証明書ファイルの指定は環境変数では不可能
It would be cool to have everything configured in a single docker-compose file but unfortunately the self-signed related configuration must be stored in a separate file.
とあるように、証明書ファイルの設定は別途ファイルを読み込ませる必要があります。しかし、この回答でのtraefik.yml
だとワイルドガード証明書を使っているせいか、上手く適用されませんでした。
公式のドキュメントにあるデフォルト設定で指定すると解決しました。
証明書ファイルはfullchain.pemを指定すべき
certFile
は中間証明書のない証明書を指定してしまうと、環境によっては「ルート証明書までたどり着けない」などとエラーが表示されます。
そのため、Let's Encryptではfullchain.pem
を指定しましょう!
実際に検証してみましたので、興味ある方はご覧ください。
構成に誤りがあってもエラー等は表示されない
モダンなプロキシらしく、変更した構成や設定は基本的に即時適用されます。Dockerのラベルに記載した設定でもです。
ですが、構成に誤りがあった場合、ログを見てもダッシュボードを見てもエラー等は一切吐かれません…
その代わり、一番最後に読み込めた設定が適用されます。
しかも、プロバイダー(Dockerとかファイルなど)の単位で検証&適用されるので、結構厄介です。
そのため、初めはダッシュボードをHTTPで開放して確認するのをオススメします。
ちなみに、再起動時には構成が正しいかどうかで、プロバイダー単位で読み込まれます。つまり、ファイル構成の1つでもおかしい場合、ファイルで書いた構成はすべて適用されません。
これでも、ある程度の原因の切り分けがつくかと思います。
なお、yamlの仕様の話ですが、*
などはシングルクォーテーションによる囲いが必要なので、そういったところも気を付けましょう…
開放するポートは一つのみに
traefikは解放されるであろうポートを勝手に判別しているので、開放するポートをexposeで1つだけ指定する必要があります。portsで開放する必要もないので安全に設定することができます。
Dockerfileですでに複数設定されている場合や複数のポートを使いたい場合は次のセクションをご覧ください。
1つのコンテナで複数ポート使用する場合
traefik.http.services.XXX.loadbalancer.server.port: 80
でロードバランサーを定義し、
traefik.http.routers.YYY.service: XXX
ルーターに先ほどのロードバランサーを設定したサービスを指定することで可能です。なお、XXXやYYYはほかのコンテナで設定する文字列と被らなければなんでもOKです。
なお、ルート設定であるhttp.routers.YYY.rule
はほかのコンテナ等の構成とかぶらないように設定する必要があります。
設定例
IPv6対応をしたい
Dockerコンテナなので、以上の方法が使えるかと思います。
今回はnetwork_mode: host
を利用しましが、それは後日。
QUICやHTTP3に対応したい
Dockerのラベルで記述すると
の2行でOKです。
Discussion