TraefikとMailuの共存試案

2022年10月13日



Docker-composeを使いMailuメールサーバをインストールするにも関連することを書いたが、Mailuは80, 443, その他のメール関係のポートをデフォルトでは占有してしまう。このうち問題となるのは、80, 443番である。これらは必ずリバースプロキシが占有しているからだ。

443番は、8443等に変更することができるが、80番は変更できない。なぜなら、MailuがLets’ Encryptの証明書を取得するときに、Let’s Encrypt側がこのポートを使うからである。方策としては、Mailuによる証明書取得の時にだけリバースプロキシを停止し、Mailuに80番を使わせるということだ。しかし、証明書の更新時にもこの操作が必要になってしまう。こんなことはやってはいられない。

そこで以下のようにしてこの問題の回避を試みたが、まだ正常に動作するかは確認していない。これはあくまでメモ書き。

方針

mail.example.comへのリクエストがTraefikの80番ポートに来たら、それをMailu側に引き渡す。

それ以外の処理はすべてmailu独自のものを使う。つまり、メール管理者画面、メールボックス画面は、traefik側のお世話にならない。これもhttpsで保護する必要があるが、ポートは8443にする。

このようにした理由は以下だ。

  • mailuは独自にLet’s encryptの証明書を取得しようとする。これはブラウザ画面のみではなく、メール送受信時にも使われるようだ。
  • したがって、Traefik側が取得した証明書に依存するわけにはいかない(というより、どうすれば良いかわからない)。mailuに独自に証明書を取得させる。
  • したがって、管理画面、メールボックス画面は、traefikによるhttpsルーティングは使わない。8443でアクセスすることにする。
  • ただし、外部からの80番ポートへのアクセス(mail.example.comに対するもの)は、mailu側に送信してあげる必要がある。これがないと、Let’s encryptの証明書取得・更新ができなくなる。

mailuの改造

80番を削除、これはTraefikが使う。443番を8443番に変更。メール管理画面、メーラー画面等は8443番でhttpsアクセスする。

    ports:
      #- "80:80" 削除
      - "8443:443" # 変更
      - "25:25"
      - "465:465"
      - "587"
      - "110:110"
      - "995:995"
      - "143:143"
      - "993:993"

以下のラベルをつける

front:
    .....
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.mailu.rule=Host(`mail.example.com`)"
      - "traefik.http.routers.mailu.entrypoints=web"

Traefik側の対応

もともとcommon-networkというネットワークを作り、そこに他コンテナを接続するようにしていたが、mailuを接続する方法がわからなかったので、以下のようにした。

  traefik:
.......
    networks:
      - default
      - mailu_default
......
networks:
  default:
    external:
      name: common-network
  mailu_default:
      external: true
.....


これを行うと、Traefikのダッシュボードは次の表示になる。80番ポートの受信だけをmailu側に送信する。