Простой почтовый сервер (версия 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
Запустить сборку образа и контейнер: