This documentation is for Dovecot v2.x, see wiki1 for v1.x documentation.
Differences between revisions 1 and 9 (spanning 8 versions)
Revision 1 as of 2005-10-28 15:35:03
Size: 1159
Editor: TimoSirainen
Comment:
Revision 9 as of 2007-03-19 12:46:22
Size: 2931
Editor: TimoSirainen
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
== Filesystem quota == = Quota =
Line 3: Line 3:
Dovecot doesn't work too well with filesystem quota currently. But there are a few things you can do: There are different quota backends that Dovecot can use:
Line 5: Line 5:
 * Set index file location to some partition where there are no quota limits. Dovecot can't currently handle out-of-quota error conditions when updating indexes.
 * mbox should work somewhat nicely as long as `mbox_lazy_writes=yes` in config file. Although if user doesn't delete any mails when closing the mailbox, Dovecot gives an "internal error".
 * Maildir also needs to update `dovecot-uidlist` file, which can't handle out-of-quota errors. Its location can be set using "CONTROL" parameter in default_mail_env.
 * [wiki:Quota/FS fs]: Filesystem quota.
 * [wiki:Quota/Dirsize dirsize]: The simplest, but sometimes slow, quota backend. It scans all the files from mail directories to calculate the quota.
 * [wiki:Quota/Dict dict]: Store quota in a dictionary (table).
 * [wiki:Quota/Maildir maildir]: Maildir++ quota.
Line 9: Line 10:
So, use something like: The quota backends are implemented as plugins for Dovecot. There is also a plugin named "quota" which does the actual work. For reporting quota information via IMAP, there is the "imap_quota" plugin. Usually you'd enable these by adding them to the `mail_plugins` settings in config file:
Line 12: Line 13:
# mbox:
default_mail_env = mbox:%h/mail:INBOX=/var/mail/%u:INDEX=/var/no-quotas/index/%u
protocol imap {
  mail_plugins = quota imap_quota
}
protocol pop3 {
  mail_plugins = quota
}
# In case you're using Dovecot-LDA:
protocol lda {
  mail_plugins = quota
} }}}
Line 15: Line 24:
# maildir:
default_mail_env = maildir:%h/Maildir:INDEX=/var/no-quotas/index/%u:CONTROL=/var/no-quotas/control/%u
Most of the quota backends have a few things in common:

You can set the quota as kilobytes (named '''storage''') and/or as number of messages (named '''messages'''). Usually only the '''storage''' quota is used. Usually these limits can be given to the quota backend as parameters, e.g.:

{{{
plugin {
  # 10 MB quota limit
  quota = maildir:storage=10240
  # 1000 messages quota limit
  quota = maildir:messages=1000
  # 10 MB + 1000 messages quota limit
  quota = maildir:storage=10240:messages=1000
} }}}

The above example shows how to set the same quota globally for everyone. You can override this for one or all users by returning a `quota` [:UserDatabase/ExtraFields:extra field] from the user database. See UserDatabase for more information about how to set them for the user database you are using.

== Examples ==

=== SQL ===

{{{
# PostgreSQL
user_query = SELECT home, uid, gid, 'maildir:storage=' || quota_kb AS quota FROM users WHERE userid = '%u'
# MySQL doesn't support the || operator, so you'll need to do differently:
user_query = SELECT home, uid, gid, concat('maildir:storage=', quota_kb) AS quota FROM users WHERE userid = '%u'
Line 19: Line 51:
== Software quotas == === LDAP ===
Line 21: Line 53:
Dovecot 1.0 supports quota using a quota plugin. It's currently discussed in [wiki:LDA Dovecot LDA] page and it supports only very simple quota calculation which is suitable only for mboxes. Maildir++ quota support will come later. {{{
# quotaStorage must be in the format mentioned above
# For example: maildir:storage=10240
user_attrs = uid,homeDirectory,,,uidNumber,gidNumber,quotaStorage=quota

# If you have the quota already as kilobytes in LDAP, there's a kludgy way to use it directly:
user_attrs = uid,homeDirectory,,,uidNumber,gidNumber,quotaStorage=quota=maildir:storage }}}

If you have the quota stored as bytes, you'll need to use a [:PostLoginScripting:post-login scripting] trick to use them. Something like:

{{{
# quotaStorage contains the quota in bytes. It's exported into
# $QUOTA_BYTES environment.
user_attrs = uid,homeDirectory,,,uidNumber,gidNumber,quotaStorage=quota_bytes
}}}

And make imap's {{{mail_location}}} point to a script:

{{{
#!/bin/sh

export QUOTA=maildir:storage=`expr $QUOTA_BYTES / 1024`
exec /usr/local/libexec/dovecot/imap
}}}

Quota

There are different quota backends that Dovecot can use:

  • [wiki:Quota/FS fs]: Filesystem quota.
  • [wiki:Quota/Dirsize dirsize]: The simplest, but sometimes slow, quota backend. It scans all the files from mail directories to calculate the quota.
  • [wiki:Quota/Dict dict]: Store quota in a dictionary (table).
  • [wiki:Quota/Maildir maildir]: Maildir++ quota.

The quota backends are implemented as plugins for Dovecot. There is also a plugin named "quota" which does the actual work. For reporting quota information via IMAP, there is the "imap_quota" plugin. Usually you'd enable these by adding them to the mail_plugins settings in config file:

protocol imap {
  mail_plugins = quota imap_quota
}
protocol pop3 {
  mail_plugins = quota
}
# In case you're using Dovecot-LDA:
protocol lda {
  mail_plugins = quota
} 

Most of the quota backends have a few things in common:

You can set the quota as kilobytes (named storage) and/or as number of messages (named messages). Usually only the storage quota is used. Usually these limits can be given to the quota backend as parameters, e.g.:

plugin {
  # 10 MB quota limit
  quota = maildir:storage=10240
  # 1000 messages quota limit
  quota = maildir:messages=1000
  # 10 MB + 1000 messages quota limit
  quota = maildir:storage=10240:messages=1000
} 

The above example shows how to set the same quota globally for everyone. You can override this for one or all users by returning a quota [:UserDatabase/ExtraFields:extra field] from the user database. See UserDatabase for more information about how to set them for the user database you are using.

Examples

SQL

# PostgreSQL
user_query = SELECT home, uid, gid, 'maildir:storage=' || quota_kb AS quota FROM users WHERE userid = '%u'
# MySQL doesn't support the || operator, so you'll need to do differently:
user_query = SELECT home, uid, gid, concat('maildir:storage=', quota_kb) AS quota FROM users WHERE userid = '%u'

LDAP

# quotaStorage must be in the format mentioned above
# For example: maildir:storage=10240
user_attrs = uid,homeDirectory,,,uidNumber,gidNumber,quotaStorage=quota

# If you have the quota already as kilobytes in LDAP, there's a kludgy way to use it directly:
user_attrs = uid,homeDirectory,,,uidNumber,gidNumber,quotaStorage=quota=maildir:storage 

If you have the quota stored as bytes, you'll need to use a [:PostLoginScripting:post-login scripting] trick to use them. Something like:

# quotaStorage contains the quota in bytes. It's exported into
# $QUOTA_BYTES environment.
user_attrs = uid,homeDirectory,,,uidNumber,gidNumber,quotaStorage=quota_bytes

And make imap's mail_location point to a script:

export QUOTA=maildir:storage=`expr $QUOTA_BYTES / 1024`
exec /usr/local/libexec/dovecot/imap

None: Quota (last edited 2021-06-15 23:54:28 by MichaelSlusarz)