TraefikとMailuの共存方法



Mailuのサーバ証明書リニューアル方法(要調査)に書いたことだが、80番を専有してしまうTraefikと、80番が必要なMailuをいかに共存させるかに悩んできたが、結論としては、不可能か面倒すぎて無理ということになった。

以下の3つの選択肢があるが、結局三番目の方法にした。

  • Mailu側では証明書を一切とらず、Traefik側が取得した証明書を流用する
  • Traefik側の80番ポートのアクセスのうち、Mailu側に必要なものだけをMailuにふりわける
  • Mailuが80番が必要なのは、証明書更新の時だけなのだから、深夜にでもTraefikを停止して、Mailuに80番を使わせる

Mailu側では証明書を一切とらず、Traefik側が取得した証明書を流用する

これをやろうとしてとりあえず、Mailu側での証明書取得動作を止めてやってみたのだが、なぜかTraefik側からのSSL接続ができない。

どうも以下に記述されたややこしいことをしなければならないらしい。

Traefik guide needs more love #1038

Traefik側の80番ポートのアクセスのうち、Mailu側に必要なものだけをMailuにふりわける

Traefikに証明書の取得・更新をさせると、80番ポートのリクエストのうち、PathPrefix(/.well-known/acme-challenge/)で指定されたパスはTraefikを取得してしまう。Let’s Encryptは証明書発行時にこのパスにアクセスしてくるため、ドメインが何であろうが、このパスのリクエストは横取りしてしまうのである。

しかも、これは最優先に設定されているようで、変更することとができないようだ。

したがって、80番の他のリクエストであれば、他コンテナに伝達できるが、このパスはTraefikが動作している限り、どうやっても伝達不可能。つまり、Traefikが動作している限り、他のコンテナがLet’s Encrypt証明書をとることはできない。

参考:Allow overriding of acme-http@internal router #8992

Mailuが80番が必要なのは、証明書更新の時だけなのだから、深夜にでもTraefikを停止して、Mailuに80番を使わせる

結局これが最も簡単なソリューションだ。以下をやるだけでよい。

  • Traefikを停止する。
  • Mailuのdocker-compose.ymlを書き換えて、80番をオープンし、再起動する。
  • 証明書の更新時期であれば、証明書が更新される。
  • 80番を削除して再起動する。
  • Traefikを起動する。

Let’s Encryptの更新は30日前から可能なので、月初めと月半ばに行えば十分だ。

その他参考資料

未分類

Posted by ysugimura