Ik zou graag van jullie willen weten of ik met onderstaande oplossing in de problemen kom.
Met name de SQL result sets, etc. etc.
Want in tests werkt het, maar geen idee of dat nog zo is als er 100 domeinen op staan met druk verkeer.
Ik ben een CentOS 8 aan het inrichten met Dovecot 2.3.7 en Postfix 3.3.1
De structuur is als volgt:
LOCALUSER = maildir:/home/LOCALUSER/mail
USER@DOMAIN = maildir:/home/LOCALUSER/mail/DOMAIN/USER/
Door een MariaDB log aan te maken, kwam ik er achter dat Postfix veel sql queries aanroept met %s.
Door te testen met %u en %d bleek dat een heel stuk minder.
Daarnaast heb ik geëxperimenteerd met VIEW, PROCEDURE en FUNCTION om te zien wat het beste resultaat geeft.
Omdat de DB procedures en functions gebruik maken van de interne @@hostname kan je mailboxen gebruiken als:
Postfix smtpd_sender_login_maps.cf
Postfix virtual_mailbox_domains.cf
Postfix virtual_mailbox_maps.cf
Postfix virtual_alias_maps.cf
Dovecot-sql.conf.ext
MariaDB (dus met name dit gedeelte bij druk bezoek)
Met name de SQL result sets, etc. etc.
Want in tests werkt het, maar geen idee of dat nog zo is als er 100 domeinen op staan met druk verkeer.
Ik ben een CentOS 8 aan het inrichten met Dovecot 2.3.7 en Postfix 3.3.1
De structuur is als volgt:
LOCALUSER = maildir:/home/LOCALUSER/mail
USER@DOMAIN = maildir:/home/LOCALUSER/mail/DOMAIN/USER/
Door een MariaDB log aan te maken, kwam ik er achter dat Postfix veel sql queries aanroept met %s.
Door te testen met %u en %d bleek dat een heel stuk minder.
Daarnaast heb ik geëxperimenteerd met VIEW, PROCEDURE en FUNCTION om te zien wat het beste resultaat geeft.
Omdat de DB procedures en functions gebruik maken van de interne @@hostname kan je mailboxen gebruiken als:
- Postfix
- Alias: bestaatniet@example.com => bestaat@example.com
- Catch-all Alias: @example.com => LOCALUSER
- LOCALUSER => LOCALUSER@hostname
- Dovecot
- Login passdb: LOCALUSER
- Login passdb: USER@DOMAIN
- Lookup userdb: LOCALUSER
- Lookup userdb: LOCALUSER@hostname
- Lookup userdb: USER@DOMAIN
Postfix smtpd_sender_login_maps.cf
code:
1
| query = SELECT logins FROM (SELECT get_mail_sender_logins('%u', '%d') AS logins) t WHERE t.logins IS NOT NULL |
Postfix virtual_mailbox_domains.cf
code:
1
| query = SELECT 1 FROM DUAL WHERE mailbox_domain_exists('%s') |
Postfix virtual_mailbox_maps.cf
code:
1
| query = SELECT 1 FROM DUAL WHERE mailbox_exists('%u','%d') |
Postfix virtual_alias_maps.cf
code:
1
| query = SELECT destination FROM (SELECT get_virtual_alias_destination('%u', '%d') AS destination) t WHERE t.destination IS NOT NULL |
Dovecot-sql.conf.ext
code:
1
2
| password_query = CALL dovecot_get_pass('%u','%n','%d'); user_query = CALL dovecot_get_user('%u','%n','%d') |
MariaDB (dus met name dit gedeelte bij druk bezoek)
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
| DELIMITER $$ /* Postfix */ CREATE FUNCTION get_mail_virtual_alias_destination (user VARCHAR(254), domain VARCHAR(254)) RETURNS varchar(254) CHARSET utf8mb4 COLLATE utf8mb4_bin BEGIN DECLARE destination VARCHAR(254) DEFAULT NULL; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET destination = NULL; IF 'localhost' = domain THEN RETURN destination; END IF; SET @address = CONCAT(user,'@',domain); IF domain = @@hostname THEN SELECT @address INTO destination FROM users WHERE user_name = user; ELSEIF mailbox_domain_exists(domain) THEN SELECT mvu_mail INTO destination FROM users_mail_virtual_users WHERE mvu_mail = @address; IF destination IS NULL THEN SELECT mva_destination INTO destination FROM users_mail_virtual_aliases WHERE mva_source IN (@address, CONCAT('@',domain)) ORDER BY mva_source DESC; IF 0 = INSTR(destination, '@') THEN SET destination = CONCAT(destination,'@',@@hostname); END IF; END IF; END IF; RETURN destination; END$$ CREATE FUNCTION mailbox_domain_exists (domain VARCHAR(254)) RETURNS BOOLEAN BEGIN DECLARE hasdomain BOOLEAN DEFAULT FALSE; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET hasdomain = FALSE; IF 'localhost' = domain THEN RETURN FALSE; END IF; IF domain = @@hostname THEN RETURN TRUE; END IF; SELECT TRUE INTO hasdomain FROM users_domains WHERE 1 = domain_mx AND domain_name = domain; RETURN hasdomain; END$$ CREATE FUNCTION mailbox_exists (user varchar(254), domain varchar(254)) RETURNS BOOLEAN BEGIN DECLARE mailbox BOOLEAN DEFAULT FALSE; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET mailbox = FALSE; IF domain = @@hostname THEN SELECT TRUE INTO mailbox FROM users WHERE user_name = user; ELSEIF mailbox_domain_exists(domain) THEN SELECT TRUE INTO mailbox FROM users_mail_virtual_users WHERE mvu_mail = CONCAT(user,'@',domain); END IF; RETURN mailbox; END$$ CREATE FUNCTION get_mail_sender_logins (user varchar(254), domain varchar(254)) RETURNS varchar(254) CHARSET utf8mb4 COLLATE utf8mb4_bin BEGIN DECLARE mailboxes VARCHAR(254) DEFAULT NULL; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET mailboxes = NULL; IF 'localhost' = domain THEN RETURN NULL; END IF; SELECT GROUP_CONCAT(address) INTO mailboxes FROM ( SELECT mva_destination AS address FROM users_mail_virtual_aliases WHERE mva_source = CONCAT('@',domain) OR mva_source = CONCAT(user,'@',domain) UNION SELECT mvu_mail AS address FROM users_mail_virtual_users WHERE mvu_mail = CONCAT(user,'@',domain) ) senders; RETURN mailboxes; END$$ /* dovecot */ CREATE PROCEDURE dovecot_get_pass (IN address varchar(254), IN user varchar(254), IN domain varchar(254)) BEGIN IF 0 = INSTR(address, '@') THEN SELECT address AS user, user_pass AS password, user_id AS userdb_uid, user_id AS userdb_gid, CONCAT('/home/', user_name, '/mail/') AS userdb_home FROM users WHERE user_name = address; ELSE SELECT mvu_mail AS user, mvu_pass AS password, user_id AS userdb_uid, user_id AS userdb_gid, CONCAT('/home/', user_name, '/mail/', domain_name, '/', mvu_name, '/') AS userdb_home FROM users_mail_virtual_users INNER JOIN users_domains USING (domain_id) INNER JOIN users USING (user_id) WHERE mvu_mail = address; END IF; END$$ CREATE PROCEDURE dovecot_get_user (IN address varchar(254), IN user varchar(254), IN domain varchar(254)) BEGIN IF 0 = INSTR(address, '@') THEN SELECT address AS user, user_id AS uid, user_id AS gid, CONCAT('/home/', user_name, '/mail/') AS home FROM users WHERE user_name = address; ELSEIF domain = @@hostname THEN SELECT address AS user, user_id AS uid, user_id AS gid, CONCAT('/home/', user_name, '/mail/') AS home FROM users WHERE user_name = user; ELSE SELECT mvu_mail AS user, user_id AS uid, user_id AS gid, CONCAT('/home/', user_name, '/mail/', domain_name, '/', mvu_name, '/') AS home FROM users_mail_virtual_users INNER JOIN users_domains USING (domain_id) INNER JOIN users USING (user_id) WHERE mvu_mail = address UNION SELECT address AS user, user_id AS uid, user_id AS gid, CONCAT('/home/', user_name, '/mail/', domain, '/.INBOX.', user, '/') AS home FROM users_domains INNER JOIN users USING (user_id) WHERE 1 = domain_mx AND domain_name = domain; END IF; END$$ |
[ Voor 14% gewijzigd door DJMaze op 16-11-2019 19:14 ]
Maak je niet druk, dat doet de compressor maar