Если у вас на сервере крутится почта под Dovecot/IMAP, то формат хранения писем — не просто строка в конфиге. От выбранного формата зависят нагрузка на файловую систему, скорость отклика у клиентов, стабильность индексации и даже стоимость бэкапов. В мире Dovecot самое популярное хранилище — maildir, но для «взрослых» объёмов и долгоживущих ящиков всё чаще выигрывает mdbox. Разбираемся, где реальная польза, где тонкие места и как мигрировать без потерь.
Maildir vs mdbox: коротко о главном
Maildir хранит каждое письмо отдельным файлом. Это удобно для простых резервных копий, ручных операций и быстрой доставки: MTA/LDA просто кладут новый файл. Но у формата есть цена — огромное число инодов, метаданные на диске, долгие операции с каталогами при больших ящиках, медленные бэкапы «по файлам», высокая фрагментация, а на HDD — болезненные seek-и.
mdbox — это «контейнерный» формат Dovecot: письма укладываются пачками в большие файлы, а отображение «UID → позиция в контейнере» хранится в индексах/картах. В итоге меньше инодов, меньше накладных расходов на каталогах, предсказуемые последовательные чтения/записи и более быстрые операции компакта/экспанжа для больших ящиков.
Правильное резюме:
maildirпрост и прозрачен,mdbox— эффективен на больших объёмах и высоких нагрузках. Переключаться стоит, когда файловая система и бэкапы начинают «стоить дороже», чем выгода от простоты maildir.
Когда переход на mdbox даст максимальный эффект
- Крупные ящики: десятки тысяч и более писем в одном или нескольких каталогах (архивы за годы, общие ящики, helpdesk).
- Диск с ограниченными IOPS: HDD/сетевое хранилище, где миллионы мелких файлов убивают латентность.
- Проблемы с инодами/метаданными: ENOSPC по инодам, длительные операции stat(), просадки IMAP LIST/SEARCH.
- Дорогие бэкапы Maildir: rsync с миллионами мелких файлов, долгие окна копирования, большие каталоги
cur/. - Экспанж/удаления приводят к «захламлению» maildir: медленная сборка мусора, разрастание каталогов.
Если держите почту на отдельном сервере, удобнее всего изолировать сервис на собственной VDS, разнести индексы на быстрый SSD, а архивы — на ёмкий том. Для шифрования IMAPS/SMTP позаботьтесь о корректных SSL-сертификаты.

Когда лучше остаться на Maildir
- Небольшие ящики и редкое использование IMAP (несколько тысяч писем, без тяжёлых вложений).
- Скрипты/интеграции, рассчитывающие на «один файл = одно письмо» в файловой системе.
- Использование примитивных file-level бэкапов без
doveadmи без возможности читать Dovecot индексы.
Что внутри mdbox и почему он быстрее
В mdbox письма записываются последовательными блоками в контейнерные файлы фиксированного или динамического размера. Dovecot поддерживает ротацию контейнеров (mdbox_rotate_size, mdbox_rotate_interval) и компакцию. При удалениях помечает письма как expunged и при компакции собирает «живые» сообщения в новые файлы, выбрасывая мусор. Это значительно уменьшает фрагментацию и стоимость операций по сравнению с maildir, где каждое удаление — работа с отдельным файлом и каталогом.
Индексы Dovecot (.imap/ каталоги) в обоих форматах важны, но при mdbox они критичны: карта соответствий хранит, где именно лежит письмо внутри контейнера. Отсюда практический вывод: следите за целостностью индексов и периодически запланируйте компакты.
Подготовка к миграции: чек-лист
- Свободное место: закладывайте 1.1–1.5× от текущего объёма почты на диске. Нужен запас для одновременного существования Maildir и mdbox до переключения.
- Бэкап: снимите независимую резервную копию (снимок/образ диска, внешнее хранилище). Имеет смысл параллельно протестировать
doveadm backupна одном ящике. По теме бэкапов посмотрите также «Резервное копирование в S3: restic и borg» и «Практика rsync: деплой и бэкапы по SSH». - Окно переключения: выберите время с минимальной активностью. Для near-zero-downtime используйте двуступенчатую синхронизацию.
- Права/пользователь: убедитесь, что системный пользователь (например,
vmail) владеет каталогами и имеет нужные ulimit (nofile/inotify). - Мониторинг: подготовьте проверку логинов IMAP, доставку тестового письма и проверку случайных ящиков после миграции.
Базовые настройки Dovecot под mdbox
Ниже пример ключевых параметров. Адаптируйте пути и владельцев под свою систему.
# /etc/dovecot/dovecot.conf (фрагменты)
# Текущее (до миграции):
mail_location = maildir:/srv/mail/%u
# Включим индексацию и оптимальные fsync
mail_fsync = optimized
# Если хранилище на HDD — полезно
maildir_very_dirty_syncs = yes
# После миграции установим:
# mail_location = mdbox:/srv/mail-mdbox/%u
# Ротация контейнеров mdbox
mdbox_rotate_size = 20M
mdbox_rotate_interval = 1d
# Компакты и обслуживание
# Можно планировать cron-ом команду: doveadm compact -A
# Опционально: компрессия сообщений (zlib)
mail_plugins = $mail_plugins zlib
plugin {
zlib_save = gz
zlib_save_level = 6
}
# Опционально: вынос вложений на отдельный том с дедупликацией
mail_attachment_dir = /srv/mail-attachments
mail_attachment_min_size = 128k
mail_attachment_hash = %%{sha1}
Ключевой момент — не менять mail_location до финального переключения. Для начальной синхронизации используйте doveadm, указывая целевое mdbox-хранилище явным параметром.

