Aller au contenu

Héberger plusieurs clients

Kewos tourne aussi bien pour un client sur sa propre machine que pour cent sur un serveur mutualisé. C’est le même code : ce qui change, c’est le nombre de lignes dans un registre.

La règle est simple et non négociable : une base de données par client. Pas de colonne tenant_id partagée, pas de schéma commun. Une sauvegarde restaure un client, une fuite ne traverse pas, et un client qui part emporte sa base.

Ajouter un client

Deux étapes, dans cet ordre, et la première est à vous :

Fenêtre de terminal
# 1. La base, créée par l'exploitant
createdb -O kewos kewos_bibliotheque2
# 2. L'inscription au registre
kewos tenant create bibliotheque2 \
--database-url 'postgresql+psycopg://kewos:...@127.0.0.1:5432/kewos_bibliotheque2' \
--master-url "$KEWOS_MASTER_DATABASE_URL" \
--display-name 'Bibliothèque du Nord'
registered tenant 'bibliotheque2' -> postgresql+psycopg://kewos:***@127.0.0.1:5432/kewos_bibliotheque2

Notez le *** : le mot de passe de la base ne s’affiche jamais, ni ici, ni dans la liste, ni dans un journal. Un terminal se partage, se copie dans un ticket, se filme pendant une démonstration.

Le registre est ce que consulte le serveur pour router une requête vers la bonne base. La commande ne crée pas la base : le choix de l’endroit, du propriétaire et des paramètres appartient à l’exploitant.

Le schéma du nouveau client

Il est vide. Une seule commande le remplit, et elle traite tous les clients :

Fenêtre de terminal
kewos reconcile --master-url ... --modules-root ... --confirm
bibliotheque2 [active]: reconciled (1 migration(s), 0 column(s))
main [active]: reconciled (0 migration(s), 0 column(s))
done: 2 tenant(s), 0 failed

Le nouveau client passe de 0 à 79 tables, l’ancien ne bouge pas. C’est la commande à lancer en dernière étape de chaque déploiement : aucun client ne peut alors rester en retard sur le code.

Les données ne se mélangent pas

titres du nouveau client : 0
titres du premier : 8

Ce n’est pas un filtre qu’on aurait pu oublier : ce sont deux bases.

Suspendre n’est pas supprimer

Fenêtre de terminal
kewos tenant drop bibliotheque2 --master-url ...
suspended tenant 'bibliotheque2'

Le mot est trompeur et le comportement est le bon : drop suspend. La ligne du registre reste, son statut passe à suspended, et la base n’est pas touchée (ses tables et ses données sont toujours là, vérifié). Un client suspendu ne sert plus de requêtes, mais il revient entier :

Fenêtre de terminal
kewos tenant restore bibliotheque2 --master-url ...

Ce que voit le serveur

Chaque requête HTTP porte son client (sous-domaine ou en-tête), un intergiciel le résout dans le registre et ouvre la connexion de ce client. Aucun code métier n’ouvre une connexion lui-même ; c’est l’interdiction n°14 du projet, et c’est ce qui rend le cloisonnement structurel plutôt que discipliné.