: O. Yuanying

Docker 上にメールサーバを構築する (2)

共通ユーザ作成

前回 において、三つのコンテナを利用してメールサーバを構築するとしたが、 最終的に postfix と dovecot、postfixadmin は共通のバーチャルドメイン用のメールディレクトリを参照することになる。 そこでパーミッションの問題を解決するために同じ uid/gid のユーザを各コンテナに用意することにした。

あと、共通のメールディレクトリは Docker のホストとなるディレクトリに作成するので、 Docker のホストにもおなじ uid/gid のユーザを作っておくことにする。

  • User: vmail(1500)
  • Group: vmail(1500)
  • Maildir: /var/vmail

Docker 上のホストで以下の操作を行う。

sudo groupadd -g 1500 vmail
sudo useradd -g vmail -u 1500 vmail -d /var/vmail
sudo mkdir /var/vmail
sudo chown vmail:vmail /var/vmail

適当に図辞するとこんな感じ。

yuanying/postfix

Maildir への配送をどうするかちょっと迷ったが、 結局 procmail を使うことにした。ということでさくっと Dockerfile を書く。

Dockerfile

# docker build -t yuanying/postfix .
# docker run -d --link mysql:mysql \
# -e "POSTFIX_MYSQL_PASSWORD=postfixpassword" \
# -h 'mail.fraction.jp' \
# -v /var/vmail:/var/vmail \
# -p 25:25 \
# yuanying/postfix
#
FROM ubuntu:precise
MAINTAINER O. Yuanying "yuan-docker@fraction.jp"

ENV DEBIAN_FRONTEND noninteractive
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update

RUN bash -c 'debconf-set-selections <<< "postfix postfix/main_mailer_type string Internet site"'
RUN bash -c 'debconf-set-selections <<< "postfix postfix/mailname string mail.example.com"'

RUN apt-get install -y postfix postfix-mysql postgrey syslog-ng procmail

ADD postfix/header_checks /etc/postfix/header_checks
ADD postfix/main.cf /etc/postfix/main.cf
ADD postfix/master.cf /etc/postfix/master.cf

ADD postfix/mysql-virtual-mailbox-maps.cf /etc/postfix/mysql-virtual-mailbox-maps.cf
ADD postfix/mysql-virtual-alias-maps.cf   /etc/postfix/mysql-virtual-alias-maps.cf 
ADD postfix/mysql-virtual-domains-maps.cf /etc/postfix/mysql-virtual-domains-maps.cf
ADD procmail/procmailrc /etc/procmailrc
RUN chown root:root /etc/procmailrc
RUN groupadd -g 1500 vmail && \
    useradd -g vmail -u 1500 vmail -d /var/vmail && \
    mkdir /var/vmail && \
    chown vmail:vmail /var/vmail

ADD run /usr/local/bin/run
RUN chmod +x /usr/local/bin/run

EXPOSE 25
# VOLUME ["/var/vmail"]

CMD ["/usr/local/bin/run"]

設定ファイルをいろいろ追加しているが、 結局は mysql と接続する設定は run ファイルで一括置換している。

run

#!/bin/bash
set -e

sed -i "s/__REPLACE_DATABASE_HOST__/${MYSQL_PORT_3306_TCP_ADDR}/g" /etc/postfix/mysql-virtual-alias-maps.cf
sed -i "s/__REPLACE_DATABASE_PORT__/${MYSQL_PORT_3306_TCP_PORT}/g" /etc/postfix/mysql-virtual-alias-maps.cf
sed -i "s/__REPLACE_DATABASE_PASSWORD__/${POSTFIX_MYSQL_PASSWORD}/g" /etc/postfix/mysql-virtual-alias-maps.cf

sed -i "s/__REPLACE_DATABASE_HOST__/${MYSQL_PORT_3306_TCP_ADDR}/g" /etc/postfix/mysql-virtual-domains-maps.cf
sed -i "s/__REPLACE_DATABASE_PORT__/${MYSQL_PORT_3306_TCP_PORT}/g" /etc/postfix/mysql-virtual-domains-maps.cf
sed -i "s/__REPLACE_DATABASE_PASSWORD__/${POSTFIX_MYSQL_PASSWORD}/g" /etc/postfix/mysql-virtual-domains-maps.cf

sed -i "s/__REPLACE_DATABASE_HOST__/${MYSQL_PORT_3306_TCP_ADDR}/g" /etc/postfix/mysql-virtual-mailbox-maps.cf
sed -i "s/__REPLACE_DATABASE_PORT__/${MYSQL_PORT_3306_TCP_PORT}/g" /etc/postfix/mysql-virtual-mailbox-maps.cf
sed -i "s/__REPLACE_DATABASE_PASSWORD__/${POSTFIX_MYSQL_PASSWORD}/g" /etc/postfix/mysql-virtual-mailbox-maps.cf

service syslog-ng start
service postfix start
tail -F /var/log/mail.log

run ファイルの最後で /var/log/mail.log を tail することで docker logs の結果に mail.log を表示している。 細かい設定などは以下を参照のこと。

スパムメール対策

とりあえず postfix のイメージを作ってはたと思ったことは、 「スパムメール対策をどうしよう」 であった。 spamassasin を同じコンテナに同居させるか、それとも別途コンテナを建てるか…。

とりあえず続く。