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

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.

Ответить


Этот вопрос предназначен для предотвращения автоматической отправки форм спам-ботами.
Смайлики
:smile: :( ;-) :roll: :pardon: 8) :x :oops: :shock: :cz2: :-D :ROFL: :Yahoo!: :cry: :Search: :Bravo: :good: :bad: :sorry: :no: :unknown: :evil: :crazy: :"": :fool: :-o :drinks: :st: :bn:
Ещё смайлики…

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[flash] ОТКЛЮЧЕН
[url] ВКЛЮЧЁН
Смайлики ВКЛЮЧЕНЫ

Обзор темы
   

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Развернуть Обзор темы: Dovecot Quota - для каждого своя

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

Сообщение quicktrick » 2017-12-06 17:28:11

Чудеса. Сегодня всё работает -- то, что вчера не работало. Ничего не делал, то есть вообще ничего. Просто еще раз попробовал. Причем вчера такая штука у меня проявлялась на двух серверах в разных сетях с разными доменами. Тестировал вчера оба сервера по нескольку раз. Сегодня оба работают как надо. Не трогал вообще ничего.

Потом для очистки совести включил в Довкоте mail_debug = yes с расширенным логированием. Получил кучу всего в логах. Всё проверил. Единственная странноватая запись в логах:

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

