3 поток Golang для инженеров с 4 июля
Подписка на новости Слёрм
Должность
«Другая» должность
«Я согласен(на) с Политикой Конфиденциальности Слёрм и предоставляю Согласие на обработку персональных данных»
Блог Слёрм

Реализация масштабируемой почтовой системы

Нам необходимо установить и настроить четыре разных типа модулей. Каждый модуль представляет собой OpenVZ-контейнер с установленной в нем операционной системой CentOS 6.


dbmail-модуль

Установка dbmail достаточно тривиальна и подробно описана в wiki, я позволю себе краткто изложить ход установки.

Для работы dbmail требуется библиотека GMime версии 2.4.x, она есть в репозитории epel, в других репозиториях версии этой библиотеки были 2.5 и 2.6. К сожалению dbmail не умеет с ними работать.


Конфигурация dbmail находиться в файле /etc/dbmail.conf.
Заносим туда логины/пароли на доступ к mysql-серверу, параметр table_prefix лучше не менять, SSL/TLS будет обрабатывать nginx, и еще я поменял кодировку писем по умолчанию.


Теперь проведем небольшой тюнинг mysql.
Добавим в my.cnf следующие параметры:


Cоздаем базу данных dbmail и заливаем в нее структуру из файла /usr/share/doc/dbmail-3.0.2/sql/mysql/create_tables.mysql
dbmail-модуль готов, осталось запустить сервисы


admin-модуль

На текущий момент для администрирования каждого из dbmail-модулей используется dbmailadmin. Установка dbmailadmin тривиальна. Все виртуальные серверы с dbamiladmin собраны в одном OpenVZ-контейнере. Назовем его admin-модуль.

Теперь нам нужен единый список доменов и почтовых ящиков, существующих в системе, с указанием на каком именно dbmail-модуле они находятся.

Для этого в admin-модуле я создал базу данных master:


В эту  базу данных вот такой скрипт периодически копирует информацию из баз данных dbmail-модулей.

Скрипт конечно не идеальный, но пока устраивает. 

На nginx- и postfix- модулях информация берется из локальных slave-копий базы master, таким образом падение admin-модуля не оставит систему без списка обслуживаемых адресов.

postfix-модуль

В нашем случае один postfix-модуль должен уметь осуществлять доставку в любой dbmail-модуль, поэтому конфигурация была немного расширена:

В master.cf описаны транспорты:


А вот на основании этих параметров в main.cf postfix и узнает какие домены и ящики он обслуживает и куда именно отдавать принятую почту:


domain.cf


mailbox.cf

Хранение данных