franGiPane overview

La réflexion qui a mené à tout ça : Discussion.

A quick description

We don't want to rely on "UI" scripts for data consistency, but instead put all data consistency constraints inside the DB engine. We don't want to have any data duplication, too. Moreover, even the file-system state / database state consistency (maildirmake, etc.) will be done by the DB engine itself.

PostgreSQL is the only free DB engine that provides all the necessary (advanced) relational database features we need : really enforced consistency checks, query rewriting rules, schemas to separate different parts of the DB, views to build dynamically the pseudo-tables that are given to Postfix et al., triggers for the file-system stuff, different procedural languages such as Perl/Python usable for writing functions, rules, triggers and constraints inside the DB engine. Thanks to the views, we were able to abstract the DB schema a lot from the low-level final tables that our server software wants to be fed with ; thanks to the views + foreign keys + JOIN, no data duplication at all is needed.

On this basis, the "UI" scripts for adding/removing/editing e-mail accounts / lists / web sites / etc. will only have to run a few SQL queries and interpret the PostgreSQL's output. They thus will be very short, and won't even be able to write inconsistent data into the database. Everything could be even done from the PostgreSQL phpmyadmin equivalent, actually, since one single SQL query is enough to create a mailbox, for example. We're not even sure we'll write any script outside the DB engine, actually.

La base de tout : une base de données relationnelle

Le constat, c'est que sur un serveur tel qu'est prévu boum, on a plein de services différents : au moins réception de mails, consultation de mails, DNS, web. Ces services sont fournis par des applications différentes, respectivement (par exemple) Postfix, Apache. Or, toutes ces applications sont indépendantes et, par défaut, sont toutes configurées avec des fichiers de formats les plus diverses.

Ceci pose tout un tas de problèmes : la première est la duplication d'information. Ça augmente les chances de fautes de frappes, ou d'oublier de mettre à jour un truc en même temps que le reste. L'autre souci, c'est l'impossibilité de déléguer, puisque (en gros) il faut être root pour faire les modifs.

Comment résoudre ça ? L'idée c'est de demander à tous ces programmes d'aller chercher l'information au même endroit. Une des solutions la plus flexible et pas trop difficile à mettre en oeuvre est d'utiliser une base de données relationnelle : PostgreSQL.

On veut gérer le plus possible au niveau BDD la consistance des données qui y sont stockées, plutôt que de mettre (et d'oublier) les checks nécessaires dans le code de franGiPane.

Pas de délégation de pouvoir

Dans Frangipane, il n'y a pas d'échelon hiérarchique intermédiaire entre les administrateurices du système (les root, quoi) et les utilisateurices (celleux qui ont une adresse email, un site web, etc.).