Перейти к содержанию

Простой почтовый сервер (версия 2)

В дополнение к предыдущей заметке...

Настройка Dnsmasq

address=/domain.local/192.168.20.10
address=/mail.domain.local/192.168.20.10
mx-host=domain.local,192.168.20.10,10
mx-host=mail.domain.local,192.168.20.10,20
ptr-record=10.20.168.192.in-addr.arpa.,mail.domain.local

Сборка образа и запуск контейнера

Сценарий сборки образа Dockerfile:

Dockerfile
FROM debian:stable
COPY ./init.sh ./start.sh ./wact.sh /
RUN bash /init.sh
CMD bash /start.sh

Сценарий, выполняемый при сборке образа внутри контейнера init.sh:

init.sh
#!/bin/bash
apt-get update
apt-get upgrade -y
export DEBIAN_FRONTEND=noninteractive
apt-get install -y iputils-ping dnsutils iproute2 mc nano postfix dovecot-pop3d inotify-tools

Сценарий, выполняемый внутри контейнера при его запуске, start.sh:

start.sh
#!/bin/bash
postfix start-fg &
dovecot -F &
bash /wact.sh /etc/postfix/main.cf "postfix reload"
bash /wact.sh /etc/dovecot/dovecot.conf "dovecot reload"
tail -f /dev/null

Файл сценария для отслеживания изменений wact.sh:

wact.sh
#!/bin/bash
if [ "$#" -lt 2 ]; then
  echo "usage: $0 <file> <command>"
  exit 1
fi
TARGET_FILE="$1"
shift
COMMAND="$@"
while true; do
  inotifywait -e modify "$TARGET_FILE" >/dev/null 2>&1
  eval "$COMMAND"
done

Файл конфигурации Postfix main.cf:

main.cf
compatibility_level = 3.9
myhostname = mail.domain.local
mydomain = domain.local
mydestination = $myhostname, $mydomain, localhost.$mydomain, localhost
#relay_domains = some_domain_allow_to_relay
mynetworks = 127.0.0.0/8, 172.0.0.0/8, 192.168.0.0/16
myorigin = $mydomain
smtpd_banner = $myhostname ESMTP
luser_relay = administrator@domain.local
notify_classes = bounce, 2bounce, delay, policy, protocol, resource, software
inet_protocols = ipv4
inet_interfaces = all
#proxy_interfaces = xxx.xxx.xxx.xxx
home_mailbox = Maildir/
maillog_file /dev/stdout
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject
smtpd_recipient_restrictions = reject_unknown_recipient_domain, reject_unauth_destination
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/dovecot/private/dovecot.pem
smtpd_tls_key_file = /etc/dovecot/private/dovecot.key
alias_maps = hash:/etc/aliases

Файл конфигурации Dovecot dovecot.conf:

dovecot.conf
dovecot_config_version = 2.4.1
dovecot_storage_version = 3
protocols = pop3
ssl = yes
ssl_server_cert_file = /etc/dovecot/private/dovecot.pem
ssl_server_key_file = /etc/dovecot/private/dovecot.key
mail_driver = Maildir
log_path = /dev/stdout
info_log_path = /dev/stdout
auth_verbose = yes
auth_mechanisms = plain login cram-md5
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}
passdb pam {
}
passdb passwd-file {
  default_password_scheme = cram-md5
  passwd_file_path = /etc/dovecot/cram-md5
}
userdb passwd {
  use_worker = yes
}

Сценарий сборки образа и запуска контейнера docker-compose.yml:

docker-compose.yml
services:
  mailserver:
    build: .
    restart: always
    image: mailserver
    container_name: mailserver
    ports:
      - "25:25"   # SMTP
      - "465:465" # SMTPS
      - "110:110" # POP3
      - "587:587" # SMTP
      - "995:995" # POP3S
      - "993:993" # IMAPS
      - "143:143" # IMAP
    network_mode: "bridge"
    volumes:
      - ./main.cf:/etc/postfix/main.cf:ro
      - ./dovecot.conf:/etc/dovecot/dovecot.conf:ro

Запустить сборку образа и контейнер:

docker-compose build
docker-compose up -d