CREATE TABLE IF NOT EXISTS virtual_domains ( id integer primary key generated by default as identity, name varchar(50) NOT NULL UNIQUE ); {% for domain in virtual_domains %} INSERT INTO virtual_domains (name) VALUES ('{{ domain }}') ON CONFLICT (name) DO NOTHING; {% endfor %} CREATE TABLE IF NOT EXISTS virtual_users ( id integer primary key generated by default as identity, domain_id integer NOT NULL, email varchar(254) NOT NULL UNIQUE, password varchar(150) NOT NULL, quota bigint NOT NULL DEFAULT 0, FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ); {% for domain in virtual_domains %} {% for user in mailserver_database.virtual_users %} INSERT INTO virtual_users (domain_id, email, password, quota) VALUES ( (SELECT id FROM virtual_domains WHERE name = '{{ domain }}'), '{{ user.name }}@{{ domain }}', {# same as `doveadm pw -s BLF-CRYPT -p ${user.pwd}` -#} '{BLF-CRYPT}{{ user.pwd | password_hash('blowfish') }}', 0 ) ON CONFLICT (email) DO UPDATE SET password = EXCLUDED.password, quota = EXCLUDED.quota; {% endfor %} {% endfor %} CREATE TABLE IF NOT EXISTS virtual_aliases ( id integer primary key generated by default as identity, domain_id integer NOT NULL, source varchar(254) NOT NULL, destination varchar(254) NOT NULL, FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ); CREATE UNIQUE INDEX IF NOT EXISTS virtual_aliases_s_d_key ON virtual_aliases (source, destination); {% for domain in virtual_domains %} {% for alias in mailserver_database.virtual_aliases %} INSERT INTO virtual_aliases (domain_id, source, destination) VALUES ( (SELECT id FROM virtual_domains WHERE name = '{{ domain }}'), '{{ alias.source }}@{{ domain }}', '{{ alias.destination }}@{{ domain }}' ) ON CONFLICT (source, destination) DO NOTHING; {% endfor %} {% endfor %}