Mailman2 から Mailman3 への移行の備忘録

Posted 2 months ago by yoosee.
 

個人グループのメーリングリストをここしばらく mailman で運用しているのだが、ある日いつものように apt update & upgrade をかけたら気づかぬうちに mailman (2.1.29) が uninstall されていて大変困ったことになった。多分 python2 を抜いたタイミングだろうか… 見ると mailman3 という新しいパッケージがあるのでこれを入れれば戻るかなと思ったが、そんな簡単な話ではなく、ほぼ最初からの導入設定が必要だったので、備忘録として記録しておく。


mailman3


なお導入と移行は一応本家にドキュメントがあるにはあるが、英語だという事を差っ引いても分かりにくい。

Mailman3 の導入

インストール自体はいつものように apt で終わり。

# apt install mailman3-full

同時に導入される mailman3-web のデータベースは標準のsqlite3を選択。特に普通のSQLサーバを使う規模でもない。

インストールが終わったらまずは mailman3 の基本設定。以下、example.com は自分のドメインに置き換えてください。

/etc/mailman3/mailman.cfg

site_owner: xxx@example.com

ここには自分のメールアドレスを入れておく。続いて mailman3-web の設定も修正。

/etc/mailman3/mailman-web.py

EMAILNAME = 'example.com'

https が使えない場合は ACCOUNT_DEFAULT_HTTP_PROTOCOL を “http” にしておくとよい。

また恐らく mailman の設定が /etc/cron.d/mailman に残っているのでこれは消しておく。

Postfix の設定

メーリングリストなので、メール配送周りを色々と調整しないといけない。mailman2 は /etc/aliases で配送アドレスをコマンドに転送していたので、まずは /etc/aliaces の記載を削除し、 # postalias /etc/aliases で更新しておく。その上で postfix の設定を変えていく。

/etc/postfix/main.cf にこんな記載を追加・更新

# Mailman configrations adding lmtp
unknown_local_recipient_reject_code = 550
owner_request_special = no
transport_maps = hash:/var/lib/mailman3/data/postfix_lmtp
local_recipient_maps = proxy:unix:passwd.byname $alias_maps hash:/var/lib/mailman3/data/postfix_lmtp
relay_domains = ${{$compatibility_level} < {2} ? {$mydestination}:{}} hash:/var/lib/mailman3/data/postfix_domains

配送先や relay の書き換えをしているので、postfix 再起動後はきちんとログを見たりテスト配送しておかしな影響が出ていないことを確認したほうがいい。私の場合は local_recipient_maps や relay_domains が上書きされてしまい、以前に入れていた設定が無効になるというやらかしがあり、あわてて修正した。

apache2 の設定

mailman3-web を利用するためにウェブサーバ側の設定も必要。ここでは apache を使っている。mod_proxy_uwsgi を有効化。

# a2enmod proxy_uwsgi

続いてapacheにmailman3-webのURLを解釈させるよう、設定を持ってくる。名前は何でもいいんだけど分かりやすいように。

# ln -s /etc/mailman3/apache.conf /etc/apache2/conf-enabled/mailman3.conf

Debianのmailman3-webパッケージで導入されるこの設定ファイルには何故か不具合が残ったままらしいので修正しておく。localhost/ の最後についているスラッシュを削除するだけ。

ProxyPass /mailman3 unix:/run/mailman3-web/uwsgi.sock|uwsgi://localhost

ここまでやったら postfix, apache, mailman3 のサービスをそれぞれ再起動しておく。一応これでセットアップ自体は完了。

Mailman (2.x) から Mailman3 へのメーリングリスト移行

幸いなことにメーリングリストのデータ移行コマンドは提供されているのでそれを使う。まずは元々あったメーリングリストを新たに mailman3 で作成し、そのリストにデータをインポートする。なお LIST-ID は各々移行したいリストに読み替えたうえで、移行するリストの数だけ下記作業を繰り返し行う。

# mailman create LIST-ID@example.com
# mailman import21 LIST-ID@example.com /var/lib/mailman/lists/LIST-ID/config.pck

メールアーカイブも移行したいのであれば mailman3-web に含まれるコマンドを使って移行する。

# cd /usr/share/mailman3-web
# python3 manage.py  hyperkitty_import -l LIST-ID@example.com /var/lib/mailman/archives/private/LIST-ID.mbox/LIST-ID.mbox
# python3 manage.py update_index_one_list LIST-ID@example.com

ここまで root で作業しているのでおかしくなっている permission を修正する。これをやらないとログにエラーも出ずにメール配送がひたすら内部で bounce して retry していたりするので気づくまで厄介だった。

# chown list:list /var/lib/mailman3/lists/ LIST-ID.example.com
# chown list:list  /var/lib/mailman3/template/lists/LIST-ID/ja/

これで一応の移行までは完了しているはず。

mailman3-web のウェブインターフェイス側での設定

mailman3 ではフロントエンドを postorius という django ベースのサービス上で構築している。なので django としてのサイト設定など、セットアップの範囲が多少広い。

まずは django / postorius の管理ユーザを作成する

# cd /usr/share/mailman3-web
# python manage.py createsuperuser

ここで管理ユーザのアカウント名、メールアドレス、パスワードを入力してCLI側の作業は一旦完了。ウェブサイトの方にアクセスして設定を継続する。

にアクセスすると、apache の設定がちゃんとできていれば postorius の画面が立ち上がるのでログインする。なおログイン時には登録したメールアドレスに確認メールが来るので、一旦そちらのメールを開いて確認リンクをクリックすることでアクティベーションを完了する。

ログイン後、上部メニューの Domains からデフォルトドメインを自分のドメインに変えておく。一覧にある SITE_ID = 1 のドメインが example.com になっているはずなので、この隣にある Edit リンクから Django Administration サイトに入って自分が使うウェブサーバのFQDNに書き換えておく。これで一旦完了。

mailman-web からのリスト管理

これで mailman-web も問題なく使えるはずなので、後は List 管理から移行されたメーリングリストのメンバーリストが正しく移行されているかなどを確認しておくとよい。mailman 2.1 に比べてもかなり細かく設定ができるし使い勝手もよくはなっているが、とは言えさほどいじるものでもないかと思う。