podman+Dovecot+Roundcubeで自分専用メールストアを作る

 自分のメール環境は長らく、Thunderbirdで複数のPOP3/IMAPアカウントへアクセスし、Thunderbird上のローカルフォルダにメールを保存するようにしていました。
 自宅であればこれでもなんら問題は無いわけですが、たまにローカルフォルダに移動させたメールを外出先で確認したいときに都合が悪い構成となっていたため、なんとかしたいな、でもGmail一本にはあまりまとめたくないな、と考えていました。
 もちろんGmail以外のIMAPサーバーにメールを保存する方法も考えましたが、容量や保存期間の問題があり、せっかく自宅のHyper-V仮想マシン上でpodmanが動いているのだし、そこにストアを作ってしまえば良いのではないか、と考え、早速作ってみることにしましたが、Thunderbirdの問題なのかDovecotの問題なのか分からない現象にややハマったので、ここにまとめておきます。

 色々選択肢はあると思いますが、今回は実績や更新頻度を考えて、DovecotRoundcubeを利用することにしました。
 要件としてはこんな感じです。

  • IMAPのメールストアだけがあればよく、PostfixなどのMTAは要らない
  • 一人だけがアクセスできればよいので、MySQLやPostgreSQLなども使わない
  • 自宅ではThunderbirdでDovecotにアクセスするので、Roundcubeにはアクセスしない
  • (このエントリーには含まれません)外部からRoundcubeへは、nginxのリバースプロキシでアクセスする
  •  公式でdockerのレシピも公開しているしサクサクいけるだろう、と思っていたのですが、何故かThunderbirdで日本語を上手く取り扱えない問題に遭遇しました。
     結局それが設定を含めたDovecot・Thunderbird・podmanのどこに問題があるのかは分かりませんでしたが、Dovecotのデフォルト文字コードをUTF-8からmUTF-7に変更することにより、回避しました。
     注:このエントリーはDovecot 2.4.2、Roundcube 1.6.12の環境で構築した際の情報を元に記述しています。


     まずはdocker-compose.ymlです。内部向けではありますが、IPアドレスやポート番号は伏せていますのでご了承ください。

    docker-compose.yml:

    services:
    dovecot:
      image: dovecot/dovecot:latest
        container_name: dovecot
        hostname: <ホスト名またはIP>
        volumes:
          - ./dovecot/data/vmail:/srv/vmail
          - ./dovecot/config/90-mailloc.conf:/etc/dovecot/conf.d/90-mailloc.conf:ro
        ports:
          - <IMAPサーバーポート番号>:31143
        environment:
          - USER_PASSWORD=<ユーザーパスワード>

      roundcubemail:
        image: roundcube/roundcubemail:latest-nonroot
        container_name: roundcubemail
        volumes:
          - ./roundcubemail/www:/var/www/html
          - ./roundcubemail/db:/var/roundcube/db
          - ./roundcubemail/data/nonroot-custom-php-config.ini:/usr/local/etc/php/conf.d/zzz-nonroot-custom-php-config.ini:ro
        ports:
          - <Roundcubeポート番号>:8000
        environment:
          - ROUNDCUBEMAIL_REQUEST_PATH=/<リバースプロキシでアクセスするパス>
          - ROUNDCUBEMAIL_DB_TYPE=sqlite
          - ROUNDCUBEMAIL_SKIN=elastic
          - ROUNDCUBEMAIL_DEFAULT_HOST=<上のdovecot - hostnameで指定したホスト名またはIP>
          - ROUNDCUBEMAIL_DEFAULT_PORT=<上のdovecot - portsで指定したIMAPサーバーポート番号>
          - ROUNDCUBEMAIL_SMTP_SERVER=<MTAのIPアドレス(今回は使わないので適当)>
          - ROUNDCUBEMAIL_SMTP_PORT=<MTAのポート番号(今回は使わないので適当)>


     Dovecotはnon-root版なので、公式のドキュメントに従ってIMAPのコンテナ内部ポートは31143になります。volumesにはメールストアに加えて、mUTF7で動作させるための構成ファイルへのパスが追加されています。
     Roundcube側の設定はDocker hubにありますが、データストアがSQLite、リバースプロキシ関連の設定を追加し、最大アップロードサイズ変更のためのコンフィグファイルを追加しています。


     docker-compose.ymlを書いたら、volumesで設定するパーシステントボリュームを作成していきます。
     ここではパーミッションやオーナーの設定は割愛していますが、適切なパーミッションあるいはオーナーに設定しておく必要があることに注意が必要です。

    mkdir -p ./dovecot/data/vmail
    mkdir -p ./dovecot/config/
    mkdir -p ./roundcubemail/www
    mkdir -p ./roundcubemail/db
    mkdir -p ./roundcubemail/data


     最後にDovecotとRoundcubeの追加コンフィグファイルを作成して配置します。
     Dovecotのメールストアはsingle-dbox(多分mailbox_list_layoutは要らないと思いますが一応指定)でmUTF7を使用するように変更します。(詳細は公式のドキュメントを参照してください
     もしかしたらMaildirなどでも問題ないのかもしれませんが、当方の環境では上手くいきませんでした。

    ./dovecot/config/90-mailloc.conf:

    mail_driver = sdbox
    mailbox_list_layout = fs
    mail_utf8_extensions = no
    mailbox_list_utf8 = no


     Roundcube側は、PHPのパラメーターを変更するようにします。

    ./roundcubemail/data/nonroot-custom-php-config.ini:

    post_max_size=1024M
    upload_max_filesize=1024M


     あとはdocker-compose buildまたはpodman-compose buildしてエラーがなくビルドできれば、docker-compose up -dまたはpodman-compose up -dでコンテナを起動すればOKのはずです。必要に応じて、Dovecotのパーシステントボリュームを定期的にバックアップするcronジョブを追加したりするとなお安心でしょう。
     複数ユーザーが個別のメールストアにアクセスしたり、MTAを使用したい場合には色々設定や別のコンテナを追加する必要が出てきますが、当方の用途ではこれで十分のため、満足の得られる結果となりました。

    “podman+Dovecot+Roundcubeで自分専用メールストアを作る” に対するコメントはありません。

    コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です

    このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください