2026.07.22 (Mer)

✹ RĂ©sumĂ© de GPT-5.6 Sol

Le rĂ©cit du transfert des fonctions et des donnĂ©es existantes de gestion des congĂ©s vers un nouvel environnement NAS, puis de la correction des dĂ©fauts d’interface rĂ©vĂ©lĂ©s sur un vĂ©ritable appareil mobile aprĂšs la connexion HTTPS externe.

J’ai transfĂ©rĂ© les fonctions et les donnĂ©es de l’automatisation historique des congĂ©s vers un nouvel environnement NAS, puis reliĂ© le chemin qui permet aux requĂȘtes HTTPS externes d’atteindre l’application Ă  l’intĂ©rieur du NAS. Il ne s’agissait pas simplement de lancer un container, mais de dĂ©placer un flux de travail existant vers un nouvel environnement d’exploitation.

Pourtant, l’affichage du nouvel Ă©cran ne suffisait pas pour dĂ©clarer la migration terminĂ©e. Les donnĂ©es des employĂ©s et des congĂ©s devaient apparaĂźtre, et les destinataires des relances ainsi que le texte des messages devaient correspondre Ă  l’ancien systĂšme. Les messages dĂ©passant la limite quotidienne de 130 devaient ĂȘtre reportĂ©s au lendemain, tandis que la queue d’envoi et l’historique devaient eux aussi ĂȘtre repris. S’il manquait un seul Ă©lĂ©ment, ce serait un autre service portant seulement le mĂȘme nom.

Lorsque j’avais auparavant de nouveau sĂ©parĂ© l’automatisation des ventes de l’administration du personnel, j’avais dĂ©cidĂ© de reproduire les fonctions existantes de relance des congĂ©s avant de les dĂ©placer. Une fois le travail commencĂ©, cet ordre s’est rĂ©vĂ©lĂ© encore plus important. J’ai repoussĂ© quelque temps le deploy sur le NAS.

Reproduction locale des fonctions et restauration des données

J’ai d’abord exĂ©cutĂ© FastAPI, Next.js et MariaDB dans un environnement Compose local et isolĂ©. Pour Ă©viter tout conflit avec le service existant, j’ai Ă©galement sĂ©parĂ© port, network, volume et credential. Je me suis connectĂ© en tant qu’administrateur, j’ai ouvert les donnĂ©es des employĂ©s et des congĂ©s, puis j’ai comparĂ© au flux existant les destinataires des relances, les textes gĂ©nĂ©rĂ©s, les envois programmĂ©s au-delĂ  de la limite de 130, la queue et l’historique.

Je ne voulais pas toucher directement Ă  la DB de production. J’ai restaurĂ© le backup SQL existant dans une instance MariaDB distincte, puis comparĂ© le schema et le nombre d’enregistrements des principales table. J’ai aussi vĂ©rifiĂ© que les donnĂ©es subsistaient aprĂšs le redĂ©marrage du backend. Ce n’est qu’à ce moment-lĂ  que j’ai disposĂ© d’une rĂ©fĂ©rence de fonctionnement locale. Si un problĂšme survenait ensuite sur le NAS, je pourrais distinguer un changement de code d’une mauvaise image ou d’une mauvaise configuration network.

La restauration du backup ne signifiait pas que la transition opĂ©rationnelle Ă©tait terminĂ©e. Le compte administrateur, le tĂ©lĂ©phone professionnel et les vĂ©ritables SMS n’avaient pas encore empruntĂ© le nouveau chemin.

Double limitation sur le chemin rĂ©el d’envoi des SMS

Le blocage suivant concernait les vĂ©ritables SMS. Sans envoyer de message, je ne pouvais pas observer jusqu’au bout le chemin qui mĂšne au tĂ©lĂ©phone Android professionnel. Mais je ne pouvais pas non plus laisser ouvert l’envoi en production pour effectuer un test.

J’ai donc divisĂ© le mode d’envoi du server en trois options.

