Dovecot Quota - для каждого своя

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2015-10-07 1:14:07

Visionman, теперь я понял. Что ж, подождём ответа от Timo в рассылке тогда.
Надеюсь, вы подробно там изложили что, где и как перестало работать.
А ещё лучше сразу патч в исходники выкатить на одобрение после такого комментария.
IT voodoo blog https://kostikov.co

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Visionman
рядовой
Сообщения: 27
Зарегистрирован: 2015-10-06 22:28:29

Dovecot Quota - для каждого своя

Непрочитанное сообщение Visionman » 2015-10-07 1:35:46

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

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2015-10-07 10:45:06

Visionman писал(а): По написанию патчей опыта к сожалению нету...
Ой, да что там уметь то.
Берёте, правите файл так, как вы считаете верным.
Потом

Код: Выделить всё

#diff -u file.orig file.fixed > file.diff
и полученный file.diff отправляете в список рассылки. По-моему в Dovecot принят этот путь.
IT voodoo blog https://kostikov.co

Visionman
рядовой
Сообщения: 27
Зарегистрирован: 2015-10-06 22:28:29

Dovecot Quota - для каждого своя

Непрочитанное сообщение Visionman » 2015-10-22 21:22:04

Что ж, после долгого общения, плюс пришлось даже сервер собирать тестовый на виртуальной машине, Тимо лично всё увидел, понял в чём дело и в следующем релизе будет всё исправлено.
Так что квоты для домена и квоты для пользователей в версии Dovecot 2.2.20 будут полностью рабочие :)

Отправлено спустя 1 час 18 секунд:
патч тут - http://hg.dovecot.org/dovecot-2.2/raw-rev/20b381fd95d0

Отправлено спустя 1 час 52 минуты 50 секунд:
Общение c Тимо, в конце он всё объяснил.
http://dovecot.2317879.n4.nabble.com/Mo ... 54077.html

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2015-10-23 1:07:57

Visionman писал(а):Что ж, после долгого общения, плюс пришлось даже сервер собирать тестовый на виртуальной машине, Тимо лично всё увидел, понял в чём дело и в следующем релизе будет всё исправлено.
Так что квоты для домена и квоты для пользователей в версии Dovecot 2.2.20 будут полностью рабочие :)
Отлично! Вы - молодец! :good:
Именно так и надо решать возникающие проблемы - вдумчиво и толково.

UPD. Почитал трэд. Тимо не сразу воткнулся в двухуровневую систему квотирования. :-D
IT voodoo blog https://kostikov.co

Visionman
рядовой
Сообщения: 27
Зарегистрирован: 2015-10-06 22:28:29

Dovecot Quota - для каждого своя

Непрочитанное сообщение Visionman » 2015-10-23 21:58:53

Спасибо :)
Интересно конечно было )))
Да кстати, Тимо не сразу понял, мол вообще зачем это надо ))))
Собственно поэтому и предложил ему, давай сервер сделаю и сам всё увидишь.
Он конечно сразу ответил "Отличная идея, проекту поможет очень!"

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2015-10-24 0:18:14

Visionman писал(а): Он конечно сразу ответил "Отличная идея, проекту поможет очень!"
О, значит удалось раскопать фишку, которая была незапланирована при дизайне системы изначально. Круто.
Может в wiki добавит пример теперь.
Кстати, насчёт помощи - я ему кидал несколько раз баксов по 20 в качестве поддержки. Как и для других проектов, которыми я пользуюсь, делаю. Чего и всем тем, кто пользуется тем или иным свободным софтом желаю. :good:
IT voodoo blog https://kostikov.co

Visionman
рядовой
Сообщения: 27
Зарегистрирован: 2015-10-06 22:28:29

Dovecot Quota - для каждого своя

Непрочитанное сообщение Visionman » 2016-02-07 20:22:00

Приветствую.

Вновь вопрос по квотам )))

Прошло немного времени, недавно настроил новый сервер и Dovecot 2.2.21, ошибку как и обещал Тимо исправил, но вопрос другой возник.
Столкнулся с таким моментом.

