[Dovecot] Quota for Shared Folders

Anton Dollmaier antondollmaier at aditsystems.de
Wed Apr 15 03:39:40 EEST 2009


Good morning list,


first of all: dovecot works really great, the performance is 
overwhelming (especially compared to courier), the configuration 
flexible as hell, it is good documented - I love this software.


But as things get complicated, I think I need some additional help.


I'm using dovecot to replace the currently used courier-mailserver in a 
shared hosting environment based on the control panel Confixx.


Confixx uses per default filesystem-users, giving each mailuser a 
filesystem-quota, mails are stored in ~/Maildir/. The imap-logins are 
all in the form of "webxpy", being "webx" the customer (prefix 'web', 
and a increasing number), and "py" the number of the pop account. 
Because of the filesystem-quota we moved the indexes to another partition.

This basic setup with dovecot works great, with auth directly against 
the confixx-database etc, imap_quota-plugin, quota-plugin working as 
expected.


We now want to implement shared folders for each customer: all 
mailaccounts of a customer should be able to subscribe to per-customer 
shared folders in a specified maildir, thus I re-mapped the usernames 
with a new user_query (and password_query) to the format of 
"webxpy at webx" - being "webx" the virtual domain and "webxpy" the 
mailaccount, but still using "webxpy" as the imap-login (no need for 
customers to change the login).

This also works, we even can control with ACL-vfiles the permissions of 
specified users, to enable or disable specific folders.

The shared folders are specified as a new public namespace and the 
"domain" is part of the storage-path (see configuration at the end of 
this mail).

To allow easier quota-management (no need to create a new system-user), 
the quota of the shared folders is maildir-based, with a 
mysql-quota-dictionary (later, all accounts will be migrated to a 
virtual-user-mailstorage, with only maildir-quota and no fs-quotas).


But when things come to the shared quota, I currently don't know how to 
solve the wishes of the customer:

