Dictionary quota
================

The /dictionary/ quota backend supports both *storage* and *messages* quota
limits. The current quota is kept in a dictionary. Currently the only supported
dictionary backend is MySQL.

The plugin parameter format is 'dict:<quota limits> <dictionary URI>'. For
example:

---%<-------------------------------------------------------------------------
plugin {
  # v1.0: 10MB and 1000 messages quota limit
  quota = dict:storage=10240:messages=1000 mysql:/etc/dovecot-dict-quota.conf
  # v1.1:
  quota = dict mysql:/etc/dovecot-dict-quota.conf
  quota_rule = *:storage=10M:messages=1000
}
---%<-------------------------------------------------------------------------

However, *the above example won't really work*. This is because it would
require linking all the binaries with MySQL library, which I didn't really want
to do. Currently you'll have to do this via the dictionary proxy (see below).
Actually the performance is better that way anyway, and I don't really see a
reason not to use it.

Example 'dovecot-dict-quota.conf':

---%<-------------------------------------------------------------------------
connect = host=localhost dbname=mails user=sqluser password=sqlpass
table = quota
select_field = current
where_field = path
username_field = username
---%<-------------------------------------------------------------------------

Create the table like this:

---%<-------------------------------------------------------------------------
create table quota (
  username varchar(255) not null,
  path varchar(100) not null,
  current integer,
  primary key (username, path)
);
---%<-------------------------------------------------------------------------

v1.0 Inaccuracy problems
------------------------

With Dovecot v1.1 quota is tracked accurately. With v1.0 you may have a
problem:

If two IMAP clients do an expunge at the same time, the quota is reduced twice
as much. Maildir++ backend also has the same problem, but it's not that big of
a problem with it because it recalculates the quota once in a while anyway.
Dict quota is recalculated only if the quota goes below zero (v1.0.rc30+ only).

So either you'll have to trust your users not to abuse this problem, or you
could create a nightly cronjob to delete all rows from the SQL quota table to
force a daily recalculation. The recalculation will of course slow down the
server.

Dictionary proxy server
-----------------------

To avoid each process making a new SQL connection, you can make all dictionary
communications go through a dictionary server process which keeps the
connections permanently open.

The dictionary server is referenced with URI 'proxy:<dictionary server socket
path>:<dictionary name>'. The socket path may be left empty if you haven't
changed 'base_dir' setting in 'dovecot.conf'. Otherwise set it to
'<base_dir>/dict-server'. The dictionary names are configured in dovecot.conf.
For example:

---%<-------------------------------------------------------------------------
dict {
  quotadict = mysql:/etc/dovecot-dict-quota.conf
}
---%<-------------------------------------------------------------------------

Example quota plugin configuration for this:

---%<-------------------------------------------------------------------------
plugin {
  # v1.0:
  quota = dict:storage=10240:messages=1000 proxy::quotadict
  # v1.1:
  quota = dict proxy::quotadict
  quota_rule = *:storage=10M:messages=1000
}
---%<-------------------------------------------------------------------------

(This file was created from the wiki on 2008-06-20 04:42)