Всё настроено, работает.
Но заметил один момент Roundcubemail web-интерфейс,
показывает снизу слева - занятое место для всех ящик одно и тоже

т.е. создано допустим три ящика

Код: Выделить всё

user1@domain.ru
user2@domain.ru
user3@domain.ru
отправили письмо user1@domain.ru размером 2.5 MB и у всех остальных ящиков(пользователей), занятое место стало 2.5 MB
удаляем письмо из ящика user1@domain.ru и у всех остальных ящиков занятое место 0 (свободно).

Потратил почти день на поиск, в чём же дело и уже попробовав кучу вариантов.
Сделал простое, уже не знаю как в голову пришло, честно! :smile:
Поменял местами, вернее поставил индекс 2 для домена, а для пользователей убрал, остальное без изменений.
Рестарт Dovecot и всё заработало!

Теперь так:
quota - это пользователи
quota2 - это домен

Код: Выделить всё

-=dovecot.conf =-

~~~~~~~

plugin {
  [u]quota2[/u] = dict:domain_quota:%d:no-unset:proxy::sqldomainquota
  [u]quota[/u] = dict:user_quota::no-unset:proxy::sqluserquota
  quota_rule2 = Trash:storage=+20%%
  quota_rule3 = Junk:storage=+20%%
  quota_grace = 10%%
  quota_warning = storage=100%% quota-exceeded 100 %u
  quota_warning2 = storage=95%% quota-warning 95 %u
  quota_warning3 = storage=90%% quota-warning 90 %u
  quota_warning4 = storage=75%% quota-warning 75 %u

~~~~~~~
Rouncubemail отображает корректно остаток места в ящиках, везде теперь разный, что собтсвенно и требовалось.
Сервер работает, ошибок нет, письма создаются, удаляются, квоты работают.
Возможно я упускаю что-то, меняя индекс 2.

Конфигурация моего сервера Dovecot он же и в качестве LDA локально доставляет письма в ящики.
http://www.heypasteit.com/clip/2G36

Лог работы когда Rouncubemail неверно отображает занятое место в ящике
quota= dict:domain_quota:%d:no-unset:proxy::sqldomainquota
quota2 = dict:user_quota::no-unset:proxy::sqluserquota
http://www.heypasteit.com/clip/2G38

Лог работы когда Rouncubemail верно отображает занятое место в ящике
quota2= dict:domain_quota:%d:no-unset:proxy::sqldomainquota
quota = dict:user_quota::no-unset:proxy::sqluserquota
http://www.heypasteit.com/clip/2G3A

Коллеги!
Что думаете по этому поводу и не заметили ли такое поведение у себя на сервере ?
Можете посмотреть, есть ли такой момент на сервере у Вас ?

Если нетрудно, посмотрите более внимательно, хочу понять, вновь в коде Dovecot что-то или настроил нетак ?!

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2016-02-07 21:34:01

Что-то я не уловил мысли.
Если мы имеем двухуровневое квотирование по моей старой схеме, то логично было бы то, кто когда для ящика нет персональной квоты (без индекса), то квота берётся единая для домена (идущая за ней следующая, т.е. с индексом 2). То есть при отсутствии квот на ящики поведение описанное вами вполне логичное и очевидное.
Если же у вас на эти ящики имеются персональные квоты, но при этом применяется единая для домена, то это косяк реализации. Реализации на чьей стороне - вашей конфигурации или самого Dovecot это вопрос.
IT voodoo blog https://kostikov.co

Visionman
рядовой
Сообщения: 27
Зарегистрирован: 2015-10-06 22:28:29

Dovecot Quota - для каждого своя

Непрочитанное сообщение Visionman » 2016-02-07 22:27:17

xM писал(а):Что-то я не уловил мысли.
Если мы имеем двухуровневое квотирование по моей старой схеме, то логично было бы то, кто когда для ящика нет персональной квоты (без индекса), то квота берётся единая для домена (идущая за ней следующая, т.е. с индексом 2). То есть при отсутствии квот на ящики поведение описанное вами вполне логичное и очевидное.
Если же у вас на эти ящики имеются персональные квоты, но при этом применяется единая для домена, то это косяк реализации. Реализации на чьей стороне - вашей конфигурации или самого Dovecot это вопрос.
Да, квоты применяются персональные и единая для домена.
Вот вот, тут поподробнее пожалуйста, косяк реализации ?
Т.е. если я правильно понимаю, индекс применяется на своё усмотрение или он зависим от настройки Dovecot и базы ?

Хмм...
Посмотрел сервер на виртуальной машине, который Тимо для теста делал и свой старый, отображение некорректное, если меняю, как описал выше, всё нормально.
Жаль ранее внимание не обратил.

Сейчас пока собственно оставил сменив индекс, отображение корректное, посмотрю на работу сервера,
целый день тестирую, всё нормально.
На днях начнёт работу с полной нагрузкой.

Есть у Вас возможность посмотреть работу Roundcube версии 1.1.4 на Вашем сервере установлен данный вебинтерфейс ?


Искал дальше информацию по вопросу, удалось найти только это...
Аналогичная ситуация некорректный вывод размера ящика, но в Webmin
Рекомендовали так, говорит всё работает:

Код: Выделить всё

### Multiple quota roots are also possible, for example:
  quota = dict:user::proxy::quota
  quota2 = dict:domain:%d:proxy::quota_domain
  quota_rule = *:storage=102400
  quota2_rule = *:storage=1048576
### Gives each user their own 100MB quota and one shared 1GB quota within the domain.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2016-02-08 0:27:55

Visionman писал(а): Вот вот, тут поподробнее пожалуйста, косяк реализации ?
Так я пока его и не вижу.
Проверьте - сделайте квоту на домен и персональную для одного из ящиков и погоняйте.
Будет видно как они меняются в базе (и, соответственно, отображаются).
Пример с квотами правильный - сначала персональные, затем на домен. Так и должно быть, по идее.
IT voodoo blog https://kostikov.co

Visionman
рядовой
Сообщения: 27
Зарегистрирован: 2015-10-06 22:28:29

Dovecot Quota - для каждого своя

Непрочитанное сообщение Visionman » 2017-04-03 12:36:03

Новый сервер делал, увидел статью, посмотреть, мало ли что изменилось )))
https://kostikov.co/post/dvuhurovnevoe- ... -dovecot-2

