Доступен — Локальные цифровые продукты
HCA · Studio
TR — Контакты ↗
Заметка 06 · Сервер

Почему квота Dovecot молча игнорируется

Вы пишете правило, перезапускаете Dovecot, ошибок нет — а ящики продолжают расти за пределы лимита. Правило не ошибочно. Файл просто никогда не читается.

Сервер
Dovecot / CyberPanel
Симптом
Квота игнорируется
Проверка
doveconf -n
Короткий ответ

Штатная установка 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

Что бы вы ни выбрали, сделайте резервную копию файла вне веб-корня, прежде чем его менять.

Сторона IMAP

Применять квоту и дать клиенту её видеть — разные вещи. Чтобы почтовый клиент показывал «заполнено на 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 отвечают за свои серверы: они показывают работающую реальность, а не намерение на диске.

Быстрая справка
Причина
В dovecot.conf от CyberPanel нет !include conf.d/*.conf
Следствие
Всё в conf.d молча игнорируется — ошибка не возникает
Диагностика
doveconf -n | grep -i quota без вывода = не применяется
Решение
Поместить блок квоты прямо в основной dovecot.conf
Корзина
Без quota_rule2 = Trash:storage=+200M удалением место не освободить
Клиент
Без плагина imap_quota пользователь не видит заполненность
Проверка
doveadm quota get -u user@example.com
Общее правило
Смотрите, что читает сервер, а не что написано в файле
Частые вопросы

О квотах Dovecot.

Почему настройка, которую я положил в conf.d, не работает?

Потому что в сгенерированном 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 из шаблона, ваша строка исчезнет и квота тихо перестанет действовать. Записать блок квоты прямо в основной файл и сохранить резервную копию — надёжнее.

Доступность и смета

Есть идея?
Можно даже одной фразой.