feat: ajout Dovecot avec authentification PostgreSQL (base esymail)
Architecture :
- Base de données esymail sur PostgreSQL existant, table mailbox
(email, password BLF-CRYPT, domain, quota_mb, is_active, timestamps)
- Dovecot auth via dovecot-sql.conf : passdb + userdb en SQL
- Stockage mails en Maildir /var/mail/vhosts/%d/%n
- UID/GID 1000 (vmail) pour les fichiers mail
- Socket auth Postfix pour SASL (/var/spool/postfix/private/auth)
Fichiers :
- docker/dovecot/Dockerfile : dovecot/dovecot + dovecot-pgsql, user vmail
- docker/dovecot/dovecot.conf : protocols imap/pop3, auth SQL, logging
- docker/dovecot/dovecot-sql.conf : connexion PostgreSQL, queries
password_query/user_query/iterate_query sur table mailbox
- docker/dovecot/init-esymail.sql : CREATE DATABASE esymail, CREATE TABLE
mailbox avec index, compte test test@siteconseil.fr/test1234
Docker :
- Service dovecot sans port exposé (interne uniquement)
- Volumes dovecot-mail (Maildir) et dovecot-logs (partagé avec fail2ban)
- Dépend de database (healthcheck)
- init-esymail.sql monté dans /docker-entrypoint-initdb.d/ de PostgreSQL
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:44:45 +02:00
|
|
|
-- Création de la base esymail si elle n'existe pas
|
|
|
|
|
SELECT 'CREATE DATABASE esymail OWNER app'
|
|
|
|
|
WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'esymail')\gexec
|
|
|
|
|
|
|
|
|
|
\connect esymail
|
|
|
|
|
|
feat: service EsyMailService complet pour gestion messagerie
EsyMailService - connexion DBAL directe vers base esymail :
Gestion domaines :
- listDomains() : liste avec count mailboxes par domaine
- getDomain(name) : détails d'un domaine
- createDomain(name, maxMailboxes, defaultQuotaMb) : création
- updateDomain(name, maxMailboxes, defaultQuotaMb, isActive) : mise à jour
- deleteDomain(name) : suppression cascade (mailboxes + alias)
- domainExists(name) : vérification existence
Gestion boîtes mail :
- listMailboxes(?domain) : liste toutes ou par domaine
- getMailbox(email) : détails d'une boîte
- createMailbox(email, password, ?displayName, quotaMb) : création avec
hash bcrypt BLF-CRYPT, vérification domaine existant
- updateMailbox(email, displayName, quotaMb, isActive) : mise à jour
- changePassword(email, newPassword) : changement mot de passe
- deleteMailbox(email) : suppression
- mailboxExists(email) : vérification existence
- countMailboxes(domain) : nombre de boîtes par domaine
Gestion alias :
- listAliases(?domain) : liste tous ou par domaine
- createAlias(source, destination, domain) : création redirection
- deleteAlias(id) : suppression
Stats :
- getStats() : compteurs domains, mailboxes, aliases, active_mailboxes
Base de données esymail :
- Table domain : name unique, max_mailboxes, default_quota_mb, is_active
- Table mailbox : email unique, password bcrypt, domain FK, display_name,
quota_mb, is_active, timestamps
- Table alias : source/destination unique, domain FK, is_active
- Domaines dev : siteconseil.fr, esy-web.dev
- Compte test : test@siteconseil.fr / test1234
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:17:01 +02:00
|
|
|
-- Table des domaines
|
|
|
|
|
CREATE TABLE IF NOT EXISTS domain (
|
|
|
|
|
id SERIAL PRIMARY KEY,
|
|
|
|
|
name VARCHAR(255) NOT NULL UNIQUE,
|
|
|
|
|
max_mailboxes INTEGER NOT NULL DEFAULT 50,
|
|
|
|
|
default_quota_mb INTEGER NOT NULL DEFAULT 5120,
|
|
|
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
|
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_domain_name ON domain (name);
|
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_domain_active ON domain (is_active);
|
|
|
|
|
|
|
|
|
|
-- Table des boites mail
|
feat: ajout Dovecot avec authentification PostgreSQL (base esymail)
Architecture :
- Base de données esymail sur PostgreSQL existant, table mailbox
(email, password BLF-CRYPT, domain, quota_mb, is_active, timestamps)
- Dovecot auth via dovecot-sql.conf : passdb + userdb en SQL
- Stockage mails en Maildir /var/mail/vhosts/%d/%n
- UID/GID 1000 (vmail) pour les fichiers mail
- Socket auth Postfix pour SASL (/var/spool/postfix/private/auth)
Fichiers :
- docker/dovecot/Dockerfile : dovecot/dovecot + dovecot-pgsql, user vmail
- docker/dovecot/dovecot.conf : protocols imap/pop3, auth SQL, logging
- docker/dovecot/dovecot-sql.conf : connexion PostgreSQL, queries
password_query/user_query/iterate_query sur table mailbox
- docker/dovecot/init-esymail.sql : CREATE DATABASE esymail, CREATE TABLE
mailbox avec index, compte test test@siteconseil.fr/test1234
Docker :
- Service dovecot sans port exposé (interne uniquement)
- Volumes dovecot-mail (Maildir) et dovecot-logs (partagé avec fail2ban)
- Dépend de database (healthcheck)
- init-esymail.sql monté dans /docker-entrypoint-initdb.d/ de PostgreSQL
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:44:45 +02:00
|
|
|
CREATE TABLE IF NOT EXISTS mailbox (
|
|
|
|
|
id SERIAL PRIMARY KEY,
|
|
|
|
|
email VARCHAR(255) NOT NULL UNIQUE,
|
|
|
|
|
password VARCHAR(255) NOT NULL,
|
feat: service EsyMailService complet pour gestion messagerie
EsyMailService - connexion DBAL directe vers base esymail :
Gestion domaines :
- listDomains() : liste avec count mailboxes par domaine
- getDomain(name) : détails d'un domaine
- createDomain(name, maxMailboxes, defaultQuotaMb) : création
- updateDomain(name, maxMailboxes, defaultQuotaMb, isActive) : mise à jour
- deleteDomain(name) : suppression cascade (mailboxes + alias)
- domainExists(name) : vérification existence
Gestion boîtes mail :
- listMailboxes(?domain) : liste toutes ou par domaine
- getMailbox(email) : détails d'une boîte
- createMailbox(email, password, ?displayName, quotaMb) : création avec
hash bcrypt BLF-CRYPT, vérification domaine existant
- updateMailbox(email, displayName, quotaMb, isActive) : mise à jour
- changePassword(email, newPassword) : changement mot de passe
- deleteMailbox(email) : suppression
- mailboxExists(email) : vérification existence
- countMailboxes(domain) : nombre de boîtes par domaine
Gestion alias :
- listAliases(?domain) : liste tous ou par domaine
- createAlias(source, destination, domain) : création redirection
- deleteAlias(id) : suppression
Stats :
- getStats() : compteurs domains, mailboxes, aliases, active_mailboxes
Base de données esymail :
- Table domain : name unique, max_mailboxes, default_quota_mb, is_active
- Table mailbox : email unique, password bcrypt, domain FK, display_name,
quota_mb, is_active, timestamps
- Table alias : source/destination unique, domain FK, is_active
- Domaines dev : siteconseil.fr, esy-web.dev
- Compte test : test@siteconseil.fr / test1234
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:17:01 +02:00
|
|
|
domain VARCHAR(255) NOT NULL REFERENCES domain(name) ON DELETE CASCADE,
|
|
|
|
|
display_name VARCHAR(255) DEFAULT NULL,
|
feat: ajout Dovecot avec authentification PostgreSQL (base esymail)
Architecture :
- Base de données esymail sur PostgreSQL existant, table mailbox
(email, password BLF-CRYPT, domain, quota_mb, is_active, timestamps)
- Dovecot auth via dovecot-sql.conf : passdb + userdb en SQL
- Stockage mails en Maildir /var/mail/vhosts/%d/%n
- UID/GID 1000 (vmail) pour les fichiers mail
- Socket auth Postfix pour SASL (/var/spool/postfix/private/auth)
Fichiers :
- docker/dovecot/Dockerfile : dovecot/dovecot + dovecot-pgsql, user vmail
- docker/dovecot/dovecot.conf : protocols imap/pop3, auth SQL, logging
- docker/dovecot/dovecot-sql.conf : connexion PostgreSQL, queries
password_query/user_query/iterate_query sur table mailbox
- docker/dovecot/init-esymail.sql : CREATE DATABASE esymail, CREATE TABLE
mailbox avec index, compte test test@siteconseil.fr/test1234
Docker :
- Service dovecot sans port exposé (interne uniquement)
- Volumes dovecot-mail (Maildir) et dovecot-logs (partagé avec fail2ban)
- Dépend de database (healthcheck)
- init-esymail.sql monté dans /docker-entrypoint-initdb.d/ de PostgreSQL
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:44:45 +02:00
|
|
|
quota_mb INTEGER NOT NULL DEFAULT 5120,
|
|
|
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
|
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
|
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NULL
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_mailbox_email ON mailbox (email);
|
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_mailbox_domain ON mailbox (domain);
|
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_mailbox_active ON mailbox (is_active);
|
|
|
|
|
|
feat: service EsyMailService complet pour gestion messagerie
EsyMailService - connexion DBAL directe vers base esymail :
Gestion domaines :
- listDomains() : liste avec count mailboxes par domaine
- getDomain(name) : détails d'un domaine
- createDomain(name, maxMailboxes, defaultQuotaMb) : création
- updateDomain(name, maxMailboxes, defaultQuotaMb, isActive) : mise à jour
- deleteDomain(name) : suppression cascade (mailboxes + alias)
- domainExists(name) : vérification existence
Gestion boîtes mail :
- listMailboxes(?domain) : liste toutes ou par domaine
- getMailbox(email) : détails d'une boîte
- createMailbox(email, password, ?displayName, quotaMb) : création avec
hash bcrypt BLF-CRYPT, vérification domaine existant
- updateMailbox(email, displayName, quotaMb, isActive) : mise à jour
- changePassword(email, newPassword) : changement mot de passe
- deleteMailbox(email) : suppression
- mailboxExists(email) : vérification existence
- countMailboxes(domain) : nombre de boîtes par domaine
Gestion alias :
- listAliases(?domain) : liste tous ou par domaine
- createAlias(source, destination, domain) : création redirection
- deleteAlias(id) : suppression
Stats :
- getStats() : compteurs domains, mailboxes, aliases, active_mailboxes
Base de données esymail :
- Table domain : name unique, max_mailboxes, default_quota_mb, is_active
- Table mailbox : email unique, password bcrypt, domain FK, display_name,
quota_mb, is_active, timestamps
- Table alias : source/destination unique, domain FK, is_active
- Domaines dev : siteconseil.fr, esy-web.dev
- Compte test : test@siteconseil.fr / test1234
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:17:01 +02:00
|
|
|
-- Table des alias
|
|
|
|
|
CREATE TABLE IF NOT EXISTS alias (
|
|
|
|
|
id SERIAL PRIMARY KEY,
|
|
|
|
|
source VARCHAR(255) NOT NULL,
|
|
|
|
|
destination VARCHAR(255) NOT NULL,
|
|
|
|
|
domain VARCHAR(255) NOT NULL REFERENCES domain(name) ON DELETE CASCADE,
|
|
|
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
|
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
|
|
|
|
|
UNIQUE(source, destination)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_alias_source ON alias (source);
|
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_alias_domain ON alias (domain);
|
|
|
|
|
|
|
|
|
|
-- Domaine de test dev
|
|
|
|
|
INSERT INTO domain (name) VALUES ('siteconseil.fr') ON CONFLICT (name) DO NOTHING;
|
|
|
|
|
INSERT INTO domain (name) VALUES ('esy-web.dev') ON CONFLICT (name) DO NOTHING;
|
|
|
|
|
|
feat: ajout Dovecot avec authentification PostgreSQL (base esymail)
Architecture :
- Base de données esymail sur PostgreSQL existant, table mailbox
(email, password BLF-CRYPT, domain, quota_mb, is_active, timestamps)
- Dovecot auth via dovecot-sql.conf : passdb + userdb en SQL
- Stockage mails en Maildir /var/mail/vhosts/%d/%n
- UID/GID 1000 (vmail) pour les fichiers mail
- Socket auth Postfix pour SASL (/var/spool/postfix/private/auth)
Fichiers :
- docker/dovecot/Dockerfile : dovecot/dovecot + dovecot-pgsql, user vmail
- docker/dovecot/dovecot.conf : protocols imap/pop3, auth SQL, logging
- docker/dovecot/dovecot-sql.conf : connexion PostgreSQL, queries
password_query/user_query/iterate_query sur table mailbox
- docker/dovecot/init-esymail.sql : CREATE DATABASE esymail, CREATE TABLE
mailbox avec index, compte test test@siteconseil.fr/test1234
Docker :
- Service dovecot sans port exposé (interne uniquement)
- Volumes dovecot-mail (Maildir) et dovecot-logs (partagé avec fail2ban)
- Dépend de database (healthcheck)
- init-esymail.sql monté dans /docker-entrypoint-initdb.d/ de PostgreSQL
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:44:45 +02:00
|
|
|
-- Boite de test dev
|
feat: service EsyMailService complet pour gestion messagerie
EsyMailService - connexion DBAL directe vers base esymail :
Gestion domaines :
- listDomains() : liste avec count mailboxes par domaine
- getDomain(name) : détails d'un domaine
- createDomain(name, maxMailboxes, defaultQuotaMb) : création
- updateDomain(name, maxMailboxes, defaultQuotaMb, isActive) : mise à jour
- deleteDomain(name) : suppression cascade (mailboxes + alias)
- domainExists(name) : vérification existence
Gestion boîtes mail :
- listMailboxes(?domain) : liste toutes ou par domaine
- getMailbox(email) : détails d'une boîte
- createMailbox(email, password, ?displayName, quotaMb) : création avec
hash bcrypt BLF-CRYPT, vérification domaine existant
- updateMailbox(email, displayName, quotaMb, isActive) : mise à jour
- changePassword(email, newPassword) : changement mot de passe
- deleteMailbox(email) : suppression
- mailboxExists(email) : vérification existence
- countMailboxes(domain) : nombre de boîtes par domaine
Gestion alias :
- listAliases(?domain) : liste tous ou par domaine
- createAlias(source, destination, domain) : création redirection
- deleteAlias(id) : suppression
Stats :
- getStats() : compteurs domains, mailboxes, aliases, active_mailboxes
Base de données esymail :
- Table domain : name unique, max_mailboxes, default_quota_mb, is_active
- Table mailbox : email unique, password bcrypt, domain FK, display_name,
quota_mb, is_active, timestamps
- Table alias : source/destination unique, domain FK, is_active
- Domaines dev : siteconseil.fr, esy-web.dev
- Compte test : test@siteconseil.fr / test1234
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:17:01 +02:00
|
|
|
INSERT INTO mailbox (email, password, domain, display_name)
|
feat: ajout Dovecot avec authentification PostgreSQL (base esymail)
Architecture :
- Base de données esymail sur PostgreSQL existant, table mailbox
(email, password BLF-CRYPT, domain, quota_mb, is_active, timestamps)
- Dovecot auth via dovecot-sql.conf : passdb + userdb en SQL
- Stockage mails en Maildir /var/mail/vhosts/%d/%n
- UID/GID 1000 (vmail) pour les fichiers mail
- Socket auth Postfix pour SASL (/var/spool/postfix/private/auth)
Fichiers :
- docker/dovecot/Dockerfile : dovecot/dovecot + dovecot-pgsql, user vmail
- docker/dovecot/dovecot.conf : protocols imap/pop3, auth SQL, logging
- docker/dovecot/dovecot-sql.conf : connexion PostgreSQL, queries
password_query/user_query/iterate_query sur table mailbox
- docker/dovecot/init-esymail.sql : CREATE DATABASE esymail, CREATE TABLE
mailbox avec index, compte test test@siteconseil.fr/test1234
Docker :
- Service dovecot sans port exposé (interne uniquement)
- Volumes dovecot-mail (Maildir) et dovecot-logs (partagé avec fail2ban)
- Dépend de database (healthcheck)
- init-esymail.sql monté dans /docker-entrypoint-initdb.d/ de PostgreSQL
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:44:45 +02:00
|
|
|
VALUES (
|
|
|
|
|
'test@siteconseil.fr',
|
|
|
|
|
'$2y$12$LJ3m4yPnMDCE1xPKm5VwS.YNbKH7JQXZ8VmYD5PJT5dKzJDkPmyG',
|
feat: service EsyMailService complet pour gestion messagerie
EsyMailService - connexion DBAL directe vers base esymail :
Gestion domaines :
- listDomains() : liste avec count mailboxes par domaine
- getDomain(name) : détails d'un domaine
- createDomain(name, maxMailboxes, defaultQuotaMb) : création
- updateDomain(name, maxMailboxes, defaultQuotaMb, isActive) : mise à jour
- deleteDomain(name) : suppression cascade (mailboxes + alias)
- domainExists(name) : vérification existence
Gestion boîtes mail :
- listMailboxes(?domain) : liste toutes ou par domaine
- getMailbox(email) : détails d'une boîte
- createMailbox(email, password, ?displayName, quotaMb) : création avec
hash bcrypt BLF-CRYPT, vérification domaine existant
- updateMailbox(email, displayName, quotaMb, isActive) : mise à jour
- changePassword(email, newPassword) : changement mot de passe
- deleteMailbox(email) : suppression
- mailboxExists(email) : vérification existence
- countMailboxes(domain) : nombre de boîtes par domaine
Gestion alias :
- listAliases(?domain) : liste tous ou par domaine
- createAlias(source, destination, domain) : création redirection
- deleteAlias(id) : suppression
Stats :
- getStats() : compteurs domains, mailboxes, aliases, active_mailboxes
Base de données esymail :
- Table domain : name unique, max_mailboxes, default_quota_mb, is_active
- Table mailbox : email unique, password bcrypt, domain FK, display_name,
quota_mb, is_active, timestamps
- Table alias : source/destination unique, domain FK, is_active
- Domaines dev : siteconseil.fr, esy-web.dev
- Compte test : test@siteconseil.fr / test1234
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 23:17:01 +02:00
|
|
|
'siteconseil.fr',
|
|
|
|
|
'Compte Test'
|
feat: ajout Dovecot avec authentification PostgreSQL (base esymail)
Architecture :
- Base de données esymail sur PostgreSQL existant, table mailbox
(email, password BLF-CRYPT, domain, quota_mb, is_active, timestamps)
- Dovecot auth via dovecot-sql.conf : passdb + userdb en SQL
- Stockage mails en Maildir /var/mail/vhosts/%d/%n
- UID/GID 1000 (vmail) pour les fichiers mail
- Socket auth Postfix pour SASL (/var/spool/postfix/private/auth)
Fichiers :
- docker/dovecot/Dockerfile : dovecot/dovecot + dovecot-pgsql, user vmail
- docker/dovecot/dovecot.conf : protocols imap/pop3, auth SQL, logging
- docker/dovecot/dovecot-sql.conf : connexion PostgreSQL, queries
password_query/user_query/iterate_query sur table mailbox
- docker/dovecot/init-esymail.sql : CREATE DATABASE esymail, CREATE TABLE
mailbox avec index, compte test test@siteconseil.fr/test1234
Docker :
- Service dovecot sans port exposé (interne uniquement)
- Volumes dovecot-mail (Maildir) et dovecot-logs (partagé avec fail2ban)
- Dépend de database (healthcheck)
- init-esymail.sql monté dans /docker-entrypoint-initdb.d/ de PostgreSQL
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 16:44:45 +02:00
|
|
|
) ON CONFLICT (email) DO NOTHING;
|