Интересный момент там

Код: Выделить всё

root@localhost [(none)]> SHOW COLUMNS FROM quota2 FROM exim;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| username | varchar(100) | NO | PRI | NULL | |
| bytes | bigint(20) | NO | | 0 | |
| messages | int(11) | NO | | 0 | |
+----------+--------------+------+-----+---------+-------+
3 rows in set (0,00 sec)
...

Код: Выделить всё

# cat dovecot-dict-sql-domain.conf
connect = host=localhost dbname=exim user=user password=password
map {
pattern = priv/quota/storage
table = quota2
username_field = domain
value_field = bytes
}
map {
pattern = priv/quota/messages
table = quota2
username_field = domain
value_field = messages
}
Скажите пожалуйста, почему username_field = domain

Ведь поля domain нету в таблице quota2 ?

Будет ошибка dovecot
Apr 03 12:28:16 dict(79492): Error: Unknown column 'domain' in 'where clause'

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2017-04-03 13:24:00

Visionman писал(а): Ведь поля domain нету в таблице quota2 ?
Спасибо за замечание. Сейчас у меня нет доступной системы использующей эту схему квотирования, поэтому брал настройки с той, что была под рукой по аналогии.
Надо вместо domain использовать поле username для хранения данных и по домену, конечно.
На сайте исправил.
IT voodoo blog https://kostikov.co

Visionman
рядовой
Сообщения: 27
Зарегистрирован: 2015-10-06 22:28:29

Dovecot Quota - для каждого своя

Непрочитанное сообщение Visionman » 2017-04-03 18:17:23

