Вы пишете правило, перезапускаете Dovecot, ошибок нет — а ящики продолжают расти за пределы лимита. Правило не ошибочно. Файл просто никогда не читается.
Штатная установка Dovecot разбивает конфигурацию на файлы в /etc/dovecot/conf.d/ и подключает их строкой !include conf.d/*.conf в основном файле. CyberPanel, генерируя собственный dovecot.conf, эту строку не добавляет. Всё, что вы кладёте в conf.d — включая квоту — записывается на диск и никогда не читается. Решение: поместить блок квоты прямо в основной dovecot.conf либо осознанно добавить строку подключения. Проверка одной командой: doveconf -n печатает действующую конфигурацию, и если строк квоты там нет — она не применяется.
Всё выглядит сделанным: правило лежит в /etc/dovecot/conf.d/90-quota.conf, служба перезапущена, в журнале чисто. При этом ящики уходят далеко за лимит, а пользователь не получает никаких предупреждений.
На этом месте большинство начинает сомневаться в синтаксисе и полдня перебирает варианты написания quota_rule. С синтаксисом всё в порядке. Файл просто не открывается.
Dovecot в поставке большинства дистрибутивов делит конфигурацию на части: 10-mail.conf, 10-auth.conf, 90-quota.conf и другие лежат в /etc/dovecot/conf.d/. Единственное, что заставляет их работать, — строка в конце основного файла:
!include conf.d/*.conf
Разворачивая почтовый стек, CyberPanel генерирует /etc/dovecot/dovecot.conf из собственного шаблона. Этот шаблон самодостаточен, состоит из одного файла и строки подключения не содержит. Каталог conf.d остаётся на диске, файлы в нём читаемы, но Dovecot в них не заглядывает.
Сбой по своей природе молчаливый. Попытка подключить несуществующий файл — ошибка. Неподключение существующего файла ошибкой не является, поэтому в журнале не остаётся ни следа.
Прежде чем гадать, прочитайте действующую конфигурацию. doveconf -n печатает то, что Dovecot реально использует, без значений по умолчанию:
# Всё, что связано с квотой и реально действует
doveconf -n | grep -i quota
# Подключает ли основной файл conf.d вообще?
grep -n 'include' /etc/dovecot/dovecot.conf
Если первая команда ничего не печатает — конфигурация квоты неактивна. Если вторая не показывает строку с conf.d — причина найдена.
Эти две команды стоит превратить в привычку для всего класса подобных задач: смотрите на то, что читает сервер, а не на то, что написано в файле.
Есть два пути. Чтобы не воевать со сгенерированной панелью структурой, предпочтительно дописать блок квоты прямо в основной файл:
# в конец /etc/dovecot/dovecot.conf
mail_plugins = $mail_plugins quota
plugin {
quota = maildir:User quota
quota_rule = *:storage=2G
quota_rule2 = Trash:storage=+200M
quota_grace = 10%
}
Строка quota_rule2 даёт корзине лимит сверх основной квоты. Без неё пользователь, упёршийся в лимит, не сможет освободить место удалением: удалённое письмо переезжает в корзину, которая входит в ту же квоту, и потребление не уменьшается.
Второй путь — вернуть подключение. Это возвращает Dovecot к стандартному поведению, но несёт риск: обновление панели может перегенерировать файл и стереть вашу строку:
echo '!include conf.d/*.conf' >> /etc/dovecot/dovecot.conf
Что бы вы ни выбрали, сделайте резервную копию файла вне веб-корня, прежде чем его менять.
Применять квоту и дать клиенту её видеть — разные вещи. Чтобы почтовый клиент показывал «заполнено на 80%», протоколу IMAP нужен собственный плагин:
protocol imap {
mail_plugins = $mail_plugins imap_quota
}
Без этой строки квота всё равно работает — письма отклоняются при переполнении, — но пользователь не видит этого заранее и узнаёт о лимите из отказа.
После изменения перезапустите службу и проверьте результат по конкретному пользователю:
systemctl restart dovecot
doveconf -n | grep -i quota # действует?
doveadm quota get -u user@example.com
Последняя команда выводит текущее потребление и лимит таблицей. Если в строке STORAGE колонка лимита пуста — квота всё ещё не применяется.
На новых ящиках квота действует сразу. На существующих Dovecot пересчитывает счётчик при первом обращении; если ждать некогда, форсируйте: doveadm quota recalc -u user@example.com.
Урок здесь не про синтаксис квоты, а про то, что нельзя принимать на веру, откуда читается конфигурация. На стеках, развёрнутых панелью, структура каталогов выглядит стандартно, но подключены ли эти файлы — отдельный вопрос. На него отвечает doveconf -n, как nginx -T и apachectl -S отвечают за свои серверы: они показывают работающую реальность, а не намерение на диске.
!include conf.d/*.confdoveconf -n | grep -i quota без вывода = не применяетсяquota_rule2 = Trash:storage=+200M удалением место не освободитьimap_quota пользователь не видит заполненностьdoveadm quota get -u user@example.comПотому что в сгенерированном CyberPanel файле /etc/dovecot/dovecot.conf нет строки, подключающей каталог conf.d. Dovecot читает только основной файл. Ваши файлы лежат где надо, права верные, синтаксис корректный — их просто никогда не открывают. Убедиться можно за секунды через doveconf -n.
Удалённое письмо переносится в корзину, а корзина входит в ту же квоту, поэтому потребление не падает. Дайте корзине лимит сверх основной квоты правилом вида quota_rule2 = Trash:storage=+200M. Как вариант — настройте автоматическую очистку корзины по сроку.
Да, но Dovecot обновляет счётчик потребления лениво и пересчитывает его при первом обращении к ящику. Чтобы увидеть результат сразу, выполните doveadm quota recalc -u user@example.com. У новых ящиков такой задержки нет.
Технически да — это возвращает Dovecot к стандартному поведению. Риск в том, что обновление панели может перегенерировать dovecot.conf из шаблона, ваша строка исчезнет и квота тихо перестанет действовать. Записать блок квоты прямо в основной файл и сохранить резервную копию — надёжнее.