The current solution for shared folders (at the customer's local site) 
is based on mdaemon, every shared folder (of a customer, not a single 
mail-account) has a quota assigned. This quota cannot be exceeded by the 
users, no more mails can be saved into the shared folders if used space 
exceeds the hard quota-value.

As my tests have shown, dovecot uses a different approach to the 
quota-issue: users can always move their mails from local folders to the 
shared namespace, regardless of the shared quota. The quota itself is 
only checked when receiving new mails, where the combined quota (local + 
shared) may not be exceeded. If it is, the mail is not delivered to the 
mailbox.

Our quota-config is this:

>   quota_rule: *:storage=50M:messages=1000
>   quota_rule2: Trash:storage=50M:messages=100
>   quota_rule3: shared*:storage=100M:messages=1000

(also being altered by user_query, but the scheme is the same)

As of dovecot-wiki, this means:

Users can save "50M + 50M + 100M" of mails in all specified Folders, so 
the storage-value for the "shared*"-folders works additionally to the 
"*"-storage-value.



Different from this, we want the following to happen:

If the customer exceeds the shared folders-quota, his mail-users may not 
move mails from INBOX to shared, this move-operation should fail with a 
reasonable error-message.

If the local quota of a mail user is exceeded, new mails should be 
rejected/delayed, regardless of the shared quota-value (e.g., shared 
quota exceeded, but no local mails [new mail-account], mails should be 
delivered to INBOX).


Sieve-filters are not a problem, we do not allow user-specific 
sieve-rules (managesieve is disabled).



Hopefully, I could explain my issues to you.

Our current dovecot-configuration is attached to this mail, any help 
would be gladly appreciated.


If additional configuration-values/information is needed, I'll happily 
provide them, if possible.



best regards,

Anton Dollmaier


> # 1.1.13: /etc/dovecot/dovecot.conf
> # OS: Linux 2.6.26-1-686 i686 Debian 5.0.1 
> log_timestamp: %Y-%m-%d %H:%M:%S 
> protocols: imap imaps pop3s pop3
> listen: *, [::]
> ssl_cert_file: /etc/dovecot/dovecot.pem
> ssl_key_file: /etc/dovecot/dovecot.pem
> disable_plaintext_auth: no
> login_dir: /var/run/dovecot/login
> login_executable(default): /usr/lib/dovecot/imap-login
> login_executable(imap): /usr/lib/dovecot/imap-login
> login_executable(pop3): /usr/lib/dovecot/pop3-login
> mail_max_userip_connections(default): 25
> mail_max_userip_connections(imap): 25
> mail_max_userip_connections(pop3): 10
> first_valid_uid: 249
> mail_access_groups: poponly
> mail_privileged_group: poponly
> mail_location: maildir:~/Maildir:INDEX=~/index:CONTROL=~/control
> mail_debug: yes
> mail_executable(default): /usr/lib/dovecot/imap
> mail_executable(imap): /usr/lib/dovecot/imap
> mail_executable(pop3): /usr/lib/dovecot/pop3
> mail_plugins(default): quota imap_quota acl
> mail_plugins(imap): quota imap_quota acl
> mail_plugins(pop3): quota acl
> mail_plugin_dir(default): /usr/lib/dovecot/modules/imap
> mail_plugin_dir(imap): /usr/lib/dovecot/modules/imap
> mail_plugin_dir(pop3): /usr/lib/dovecot/modules/pop3
> imap_client_workarounds(default): netscape-eoh
> imap_client_workarounds(imap): netscape-eoh
> imap_client_workarounds(pop3): 
> pop3_client_workarounds(default): 
> pop3_client_workarounds(imap): 
> pop3_client_workarounds(pop3): outlook-no-nuls oe-ns-eoh
> namespace:
>   type: private
>   separator: .
>   inbox: yes
>   list: yes
>   subscriptions: yes
> namespace:
>   type: private
>   prefix: INBOX.
>   hidden: yes
>   subscriptions: yes
> namespace:
>   type: public
>   separator: .
>   prefix: shared.
>   location: maildir:/var/mail/shared/%d/:INDEX=~/shared
>   list: yes
> auth default:
>   verbose: yes
>   debug: yes
>   debug_passwords: yes
>   passdb:
>     driver: sql
>     args: /etc/dovecot/dovecot-sql.conf
>   userdb:
>     driver: sql
>     args: /etc/dovecot/dovecot-sql.conf
>   socket:
>     type: listen
>     client:
>       path: /var/spool/postfix/private/auth
>       mode: 432
>       user: postfix
>       group: postfix
>     master:
>       path: /var/run/dovecot/auth-master
>       mode: 432
>       user: vmail
>       group: vmail
> plugin:
>   quota: dict:::proxy::quotadict
>   quota2: dict::%d:proxy::quota2dict
>   quota_rule: *:storage=50M:messages=1000
>   quota_rule2: Trash:storage=50M:messages=100
>   quota_rule3: shared*:storage=100M:messages=1000
>   acl: vfile
>   expire: Trash 7 Spam 30
>   expire_dict: proxy::expire
> dict:
>   quotadict: mysql:/etc/dovecot/dovecot-dict-quota.conf
>   quota2dict: mysql:/etc/dovecot/dovecot-dict-quota2.conf

(the two quota-dicts could probably be merged into one)

/etc/dovecot/dovecot-sql.conf:

> driver = mysql
> connect = host=localhost dbname=confixx user=confixx password=p4ssw0rd
> default_pass_scheme = CRYPT
> password_query = SELECT CONCAT(account, '@', kunde) as user, longpw as password FROM pop3 WHERE (account='%u' and gesperrt='0'
> user_query = SELECT CONCAT('/var/mail/vmail/', p.kunde, '/', p.account,'/') as home, 249 as uid, 249 as gid, CONCAT('*:storage=', p.maxkbhard) AS quota_rule, CONCAT('shared.*:storage=', k.shared_maxkb) as quota2_rule FROM pop3 AS p, kunden AS k WHERE k.kunde = p.kunde AND CONCAT(p.account, '@', p.kunde) = '%u'

(quota-values in kilobytes)


/etc/dovecot/dovecot-dict-quota.conf:

> connect = host=localhost dbname=confixx user=confixx password=p4ssw0rd
> table = dovecot_quota
> select_field = current
> where_field = path
> username_field = username

/etc/dovecot/dovecot-dict-quota2.conf:

> connect = host=localhost dbname=confixx user=confixx password=p4ssw0rd
> table = dovecot_quota_shared
> select_field = current
> where_field = path
> username_field = username

(tables are exactly as specified in dovecot-wiki)


More information about the dovecot mailing list