Сам тоже сначала включил :-D
Думаю как ж так то, domain явно тут не должно быть :pardon:

Пожалуйста! :smile:

P.S.
Здорово сайт оформлен, стильно!
CMS отличная! :good:

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2017-04-03 18:24:02

Visionman писал(а): CMS отличная!
Диего красаучег!
IT voodoo blog https://kostikov.co

dserga
ефрейтор
Сообщения: 57
Зарегистрирован: 2008-05-23 7:23:36

Dovecot Quota - для каждого своя

Непрочитанное сообщение dserga » 2017-05-07 12:05:30

Всю голову сломал с Postfixadmin 3.02
Предыстория: переход с Dovecot версии 1.2 на Dovecot 2.2, использовались quota sieve, база данных MySQL 5.6
C обновлением самих программ проблем не возникло, но вот их дальнейшее использование с поставило меня в тупик.
Итак по порядку:
1. Когда я завожу нового пользователя в домене в таблице quota2 не появляется запись для данного пользователя.
Вопрос: должен ли это делать сам Postfixadmin или это забота Dovecot 2, ошибку которого я опишу ниже?
2. Dovecot прекрасно читает в выбранным пользователем пароли из базы и правильно обрабатывает password_query и user_query,
но спотыкается при попытке достучаться словарем квот в базу с такой ошибкой при работе imapsync (влючена опция debug):

Код: Выделить всё

 dict(83791): Error: mysql(localhost): Connect failed to database (exim): Access denied for user 'exim'@'localhost' (using password: YES) - waiting for 25 seconds before retry
imap(anastasia@****.ru): Error: dict-client: Lookup 'priv/quota/storage' failed: Dict server timeout: No input for 30.020 secs (1 commands pending, ol
dest sent 60.034 secs ago: Lpriv/quota/storage, 60.035 in dict wait, 0.000 in other ioloops, 0.000 in locks) (reply took 60.034 secs (60.035 in dict wait, 0.000 in other ioloops, 0.000 in locks, reconnected 30.028 secs ago, async-id reply 30.020 secs ago))
dict(83792): Error: mysql: Query timed out (no free connections for 60 secs): SELECT bytes FROM quota2 WHERE username = 'anastasia@******.ru'
Пользователь, от имени которого запускается Dovecot:
mail_gid = mail
mail_uid = mailnull
Вот это словарь
service dict {
unix_listener dict {
group = mail
mode = 0660
user = mailnull
}
}

Где собака порылась? Уже все что мог перебрал. И базу создавал заново и руками и автоматически, и все разрешения перепроверил, ну не летит паровоз, хоть ты тресни.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2017-05-07 16:07:28

У вас нет доступа к базе данных. Проверяйте права.
IT voodoo blog https://kostikov.co

dserga
ефрейтор
Сообщения: 57
Зарегистрирован: 2008-05-23 7:23:36

Dovecot Quota - для каждого своя

Непрочитанное сообщение dserga » 2017-05-07 16:31:53

xM писал(а): У вас нет доступа к базе данных. Проверяйте права.
И я так тоже думаю, но почему imap-dovecot с этими же правами делает выборку что по сокету, что по сети, через localhost, а dict этого сделать не может, хотя ему в явном виде тоже указано от какого пользователя запускаться?

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2017-05-07 17:29:22

Проверьте в конфигурационном файле dict верность данных для доступа к базе данных (connect= ...). Они должны быть идентичны тем, что используются в выборке пользователей.
IT voodoo blog https://kostikov.co

dserga
ефрейтор
Сообщения: 57
Зарегистрирован: 2008-05-23 7:23:36

Dovecot Quota - для каждого своя

Непрочитанное сообщение dserga » 2017-05-07 19:44:36

Нашел одну ошибку в пароле, что и влияло на вызов mysql dict-ом и пришлось переделать полностью вызов user_query, ибо тот, что у вас на сайте в статье не работает, а старый, что был у меня неверно считал квоты. Теперь обработка выглядит так, и не ругается у меня на неверный синтаксис:

