Вопрос возник не из-за сбоя, а по ходу дела: есть ли в 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 не спрашивает подтверждения и не умеет откатываться.

Годовая нарезка удобна не только технически. Она совпадает с тем, как люди вспоминают переписку: «это было в прошлом году» — рабочий поисковый признак, а «это было среди последних сорока тысяч писем» — нет.

Что из этого стоит запомнить

Что отсутствие лимита — не то же самое, что отсутствие предела.

Система не откажет вам в создании стотысячного письма в папке. Она просто начнёт работать хуже, постепенно и без объявления, и связать замедление с размером папки будет тем труднее, чем дольше вы этого не делали.