それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

docker でpostfixをビルドしたのでその時の記録

docker で postfix を作る

  • debian を起動する
  • postfix をインストールする
  • postfix でメールリレーを作る
  • これらをDockerで起動する
  • 必要な部分を環境変数にする。

最初に、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