PhpConcept

Developers Tools

  • Increase font size
  • Default font size
  • Decrease font size
Home White Papers

Installer Serveur LAMP - Domaines Virtuels

Print PDF

Installer Apache, PHP5, MySQL, Postfix SMTP et Courier POP

sur un serveur Kimsufi ou RPS d'OVH

 

Configuration de Postfix avec domaines virtuels et MySQL

Nous allons directement configurer Postfix pour qu'il supporte plusieurs domaines en s'appuyant sur une base de données MySQL. La base de donnée contiendra les caractéristiques du domaine (en gros son nom DNS rps.phpconcept.net dans notre exemple), les différents comptes d'email, les redirections et le "catch-all". Par contre les mails seront stockés dans le système de fichier en utilisant le format Maildir de Courier (voir plus loin).

Le volume de données se trouvera donc dans le système de fichier et non dans la base MySQL. Les serveurs RPS ou Kimsufi sont partitionés de façon à ce que la partition /home soit la plus importante. Nous allons donc mettre les mails dans le système de fichier sous /home.

J'ai choisi de créer un user spécifique "mailboxes" sous /home pour héberger les mails des différents domaines. On créé donc le user et les dossiers nécessaires :

r10198:~# useradd -g mail -s /bin/false -d /home/mailboxes -m mailboxes
r10198:~# more /etc/passwd | grep mailboxes
mailboxes:x:1000:8::/home/mailboxes:/bin/false
r10198:~#

On a donc un utilisateur "mailboxes", avec comme uid=1000 et un dossier /home/mailboxes. Par la suite, sous ce dossier on va créer un dossier par domaine virtuel que l'on voudra gérer.

On va ensuite configurer Postfix pour qu'il supporte les domaines virtuels et qu'il aille chercher les informations concernant ces domaines dans une base MySQL. L'interêt sera qu'une fois la configuration Postfix terminée, l'ajout ou la modification d'un domaine virtuel se fera directement en renseignant une table MySQL, sans plus toucher à Postfix.

On va donc effectuer les configurations suivantes :

  • Création d'une base de données MySQL dédiée pour la gestion des domaines virtuels et des comptes emails.
  • Création d'un utilisateur MySQL spécifique pour accéder à cette base de donnée.
  • Configuration de Postfix pour supporter les domaines virtuels.
  • Configuration de Postfix pour accéder aux informations de la base de données.

Création d'une base de données MySQL & d'un user dédié

r10198:~# mysql -u root -p mysql
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 13
Server version: 5.0.32-Debian_7etch3-log Debian etch distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> CREATE DATABASE virtualmail DEFAULT CHARACTER SET latin1 COLLATE latin1_bin;
Query OK, 1 row affected (0.00 sec)
mysql> GRANT ALL ON virtualmail.* TO postfixuser@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> SET PASSWORD FOR postfixuser@localhost=PASSWORD('xxxxx');
Query OK, 0 rows affected (0.00 sec)
mysql>

On peut vérifié que l'on a bien accès à cette table ne utilisant phpmyadmin et en se loggant avec le user postfixuser.

On créé alors des tables pour la gestion de domaines virtuels et des users de ces domaines. Il est possible de créer les table par phpMyAdmin, mais le mode CLI est rapide pour faire un copier/coller des tables suivantes. On prendra soin de se connecter à la base de données "virtualmail" et non à la table "mysql". Et on utilisera comme valeurs par defaut les uid/gid du user mailboxes créé précédemment :

