[đ ] Operations Automation #3: Migration de lâautomatisation historique des congĂ©s vers le NAS et connexion HTTPS externe
⚠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.

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.
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.

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.

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Ă©.


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.

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