NO_SEND
ALLOWLIST_SEND
PRODUCTION

L’état habituel est NO_SEND. Ce n’est que pendant le test que j’ai placĂ© un destinataire autorisĂ© dans ALLOWLIST_SEND. J’ai identifiĂ© la cible Ă  l’aide d’un hash SHA-256 plutĂŽt qu’avec le numĂ©ro de tĂ©lĂ©phone en clair, et j’ai limitĂ© Ă  un le nombre de messages que le server pouvait rĂ©clamer. J’ai Ă©galement ajoutĂ© un budget distinct d’un message dans l’application Android. Je voulais Ă©viter qu’un second message parte mĂȘme si le server ou l’application Ă©tait mal manipulĂ©.

Je ne me suis pas contentĂ© de lire le code pour valider cet Ă©tat. Avec Computer Use, j’ai ouvert l’écran rĂ©el d’administration et vĂ©rifiĂ© NO_SEND, le nombre de messages alors disponibles pour claim, la queue et l’historique. Sur le mĂȘme Ă©cran, j’ai aussi comparĂ© le rĂ©sultat du travail de Codex au code d’implĂ©mentation.

Écran Computer Use montrant la queue et l'historique des SMS avec NO_SEND appliquĂ©, comparĂ©s au rĂ©sultat du travail de Codex et au code d'implĂ©mentation. L'adresse rĂ©elle du service, l'indicateur d'une personne non publique et les libellĂ©s permettant d'identifier l'entreprise sont pixellisĂ©s.

J’ai Ă©galement créé un package de test distinct afin de ne pas toucher directement Ă  l’application opĂ©rationnelle. Sur l’appareil Android connectĂ© en USB, j’ai utilisĂ© adb reverse pour relier l’endpoint local. Un vĂ©ritable SMS s’est ainsi terminĂ© en SUCCESS, et j’ai constatĂ© son arrivĂ©e sur l’appareil destinataire.

Un rĂ©sultat ambigu est aussi apparu. L’utilisateur avait reçu le message, mais le delivery callback Android n’avait pas Ă©tĂ© capturĂ©. SUCCESS signifiait que l’opĂ©rateur avait acceptĂ© la demande d’envoi, pas que le delivery callback Ă©tait terminĂ©. Si je regroupais la rĂ©ception rĂ©elle et l’état du callback sous le mĂȘme succĂšs, il deviendrait encore plus difficile de dĂ©cider ensuite comment traiter les cas UNKNOWN.

AprĂšs avoir observĂ© un message, je suis immĂ©diatement revenu Ă  NO_SEND. L’Android readiness Ă©tait Ă  0 et le claim du server renvoyait 204 No Content. J’ai terminĂ© le test dans un Ă©tat oĂč une action accidentelle supplĂ©mentaire ne pouvait pas envoyer un autre message.

Migration des images Docker linux/amd64 vers le NAS

Je n’ai dĂ©ployĂ© sur le NAS que le service d’automatisation des congĂ©s, et non toute la plateforme d’automatisation. Au lieu de rebuild le source sur le NAS, j’ai créé les image linux/amd64 sur le Mac, vĂ©rifiĂ© leurs hash, puis les ai transfĂ©rĂ©es. J’ai aussi sĂ©parĂ© le project Compose du stack existant. Cette organisation Ă©vitait que le remplacement d’un seul backend recrĂ©e en mĂȘme temps MariaDB et le Frontend.

Connexion du HTTPS externe et du Reverse Proxy

L’écran de connexion s’est ouvert Ă  la nouvelle adresse, et les donnĂ©es existantes des employĂ©s et des congĂ©s Ă©taient visibles. Mais un texte ne permettait pas de comprendre d’un seul coup d’Ɠil comment les requĂȘtes d’un navigateur externe atteignaient MariaDB. En particulier, lorsque j’expliquais si 3101 Ă©tait un port ouvert sur Internet ou seulement utilisĂ© dans le NAS, les frontiĂšres se brouillaient sans cesse. J’ai donc reprĂ©sentĂ© le chemin de la requĂȘte dans un schĂ©ma.

