Вопрос или проблема
Я настроил хранилище как 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, чтобы получить больше информации о возникающих ошибках.