Вчера только закончил настройку. Сейчас всё расскажу.
Используется postfixadmin и Dovecot 2 последних релизов.
База создана стандартная postfixadmin'а под именем 'exim'.
Итак, во-первых, активируем квоты в postfixadmin
Код: Выделить всё
root@beta:/usr/local/www/postfixadmin # cat config.inc.php | grep quota
$CONF['maxquota'] = '0';
$CONF['quota'] = 'YES';
$CONF['quota_multiplier'] = '1048576';
$CONF['used_quotas'] = 'YES';
$CONF['new_quota_table'] = 'YES';
Для Dovecot версии выше 1.2 используется таблица 'quota2'.
Во-вторых, настраиваем Dovecot 2.
Даю общие переменные и кусок с нужными секциями.
Код: Выделить всё
root@beta:/usr/local/etc/dovecot # cat dovecot.conf
# --- by xM v.2013-12-05
auth_mechanisms = cram-md5 plain login
base_dir = /var/run/dovecot
disable_plaintext_auth = no
first_valid_gid = 0
first_valid_uid = 25
mail_uid = 26
mail_gid = 26
login_greeting = Dovecot ready!
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
mail_access_groups = mail
mail_location = maildir:/var/mail/%d/%n
mail_privileged_group = mail
auth_debug = no
auth_debug_passwords = no
auth_verbose = no
mail_debug = no
listen = *
protocols = imap pop3 lmtp sieve
mail_plugins = acl quota trash
# skip ... namespace
passdb {
args = /usr/local/etc/dovecot/dovecot-sql.conf
driver = sql
}
userdb {
args = /usr/local/etc/dovecot/dovecot-sql.conf
driver = sql
}
# -- Quota
plugin {
quota = dict:domain_quota:%d:proxy::sqldomainquota
quota2 = dict:user_quota::proxy::sqluserquota
quota2_rule2 = Trash:storage=+20%%
quota2_rule3 = Junk:storage=+20%%
quota2_grace = 10%%
quota2_warning = storage=100%% quota-exceeded 100 %u
quota2_warning2 = storage=95%% quota-warning 95 %u
quota2_warning3 = storage=90%% quota-warning 90 %u
quota2_warning4 = storage=75%% quota-warning 75 %u
}
dict {
sqluserquota = mysql:/usr/local/etc/dovecot/dovecot-dict-sql-user.conf
sqldomainquota = mysql:/usr/local/etc/dovecot/dovecot-dict-sql-domain.conf
}
service dict {
unix_listener dict {
user = mailnull
mode = 0660
}
}
service quota-warning {
executable = script /usr/local/etc/dovecot/quota_warning.sh
unix_listener quota-warning {
user = mailnull
mode = 0660
}
}
# -- Trash
plugin {
trash = /usr/local/etc/dovecot/dovecot-trash.conf
}
# skip ... all other
Далее, запросы к записям об учётных данных пользователей
Код: Выделить всё
root@beta:/usr/local/etc/dovecot # cat dovecot-sql.conf
driver = mysql
connect = host=localhost dbname=exim user=exim password=exim
default_pass_scheme = CRAM-MD5
password_query = SELECT `username` AS `user`, `password` \
FROM `mailbox` WHERE `username` = LCASE('%u') \
AND `active` = '1'
user_query = SELECT CONCAT('/var/mail/',LCASE(maildir)) AS home, \
CONCAT('*:bytes=', domain.maxquota*1048576) AS quota_rule, \
CONCAT('*:bytes=', mailbox.quota) AS quota2_rule \
FROM mailbox, domain \
WHERE username = LCASE('%u') AND mailbox.active = '1' \
AND domain.domain = '%d' AND domain.active = '1'
Обратите внимание, что используется два набора параметров 'quota' в Dovecot - без префикса для доменов, и с префиксом 2 для пользователей.
Далее, запросы к словарям квот. Опять же, отдельно для доменов и пользователей
Код: Выделить всё
root@beta:/usr/local/etc/dovecot # cat dovecot-dict-sql-domain.conf
connect = host=localhost dbname=exim user=exim password=exim
map {
pattern = priv/quota/storage
table = domain
username_field = domain
value_field = quota
}
map {
pattern = priv/quota/messages
table = quota2
username_field = username
value_field = messages
}
root@beta:/usr/local/etc/dovecot # cat dovecot-dict-sql-user.conf
connect = host=localhost dbname=exim user=exim password=exim
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
}
Тонкий момент - размер занимаемого пользователем места и количество сообщений в ящике хранятся в таблице 'quote2', тогда как для домена там хранится только количество сообщений. Размер места, которое занимают пользователи домена хранятся в таблице 'domain'.
Далее, скрипт для отправки уведомлений о заканчивающихся квотах.
Код: Выделить всё
root@beta:/usr/local/etc/dovecot # ll quota_warning.sh
-rwxr-xr-x 1 mailnull mail 302 4 дек 23:16 quota_warning.sh*
root@beta:/usr/local/etc/dovecot # cat quota_warning.sh
PERCENT=$1
USER=$2
cat << EOF | /usr/local/libexec/dovecot/dovecot-lda -d $USER -o "plugin/quota=maildir:User quota:noenforcing"
From: postmaster@yourdomain.ru
Subject: Quota warning
X-Priority: 2
Your mailbox is now $PERCENT% full.
Please remove unnecessary information to avoid new mail loss.
EOF
Обратите внимание на права и атрибуты скрипта.
И, наконец, модуль автоочистки 'trash', который я активировал на всякий случай.
Код: Выделить всё
root@beta:/usr/local/etc/dovecot # cat dovecot-trash.conf
1 Trash
2 Junk
3 Draft
Ещё один тонкий момент, который я заметил при запуске квот - подсчёт количества сообщений и использованного места для домена на уже
работающей системе с кучей пользователей и доменов.
Для корректного подсчёта мне пришлось руками внести их правильные значения (количество сообщений в таблицу 'quota2' и занимаемого места в 'domian'). Для этого необходимо, чтобы для всех пользователей данного домена сформировались аналогичные параметры в таблице 'quote2'.
Для этого им достаточно получить по одному новому сообщению. Я для этого использовал широковещательную рассылку через интерфейс postfixadmin.
После чего:
1. Останавливаем Dovecot во избежание пересчёта в процессе корректировки.
2. Подсчитываем суммы столбцов таблицы 'quota2' для 'bytes' и 'messages'.
3. Сумму количества сообщений вставляем в соответствующий столбец для данного домена в той же таблице.
4. Сумму места, занимаемого всеми пользователями, вставляем в столбец 'quota' в таблице 'domain' в строке нужного домена.
5. Запускаем Dovecot.
Собственно, всё.
Enjoy it!