This documentation is for Dovecot v2.x, see wiki1 for v1.x documentation.
Differences between revisions 1 and 19 (spanning 18 versions)
Revision 1 as of 2005-10-28 15:35:03
Size: 1159
Editor: TimoSirainen
Comment:
Revision 19 as of 2007-07-26 16:10:34
Size: 3739
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 and slowest quota backend.
 * [wiki:Quota/Dict dict]: Store quota in a dictionary (e.g. SQL).
 * [wiki:Quota/Maildir maildir]: Maildir++ quota. This is the most commonly used quota for virtual users.
Line 9: Line 10:
So, use something like: See ["Quota/New"] for Dovecot v1.1 / quota-rewrite patch quota configuration.

== Enabling quota plugins ==

There are currently two quota related plugins:

 * quota: Implements the actual quota handling and includes also all the quota backends.
 * imap_quota: For reporting quota information via IMAP.

Usually you'd enable these by adding them to the {{{mail_plugins}}} settings in the config file:
Line 12: Line 22:
# 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 deliver:
protocol lda {
  mail_plugins = quota
} }}}
Line 15: Line 33:
# maildir:
default_mail_env = maildir:%h/Maildir:INDEX=/var/no-quotas/index/%u:CONTROL=/var/no-quotas/control/%u
== Configuring quota ==

Most of the quota backends have very similar configuration. They support two kinds of quota limits:

 * '''storage''': Quota limit in kilobytes.
 * '''messages''': Quota limit in number of messages. This isn't probably very useful.

You can configure quota globally by placing the settings in plugin section in {{{dovecot.conf}}} and you can give per-user limits by having your [:UserDatabase:userdb] return the quota setting as an [:UserDatabase/ExtraFields:extra field]. The userdb quota setting always overrides the global plugin setting.

The important thing to remember is to '''use the correct format for quota setting'''. You can't just return a numeric quota field from userdb and expect it to work. Dovecot wouldn't then know what quota backend to use.

Here is an example global quota configuration:

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

Now if you want to override this for some users, make your userdb return quota field '''in the exact same format'''. See below for some examples.

== Examples ==

=== SQL ===

{{{
# MySQL, quota in kilobytes:
user_query = SELECT home, uid, gid, concat('maildir:storage=', quota_kb) AS quota FROM users WHERE userid = '%u'

# MySQL, quota in bytes:
user_query = SELECT home, uid, gid, concat('maildir:storage=', floor(quota/1024)) AS quota FROM users WHERE userid = '%u'

# PostgreSQL, SQLite, quota in kilobytes:
user_query = SELECT home, uid, gid, 'maildir:storage=' || quota_kb AS quota FROM users WHERE userid = '%u'
Line 19: Line 69:
== Software quotas == === LDAP ===
Line 21: Line 71:
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. The easiest way from Dovecot's point of view is if you already have the quota in Dovecot's format in LDAP (e.g. {{{maildir:storage=102400}}}. Then you can use a configuration like this:

{{{
user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid,quotaDovecot=quota
}}}

Unfortunately usually this isn't the case. So if you have the quota in kilobytes in LDAP, you can use it in a bit kludgy way:

{{{
user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid,quotaKb=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:

{{{
# quotaBytes is exported to $QUOTA_BYTES environment
user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid,quotaBytes=quota_bytes
}}}

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

{{{
#!/bin/sh

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

This post-login trick unfortunately doesn't work with [:LDA:deliver]. If you need it, you're pretty much out of luck for now. [:Quota/new:v1.1 quota] makes this possible.

Quota

There are different quota backends that Dovecot can use:

  • [wiki:Quota/FS fs]: Filesystem quota.
  • [wiki:Quota/Dirsize dirsize]: The simplest and slowest quota backend.
  • [wiki:Quota/Dict dict]: Store quota in a dictionary (e.g. SQL).
  • [wiki:Quota/Maildir maildir]: Maildir++ quota. This is the most commonly used quota for virtual users.

See ["Quota/New"] for Dovecot v1.1 / quota-rewrite patch quota configuration.

Enabling quota plugins

There are currently two quota related plugins:

  • quota: Implements the actual quota handling and includes also all the quota backends.
  • imap_quota: For reporting quota information via IMAP.

Usually you'd enable these by adding them to the mail_plugins settings in the config file:

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

Configuring quota

Most of the quota backends have very similar configuration. They support two kinds of quota limits:

  • storage: Quota limit in kilobytes.

  • messages: Quota limit in number of messages. This isn't probably very useful.

You can configure quota globally by placing the settings in plugin section in dovecot.conf and you can give per-user limits by having your [:UserDatabase:userdb] return the quota setting as an [:UserDatabase/ExtraFields:extra field]. The userdb quota setting always overrides the global plugin setting.

The important thing to remember is to use the correct format for quota setting. You can't just return a numeric quota field from userdb and expect it to work. Dovecot wouldn't then know what quota backend to use.

Here is an example global quota configuration:

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

Now if you want to override this for some users, make your userdb return quota field in the exact same format. See below for some examples.

Examples

SQL

# MySQL, quota in kilobytes:
user_query = SELECT home, uid, gid, concat('maildir:storage=', quota_kb) AS quota FROM users WHERE userid = '%u'

# MySQL, quota in bytes:
user_query = SELECT home, uid, gid, concat('maildir:storage=', floor(quota/1024)) AS quota FROM users WHERE userid = '%u'

# PostgreSQL, SQLite, quota in kilobytes:
user_query = SELECT home, uid, gid, 'maildir:storage=' || quota_kb AS quota FROM users WHERE userid = '%u'

LDAP

The easiest way from Dovecot's point of view is if you already have the quota in Dovecot's format in LDAP (e.g. maildir:storage=102400. Then you can use a configuration like this:

user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid,quotaDovecot=quota

Unfortunately usually this isn't the case. So if you have the quota in kilobytes in LDAP, you can use it in a bit kludgy way:

user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid,quotaKb=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:

# quotaBytes is exported to $QUOTA_BYTES environment
user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid,quotaBytes=quota_bytes

And make imap's mail_executable point to a script:

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

This post-login trick unfortunately doesn't work with [:LDA:deliver]. If you need it, you're pretty much out of luck for now. [:Quota/new:v1.1 quota] makes this possible.

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