1
0

More than 1 year has passed since last update.

Mailman3(Docker) + Postfix + Nginx 環境の作り方 on Ubuntu

Last updated at Posted at 2023-03-21

概要

Ubuntu22にて、Dockerを用いたMailman3を建てました。
Nginxを用いた手法で日本語のドキュメントがなかったため記録を残します。
細かい説明は、記事最後に添付してある公式ドキュメントをお読みください。

Mailman3(Docker)の導入

データを永続化するためのディレクトリを生成
githubから一式clone

$ mkdir -p /opt/mailman/core
$ mkdir -p /opt/mailman/web
$ git clone https://github.com/maxking/docker-mailman
$ cd docker-mailman

dockerシークレットキーを生成

$ sudo apt install python3-django
$ python3
>>> from django.core.management.utils import get_random_secret_key
>>> print(get_random_secret_key())
SECRET_KEYが生成されるのでコピー。
printする度に値が変わる。
>>> [Ctrl]+[D]

compose yamlを編集

$ vim docker-compose-mysql.yaml
diff --git a/docker-compose-mysql.yaml b/docker-compose-mysql.yaml
--- a/docker-compose-mysql.yaml
+++ b/docker-compose-mysql.yaml
@@ -17,6 +17,10 @@ services:
     - DATABASE_TYPE=mysql
     - DATABASE_CLASS=mailman.database.mysql.MySQLDatabase
     - HYPERKITTY_API_KEY=someapikey
+    - MTA=postfix
     ports:
     - "127.0.0.1:8001:8001" # API
     - "127.0.0.1:8024:8024" # LMTP - incoming emails
@@ -38,8 +42,13 @@ services:
     - DATABASE_TYPE=mysql
     - DATABASE_URL=mysql://mailman:mailmanpass@database/mailmandb?charset=utf8mb4
     - HYPERKITTY_API_KEY=someapikey
-    - SECRET_KEY=thisisaverysecretkey
+    - SECRET_KEY=先ほど作成したkeyをペースト
     - DYLD_LIBRARY_PATH=/usr/local/mysql/lib/
+    - SERVE_FROM_DOMAIN=example.com
+    - MAILMAN_ADMIN_USER=admin
+    - MAILMAN_ADMIN_EMAIL=admin@example.com
     #ここで入力したMAILMAN_ADMIN_EMAILがmailmanの管理者ユーザとして登録されるため、疎通可能なメアドにする。
     #初回ログイン時は”パスワードを忘れた”を選択して、パスワード設定をする。
+    - MAILMAN_HOST_IP=*
+    - UWSGI_STATIC_MAP=/static=/opt/mailman-web-data/static
     ports:
     - "127.0.0.1:8000:8000" # HTTP
     - "127.0.0.1:8080:8080" # uwsgi

dockerコンテナをビルド&起動

$ sudo docker compose -f docker-compose-mysql.yaml up --build -d

Postfixの導入

上記の通りに進める。
s-nailはインストールしないでも良い。

疎通テスト
このコマンドで、指定したメール宛にThisIsTestのメールが送信されるので、メールの受信を確認する。

echo ThisIsTest |sendmail TARGET@example.com

mailman用の設定

$ sudo vim /etc/postfix/main.cf

以下を末尾に追加

# main.cf

# Support the default VERP delimiter.
recipient_delimiter = +
unknown_local_recipient_reject_code = 550
owner_request_special = no

transport_maps =
    regexp:/opt/mailman/core/var/data/postfix_lmtp
local_recipient_maps =
    regexp:/opt/mailman/core/var/data/postfix_lmtp
relay_domains =
    regexp:/opt/mailman/core/var/data/postfix_domains

設定を確認

$ docker exec mailman-core cat /etc/mailman.cfg
[mta]
incoming: mailman.mta.postfix.LMTP
outgoing: mailman.mta.deliver.deliver
lmtp_host: 172.19.199.3
lmtp_port: 8024
smtp_host: 172.19.199.1
smtp_port: 25
configuration: /etc/postfix-mailman.cfg

上記で確認したものを参考に、下記の3つのパラメータを設定

diff --git a/docker-compose-mysql.yaml b/docker-compose-mysql.yaml
--- a/docker-compose-mysql.yaml
+++ b/docker-compose-mysql.yaml
@@ -17,6 +17,10 @@ services:
     - DATABASE_TYPE=mysql
     - DATABASE_CLASS=mailman.database.mysql.MySQLDatabase
     - HYPERKITTY_API_KEY=someapikey
+    - SMTP_HOST=172.19.199.1
+    - SMTP_PORT=25
+    - MM_HOSTNAME=172.19.199.3
     ports:
     - "127.0.0.1:8001:8001" # API
     - "127.0.0.1:8024:8024" # LMTP - incoming emails

mailmanのsite_ownerを生成

sudo vim /opt/mailman/core/mailman-extra.cfg

以下を追加

[mailman]
# This address is the "site owner" address.  Certain messages which must be
# delivered to a human, but which can't be delivered to a list owner (e.g. a
# bounce from a list owner), will be sent to this address.  It should point to
# a human.
site_owner: changeme@example.com

dockerを再起動し、一通りテスト

$ cd
$ cd docker-mailman
$ docker compose down
$ sudo docker compose -f docker-compose-mysql.yaml up --build -d
$ echo ThisIsTest |sendmail TARGET@example.com
$ curl localhost:8000/postorius/lists/

Nginxで外部との疎通

$ sudo apt install nginx -y
$ sudo vim /etc/nginx/sites-available/default
下記の設定をhttpかhttpsで指定。
$ sudo service nginx restart

http version

server {
    listen 80;
    server_name example.com;

    location /static {
        alias /opt/mailman/web/static;
        autoindex off;
    }

    location / {
          uwsgi_pass localhost:8080;
          include uwsgi_params;
          uwsgi_read_timeout 300;
    }
}

https version

server {
    listen 80;
    return 301 https://$host$request_uri;
}

server {
  listen 443 ssl;
  server_name example.com;

  ssl_certificate /etc/ssl/certs/example.com.cer;
  ssl_certificate_key /etc/ssl/private/example.com.key;

    location /static {
        alias /opt/mailman/web/static;
        autoindex off;
    }

    location / {
          uwsgi_pass localhost:8080;
          include uwsgi_params;
          uwsgi_read_timeout 300;
    }
}

サーバ外部からのアクセスのためにport解放

$ sudo ufw allow 22
$ sudo ufw allow domain
$ ufw allow http
$ ufw allow https
$ sudo ufw reload
$ sudo ufw enable

ブラウザから指定したドメイン or ipアドレスにアクセスして確認

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0