dovecot[522]: lmtp(test@email1.ru): Debug: sieve: include: sieve_global is not set; it is currently not possible to include `:global' scripts.

При этом в конфигах этот параметр нигде не задан. Ну да бог с ним.

В общем, отключил mail_debug, перезагрузил сервера на всякий пожарный -- всё работает. Что это было? Мистика.

Кстати, при превышении нижнего порога Quota warning -- после прихода этого сообщения и/или любого из следующих Quota warnings -- последующее удаление части почты из Inbox (перемещение удаленной почты в папку Trash) почему-то вызывает отправление сообщения "Quota warning: mailbox is 100% full". Хотя при этом заполненность квоты может быть всего процентов 80. Странновато, конечно, но пережить можно. Дальнейший прием почты на данный адрес вызывает отправку уже правильных Quota warnings.

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

Сообщение quicktrick » 2017-12-05 19:56:13

Не могли бы вы мне помочь разобраться? Я понимаю, что обращаюсь не вполне по адресу, поскольку у меня Rspamd, но я тут обнаружил проблему именно с квотой, а, точнее, с работой плагина trash. Проблема вот в чем. Когда я тестирую работу плагина trash, отправляя письма на тестовый ящик с того же домена, то всё работает как надо. При превышении квоты из папки Trash удаляется часть писем, и отправленное письмо доходит по адресу.

Но вот когда я делаю то же самое, отправляя тестовые письма с внешнего домена, то плагин trash так же срабатывает, удаляет часть писем из папки Trash, но тестовое письмо не доходит. Почему-то sieve не может его сохранить. Никак не могу понять, в чем дело.

Вот выдержки из логов.

1. Отправка превышающего квоту письма с внутреннего домена (письмо дошло по адресу):

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

Dec 05 19:11:27 voyo dovecot[3060]: lmtp(22366): Connect from local
Dec 05 19:11:27 voyo dovecot[3060]: imap(admin@mydomain.tld): Connection closed (IDLE running for 0.001 + waiting input for 0.001 secs, 2 B in + 10+10 B out, state=wait-input) in=7481 out=2896
Dec 05 19:11:27 voyo dovecot[3060]: lmtp(test@mydomain.tld): EC5CGy/FJlpeVwAAMhFstA: sieve: msgid=<7c6f221d-c87d-5221-a632-e8b3c2a55671@mydomain.tld>: stored mail into mailbox 'INBOX'
Dec 05 19:11:27 voyo postfix/lmtp[22179]: 4D56F2342: to=<test@mydomain.tld>, relay=mail.mydomain.tld[private/dovecot-lmtp], delay=0.34, delays=0.09/0.01/0.05/0.19, dsn=2.0.0, status=sent (250 2.0.0 <test@mydomain.tld> EC5CGy/FJlpeVwAAMhFstA Saved)
Dec 05 19:11:27 voyo dovecot[3060]: lmtp(22366): Disconnect from local: Successful quit

2. Отправка превышающего квоту письма с внешнего домена (письмо не дошло по адресу):

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

Dec 05 19:20:53 voyo dovecot[3060]: lmtp(22580): Connect from local
Dec 05 19:20:53 voyo postfix/smtpd[22487]: disconnect from smtp59.i.mail.ru[217.69.128.39] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7
Dec 05 19:20:53 voyo dovecot[3060]: lmtp(test@mydomain.tld): EP//DmXHJlo0WAAAMhFstA: sieve: msgid=<29347684-e205-77a8-b8b1-40cc7cda96a0@mail.ru>: failed to store into mailbox 'INBOX': Quota exceeded (mailbox for user is full)
Dec 05 19:20:53 voyo dovecot[3060]: lmtp(test@mydomain.tld): EP//DmXHJlo0WAAAMhFstA: sieve: Execution of script /usr/lib/dovecot/sieve/after.d/junk.sieve failed with unsuccessful implicit keep
Dec 05 19:20:53 voyo dovecot[3060]: lmtp(22580): Disconnect from local: Successful quit
Dec 05 19:20:53 voyo postfix/lmtp[22506]: D32A12346: to=<test@mydomain.tld>, relay=mail.mydomain.tld[private/dovecot-lmtp], delay=0.5, delays=0.39/0/0/0.11, dsn=5.2.2, status=bounced (host mail.mydomain.tld[private/dovecot-lmtp] said: 552 5.2.2 <test@mydomain.tld> Quota exceeded (mailbox for user is full) (in reply to end of DATA command))

Из второго лога видно, что не сработал скрипт junk.sieve. Вот его содержимое:

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

require ["fileinto","mailbox"];
if header :contains "X-Spam" "Yes" {
 fileinto :create "Junk";
 stop;
}

Но дело, судя по всему, не в содержании этого скрипта. А вот в чем -- не могу понять. Все права на выполнение есть, ошибок в логах нет.

В принципе, я конфигурировал Rspamd вот по этой инструкции. Всё работает. За исключением того, что я здесь описал. Очевидно, что скрипт junk.sieve просто не вызывается при доставке письма, отправленного из того же домена (что вполне логично, хотя могут быть варианты со спамом и из своего же домена). Но вот как бы мне победить проблему потери письма из внешнего домена? Буду очень благодарен за любые советы.

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

Сообщение xM » 2017-12-03 20:10:34

Запостил баг с doveadm в список рассылки Dovecot.
https://dovecot.org/pipermail/dovecot/2 ... 10193.html

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

Сообщение xM » 2017-11-28 19:26:56

quicktrick писал(а):Источник цитаты Подскажите, пожалуйста, "там" -- это где?

В дистрибутиве.
https://github.com/postfixadmin/postfix ... /ADDITIONS

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

Сообщение quicktrick » 2017-11-28 19:20:43

xM писал(а):Источник цитаты Там есть скрипт в комплекте который сканирует и удаляет каталоги в случае отсутствия ссыки на них в базе.

Подскажите, пожалуйста, "там" -- это где?

Ваш скрипт обязательно посмотрю. Я, правда, поставил себе Rspamd, но неважно, подстрою под свой сервер. Спасибо!

Ну, и последней нерешенной проблемой останется отображение использованных доменных квот в Постфикс Админе.

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

Сообщение xM » 2017-11-28 18:19:34

quicktrick писал(а):Источник цитаты что в Постфикс Админе будет удален пользователь, а его почта на физическом диске останется?

Оно именно так и присходит. Там есть скрипт в комплекте который сканирует и удаляет каталоги в случае отсутствия ссылки на них в базе.
Ну или можете на базе моего скрипта mboxcleanup.sh что-то наваять по этой статье.
"Автоматизация удаления неиспользуемых почтовых ящиков совместно с Dovecot".
В реальности он у меня сложнее - ещё базы Spamassassin и Roundcube чистятся плюс архив улетает в облако.

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

Сообщение quicktrick » 2017-11-28 18:03:24

Ну, поскольку приходится всё же использовать phpMyAdmin, то проще дать нормальный пароль. Хотя доступ к локейшну pma в Nginx у меня тоже запаролен.

Отправлено спустя 3 минуты 20 секунд:
Тут у меня еще вот какие соображения по поводу триггера. Не случится ли такая ситуация, что в Постфикс Админе будет удален пользователь, а его почта на физическом диске останется? Мне кажется, это вполне рядовой случай. Тогда пересчет доменной квоты будет как бы некорректным. Администратору все равно надо удалять почту несуществующего пользователя с диска.

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

Сообщение xM » 2017-11-28 17:43:39

quicktrick писал(а):Источник цитаты Конечно, используются спецсимволы, а как же без них в паролях

Очень просто. Не давать критический доступ к базе за переделами localhost. Так что можете использовать чисто номинальный пароль для обычных пользователей.
К root и DBA это, конечно же, не относится.

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

Сообщение quicktrick » 2017-11-28 17:34:15

Конечно, используются спецсимволы, а как же без них в паролях. Но вопрос не только в этом, а именно в выборе кавычек или апострофов. Я же говорю, в FreeBSD мне пришлось столкнуться с аналогичной проблемой в алиасах, а там никаких спецсимволов не было.

Отправлено спустя 24 секунды:
Потестировал пересчитанную доменную квоту с отправкой / приёмом, а также с удалением писем. Похоже, действительно, теперь доменная квота работает правильно, как и написано в вашей статье. Осталось только добавить триггер в MySQL.

Большое спасибо за статью! :) Теперь бы еще решить вопрос с отображением использованной доменной квоты в Постфикс Админе.

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

Сообщение xM » 2017-11-28 17:28:41

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

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

Сообщение quicktrick » 2017-11-28 17:28:08

Правильно, раскрываются без кавычек. И именно такой вариант с паролем (раскрывшимся без кавычек) в Линуксе не работает. Во всяком случае, в openSUSE. Посмотрите мой предыдущий длинный пост с тестами паролей в командной строке.

Отправлено спустя 1 минуту 2 секунды:
Я попробовал ваш скрипт в очень многих вариантах. И у меня он работает только так, как я написал. С паролем, заключенным в апострофы. Иначе никак.

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

Сообщение xM » 2017-11-28 17:23:00

quicktrick писал(а):Источник цитаты Ну, точнее, пароль требуется заключить в апострофы. Остальное необязательно.

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

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

Сообщение quicktrick » 2017-11-28 17:02:46

Я про

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

DBUSER="exim"
DBPASS="exim"
DBNAME="exim"

У меня работает только если это записано так:

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

DBUSER='exim'
DBPASS='exim'
DBNAME='exim'


Отправлено спустя 1 минуту 58 секунд:
Ну, точнее, пароль требуется заключить в апострофы. Остальное необязательно.

Отправлено спустя 3 минуты 44 секунды:
Кстати, на своем (недоделанном пока) файрволе под FreeBSD я некоторое время назад аналогичным образом помучился с алиасами (похожая проблема с кавычками и апострофами).

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

Сообщение xM » 2017-11-28 16:45:03

quicktrick писал(а):Источник цитатыВ общем, в вашем скрипте надо переменные доступа к базе вместо кавычек заключить в апострофы.

Если вы по поводу переменных в SQL запросах, то там апострофы, как обычно.
Примите во внимание что у вас Linux с его bash, а скрипт написан на sh.

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

Сообщение quicktrick » 2017-11-28 16:37:29

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

Чтобы было понятно, о чем идет речь. Вот так команда не работает:

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

myhost:/ # mysql -u root -pmypassword
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

А вот так почему-то работает:

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

myhost:/ # mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10530
Server version: 10.1.25-MariaDB openSUSE package

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> quit
Bye


Загвоздка оказалась в том, что консольная команда не берет пароль в голом виде. Не берет она также пароль, заключенный в кавычках. А берет пароль только в окружении апострофов. То есть:

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

myhost:/ # mysql -u myuser -h 127.0.0.1 -pmypassword -D mydb
ERROR 1045 (28000): Access denied for user 'myuser'@'127.0.0.1' (using password: YES)

myhost:/ # mysql -u myuser -h 127.0.0.1 -p"mypassword" -D mydb
ERROR 1045 (28000): Access denied for user 'myuser'@'127.0.0.1' (using password: YES)

myhost:/ # mysql -u myuser -h 127.0.0.1 -p'mypassword' -D mydb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10456
Server version: 10.1.25-MariaDB openSUSE package

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [mydb]> select * from quota2;
+--------------------+---------+----------+
| username           | bytes   | messages |
+--------------------+---------+----------+
| mydomain.tld       | 3227198 |       26 |
| user1@mydomain.tld |    2412 |        1 |
| user2@mydomain.tld | 1529531 |        6 |
| user3@mydomain.tld |   23249 |        1 |
| user4@mydomain.tld |  564663 |        6 |
| user5@mydomain.tld | 1107343 |       12 |
+--------------------+---------+----------+
6 rows in set (0.00 sec)

MariaDB [mydb]> quit
Bye

Вот такая хрень. В общем, в вашем скрипте надо переменные доступа к базе вместо кавычек заключить в апострофы. Тогда скрипт работает (у меня на openSUSE). Иначе никак.

Да, и у меня еще в команду подключения к mysql требуется добавить хост 127.0.0.1. Я это добавил у себя в скрипт.

В общем, доменная квота пересчиталась. Остальное сейчас протестирую.

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

Сообщение xM » 2017-11-28 13:01:25

quicktrick писал(а):Источник цитаты на неправильно подсчитываемую доменную квоту

Ещё раз. Доменная квота считается правильно.
Для пересчёта всех значений квот пользователей и доменов используйте скрипт dovequota.sh из статьи выше. Я его вчера обкатал во всех режимах и проблем с расчётами не отмечено. Та же ситуация и с триггером на удаление пользователей. Всё работает чётко.

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

# ./dovequota.sh calc

Далее квоты будут вестись верно. Если, конечно, вы где-то не ошиблись в конфигах.
quicktrick писал(а):Источник цитаты Либо писать разработчикам Довкота и добиваться, чтобы они исправили ошибки

В теущей версии ошибка только с doveadm.

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

Сообщение quicktrick » 2017-11-28 12:39:39

Хм. Попробовал в конфиге Довкота убрать доменную квоту и оставить только пользовательскую. После этого Раундкуб перестал отображать табличку "limit/used", отображает только использованный процент. Нехорошо, потому что непонятно, каковы объемы лимита и использованной квоты. Вернул доменную квоту.

В этой связи возникает проблема. Либо плюнуть на неправильно подсчитываемую доменную квоту, оставить всё как есть и как бы не обращать на нее внимания. Потому что корректировать доменную квоту в таблице quota2 бесполезно, так как плагин постоянно обновляет эту запись.

Либо писать разработчикам Довкота и добиваться, чтобы они исправили ошибки (некогда этим заниматься, честно говоря). В общем, ладно. Скорее всего, выберу первый вариант и, может, между делом в спокойном режиме как-то попинаю разработчиков. Хотя понятно, что, если они захотят вообще этим заниматься, то придется как-то с ними взаимодействовать, делать для них какие-то тесты и пр.

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

Сообщение xM » 2017-11-28 12:03:42

quicktrick писал(а):Источник цитаты попросил помощи у разработчиков в гите

Добавил комментарий тоже.
quicktrick писал(а):Источник цитаты доменная квота не будет отображаться в Раундкубе

Она отображается в том случае, если у пользователя нет персональной.

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

Сообщение quicktrick » 2017-11-28 9:14:22

Хорошая статья, спасибо! В этой связи у меня возникает мысль убрать совсем доменную квоту из конфига Довкота и рассчитывать ее только вашим скриптом. При этом, насколько я понимаю, доменная квота не будет отображаться в Раундкубе, что, на мой взгляд, как раз хорошо. Зачем всем пользователям видеть доменную квоту? А опции отображения или не отображения доменной квоты я в Раундкубе не нашел.

А вот в Постфикс Админе отображать использованную доменную квоту как раз было бы хорошо -- для администратора на странице Domain List. Там сейчас отображается доменная квота в виде: "суммарный объем пользовательских лимитов"/"доменный лимит". Но не хватает отображения использованной доменной квоты. В конфиге Постфикс Админа вроде есть возможность добавлять некие пользовательские поля, но, честно говоря, я не вполне разобрался, как это делать. Я попросил помощи у разработчиков в гите, но ответа пока нет (да и, по опыту, они там не очень охотно отвечают).

В идеале, на мой взгляд, было бы оптимально при переходе на страницу Domain List в браузере выполнять ваш скрипт по пересчету доменной квоты и отображать ее в списке доменов. Может быть, в виде: used / users' limit / domain limit.

Теперь вопрос, как всё это реализовать.

Отправлено спустя 7 минут 17 секунд:
А может, лучше даже не выполнять скрипт каждый раз при переходе на страницу Domain List, а добавить для этого специальную кнопку.

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

Сообщение xM » 2017-11-27 23:55:46

Готово.
"Проблемы учёта доменной квоты в Dovecot 2".

Скрипт dovequota.sh погонял, но проверьте с оказией в разных режимах.

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

Сообщение quicktrick » 2017-11-27 18:29:40

За запрос спасибо, только ведь плагин сам постоянно обновляет доменную квоту, причем у меня неправильно. Впрочем, подозреваю, что в моем случае дело именно в удалении базы ПостфиксАдмина и повторном создании почтовых ящиков. А Довкот, похоже, в доменной квоте считает только ту почту, которая приходила после этого. Надо проверить на чистой конфигурации. Чуть позже сделаю на другом сервере.

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

Сообщение xM » 2017-11-27 18:25:32

quicktrick писал(а):Источник цитаты doveadm quota recalc -A

Я ж говорю, doveadm кривой.
Сейчас статью на тему решения этих проблем тисну по-быстрому. Ждите.

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

Сообщение quicktrick » 2017-11-27 18:18:28

Вот это номер! Попробовал. Удалил для начала запись с доменной квотой. Потом сделал так:

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

doveadm quota recalc -A
Error: User listing returned failure
doveadm: Error: Failed to iterate through some users

Смотрю в логе:

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

 dovecot[26495]: auth-worker(26553): Error: sql: Iterate query failed: Table 'mailserver.users' doesn't exist (using built-in default iterate_query: SELECT username, domain FROM users)

Как это понимать? Такой таблицы действительно нет. А что, должна быть? Или это баги Довкота? Может, отсюда и все остальные проблемы? Или где-то в конфигурации такая таблица указана?

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

Сообщение xM » 2017-11-27 18:11:50

Ну, тогда тут трудно сказать что у вас там происходит.
У себя только что специально проверил по одному из доменов, где ящиков мало - сумма сообщений и размеров ящиков совпадает с доменной квотой.

Отправлено спустя 7 минут 27 секунд:
Кстати, как версия. Postfixadmin (проверено на 3.1) при удалении ящиков не корректирует доменную квоту. Так что надо, скорее всего, вешать триггер на удаление строки и делать пересчёт.

Отправлено спустя 38 минут 39 секунд:
На всякий случай дарю SQL для обновления доменной квоты.

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

SET @dom = 'my.domain' ;
UPDATE `quota2` t1, (SELECT SUM(`bytes`) bytes, SUM(`messages`) messages FROM `quota2` WHERE `username` LIKE CONCAT('%@',@dom)) t2 SET t1.bytes = t2.bytes, t1.messages = t2.messages WHERE `username` = @dom

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

Сообщение quicktrick » 2017-11-27 17:00:07

Ну, я, собственно, и делал по вашей статье. Отличия только в том, что у меня openSUSE Tumbleweed, и вместо двух раздельных словарей для пользователя и домена я использую один. Два словаря тоже пробовал после того как столкнулся с описанной проблемой, но поскольку ничего не изменилось, вернулся к одному. Да, и еще в скрипте quota_warning.sh отправка почты у меня выполняется так (как описано здесь в самом конце этого подраздела):

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

/usr/lib/dovecot/dovecot-lda -d $USER -o "plugin/quota=dict:User quota::noenforcing:proxy::sqlquota"

но это уже к делу не относится.

Вернуться к началу