Квоты Dovecot с пользователями в MySQL

Вопрос или проблема

Я настроил хранилище как mdbox. Пытаюсь заставить квоты работать с информацией о пользователе, хранящейся в базе данных, прямо сейчас с простой таблицей, как эта:

+----+-----------+-----------------------------+------------------+-------------+
| id | domain_id | password                    | email            | quota_bytes |
+----+-----------+-----------------------------+------------------+-------------+
|  1 |         1 | $y$jpasswordpassword.....LC | [email protected] | 600M        |
+----+-----------+-----------------------------+------------------+-------------+

Это работает с использованием статического драйвера userdb так:

userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vmail/%d/%n
  #driver = sql
  #args = /etc/dovecot/dovecot-sql.conf.ext
}

Аутентификация выполняется с помощью password_query так, всегда работает:

password_query = SELECT email as user, password FROM virtual_users WHERE email="%u";

Я пытаюсь добавить user_query так:

user_query = SELECT email AS user, '/var/mail/vmail/%d/%n' AS home, 'maildir:/var/mail/vmail/%d/%n' as mail, 5000 AS uid, 5000 AS gid, CONCAT('*:bytes=", quota_bytes) AS userdb_quota_rule FROM virtual_users WHERE email = "%u';

Пока все хорошо. Но перемещение частей квоты сложно. Работает с mdbox, пока у меня есть это:

plugin {
  quota = count:User quota
  quota_vsizes = yes
  quota_rule = *:storage=7G
  quota_rule2 = Trash:storage=+100M
  quota_grace = 10%%
  quota_max_mail_size = 100M
}

Но я никогда не получаю это, чтобы работать с чем-либо, что приходит из MySQL. Я довольно уверен, что это проблема с dict, и я много с этим играл. Таким образом, я получаю сообщения об ошибках, как эти:

2024-10-23T17:25:40.846512+02:00 mail dovecot: dict(146093): Error: conn unix:dict (pid=146092,uid=5000): Unconfigured dictionary name 'quotadict'
2024-10-23T17:25:40.846799+02:00 mail dovecot: imap([email protected])<146092><YIuifyYlf9BOQncf>: Error: Failed to get quota resource STORAGE: quota-dict: dict_lookup(priv/quota/storage) failed: Connection closed (reply took 0.030 secs (0.031 in dict wait, 0.000 in other ioloops, 0.000 in locks))

Итак, два вопроса. Первый — с такой базой данных и необходимостью квоты, что мне нужно вставить в плагин для квот, и как должен выглядеть файл dovecot-dict-sql.conf.ext, используя эти запросы?

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

2024-10-23T15:37:06.934409+02:00 mail dovecot: imap([email protected])<144888><gXQb7CQllZROQncf>: Error: Failed to get quota resource STORAGE:
 quota-count: Couldn't get size of mailbox dovecot.sieve: stat(/var/mail/vmail/example.de/pawal/.dovecot.sieve/tmp) failed: Not a directory

Есть ли какие-либо рекомендации по этим двум вопросам?

Ответ или решение

Введение

Настройка квот для Dovecot с использованием MySQL может быть сложной задачей, особенно когда вы работаете с хранилищем mdbox. Этот ответ рассмотрит две основные проблемы, с которыми вы сталкиваетесь: конфигурацию плагина квот и ошибки при получении информации о пользователе из базы данных.

Первое: Конфигурация квот

Чтобы настроить квоты с использованием информации из MySQL, вам потребуется правильно сконфигурировать ваш файл dovecot.conf и создать конфигурацию для словаря в dovecot-dict-sql.conf.ext.

1. Конфигурация плагина квот

Убедитесь, что в вашем конфигурационном файле dovecot.conf указаны следующие настройки для плагина квот:

plugin {
  # Quota settings
  quota = dict::quotadict
  quota_rule = *:storage=*:bytes=quota_bytes
  quota_grace = 10%%
}

Здесь мы используем dict::quotadict, который будет определен в конфигурации словаря, и указали quota_rule на основании значения quota_bytes, полученного из базы данных.

2. Конфигурация словаря

Файл dovecot-dict-sql.conf.ext будет содержать информацию о подключении к вашей базе данных MySQL и запрос для получения квоты. Примерный файл конфигурации будет выглядеть так:

dict {
  driver = sql
  # Параметры подключения
  connect = host=localhost dbname=your_db_name user=your_user password=your_password

  # Запрос для получения данных квоты
  quota_query = SELECT quota_bytes as bytes FROM virtual_users WHERE email = '%u'
}

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

Второе: Ошибка при получении информации о пользователе

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

1. Проверьте настройки user_query

Ваша строка user_query выглядит в целом корректно, но убедитесь, что она соответствует формату мой SQL-запроса:

user_query = SELECT email AS user, '/var/mail/vmail/%d/%n' AS home, 'maildir:/var/mail/vmail/%d/%n' as mail, 5000 AS uid, 5000 AS gid, CONCAT('*:bytes=', quota_bytes) AS userdb_quota_rule FROM virtual_users WHERE email = '%u'

Убедитесь, что значение переменной quota_bytes корректно возвращается из базы данных и соответствует требуемому формату.

2. Подтверждение корректности путей

Ошибка stat(/var/mail/vmail/example.de/pawal/.dovecot.sieve/tmp) failed: Not a directory указывает на проблему с поиском указанного пути. Проверьте, существует ли директория, и действительно ли она является директорией. Если вы используете mdbox, убедитесь, что структура каталогов создана правильно, и что в ней нет конфликтов с именами.

Заключение

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

Если проблемы сохраняются, рекомендуется включить более подробный уровень логирования для Dovecot, чтобы получить больше информации о возникающих ошибках.

Оцените материал
Добавить комментарий

Капча загружается...