何かしらサービスを申し込む際にはメールアドレスが必要になる。 Docker Mailserverを使って、Docker環境でさくっと立てる方法を書いていく。
今日日、どのISPでもクラウドでも、スパム対策でデフォルトでOutboundのport:25が開いていない。ので、何も考えずにサーバーを立てると、Emailの送信ができない。けど、受信だけできれば十分な場合が多いので問題ない。
送信できるEmail環境構築については、この記事で解説しています。
要件
基本的にdockerおよびdocker-composeの環境があればよい。
- docker
- docker-compose
0. 今回想定する環境設定の値
項目 | 値 |
---|---|
メールサーバ OS | Ubuntu Linux |
メールサーバ Public IP | 11.22.33.44 |
作業ディレクトリ | /home/ubuntu/docker-mailserver |
メールサーバのホスト名 | mailserver.example.com |
メールアドレスのドメイン | @m.example.com |
メールアドレス | [email protected] |
1. Linuxホストを用意する
PublicからアクセスできるLinuxマシンを用意する。ここではAWSのEC2にUbuntu環境を想定する。
- LinuxホストのPublic IP:
11.22.33.44
2. LinuxホストのNWポートを開ける
以下のポートの受信を許可する。
- Inbound port:
25, 80, 143, 587, 993
EC2の場合はセキュリティグループの設定をする。
port:80
はSSL証明書(Let’s Encrypt)の取得・更新のために開けておく。
3. DNSレコードを追加
以下の2つのレコードをexample.com
のゾーンに追加。
mailserver.example.com A 11.22.33.44
m.example.com mx 50
今回は、送信を想定しないので、SPF, DIKMレコードは省略 DNSレコードをミスるとキャッシュが切れるまで変更が効かないの、初めは短めのTTL(例えばTTL=60sec)で設定しておく。
登録後は念のため、DNSで引けるか確認しておく。
$ dig mailserver.example.com a +short
11.22.33.44
$ dig m.example.com mx +short
50 mailserver.example.com
しっかり正しく引けている。
4. SSL証明書の取得
Let’s Encryptのcert botでSSL証明書を取得する。 certbotもDockerで提供されているので、それを使う(もちろんローカルにインストールしても良い)。
$ mkdir docker-mailserver
$ cd docker-mailserver
$ docker run --rm -it \
-v "${PWD}/docker-data/certbot/certs/:/etc/letsencrypt/" \
-v "${PWD}/docker-data/certbot/logs/:/var/log/letsencrypt/" \
-p 80:80 \
certbot/certbot certonly --standalone -d mailserver.example.com
...
いくつか質問事項が聞かれる
...
Successfully received certificate.
### 発行された証明書のディレクトリの確認
$ ls docker-data/certbot/certs/
accounts archive csr keys live renewal renewal-hooks
5. Docker MailserverのScriptをダウンロード
### 作業ディレクトリにいることを確認
$ pwd
/home/ubuntu/docker-mailserver
$ DMS_GITHUB_URL='https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master'
$ wget "${DMS_GITHUB_URL}/docker-compose.yml"
$ wget "${DMS_GITHUB_URL}/mailserver.env"
$ wget "${DMS_GITHUB_URL}/setup.sh"
$ chmod a+x ./setup.sh
### 動作するか確認
$ ./setup.sh help
6. docker-compose.yml
を編集
services:
mailserver:
image: docker.io/mailserver/docker-mailserver:latest
container_name: mailserver
# If the FQDN for your mail-server is only two labels (eg: example.com),
# you can assign this entirely to `hostname` and remove `domainname`.
hostname: mailserver.example.com #<== ここ編集!
domainname: m.example.com #<== ここ編集!
env_file: mailserver.env
# More information about the mail-server ports:
# https://docker-mailserver.github.io/docker-mailserver/edge/config/security/understanding-the-ports/
# To avoid conflicts with yaml base-60 float, DO NOT remove the quotation marks.
ports:
- "25:25" # SMTP (explicit TLS => STARTTLS)
- "143:143" # IMAP4 (explicit TLS => STARTTLS)
- "465:465" # ESMTP (implicit TLS)
- "587:587" # ESMTP (explicit TLS => STARTTLS)
- "993:993" # IMAP4 (implicit TLS)
volumes:
- ./docker-data/dms/mail-data/:/var/mail/
- ./docker-data/dms/mail-state/:/var/mail-state/
- ./docker-data/dms/mail-logs/:/var/log/mail/
- ./docker-data/dms/config/:/tmp/docker-mailserver/
- /etc/localtime:/etc/localtime:ro
- ./docker-data/certbot/certs/:/etc/letsencrypt # <==ここ追記!
restart: always
stop_grace_period: 1m
cap_add:
- NET_ADMIN
- SYS_PTRACE
7. mailserver.env
を編集
ファイルの中のSSL_TYPE
をletsencrypt
に設定する。
...
SSL_TYPE=letsencrypt
...
8. メールアドレスを設定する
$ ./setup.sh email add [email protected]
##パスワード入力
9. mailserverを起動!
デバッグのため、最初はフォアグランドモード(-d
オプションなし)で起動させる。あとで、問題なければ-d
で再起動させる。
$ docker-compose up
10. メールクライアントから接続テスト
メールクライアントで以下を設定して、接続確認する。
設定項目 | 値 |
---|---|
メールサーバ | mailserver.example.com |
ユーザー名 | [email protected] |
パスワード | 上記で設定したパスワード |
11. 問題なければデーモン化
先ほどdocker-compose up
立ち上げたプロセスをCtrl-c
で停止して、再度docker-compose up -d
で立ち上げる。
....
Ctrl-c
$ docker-compose up -d
$ docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
mailserver "/usr/bin/dumb-init …" mailserver running 0.0.0.0:25->25/tcp, 0.0.0.0:143->143/tcp, 0.0.0.0:465->465/tcp, 0.0.0.0:587->587/tcp, 0.0.0.0:993->993/tcp, :::25->25/tcp, :::143->143/tcp, :::465->465/tcp, :::587->587/tcp, :::993->993/tcp
12. certbotをcrontabに登録
Let’s EncryptのDV証明書は有効期限が90日なので、更新用のスクリプトをcronで回しておく。
作業ディレクトリ内にcert_renew.sh
を作成し、以下を書き込む。
$ pwd
/home/ubuntu/docker-mailserver
$ vim cert_renew.sh
---
#!/bin/bash
docker run --rm \
-v "${PWD}/docker-data/certbot/certs/:/etc/letsencrypt/" \
-v "${PWD}/docker-data/certbot/logs/:/var/log/letsencrypt/" \
-p 80:80 \
certbot/certbot renew -n > tmp.log 2>&1
---
後はcrontabで15日に一回、回しておく。
$ crontab -e
1 2 */15 * * cd docker-mailserver; sh cert_renew.sh