Настройка квот в Dovecot + PostfixAdmin


Используемые термины: Dovecot, PostfixAdmin, Postfix.
При установке почтового сервера на базе Postfix + Dovecot и использовании панели управления почтовыми ящиками PostfixAdmin, по умолчанию, квотирование не настроено — его можно задавать в последней, но работать квоты не будут. Нужна дополнительная настройка...
Настройка Dovecot
Открываем конфигурационный файл10-mail.conf:
vi /etc/dovecot/conf.d/10-mail.conf
Находим строку с mail_plugins и приводим ее к виду:
...
mail_plugins = $mail_plugins quota
...
* данная строка подключает к плагинам дополнительно плагин для управления квотами (quota). Если опция закомментирована, снимаем комментарий.
Открываем конфигурационный файл 20-imap.conf:
vi /etc/dovecot/conf.d/20-imap.conf
Находим опцию protocol imap и добавим в нее также возможность использования плагина с квотами:
protocol imap {
mail_plugins = $mail_plugins imap_quota
}
* опция mail_plugins может быть закомментирована. Если это так, то коментарий снимаем.
Открываем конфигурационный файл 10-master.conf:
vi /etc/dovecot/conf.d/10-master.conf
Находим опцию service dict, в ней unix_listener dict и приводим ее к виду:
service dict {
unix_listener dict {
mode = 0660
user = vmail
group = vmail
}
}
Открываем файл 90-quota.conf:
vi /etc/dovecot/conf.d/90-quota.conf
Добавляем:
plugin {
quota = dict:User quota::proxy::quota
}
* или снимаем комментарий с соответствующей строки quota = dict:User quota::proxy::quota.
Открываем основной конфигурационный файл для dovecot:
vi /etc/dovecot/dovecot.conf
Находим раздел dict и снимаем комментарий или добавляем:
dict {
quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
}
Теперь создаем файл для настройки выгрузки квот:
vi /etc/dovecot/dovecot-dict-sql.conf.ext
connect = host=localhost dbname=postfix user=postfix password=postfix123
map {
pattern = priv/quota/storage
table = quota2
username_field = username
value_field = bytes
}
map {
pattern = priv/quota/messages
table = quota2
username_field = username
value_field = messages
}
* где host — сервер mysql, к которому будем подключаться; dbname — имя базы данных, в которой находятся пользователи postfix; user — пользователь, под которым мы подключаемся к базе; password — пароль для подключения к базе. В данном примере мы подключимся к СУБД, которая находится на том же сервере (localhost) к базе postfix под пользователем postfix с паролем postfix123.
Откроем наш файл, в котором мы описываем настройки выборки данных по пользователям из базы данных:
vi /etc/dovecot/dovecot-sql.conf.ext
Находим запрос user_query и дописываем в SELECT CONCAT('*:bytes=', quota) AS quota_rule — у меня в итоге получилось:
user_query = SELECT CONCAT('/home/mail/',LCASE(`domain`),'/',LCASE(`maildir`)), 1024 AS uid, 1024 AS gid, CONCAT('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u'
* если в нашем файле запросов есть несколько строк user_query, то необходимо дописать запрос для последней.
Проверяем конфигурационный файл dovecot:
doveconf
... и если команда не вернет ошибку, перезапускаем его:
systemctl restart dovecot
Проверка работы квот
Для начала в командной строке вводим:
doveadm quota get -u user@domain.net
* user@domain.net — почтовый пользователь, для которого нужно показать квоту.
Данная команда отобразит квоту для пользователя, например:
Quota name Type Value Limit %
User quota STORAGE 16420 50000 32
User quota MESSAGE 14 - 0
* в данном примере почтовый ящик занимает около 16 Мб, а квота около 50 Мб — ящик заполнен на 32%.
Теперь открываем PostfixAdmin - заходим в настройки почтового ящика и ставим небольшой лимит, например, в 5 Мб:
Теперь объем ящика превышает лимит:
doveadm quota get -u user@domain.net
Quota name Type Value Limit %
User quota STORAGE 16420 5000 328
User quota MESSAGE 14 - 0
* объем превышен, почти, втрое.
Некоторые почтовые клиенты покажут превышение лимита, например, Thunderbird:
Оповещения при превышении квоты
Открываем конфигурационный файл 90-quota.conf:
vi /etc/dovecot/conf.d/90-quota.conf
Снимаем комментарий или добавляем данные строки:
plugin {
quota_warning = storage=95%% quota-warning 95 %u
quota_warning2 = storage=80%% quota-warning 80 %u
}
* в данном примере мы указываем на необходимость делать 2 предупреждения — первое при достижении объема ящика в 80%, второе — 95%. Сервис dovecot, который будет это обеспечивать, называется quota-warning.
Теперь находим раздел service quota-warning и приводим его к виду:
service quota-warning {
executable = script /usr/local/bin/quota-warning.sh
user = dovecot
unix_listener quota-warning {
user = vmail
}
}
* мы создали сервис quota-warning, который будет запускать скрит /usr/local/bin/quota-warning.sh.
Создаем сам скрипт quota-warning.sh:
vi /usr/local/bin/quota-warning.sh
cat << EOF | /usr/libexec/dovecot/dovecot-lda -d $2 -o "plugin/quota=maildir:User quota:noenforcing"
Content-Type: text/html; charset=utf-8
From: Администратор почты <postmaster@dmosk.ru>
Subject: Предупреждение о превышении квоты на почтовый ящик
X-Priority: 2
<p>Размер Вашего почтового ящика составляет $1% от установленного ограничения.<br>
Чтобы уменьшить его размер Вы можете удалить большие письма с вложениями, старые письма или почистить корзину.</p>
EOF
* где postmaster@dmosk.ru — административный почтовый ящик. Сам текст сообщения можно преобразовать, чтобы оно было более презентабельным.
Задаем права на исполнение скрипта:
chmod +x /usr/local/bin/quota-warning.sh
Проверяем, что нам приходят уведомления, запустив скрипт:
/usr/local/bin/quota-warning.sh 80 user@domain.net
* где user@domain.net — наш почтовый ящик, на который должно будет отправиться уведомление.
Перезапускаем службу dovecot:
systemctl restart dovecot