Вопрос возник не из-за сбоя, а по ходу дела: есть ли в mailcow ограничение на количество писем в одной папке.
Сбоя не было — это разбор, а не история инцидента. Но ответ оказался интереснее, чем «да» или «нет», потому что формальный лимит и практический предел здесь находятся в разных местах.
Коротко
- Жёсткого лимита нет: квоты в mailcow считаются по объёму, в мегабайтах.
- Dovecot умеет квоту по числу сообщений, но в mailcow она по умолчанию выключена.
- Практические пределы наступают раньше формальных — их пять, и все разные.
- Ориентир: держать папки в пределах десятков тысяч писем.
Формальный ответ
Жёсткого ограничения на число писем в папке нет. Квоты в mailcow считаются по объёму, а не по количеству.
Dovecot в принципе умеет и по количеству. Правило, в котором заданы оба предела сразу, выглядело бы так:
quota_rule = *:storage=5G:messages=50000
Но в mailcow ограничение по числу сообщений по умолчанию не включено.
Посмотреть текущее состояние квоты у конкретного пользователя:
docker compose exec dovecot-mailcow doveadm quota get -u user@example.com
Это стоит выполнить прежде, чем рассуждать: возможно, у вас квота уже настроена не так, как в конфигурации по умолчанию, и ответ на вопрос будет свой.
Где начинаются настоящие пределы
Формально предела нет, а фактически он есть — просто не один, а пять, и каждый проявляется по-своему.
Maildir хранит каждое письмо отдельным файлом. Папка на сто тысяч писем — это сто тысяч файлов в каталоге. Файловая система с этим справится, но любая операция, которая перебирает каталог, станет заметно медленнее.
Пересборка индексов тормозит. Пока индекс цел, всё быстро. Когда его надо перестроить — а это случается, — время растёт вместе с размером папки, и растёт непропорционально.
SOGo медленнее открывает огромные папки. Веб-интерфейс вынужден получить и отрисовать список; на десятках тысяч писем это перестаёт быть мгновенным.
Outlook плохо синхронизирует десятки тысяч писем. Это не предел сервера, но для пользователя разницы нет: тормозит у него.
Растёт полнотекстовый индекс, а на ext4 можно упереться в inode. Последнее особенно неприятно тем, что проявляется как «место на диске есть, а файл создать нельзя» — симптом, который сначала сбивает с толку. Запас смотрится отдельной командой, df без ключа его не покажет:
df -i /var/lib/docker
Обратите внимание: ни один из этих пределов не сообщает о себе заранее. Нет предупреждения «папка становится большой». Есть постепенное замедление, которое однажды замечают.
Практический ориентир
Держать папки в пределах десятков тысяч писем, а старое архивировать по годам.
Инструментов два: doveadm move на стороне сервера или автоархивация на стороне почтового клиента. Первый предсказуемее — он делает ровно то, что попросили, и не зависит от того, запущен ли у пользователя клиент:
docker compose exec dovecot-mailcow doveadm mailbox create -u user@example.com 'Архив/2024'
docker compose exec dovecot-mailcow doveadm move -u user@example.com \
'Архив/2024' mailbox INBOX SINCE 2024-01-01 BEFORE 2025-01-01
Границы года задаются двумя условиями, SINCE и BEFORE, и работают они как «И». Стоит сделать первый прогон на одном месяце вместо года: doveadm move не спрашивает подтверждения и не умеет откатываться.
Годовая нарезка удобна не только технически. Она совпадает с тем, как люди вспоминают переписку: «это было в прошлом году» — рабочий поисковый признак, а «это было среди последних сорока тысяч писем» — нет.
Что из этого стоит запомнить
Что отсутствие лимита — не то же самое, что отсутствие предела.
Система не откажет вам в создании стотысячного письма в папке. Она просто начнёт работать хуже, постепенно и без объявления, и связать замедление с размером папки будет тем труднее, чем дольше вы этого не делали.