docker で postfix を作る
最初に、postfix設定の実験用の仮想マシンを準備する
lxc image list images:'debian/12'
最低限の作業用土台を整える。
CONTAINER_NAME=sample01 lxc launch images:'debian/12' $CONTAINER_NAME lxc shell $CONTAINER_NAME
設定ミスなど、作り直すときは次のように
## 消して入れ直す場合 CONTAINER_NAME=sample01 lxc stop $CONTAINER_NAME lxc delete $CONTAINER_NAME lxc launch images:'debian/12' $CONTAINER_NAME lxc shell $CONTAINER_NAME
apt 環境を作り、作業用にvim を入れる。
echo 'Acquire::HTTP::Proxy "http://apt-cacher.lan";' |sudo tee /etc/apt/apt.conf.d/01proxy echo -e "APT::Install-Suggests 0;\nAPT::Install-Recommends 0;" | sudo tee /etc/apt/apt.conf.d/00-no-install-recommends apt update ## no doc cat <<EOF > 01-nodoc # Delete locales path-exclude=/usr/share/locale/* # Delete man pages path-exclude=/usr/share/man/* # Delete docs path-exclude=/usr/share/doc/* path-include=/usr/share/doc/*/copyrigh EOF mv 01-nodoc /etc/dpkg/dpkg.cfg.d/01-nodoc apt update ## 実験用に使うもの apt -y install vim-nox curl rsyslog
LXC にpostfix を入れる
とりあえずLXCのコンテナにPostfixをいれて、環境変数や設定などを確認しておく。
export DEBIAN_FRONTEND=noninteractive apt install -y postfix libsasl2-modules
ここでわかったこと.
libsasl2-modules
がないと、smart relay ができない。
postfix 設定を書く
設定にスマートリレーを書いた。
## 追記 sed -e '/^relayhost = /a \ smtp_use_tls = yes\ smtp_sasl_auth_enable = yes \ smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd \ smtp_sasl_tls_security_options = noanonymous \ smtp_sasl_mechanism_filter = plain\ ' \ -i /etc/postfix/main.cf ## 置換 sed -e 's/^relayhost =/relayhost = [smtp.gmail.com]:587/' \ -i /etc/postfix/main.cf ## 置換 sed -e 's/^inet_protocols = all/inet_protocols = ipv4/' \ -i /etc/postfix/main.cf ## 書き込み echo '[smtp.gmail.com]:587 server-admin@example.tld:xxxPASSWORDxxxx' > /etc/postfix/sasl_passwd
設定反映&再起動
postmap /etc/postfix/sasl_passwd /etc/init.d/postfix restart
POSTFIX のリレーをテストする
作った設定が正しく動くか、リレーをテストする。
サンプルデータを送る
cat <<EOF > send-sample-mail.sh ADDR=takuya@example.com.tld FROM=server-admin@example.tld echo "To: \${ADDR} From: \${FROM} Subject: テストメール/ \$(date +"%F %T") これはテスト\$(echo \$RANDOM) --- \$(date +"%F %T" ) " | \ curl -v \ --url 'smtp://localhost:25' \ --mail-rcpt \${ADDR} \ --mail-from \${FROM} \ -T - EOF
送信テスト
bash send-sample-mail.sh
ログの確認
cat /var/log/mail.log
フォアグランドで起動する
しらべたら、フォアグランドで起動する方法が追加されていた。
/usr/sbin/postfix start-fg
これらをふまえて、Dockerを作る
環境変数を使えるようにする。
設定を環境変数に変える。
POSTFIX_RELAY_HOST=[smtp.gmail.com]:587 POSTFIX_RELAY_USER= server-admin@example.tld POSTFIX_RELAY_PASS=xxxxxxxx
start.sh
sed -e "s/^relayhost =/relayhost = ${POSTFIX_RELAY_HOST}/" -i /etc/postfix/main.cf echo "${POSTFIX_RELAY_HOST} ${POSTFIX_RELAY_USER}:${POSTFIX_RELAY_PASS}" > /etc/postfix/sasl_passwd postmap /etc/postfix/sasl_passwd /usr/sbin/postfix start-fg
起動コマンドに指定した。
CMD ['/bin/sh', '/root/start.sh']
ログをSTDOUTに書き出す。
このままではログが行方不明になるので、ログを永続化するためにDocker のログとして出すことにした。
## master.cf postlog unix-dgram n - n - 1 postlogd ## main.cf maillog_file = /dev/stdout
docker build でイメージ作成する。
docker build -t takuya/docker-postfix .
動かしてみた。
Sep 22 06:13:36 localhost postfix/error[194]: 97A4E1AA43B: to=<takuya@exmaple.com.tld>, relay=none, delay=0.02, delays=0.01/0/0/0.01, dsn=4.3.0, status=deferred (mail transport unavailable)
いくつかの問題点が見つかった。
dockerのホストネットワークをmynetwork に指定
mynetworks を指定しないと、Relay access Denied
になる。
dns が引けないので、cant resolve smtp.
dns が引けないので、エラーが出ていた。これはDNSを指定することで解決させた。
cant resolve smtp. No worthy mechs found mail transport unavailable
chroot するので、host 名の resolve が効かない模様
そもそも、docker 内部でさらにchroot しているので、chroot は省略可能と判断とした。 ホスト名が分からなくてもローカル配送は想定しないのでOK