Size: 1159
Comment:
|
Size: 3603
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: {{{ # quotaStorage contains the quota in bytes. It's exported into # $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 }}} |
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:
# quotaStorage contains the quota in bytes. It's exported into # $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