Aki Tuomi wrote on Thu, 16 Aug 2018 21:03:44 +0300 (EEST):

> Can you provide doveconf -n please?

Thanks for the quick reply. I think I already provided the most relevant 
portions of config. I ran a doveconf -n and it doesn't reveal important 
information like sql setup. I'll do my best to sum up the relevant parts 
below, anyway.

But first I would like to know how the dictionary-based domain quota is 
intended to work as that is mentioned nowhere. Is it like in the either/or 
example where they say that dovecot can only act on one of the quotas at a 
given time or is it intended to be used like the filesystem aquota works?

So, there are two things: 
First: I do not quite understand how it is supposed to work. Once I knew I 
could test my setup whether it acts on the limits correctly. 
The second is the apparent bug with recalc. I omitted to say that the 
updating of both quotas by dovecot when mail comes in *does* seem to work 
correctly. But if I run a recalc it all gets messed up. This has been 
reported a few times over time, so I guess it's not specific to my setup.

So, here's the relevant bits again (and a bit more):

dict {
  quota = mysql:/etc/dovecot/dovecot-dict-sql-user.conf
  quota_domain = mysql:/etc/dovecot/dovecot-dict-sql-domain.conf
}

mail_home = /var/vmail/%d/%n
mail_location = maildir:/var/vmail/%d/%n/mail/
mail_plugins = " quota"

plugin {
  quota = dict:user::proxy::quota
  quota2 = dict:domain:%d:proxy::quota_domain
  quota_rule = *:storage=100M
  quota_rule2 = Trash:storage=+10%%
  quota_rule3 = Spam:ignore
  quota2_rule = *:storage=1000M
  quota2_rule2 = Trash:storage=+10%%
  quota2_rule3 = Spam:ignore
  quota_vsizes = yes
  (+ quota_status, _warning etc. not relevant ...)
}

service dict {
  unix_listener dict {
    group = vmail
    mode = 0600
    user = vmail
  }
}

service quota-status {
  client_limit = 1
  executable = quota-status -p postfix
  inet_listener {
    port = 10024
  }
}

userdb {
  args = /etc/dovecot/dovecot-sql.conf
  driver = sql
}

/etc/dovecot/dovecot-dict-sql-user.conf
connect = ...
map {
  pattern = priv/quota/storage
  table = quota
  username_field = username
  value_field = bytes
}
map {
  pattern = priv/quota/messages
  table = quota
  username_field = username
  value_field = messages
}


/etc/dovecot/dovecot-dict-sql-domain.conf
connect = 
map {
  pattern = priv/quota/storage
  table = quota_domain
  username_field = domain
  value_field = bytes
}
map {
  pattern = priv/quota/messages
  table = quota_domain
  username_field = domain
  value_field = messages
}


/etc/dovecot/dovecot-sql.conf
user_query = SELECT CONCAT('/var/vmail/',m.maildir) AS home, CONCAT
('maildir:/var/vmail/',m.maildir,'mail/') AS mail, 200 AS uid, 200 AS gid, 
concat('*:bytes=', m.quota) AS quota_rule, concat('*:bytes=', 
(s.ServerPopQuota*1024*1024)) AS quota2_rule FROM mailbox AS m LEFT JOIN 
server AS s ON (m.ServerID = s.ServerID) WHERE (m.username = '%u' OR 
m.local_part = "%n") AND m.active = '1'

doveadm quota get of a test domain:
Username                   Quota name Type    Value   Limit           %
example...@example.com   user       STORAGE  5567  100000           5
example...@example.com   user       MESSAGE    70       -           0
example...@example.com   domain     STORAGE 33426 1024000           3
example...@example.com   domain     MESSAGE  1292       -           0
example_s...@example.com user       STORAGE 33403  100000          33
example_s...@example.com user       MESSAGE  1280       -           0
example_s...@example.com domain     STORAGE 33426 1024000           3
example_s...@example.com domain     MESSAGE  1292       -           0

Note: these are values after a recalc and after the users (both) received 
some more test mails. So, the figures in general are not correct (if I sum 
them up), but you see that user quota is getting updated separate for each 
user and that domain quota is equal for both but not equal with any of the 
users. Now, if I would do a recalc -A it would look like this:

example...@example.com   user       STORAGE  5567  100000           5
example...@example.com   user       MESSAGE    70       -           0
example...@example.com   domain     STORAGE 33403 1024000           3
example...@example.com   domain     MESSAGE  1280       -           0
example_s...@example.com user       STORAGE 33403  100000          33
example_s...@example.com user       MESSAGE  1280       -           0
example_s...@example.com domain     STORAGE 33403 1024000           3
example_s...@example.com domain     MESSAGE  1280       -           0

So, the last user processed determiens the domain values.
Actually, the user values would be recalculated correctly after the recalc 
and might be different from above and the domain quota then follows that 
by using the last processed user as the single source for it.

Thanks!


Kai


Reply via email to