Код: Выделить всё

user_query    = SELECT CONCAT('/var/mail/exim/','maildir') AS home, 26 AS `uid`, 6 AS `gid`, \
        CONCAT('*:bytes=', CAST(mailbox.quota AS CHAR)) AS quota_rule, \
        CONCAT('*:bytes=', CAST(ROUND(domain.quota * 1048576) AS CHAR)) AS quota2_rule \
        FROM mailbox,domain WHERE username ='%u' AND mailbox.active ='1' \
        AND domain.domain ='%d' AND domain.active = '1'
26 - mailnull
6 - mail

Тем не менее спасибо за наводку. Глаза совсем замылились, не видели очевидного.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2017-05-07 21:09:02

dserga писал(а): пришлось переделать полностью вызов user_query, ибо тот, что у вас на сайте в статье не работает
Ну, у меня работает как в статье. И не только у меня.
Впрочем, рад что вы сами разобрались.

Отправлено спустя 1 час 18 минут 50 секунд:
Вообще, посмотрел ваше выражение. Возможно, у вас в конфиге отключено автоматическое приведение типов. CONCAT() по умолчанию прекрасно это делает. Да, и у меня везде MySQL 5.7. Но оно работало и на 5.5 и на 5.6.
Кстати, там наверняка можно и проще. Как-то так.

Код: Выделить всё

...
CONCAT('*:bytes=', domain.quota, 'M') AS quota2_rule
...
Правда я не уверен сколько будет считать Dovecot за 1 Mb. Но, на всякий случай, изменил в статье запрос именно на этот вариант.
IT voodoo blog https://kostikov.co

dserga
ефрейтор
Сообщения: 57
Зарегистрирован: 2008-05-23 7:23:36

Dovecot Quota - для каждого своя

Непрочитанное сообщение dserga » 2017-05-08 4:25:29

Проверил конфигурацию mysql, но не обнаружил там в явном виде ключа, отвечающего за неявное приведение типов. По умолчанию мускуль должен это делать сам, но в моем случае не делает. Стоит 5.6, ставил не из пакета, а собирал из портов, так как хотел сменить collation по умолчанию, да и внести пару нужных мне опций. Буду признателен, если вы меня просветите в этом вопросе. А в запросах языка dict я использую везде bytes (байты) а не storage (килобайты) переменные. Довекот понимает "M", но вот язык квот - нет. Поэтому ну их нафиг, странные эксперименты, пусть лучше работает так, как есть.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2017-05-08 10:53:15

dserga писал(а): Довекот понимает "M", но вот язык квот - нет. Поэтому ну их нафиг, странные эксперименты, пусть лучше работает так, как есть.
Не, bytes тоже понимает мультипликаторы
https://wiki2.dovecot.org/Quota/Configuration
So storage=100M and bytes=100M both mean the exact same thing.
Так что можно использовать. И там же написано, что считает правильно, по 1024. Впрочем, и число сообщений тоже. :smile:
IT voodoo blog https://kostikov.co

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Dovecot Quota - для каждого своя

Непрочитанное сообщение xM » 2017-05-08 14:33:15

dserga писал(а): Буду признателен, если вы меня просветите в этом вопросе.
Наверное где-то в районe SQL modes типа STRICT_TRANS_TABLES или STRICT_ALL_TABLES.
См. что у вас стоит

Код: Выделить всё

> SELECT @@sql_mode\G
IT voodoo blog https://kostikov.co

dserga
ефрейтор
Сообщения: 57
Зарегистрирован: 2008-05-23 7:23:36

Dovecot Quota - для каждого своя

Непрочитанное сообщение dserga » 2017-05-08 15:35:25

xM писал(а): Наверное где-то в районe SQL modes типа STRICT_TRANS_TABLES или STRICT_ALL_TABLES.
См. что у вас стоит

Код: Выделить всё

mysql> SELECT @@sql_mode\G;
*************************** 1. row ***************************
@@sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
Стоит сие.