Flux des requĂȘtes de l'automatisation des congĂ©s : seul HTTPS 443 est utilisĂ© Ă  l'extĂ©rieur, tandis que Frontend 3101, Backend 8000 et MariaDB 3306 sont reliĂ©s Ă  l'intĂ©rieur du NAS

Le schĂ©ma a montrĂ© que seul HTTPS 443 Ă©tait nĂ©cessaire depuis l’extĂ©rieur. Le Router transmet 443 au NAS, puis le reverse proxy du NAS examine le hostname et envoie la requĂȘte au Frontend sur 127.0.0.1:3101. Backend 8000 et MariaDB 3306 ne communiquent qu’au sein de la Docker network. Comme 3101 est lui aussi liĂ© uniquement au loopback du NAS, il n’est pas directement accessible depuis Internet.

J’ai laissĂ© Cloudflare hors du chemin principal pour la mĂȘme raison. Je disposais dĂ©jĂ  d’un authoritative DNS, d’une adresse IP publique fixe et d’un contrĂŽle direct du Router. En ajoutant seulement l’A record du service et en gĂ©rant le certificat sur le NAS, je supprimais un composant intermĂ©diaire. En contrepartie, je dois gĂ©rer moi-mĂȘme le renouvellement du certificat et le port forwarding. Hormis le port 80 nĂ©cessaire Ă  l’émission et au renouvellement du certificat, les requĂȘtes rĂ©elles du service n’arrivent que par 443.

VĂ©rification sur un vĂ©ritable appareil mobile et correction de l’interface responsive

L’ouverture de l’adresse HTTPS externe ne signifiait pas que la migration Ă©tait terminĂ©e. Depuis un vĂ©ritable appareil Android connectĂ© en USB, j’ai accĂ©dĂ© Ă  la nouvelle adresse par le rĂ©seau mobile et parcouru directement la connexion, le dashboard, la liste des employĂ©s, l’historique des SMS et la gestion des congĂ©s. Les Ă©crans s’ouvraient, mais ils n’étaient pas utilisables en l’état.

Les problĂšmes que j’avais manquĂ©s en rĂ©duisant simplement la largeur du navigateur sur le PC sont apparus tous ensemble sur l’appareil rĂ©el. Dans le dashboard, la sidebar de bureau occupait presque tout l’écran et comprimait les card et le texte en colonnes verticales.

Dans toutes les comparaisons ci-dessous, la partie gauche correspond Ă  l’état avant la correction et la partie droite Ă  l’état aprĂšs.

Défaut de layout du dashboard découvert sur un véritable appareil mobile et résultat aprÚs correction

Dans la liste des employĂ©s, les titres et les button se coupaient caractĂšre par caractĂšre, tandis qu’une large table Ă©tait forcĂ©e dans un espace Ă©troit. J’ai maintenu le titre et la zone d’actions dans un flux horizontal, et permis Ă  la table de dĂ©filer latĂ©ralement autant que nĂ©cessaire au lieu d’écraser son contenu.

Comparaison avant et aprÚs du titre, de la zone d'actions et de la table des employés adaptés à la largeur mobile

Les filter de l’historique des SMS et de la gestion des congĂ©s avaient le mĂȘme problĂšme. Plusieurs champs et une plage de dates Ă©taient comprimĂ©s sur une seule ligne. Sur les petits Ă©crans, je les ai principalement disposĂ©s sur deux colonnes et placĂ© la plage de dates sur une ligne distincte afin que chaque Ă©lĂ©ment puisse ĂȘtre lu et touchĂ©.

Comparaison avant et aprĂšs des filter de l'historique des SMS rendus lisibles et utilisables sur mobile

Comparaison avant et aprÚs des filter de gestion des congés réorganisés pour la largeur mobile

