Релиз nxs-anomaly: отечественная альтернатива Grafana OnCall для управления дежурствами, маршрутизации оповещений и эскалации инцидентов. Доступен на GitHub
Все статьи

Почтовый сервер с нуля. Часть третья.

Разворачиваем почтовый сервер в Docker и настраиваем взаимодействие всех компонентов

Время чтения
13 минут
Раздел
Статьи
Почтовый сервер с нуля. Часть третья.

Это заключительная часть серии статей о создании почтового сервера. В предыдущих материалах были рассмотрены настройка 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

Такая конфигурация задаёт параметры сборки, открытые порты, каталоги конфигурации и журналов, а также сетевые настройки Exim4.

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

Конфигурация определяет параметры сборки, порт веб-интерфейса, каталог данных и сетевые настройки RainLoop.

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}
Данные PostgreSQL хранятся в подключённом каталоге. Имя базы данных, пользователь и пароль передаются через переменные окружения.

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
Конфигурация задаёт версию Redis, каталог для хранения данных и сетевые параметры сервиса.

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

Конфигурация определяет параметры сборки, зависимости от Redis и ClamAV, порт веб-интерфейса, каталоги данных и журналов, а также переменные окружения для взаимодействия с другими сервисами.

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 упрощает развёртывание и управление почтовым сервером, помогает изолировать компоненты и делает инфраструктуру более гибкой и масштабируемой. Использование контейнеризации также облегчает сопровождение и обновление сервисов.

Оставьте заявку, чтобы обсудить проект

Ваши контакты
О вашем проекте

Нажав на кнопку, соглашаюсь на обработку персональных данных, Ознакомлен со всеми документами, размещенными на сайте

См. Политику обработки персональных данных
См. Пользовательское соглашение