Почтовый сервер с нуля. Часть третья.
Разворачиваем почтовый сервер в Docker и настраиваем взаимодействие всех компонентов
Это заключительная часть серии статей о создании почтового сервера. В предыдущих материалах были рассмотрены настройка Exim4, Dovecot, PostfixAdmin и RainLoop. В этой статье разберём, как объединить компоненты в единую инфраструктуру с помощью Docker и Docker Compose.
Рассмотрим настройку контейнеров, взаимодействие сервисов, переменные окружения и порядок развёртывания. В завершение проверим работоспособность почтового сервера.
Преимущества использования Docker
Docker упрощает развёртывание и сопровождение почтового сервера благодаря нескольким возможностям.
- Простота развёртывания. Компоненты запускаются в изолированных контейнерах. Это позволяет разворачивать сервер на разных физических и виртуальных машинах независимо от основной операционной системы и не устанавливать всё необходимое программное обеспечение непосредственно на хост.
- Масштабируемость. При увеличении нагрузки можно наращивать количество экземпляров сервисов. Например, увеличить число экземпляров Dovecot для обработки IMAP-соединений или настроить балансировку нагрузки для Exim4.
- Управление зависимостями. Необходимые библиотеки и пакеты включаются в контейнеры, что снижает вероятность конфликтов между зависимостями и упрощает обновление и перенос приложений. Каждый сервис работает в изолированной среде.
Обзор контейнеров
Основные компоненты почтового сервера описываются в файле docker-compose.yml. Готовые конфигурации сборки контейнеров доступны в репозитории GitHub. Большинство сервисов собираются из Dockerfile, написанных вручную. Подробное описание каждого шага сборки выходит за рамки этой статьи, поэтому далее рассмотрены основные настройки.
Конфигурация построена на следующих принципах:
1. Общая подсеть. Все контейнеры подключены к одной сети и имеют определённые IP-адреса. Это упрощает взаимодействие между сервисами и управление маршрутизацией.
2. Единый префикс имён. Общий префикс для контейнеров помогает идентифицировать ресурсы конкретного проекта, особенно если на одном сервере работают несколько проектов.
3. Единая директория проекта. Файлы, необходимые для работы почтового сервера, хранятся в одной директории с docker-compose.yml. Это упрощает управление конфигурацией, перенос проекта и совместную работу над ним.
4. Синхронизация времени. Время контейнеров синхронизируется с временем сервера. Это важно для согласованности журналов, корректной работы сертификатов и аутентификации.
5. Автоматическое восстановление. Для контейнеров предусмотрена автоматическая перезагрузка после сбоев, что помогает сократить время простоя.
6. Общий файл .env. В нём хранятся основные переменные окружения, включая имена баз данных, пароли и версии программного обеспечения. Это упрощает управление настройками и обновление проекта.
Такой подход упрощает управление инфраструктурой и взаимодействие между компонентами почтового сервера.
Exim4
Exim4 — почтовый сервер, или MTA (Mail Transfer Agent), отвечающий за отправку, получение и маршрутизацию электронной почты. Он поддерживает гибкую настройку для различных сценариев использования.
Установка и базовая настройка
Exim4 запускается в Docker-контейнере, что обеспечивает изоляцию от других процессов и упрощает управление зависимостями. Установка Exim4 и необходимых компонентов описывается в Dockerfile. Там же задаются конфигурационные файлы, необходимые для работы сервера.
Для взаимодействия с Dovecot, Rspamd и ClamAV необходимо корректно настроить соответствующие компоненты. Это обеспечивает обработку и доставку писем, фильтрацию спама и антивирусную проверку.
Настройка взаимодействия с другими компонентами
В конфигурации Exim4 объявляется подключение к Rspamd. Остальные сервисы настраиваются самостоятельно.
Основные элементы Dockerfile:
- Переменная ARG EXIM_VERSION. Определяет устанавливаемую версию Exim4. Перед установкой рекомендуется проверить доступные версии на официальном сайте Exim и выбрать актуальную версию с необходимыми обновлениями безопасности.
- Запуск от пользователя vmail. Контейнер работает от имени пользователя с ограниченными правами, что позволяет снизить потенциальные риски.
- Каталог конфигурации ./volumes/etc/exim4. В нём должны находиться подготовленные конфигурационные файлы. Их можно редактировать без пересборки контейнера.
- Каталог журналов ./volumes/var/log/exim. Используется для хранения логов Exim4, необходимых для мониторинга и диагностики.
Конфигурация Exim4 в docker-compose.yml
services:
exim:
build:
context: build/exim/
args:
- EXIM_GID=${EXIM_GID:-500}
- EXIM_GROUP=${EXIM_GROUP:-vmail}
- EXIM_USER=${EXIM_USER:-vmail}
- EXIM_UID=${EXIM_UID:-500}
container_name: ${COMPOSE_PROJECT_NAME}-exim4
ports:
- "25:25" # SMTP — основной порт для отправки почты
- "465:465" # SMTPS — защищённый SMTP с TLS
- "587:587" # SMTP — альтернативный порт для почтовых клиентов
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ./volumes/var/mail:/var/mail:rw
- ./volumes/etc/exim4:/etc/exim4
- ./volumes/etc/ssl:/etc/exim4/ssl
- ./volumes/var/log/exim:/var/log/exim:rw
- ./volumes/var/run/dovecot:/var/run/dovecot:rw
env_file:
- .env
restart: always
networks:
lan:
ipv4_address: ${PROJECT_IP_MASK}.3
Dovecot
Dovecot обеспечивает доступ к почтовым ящикам через протоколы IMAP и POP3. Он отвечает за работу пользователей с почтой и взаимодействует с Exim4, который доставляет сообщения.
Интеграция с Exim4
После доставки письма Exim4 Dovecot обеспечивает доступ к нему из почтового клиента. Настройка взаимодействия этих сервисов необходима для полноценной работы почтового сервера.
Установка и базовая настройка
Установка Dovecot и его зависимостей выполняется через Dockerfile. Основные параметры сборки:
- Версия Dovecot. Используется версия из официального репозитория Pigeonhole, который также включает плагин Sieve для фильтрации почты.
- Пользователь vmail. Контейнер запускается от имени пользователя с минимальными необходимыми привилегиями.
- Каталог конфигурации ./volumes/etc/dovecot. Содержит конфигурационные файлы Dovecot.
- Каталог журналов ./volumes/var/log/dovecot. Используется для мониторинга и диагностики работы сервиса.
Конфигурация Dovecot в docker-compose.yml
services:
dovecot:
container_name: ${COMPOSE_PROJECT_NAME}-dovecot
ports:
- "993:993" # SSL/IMAP
- "995:995" # SSL/POP3
build:
context: build/dovecot/
args:
- vmail_gid=${EXIM_GID:-500}
- VMAIL_GROUP=${EXIM_GROUP:-vmail}
- VMAIL_USER=${EXIM_USER:-vmail}
- vmail_uid=${EXIM_UID:-500}
- dovecot_branch=release-${DOVECOT_VERSION}
- dovecot_tag=${DOVECOT_VERSION}
- pigeonhole_branch=${pigeonhole_branch:-release-0.5.20}
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ./volumes/var/mail:/var/mail:rw
- ./volumes/etc/dovecot:/etc/dovecot
- ./volumes/etc/ssl:/etc/dovecot/ssl
- ./volumes/var/log/dovecot:/var/log/dovecot:rw
- ./volumes/var/run/dovecot:/var/run/dovecot:rw
env_file:
- .env
restart: always
networks:
lan:
ipv4_address: ${PROJECT_IP_MASK}.4
Конфигурация определяет параметры сборки Dovecot, подключение каталогов с почтой, сертификатами, настройками и журналами, а также сетевые параметры сервиса.
PostfixAdmin
PostfixAdmin — веб-интерфейс для управления почтовыми доменами и учётными записями. С его помощью администратор может добавлять домены, создавать почтовые ящики, задавать квоты и выполнять другие операции по обслуживанию почтового сервера.
Установка и базовая настройка
Dockerfile PostfixAdmin содержит инструкции по установке и настройке интерфейса, а также его интеграции с базой данных PostgreSQL. Это позволяет управлять виртуальными почтовыми доменами и учётными записями через веб-интерфейс.
Конфигурация PostfixAdmin в docker-compose.yml
services:
postfixadmin:
build:
context: build/postfixadmin/
container_name: ${COMPOSE_PROJECT_NAME}-postfixadmin
env_file:
- .env
ports:
- "8080:80"
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ./volumes/var/mail:/var/mail:rw
- ./volumes/etc/postfixadmin/config.inc.php:/var/www/html/config.local.php:ro
- ./volumes/etc/postfixadmin/dbconfig.inc.php:/var/www/dbconfig.inc.php:ro
- ./volumes/etc/dovecot:/etc/dovecot
- ./volumes/scripts/postfixadmin:/var/www/scripts:rw
- ./volumes/etc/ssl:/etc/dovecot/ssl
networks:
lan:
ipv4_address: ${PROJECT_IP_MASK}.5
restart: always
environment:
POSTFIXADMIN_DB_TYPE: ${POSTFIXADMIN_DB_TYPE}
POSTFIXADMIN_DB_HOST: ${POSTFIXADMIN_DB_HOST}
POSTFIXADMIN_DB_USER: ${POSTFIXADMIN_DB_USER}
POSTFIXADMIN_DB_NAME: ${POSTFIXADMIN_DB_NAME}
POSTFIXADMIN_DB_PASSWORD: ${POSTFIXADMIN_DB_PASSWORD}
Конфигурация задаёт порт веб-интерфейса, подключаемые каталоги, сетевые параметры и переменные для подключения к базе данных.
RainLoop
RainLoop — веб-клиент электронной почты, который позволяет работать с почтовыми ящиками через браузер.
Интеграция с Dovecot
RainLoop настраивается для взаимодействия с Dovecot. Это позволяет пользователям отправлять и получать письма через веб-интерфейс без установки дополнительных приложений на своих устройствах.
Установка и базовая настройка
Dockerfile RainLoop содержит параметры, необходимые для запуска приложения в контейнере. Интеграция с Dovecot обеспечивает доступ к почтовым ящикам пользователей.
Конфигурация RainLoop в docker-compose.yml
services:
rainloop:
build:
context: build/rainloop/
container_name: ${COMPOSE_PROJECT_NAME}-rainloop
env_file:
- .env
ports:
- "8800:8888"
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ./volumes/rainloop/data:/rainloop/data:rw
networks:
lan:
ipv4_address: ${PROJECT_IP_MASK}.6
restart: always
PostgreSQL
PostgreSQL — реляционная база данных, используемая для хранения данных PostfixAdmin.
Использование в качестве базы данных PostfixAdmin
Для корректной работы PostfixAdmin параметры подключения к PostgreSQL должны соответствовать настройкам в файле .env. В частности, должны совпадать имя базы данных, имя пользователя и пароль.
Установка и настройка
PostgreSQL запускается в отдельном контейнере и взаимодействует с другими компонентами через Docker Compose. Изоляция базы данных упрощает управление зависимостями и помогает избежать конфликтов с другими сервисами.
Конфигурация PostgreSQL в docker-compose.yml
services:
postgresql:
image: postgres:${POSTGRES_VERSION}
container_name: ${COMPOSE_PROJECT_NAME}-postgresql
volumes:
- ./volumes/var/lib/postgresql/data:/var/lib/postgresql/data:rw
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
env_file:
- .env
restart: always
networks:
lan:
ipv4_address: ${PROJECT_IP_MASK}.2
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
Redis
Redis — система хранения данных в памяти, которая используется для кэширования и повышения производительности. В данной конфигурации Redis хранит данные, связанные с фильтрацией спама и другими задачами.
Установка и настройка
Redis разворачивается через Docker Compose и используется совместно с Rspamd и другими компонентами.
Конфигурация Redis в docker-compose.yml
services:
redis:
image: redis:${REDIS_VERSION}
container_name: ${COMPOSE_PROJECT_NAME}-redis
env_file:
- .env
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ./volumes/var/lib/redis:/data:rw
networks:
lan:
ipv4_address: ${PROJECT_IP_MASK}.7
restart: always
Rspamd
Rspamd — система фильтрации спама, предназначенная для защиты электронной почты от нежелательных сообщений и фишинговых атак.
Интеграция с Exim4
Rspamd интегрируется с Exim4 для обработки и фильтрации почты, проходящей через сервер. Совместная работа с ClamAV позволяет дополнительно проверять сообщения на вирусы и вредоносные вложения.
Установка и настройка
Dockerfile Rspamd содержит необходимые зависимости и параметры для запуска сервиса в контейнере.
Основные элементы конфигурации:
- Подготовка настроек. Конфигурационные файлы должны быть подготовлены в директории /etc, расположенной вместе с Dockerfile.
- Каталог конфигурации. Настройки размещаются в ./volumes/etc/rspam.
- Каталог журналов. Для логов используется ./volumes/var/log/rspam.
Конфигурация Rspamd в docker-compose.yml
services:
rspam:
container_name: ${COMPOSE_PROJECT_NAME}-rspam
restart: unless-stopped
ports:
- "11334:11334"
build:
context: ./build/rspam
args:
RSPAM_gid: 0
RSPAM_uid: 500
RSPAM_GROUP: root
RSPAM_USER: rspamd
RSPAM_IP: ${PROJECT_IP_MASK}.8
RSPAM_REDIS_DB: 7
depends_on:
- redis
- clamav
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ./volumes/var/lib/rspamd:/var/lib/rspamd
- ./volumes/var/log/rspam:/var/log/rspamd
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD}
- REDIS_PORT=${REDIS_PORT}
- RSPAM_GROUP=root
- RSPAM_USER=rspamd
- RSPAM_enable_password=${RSPAM_enable_password}
- RSPAM_password=${RSPAM_password}
- RSPAM_REDIS_DB=7
- RSPAM_IP=${PROJECT_IP_MASK}.8
- CLAMAV_IP=${PROJECT_IP_MASK}.9
networks:
lan:
ipv4_address: ${PROJECT_IP_MASK}.8
aliases:
- rspam
ClamAV
ClamAV — антивирусное программное обеспечение для проверки почты на вредоносные программы. В этой конфигурации оно интегрируется с Exim4 и проверяет входящие письма до их доставки пользователям.
Конфигурация ClamAV в docker-compose.yml
services:
clamav:
container_name: ${COMPOSE_PROJECT_NAME}-clamav
image: tiredofit/clamav:latest
restart: always
environment:
- CLAMAV_IP=${PROJECT_IP_MASK}.9
- DEFINITIONS_UPDATE_FREQUENCY=60
- SETUP_TYPE=MANUAL
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ./volumes/var/lib/clamav:/data
networks:
lan:
ipv4_address: ${PROJECT_IP_MASK}.9
aliases:
- clamavПеременная DEFINITIONS_UPDATE_FREQUENCY задаёт частоту обновления вирусных баз. Конфигурация Docker Compose обеспечивает хранение данных ClamAV и его подключение к общей сети с остальными сервисами.
Переменные проекта
COMPOSE_PROJECT_NAME=mailserver
PROJECT_IP_MASK=172.23.1
- COMPOSE_PROJECT_NAME задаёт имя проекта Docker Compose. Оно используется в именах контейнеров, сетей и других ресурсов. Например, контейнеры могут называться mailserver-postgresql и mailserver-dovecot.
- PROJECT_IP_MASK задаёт базовую часть IP-адресов контейнеров. При значении 172.23.1 контейнер PostgreSQL может получить адрес 172.23.1.2, а Exim4 — 172.23.1.3.
Переменные PostgreSQL
POSTGRES_DB=
POSTGRES_USER
POSTGRES_PASSWORD
POSTGRES_VERSION
- POSTGRES_DB — имя базы данных, создаваемой при инициализации контейнера. Она используется, в частности, для хранения данных PostfixAdmin.
- POSTGRES_USER — имя пользователя PostgreSQL, используемого для подключения к базе данных mailserver_db.
- POSTGRES_PASSWORD — пароль пользователя, указанного в POSTGRES_USER.
- POSTGRES_VERSION — версия PostgreSQL, используемая для создания контейнера. В описанной конфигурации указана версия 14.
Переменные PostfixAdmin
POSTFIXADMIN_DB_TYPE=pgsql
POSTFIXADMIN_DB_HOST=172.23.1.2
POSTFIXADMIN_DB_USER
POSTFIXADMIN_DB_NAME
POSTFIXADMIN_DB_PASSWORD
- POSTFIXADMIN_DB_TYPE задаёт тип базы данных. В данном случае используется PostgreSQL (pgsql); также поддерживаются другие СУБД, например MySQL.
- POSTFIXADMIN_DB_HOST указывает IP-адрес хоста базы данных. В приведённом примере это адрес контейнера PostgreSQL.
- POSTFIXADMIN_DB_USER задаёт имя пользователя базы данных для подключения PostfixAdmin.
- POSTFIXADMIN_DB_NAME определяет имя базы данных, к которой подключается PostfixAdmin.
- POSTFIXADMIN_DB_PASSWORD содержит пароль пользователя базы данных.
Переменные Dovecot
DOVECOT_VERSION=
DOVECOT_VERSION задаёт версию Dovecot, используемую в контейнере.
Переменные Redis
REDIS_PASSWORD
REDIS_PORT=
REDIS_PROTECTED_MODE=yes
REDIS_VERSION
- REDIS_PASSWORD задаёт пароль для защиты доступа к данным Redis.
- REDIS_PORT определяет порт, на котором Redis принимает соединения. По умолчанию используется порт 6379.
- REDIS_PROTECTED_MODE включает или отключает защищённый режим Redis. При значении yes в этом режиме Redis принимает соединения только с localhost.
- REDIS_VERSION определяет версию Redis. В описанной конфигурации используется версия 6.
Переменные Rspamd
RSPAM_enable_password=yes
RSPAM_password
- RSPAM_enable_password определяет, требуется ли пароль для доступа к интерфейсу Rspamd. Значение yes включает защиту паролем.
- RSPAM_password содержит пароль для доступа к интерфейсу Rspamd.
Использование общего .env позволяет менять основные параметры проекта без редактирования конфигурационных файлов Docker Compose и упрощает управление сервисами.
Порядок запуска контейнеров
Для развёртывания почтового сервера необходимо получить конфигурационные файлы, настроить сервисы, проверить права доступа и запустить контейнеры.
1. Клонирование репозитория
Склонируйте репозиторий с необходимыми файлами и конфигурациями:
git clone https://github.com/nixys/docker-mail-server
2. Настройка Exim4
Перейдите в директорию конфигурации Exim4:
cd volumes/etc/exim4
Отредактируйте основной конфигурационный файл exim.conf, указав:
- основные переменные для вашего домена;
- параметры подключения к базе данных с использованием пароля из .env;
- пути к сертификатам и ключам DKIM;
- дополнительные правила ACL (Access Control List), если они необходимы.
3. Настройка Dovecot
Перейдите в директорию конфигурации Dovecot:
cd volumes/etc/dovecot
Отредактируйте файл dovecot-sql.conf, настроив подключение к базе данных с использованием параметров из .env.
В файле dovecot.conf задайте основные параметры домена и пути к SSL-сертификатам. После внесения изменений проверьте корректность конфигурационных файлов.
4. Настройка PostfixAdmin
Перейдите в директорию конфигурации PostfixAdmin:
cd volumes/etc/postfixadmin
В файле dbconfig.inc.php настройте подключение к базе данных в соответствии с параметрами .env.
В файле config.inc.php задайте переменные, связанные с доменом, управлением почтой и другими параметрами приложения. Сохраните изменения и проверьте их корректность.
5. Настройка Rspamd
Перейдите в директорию конфигурации Rspamd:
cd build/rspam/etc/local.d
Отредактируйте конфигурационные файлы, если требуется изменить основные параметры Rspamd. Если дополнительные изменения не нужны, оставьте существующие настройки.
6. Проверка прав доступа
Проверьте права доступа к директории volumes/var/log. При необходимости установите их командой:
chmod -R 755 volumes/var/log
Убедитесь, что права позволяют контейнерам записывать журналы.
7. Запуск контейнеров
После настройки файлов и проверки прав доступа запустите контейнеры с помощью Docker Compose:
docker-compose up -d
Проверка работоспособности почтового сервера
После запуска контейнеров необходимо проверить работу основных компонентов:
- Отправка писем. Отправьте тестовое письмо из контейнера с Exim4 и убедитесь, что оно доставлено.
- Доступ к веб-интерфейсам. Проверьте, что PostfixAdmin и RainLoop доступны через браузер. Убедитесь, что можно войти в административную панель и работать с учётной записью пользователя.
- Приём почты. Проверьте, что сервер корректно принимает письма и доставляет их в соответствующие почтовые ящики.
- Работа Rspamd. Откройте веб-интерфейс Rspamd и проверьте информацию об обработанных сообщениях. Убедитесь, что данные в Redis обновляются в соответствии с информацией о спаме и фильтрации.
- Эти проверки позволяют убедиться, что основные компоненты запущены и взаимодействуют друг с другом.
Заключение
В серии статей рассмотрена настройка почтового сервера с использованием Docker-контейнеров. В инфраструктуру входят Exim4, Dovecot, PostfixAdmin, RainLoop, PostgreSQL, Redis, Rspamd и ClamAV.
Развёртывание такой системы требует предварительной настройки компонентов и проверки их взаимодействия. Ключевые этапы включают клонирование репозитория, настройку конфигурационных файлов, запуск контейнеров и проверку отправки и приёма почты.
Docker упрощает развёртывание и управление почтовым сервером, помогает изолировать компоненты и делает инфраструктуру более гибкой и масштабируемой. Использование контейнеризации также облегчает сопровождение и обновление сервисов.
Оставьте заявку, чтобы обсудить проект
Спасибо за обращение
Мы свяжемся с вами в ближайшее время.