OSEN-НИЙ SAAALEСкидка 50% на виртуальный хостинг и VDS
до 30.11.2025 Подробнее
Выберите продукт

Dovecot mdbox вместо Maildir: когда переходить и как мигрировать

Maildir прост и предсказуем, но на больших объёмах превращается в миллионы мелких файлов — тормоза, боль для IOPS и бэкапов. Разбираю, когда mdbox реально ускоряет IMAP и экономит место, как подготовиться и мигрировать почти без простоя, с проверками и понятным планом отката.
Dovecot mdbox вместо Maildir: когда переходить и как мигрировать

Если у вас на сервере крутится почта под 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 и mdbox: контейнеры сообщений и индексы соответствий

Когда лучше остаться на 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-хранилище явным параметром.

Поток выполнения doveadm backup и последующего compact при миграции почты

Стратегия миграции №1: короткий простой (прямо и надёжно)

  1. Подготовьте каталоги и права под будущий mdbox.
mkdir -p /srv/mail-mdbox
chown -R vmail:vmail /srv/mail-mdbox
chmod 750 /srv/mail-mdbox
  1. Остановите приём почты и логины на время миграции (минимизирует расхождения).
systemctl stop postfix
systemctl stop dovecot
  1. Запустите однократный перенос для всех пользователей. Исходим из того, что текущий mail_location указывает на Maildir.
for u in $(doveadm user '*'); do doveadm backup -u "$u" mdbox:/srv/mail-mdbox/"$u"; done
  1. Переключите формат на 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
  1. Верификация: проверьте логины тестовых пользователей, доставку, произвольные IMAP-папки, счётчики UNSEEN.
  2. Отложенное удаление Maildir: оставьте старые каталоги read-only на несколько дней для спокойствия.

Стратегия миграции №2: почти без простоя (двухфазная синхронизация)

Подходит, если нельзя останавливать сервис на длительное время. Идея: сначала скопировать «львиную долю» онлайн, затем сделать короткий догон и переключиться.

  1. Первая фаза — онлайн-копия в фоновом режиме:
for u in $(doveadm user '*'); do doveadm backup -u "$u" mdbox:/srv/mail-mdbox/"$u"; done

Пользователи продолжают работать. Новые и изменённые письма ещё лежат в Maildir.

  1. Вторая фаза — короткий стоп-догон:
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

Итог: сначала уносим «массу» данных, а в окне переключения — только инкремент. Простой сокращается до минут.

FastFox VDS
Облачный VDS-сервер в России
Аренда виртуальных серверов с моментальным развертыванием инфраструктуры от 195₽ / мес

Важные нюансы и грабли

Индексы и целостность

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 и чёткий план проверки/отката. Сделайте один качественный пилот — и переход остальной массы пользователей пройдёт спокойно.

Поделиться статьей

Вам будет интересно

DMARC: rua, p=quarantine и p=reject — как включить без потери доставляемости OpenAI Статья написана AI (GPT 5)

DMARC: rua, p=quarantine и p=reject — как включить без потери доставляемости

Пошаговое руководство для админов: что такое DMARC и агрегированные отчёты rua, как правильно оформить rua=mailto, собрать XML-отч ...
Floating IP для Nginx: keepalived VRRP, healthcheck и быстрый failover OpenAI Статья написана AI (GPT 5)

Floating IP для Nginx: keepalived VRRP, healthcheck и быстрый failover

Пошагово строим отказоустойчивый фронтенд на двух серверах Nginx с общим floating IP. Настраиваем keepalived (VRRP), HTTP health c ...
SYNPROXY в nftables: защита VDS от TCP SYN flood пошагово OpenAI Статья написана AI (GPT 5)

SYNPROXY в nftables: защита VDS от TCP SYN flood пошагово

SYN flood забивает TCP-очереди и conntrack на VDS, съедая CPU. SYNPROXY в nftables отсекает мусор до TCP-стека. Разбираем принцип, ...