r10198:~# mysql -u root -p virtualmail
Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.0.32-Debian_7etch3-log Debian etch distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> CREATE TABLE `domains` (
-> `domain` varchar(128) NOT NULL,
-> UNIQUE KEY `domains` (`domain`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Query OK, 0 rows affected (0.07 sec)

mysql> CREATE TABLE `users` (
-> `email` varchar(128) NOT NULL default '',
-> `pwd` varchar(128) NOT NULL,
-> `name` varchar(128) NOT NULL default '',
-> `uid` smallint(5) unsigned NOT NULL default '1000', <---- Attention : dépend de votre install
-> `gid` smallint(5) unsigned NOT NULL default '106', <---- Attention : dépend de votre install
-> `home` varchar(128) NOT NULL default '/',
-> `domain` varchar(128) NOT NULL default '',
-> `maildir` varchar(255) NOT NULL default '',
-> `quota` int(11) NOT NULL default '0',
-> PRIMARY KEY (`email`),
-> UNIQUE KEY `id` (`email`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE `virtual` (
-> `address` varchar(255) NOT NULL default '',
-> `goto` varchar(255) NOT NULL default '',
-> UNIQUE KEY `address` (`address`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=latin1;


Query OK, 0 rows affected (0.02 sec)
mysql> quit
Bye
r10198:~#

Configuration de Postfix

On modifie le fichier de configuration de Postfix pour qu'il supporte les domaines virtuels.

r10198:~# vi /etc/postfix/main.cf
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default

# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes

smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

myhostname = smtp.rps.phpconcept.net
alias_maps = hash:/etc/aliases

alias_database = hash:/etc/aliases
myorigin = /etc/mailname
#mydestination = rps.phpconcept.net, r10198.ovh.net, localhost.ovh.net, localhost
relayhost =
mynetworks = 127.0.0.0/8

mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

# ----- Ajoute pour gestion des domaines virtuels
virtual_mailbox_maps = mysql:/etc/postfix/mysql_vmailbox.cf

virtual_mailbox_domains = mysql:/etc/postfix/mysql_domains.cf
virtual_alias_maps = mysql:/etc/postfix/mysql_virtuals.cf mysql:/etc/postfix/mysql_no_catch_all.cf
virtual_mailbox_base = /home/mailboxes
virtual_minimum_uid = 100
virtual_uid_maps = static:1000
virtual_gid_maps = static:106

r10198:~#

Nous allons maintenant créer les fichiers .cf qui vont permettre à Postfix de faire le lien vers la base de donnée. le premier permet à Postfix d'obtenir le chemin vers le dossier des emails de l'utilisateur identifié par son email :

r10198:~# vi /etc/postfix/mysql_vmailbox.cf
user=postfixuser
password=XXXXX
dbname=virtualmail
table=users
select_field=home
where_field=email
hosts=localhost
r10198:~#

Le second permet de valider qu'un nom de domaine est bien définit dans la base.

r10198:~# vi /etc/postfix/mysql_domains.cf
user=postfixuser
password=XXXX
dbname=virtualmail
query = SELECT domain from domains WHERE domain='%s'
hosts=localhost
r10198:~#

Les deux suivant permettent de gérer la redirection, ainsi que le catch-all. Pour la redirection il faut, en fonction d'une adresse email (address) retourner l'adresse réelle de destination (goto).

r10198:~# vi /etc/postfix/mysql_virtuals.cf
user=postfixuser
password=XXXXX
dbname=virtualmail
table=virtual
select_field=goto
where_field=address
hosts=localhost
r10198:~#

Pour le catch-all on veut rediriger à une adresse toutes les adresses non resolues pour un domaine. On va donc utiliser deux fichier mysql. Le premier (ci-dessus) qui va permettre d'associer un nom de domaine @rps.phpconcept.net à un email de redirection. Le second permet de déterminer si un email est bien défini dans la base locale pour ne pas le rediriger vers l'email de catch-all. C'est le role du fichier ci-dessous :

r10198:~# vi /etc/postfix/mysql_no_catch_all.cf
user=postfixuser
password=XXXXX
dbname=virtualmail
query = SELECT email from users WHERE email='%s'
hosts=localhost

Il faut redemarrer Postfix pour qu'il prenne en compte les modifications :

r10198:~# /etc/init.d/postfix restart
Stopping Postfix Mail Transport Agent: postfix.
Starting Postfix Mail Transport Agent: postfix.
r10198:~#

 

Installer Postfix
[Sommaire] Installer Courier-maildrop

 

Last Updated on Monday, 28 December 2009 15:44