Стратегия миграции №1: короткий простой (прямо и надёжно)
- Подготовьте каталоги и права под будущий mdbox.
mkdir -p /srv/mail-mdbox
chown -R vmail:vmail /srv/mail-mdbox
chmod 750 /srv/mail-mdbox
- Остановите приём почты и логины на время миграции (минимизирует расхождения).
systemctl stop postfix
systemctl stop dovecot
- Запустите однократный перенос для всех пользователей. Исходим из того, что текущий
mail_locationуказывает на Maildir.
for u in $(doveadm user '*'); do doveadm backup -u "$u" mdbox:/srv/mail-mdbox/"$u"; done
- Переключите формат на mdbox в конфиге и пересоздайте индексы.
sed -i 's|^mail_location = .*|mail_location = mdbox:/srv/mail-mdbox/%u|' /etc/dovecot/dovecot.conf
systemctl start dovecot
for u in $(doveadm user '*'); do doveadm index -u "$u" -q '*'; done
for u in $(doveadm user '*'); do doveadm compact -u "$u"; done
systemctl start postfix
- Верификация: проверьте логины тестовых пользователей, доставку, произвольные IMAP-папки, счётчики UNSEEN.
- Отложенное удаление Maildir: оставьте старые каталоги read-only на несколько дней для спокойствия.
Стратегия миграции №2: почти без простоя (двухфазная синхронизация)
Подходит, если нельзя останавливать сервис на длительное время. Идея: сначала скопировать «львиную долю» онлайн, затем сделать короткий догон и переключиться.
- Первая фаза — онлайн-копия в фоновом режиме:
for u in $(doveadm user '*'); do doveadm backup -u "$u" mdbox:/srv/mail-mdbox/"$u"; done
Пользователи продолжают работать. Новые и изменённые письма ещё лежат в Maildir.
- Вторая фаза — короткий стоп-догон:
systemctl stop postfix
systemctl stop dovecot
for u in $(doveadm user '*'); do doveadm backup -u "$u" mdbox:/srv/mail-mdbox/"$u"; done
sed -i 's|^mail_location = .*|mail_location = mdbox:/srv/mail-mdbox/%u|' /etc/dovecot/dovecot.conf
systemctl start dovecot
for u in $(doveadm user '*'); do doveadm compact -u "$u"; done
systemctl start postfix
Итог: сначала уносим «массу» данных, а в окне переключения — только инкремент. Простой сокращается до минут.
Важные нюансы и грабли
Индексы и целостность
mdbox зависит от индексов. Если индексы повреждаются (жёсткая перезагрузка, сбой диска), Dovecot умеет восстанавливаться, но это может занять время. Планируйте регулярные doveadm index и следите за логами при старте. Для хранения индексов на быстром диске используйте mail_index_path на SSD, а данные — на более ёмком томе.
Компакты и экспанжи
Удаление письма — это «логическое» удаление вплоть до компакта. Регулярно запускайте:
doveadm compact -A
При больших удалениях (массовые чистки) полезно запустить компакты вручную сразу после операции. Так вы быстрее вернёте место на диске и не останетесь с лишними «пустотами» в контейнерах.
Резервное копирование
С файловыми бэкапами mdbox живёт лучше, чем кажется: крупные контейнеры копируются быстрее, чем миллионы мелких файлов в maildir. Но чтобы сохранять непротиворечивые данные, старайтесь использовать doveadm backup или файловые снимки (LVM/ZFS) на время консистентной копии. Прямая замена rsync «как было с Maildir» может работать, но без гарантий на консистентность при конкурирующих записях.
Квоты
Квоты формата count/dict работают и с mdbox. После миграции сделайте пересчёт:
doveadm quota recalc -A
Если используете отдельный том для вложений (mail_attachment_dir), учитывайте, что квоты по умолчанию считают общий объём писем, а не каталог вложений. При необходимости настройте политику учёта.
Компрессия
Плагин zlib заметно уменьшает размер архивов с перепиской, но увеличивает нагрузку на CPU. На современных CPU это оправдано, особенно для больших, редко читаемых ящиков. Для «горячих» ящиков с большим количеством маленьких писем сначала замерьте влияние на латентность.
Миграция отдельных ящиков/этапами
Не обязательно переносить всех сразу. Отличная практика — выбрать несколько самых больших и самых активных ящиков, замерить эффект и отточить процедуру. После — переносить остальную массу.
Как оценить выгоду заранее
- IO профили: сравните количество системных вызовов на Maildir (много stat()/open() по мелочам) и ожидаемые последовательные записи/чтения при mdbox.
- Размер индексов: планируйте кэш индексов на быстрых носителях; это часто узкое место в IMAP LIST/SEARCH.
- Скорость бэкапа: протестируйте
doveadm backupна одном крупном ящике. Сравните окно и полосу с вашим текущим rsync. - Падение латентности IMAP: в списках с 50–200 тыс. писем убыстрение бывает кратным за счёт предсказуемого чтения и меньшего числа файловых операций.
Чистый план отката
Если что-то пошло не так, сохраняйте старый Maildir в режиме read-only несколько дней. В крайнем случае можно временно вернуть mail_location на Maildir и синхронизировать «хвост» обратно с помощью doveadm backup в обратную сторону. Пример для одного пользователя:
u="user@example.com"
mv /srv/mail/$u /srv/mail-backup/$u
mkdir -p /srv/mail/$u
chown -R vmail:vmail /srv/mail/$u
# Текущий формат у пользователя — mdbox (mail_location указывает на mdbox)
# Копируем данные из mdbox обратно в Maildir назначения
doveadm backup -u "$u" maildir:/srv/mail/"$u"
Лучший откат — тот, который вы один раз отрепетировали на тестовом пользователе и задокументировали.
Частые вопросы
Что с POP3? Работает как и раньше: Dovecot читает письма из mdbox через свои индексы, клиенту разницы нет.
Можно ли просто «скопировать» файлы mdbox rsync-ом? Можно, но для консистентности при активных записях используйте doveadm backup или остановку логинов на время копирования. Снимки ФС — ещё лучше.
Можно ли смешивать Maildir и mdbox для разных пользователей? Да, если mail_location задаётся на уровне userdb. Это удобный способ мигрировать поэтапно.
Нужно ли менять LDA/LMTP настройки? Обычно нет: Dovecot сам понимает формат хранилища для пользователя по mail_location.
Что с восстановлением одного письма? При mdbox точечное восстановление делается через doveadm import/doveadm fetch, а не «просто положить файл в cur/». Заложите это в процедуры поддержки.
Операции обслуживания после миграции
- Периодический компактиг:
doveadm compact -A. - Переиндексация «проблемных» ящиков:
doveadm index -u user '*'. - Контроль места и контейнеров: проверяйте ротацию (
mdbox_rotate_size) и тренды роста индексов. - Проверка квот:
doveadm quota recalc -A.
Итог
Формат mdbox не панацея, но для средних и крупных почтовых хранилищ он даёт системные выигрыши: меньше инодов, более предсказуемый I/O, ускорение IMAP-операций, удобные компакты и более короткие окна бэкапа. Ключ к успешной миграции — подготовка (свободное место, бэкап, тест на одном ящике), аккуратная двухфазная синхронизация с doveadm backup и чёткий план проверки/отката. Сделайте один качественный пилот — и переход остальной массы пользователей пройдёт спокойно.


