Mariage-Divorce
Se marier, divorcer et tester un couple en ligne, pour rire
Mariage-Divorce (G·&·P dans le dépôt) est un projet troll, fait lors d’une soirée avec des potes. C’est une blague assumée, mais elle repose sur du vrai : presque tout vient de modules que j’avais déjà écrits, et le projet a surtout été un assemblage.
L'idée
Le site est une mairie imaginaire, « Undertainment », qui délivre des actes de mariage, de divorce et de testament. Chaque acte est un parchemin au format A4, avec en-tête de la République, numéro d’acte et cachet « Enregistré » une fois validé. Les champs se remplissent, deux signatures se tracent au doigt ou à la souris, et un compteur tient le registre des couples : combien de mariages, combien de divorces, et qui hérite de qui.
Le reste du site suit la même veine. Une page « Thérapie de couple » affiche un post-it qui change à chaque visite et dit où est parti l’autre. Une page « Date » met deux personnes en vidéo, avec un décor au choix (restaurant, bar, cinéma). Une page « Recherche le Point G » fait passer un faux chargement et un faux captcha avant de montrer un simple miroir.
Des contrats partagés en direct
Il n’y a qu’un seul contrat de mariage et un seul contrat de divorce, communs à tous les visiteurs. Ce qu’on tape apparaît chez les autres, et une signature se voit se dessiner à l’écran des autres pendant qu’elle est tracée. Même la feuille se déplace : on la saisit et elle bouge chez tout le monde.
Le serveur garde l’état de chaque contrat et le diffuse en SSE. Les champs partent après une courte pause de frappe, les points d’un trait par petits paquets d’environ 50 ms, et l’image finale de la signature au lever du crayon. La feuille a une taille fixe (794 × 1123 px, un A4 à 96 dpi) mise à l’échelle selon l’écran, et les signatures sont tracées sur une toile de résolution fixe : tout le monde voit donc la même chose. Quand les deux ont signé, la validation fige le contrat, lui donne un numéro et l’inscrit au compteur.
Le testament fait exception. C’est un document individuel : le brouillon reste dans le navigateur de la personne, et seule la validation contacte le serveur.
Le compteur compare les noms avec tolérance : accents, casse, ponctuation, une faute de frappe, ordre des deux noms inversé. Sans ça, « Roméo » et « romeo » seraient deux couples différents.
Ce qui tourne derrière
Le site tourne dans un pod Podman sur mon VPS, avec trois conteneurs : nginx pour les fichiers statiques et la redirection de l’API, une API en Python qui n’utilise que la bibliothèque standard, et coturn pour le relais vidéo. Les conteneurs sont déclarés en unités Quadlet pour systemd. Ils tournent sans privilèges (capacités retirées, système de fichiers en lecture seule, mémoire plafonnée).
La publication se fait par git push vers un dépôt du VPS. Un hook post-receive extrait main, copie le site, met à jour l’API, redémarre ce qui a changé et attend que /api/sante réponde avant de dire que c’est en ligne. Un script deployer.sh fait le commit et le push en une commande. Les données (événements du compteur, état des contrats) sont de simples fichiers JSON écrits de façon atomique.
J’ai gardé l’API en Python standard et le front sans framework ni build. Ça évite tout outillage, et le serveur tient dans un fichier.
La vidéo à deux
La page Date est un appel vidéo de navigateur à navigateur en WebRTC, avec PeerJS. Le premier arrivé sur un code prend l’identifiant du rendez-vous, le second s’y connecte avec le lien d’invitation. Le choix du décor est synchronisé entre les deux écrans.
Quand deux navigateurs ne peuvent pas se joindre directement (réseau d’entreprise, téléphone en 4G), l’appel passe par le relais coturn du pod. L’API délivre à chaque visiteur des identifiants temporaires, calculés avec un secret partagé avec coturn, et le relais refuse les adresses privées, limite le débit et le nombre de sessions. Sans l’API, le navigateur retombe sur un serveur STUN public.
Ce que ça m'a apporté
Ce n’est pas un projet jetable. Il reprend des bouts que j’avais déjà : des classes CSS, des scripts de déploiement, des morceaux de serveur. Il est monté presque uniquement par assemblage, et c’est ce qui m’intéresse.
En le faisant, j’ai construit une méthode et une base pour déployer un site web rapidement : une feuille de style modulaire déjà prête, un déploiement par git push et des scripts qui font le reste. Un prochain site peut partir de là, au lieu de repartir de zéro.
Limites
La barre de recherche du compteur est écrite mais désactivée tant que le site n’a pas assez de couples. Les contrats étant communs à tous, deux inconnus peuvent se retrouver à écrire sur la même feuille : c’est voulu, mais ça veut dire que le contenu n’est pas modéré. La mise en relation des appels passe par le serveur public de PeerJS, pas par un serveur à moi. Je n’ai pas testé le relais vidéo à grande échelle, et le dépôt ne contient pas de tests.
Liens
- Voir le site : https://mariage-divorce.selixy.dev