AprĂšs les corrections, j’ai de nouveau dĂ©ployĂ© une nouvelle Docker image et me suis reconnectĂ© sur le mĂȘme tĂ©lĂ©phone. J’ai ouvert le menu, fait dĂ©filer les Ă©crans et regardĂ© directement chaque filter et chaque table pour vĂ©rifier que les dĂ©fauts observĂ©s au dĂ©part avaient disparu. Ce qui devait simplement confirmer que la network externe atteignait le container du NAS a fini par corriger l’interface rĂ©ellement utilisĂ©e.

État de la migration par Ă©tapes et vĂ©rification de l’interface d’administration/E2E

AprĂšs avoir reliĂ© la migration vers le NAS, l’accĂšs externe et un SMS interne, j’ai de nouveau dĂ©pliĂ© le roadmap complet et constatĂ© que les Ă©tapes 1 Ă  3 Ă©taient franchies. J’en Ă©tais Ă  l’étape 4 : dĂ©ployer l’interface d’administration amĂ©liorĂ©e dans une nouvelle image, puis revoir chaque page avec ADB et l’appareil rĂ©el.

Schéma des étapes d'Operations Automation montrant la planification, la migration historique et la connexion au NAS achevées, avec le deploy de l'interface d'administration UI/UX et l'E2E sur appareil réel en cours

L’ajout de ce schĂ©ma a aussi clarifiĂ© la prochaine limite du travail. L’accĂšs externe avait dĂ©jĂ  passĂ© le test, mais le dogfooding au siĂšge ne pouvait pas commencer avant la nouvelle vĂ©rification des Ă©crans d’administration sur un appareil rĂ©el. L’étape suivante n’était donc pas d’ajouter des fonctions, mais de vĂ©rifier jusqu’au bout que l’interface corrigĂ©e conservait le mĂȘme flux de travail sur ordinateur et sur mobile.

État sĂ©curisĂ© et rollback avant la transition opĂ©rationnelle

Pour l’instant, le nouveau stack est dĂ©libĂ©rĂ©ment configurĂ© pour ne rien faire automatiquement.

ENABLE_SCHEDULER=False
SMS_SEND_MODE=NO_SEND
SMS_ALLOWLIST_MAX_CLAIMS=0

Je n’ai inscrit les credential administrateur ni dans Compose ni dans les image. Sur le NAS, je les ai fournis au moyen d’un secret file dotĂ© des droits 0600; sur le Mac, je les ai conservĂ©s dans Keychain.

Je pouvais me connecter Ă  la nouvelle adresse et lire les donnĂ©es, et un SMS Ă©tait Ă©galement arrivĂ© dans des conditions limitĂ©es. Sur un rĂ©seau mobile externe, j’ai vĂ©rifiĂ© tout le parcours, de la connexion Ă  la consultation des donnĂ©es et Ă  l’utilisation des Ă©crans. MalgrĂ© cela, avant de supprimer l’ancien service de messages de congĂ©s, il reste Ă  dĂ©finir une mĂ©thode de rĂ©cupĂ©ration pour les envois dĂ©pourvus de delivery callback et Ă  obtenir l’approbation des conditions d’envoi rĂ©elles.

J’ai donc arrĂȘtĂ© les container et volume existants, mais je les ai laissĂ©s intacts. Ce qu’il faut ensuite, ce n’est pas ajouter davantage de configuration. Il faut dĂ©cider comment rĂ©cupĂ©rer les envois sans callback, puis ouvrir l’envoi rĂ©el sur un nombre limitĂ© de messages, dans des conditions approuvĂ©es.

IndĂ©pendamment de la migration technique, j’ai racontĂ© dans Quand on sait utiliser activement l’IA, le champ des possibles paraĂźt soudain infini ce que j’ai ressenti en permettant Ă  l’IA d’observer avec moi le vĂ©ritable tĂ©lĂ©phone ainsi que les Ă©crans d’administration du Router et du NAS.

Laisser un commentaire