Live blog coding et amusement en golang
2025-05-27T15:55:27Z
On dit souvent que pour se motiver Ă lancer (et surtout finir) un projet, le mieux câest de le faire en live, avec du public. Apparemment, ça pousse Ă aller jusquâau bout. Câest en tout cas ce que je remarque chez pas mal de devs-influenceurs que je suis sur YouTube.
Bon, moi jâai clairement pas leur audience et spoiler : je compte pas me filmer en train de coder pendant 3 heures.
Du coup, jâai eu une idĂ©e qui me correspond mieux : je vais essayer dâĂ©crire un article en mĂȘme temps que je bosse sur mon projet. Une sorte de journal de bord, en mode « devlog maison ». On verra bien ce que ça donne !
Le besoin
Jâauto-hĂ©berge quelques projets persos sur un Raspberry Pi, y compris ce blog dâailleurs. Franchement, ça marche super bien, et ça me permet de mâĂ©clater un peu avec la gestion de serveur, le dĂ©ploiement, tout ça.
Le seul vrai souci que jâai rencontrĂ©, câest cette histoire dâIP dynamique. Alors oui, avec nos box actuelles, les IP ont tendance Ă rester stables pas mal de temps⊠mais ce la n'est pas garanti.
DerniĂšrement, jâai eu la « chance » dâavoir mon IP changĂ©e plusieurs fois en une seule semaine, alors qu'elle Ă©tait stable depuis des mois. Et devoir mettre Ă jour les enregistrements DNS Ă la main, câest clairement pas fun. Surtout que pour connaĂźtre la nouvelle IP, faut ĂȘtre chez soi. Pratique, hein ?
Ce quâil me faudrait, câest un petit script qui vĂ©rifie rĂ©guliĂšrement si mon IP a changĂ©, et qui met Ă jour mes DNS direct chez le registrar. Automatiser un peu tout ça, quoi.
Par chance, mon registrar est OVH. Et mĂȘme si pas mal de monde aime rĂąler sur leurs offres ou certaines dĂ©cisions techniques, personellement je trouve quâils font vraiment des efforts pour filer un coup de main aux devs.
Petit flashback : en 2021, quand le data center de Strasbourg a pris feu, plein de sites hĂ©bergĂ©s chez OVH sont tombĂ©s en rade. Je vais pas relancer le dĂ©bat sur les backups, câest pas le sujet ici, mais forcĂ©ment, tout le monde cherchait Ă remettre son site en ligne au plus vite. Sauf que lâinterface web (le fameux manager) Ă©tait complĂštement saturĂ©e.
Câest lĂ que je suis tombĂ© sur un article de wikitwist.com qui parlait de cet Ă©vĂ©nement... mais sous un angle un peu diffĂ©rent : celui de lâAPI dâOVH. Et franchement, elle est super bien conçue et trĂšs bien documentĂ©e. Elle permet, entre autres, de gĂ©rer ses enregistrements DNS. Du coup, je me suis dit : pourquoi ne pas en profiter pour automatiser un peu tout ça ?
l'article de wikitwist sur l'API d'OVH
Le plan
Mon FAI ne mâaide pas vraiment Ă rĂ©cupĂ©rer facilement mon IP publique (en IPv4), du coup jâai dĂ» trouver une autre solution pour connaĂźtre mon adresse depuis lâextĂ©rieur. Je pourrais tout simplement interroger un service en ligne qui me retourne mon IP, yâen a plein. Mais bon... les solliciter en boucle, ça me gĂȘne un peu, surtout quand on sait pas trop ce quâils font des infos quâon leur envoie.
Heureusement, jâai dĂ©jĂ un serveur externe (VPS chez OVH), en dehors de mon rĂ©seau local. Et faire un petit script PHP pour quâil affiche mon IP, franchement, câest pas plus compliquĂ© que quelques lignes. Du coup, jâai dĂ©cidĂ© de crĂ©er cette premiĂšre brique que jâai appelĂ©e "KIP", un petit jeu de mots entre âkeepâ et âIPâ. Jâaime bien, ça sonne comme l'acronyme KISS.
Ensuite, la seconde partie : un script qui va chercher cette IP, la compare avec celle quâil a en mĂ©moire, et si jamais elle a changĂ©, il met Ă jour les DNS via lâAPI dâOVH. Et comme jâai trĂšs envie de me mettre sĂ©rieusement Ă Go, je me suis dit que ce serait un projet parfait pour ça. Appelons ce futur script "GoKeep", ça colle bien au concept.
Pour ĂȘtre tout Ă fait transparent : jâavais dĂ©jĂ créé une premiĂšre version de ces deux utilitaires en PHP avec Symfony. Mais avec un peu de recul, utiliser Symfony pour quelquechose d'aussi simple, c'est comme ouvrir un vortex par la porte des Ă©toiles pour travailler son swing. Trop lourd, trop contraignant Ă maintenir. Donc lĂ , on repart sur du plus lĂ©ger, plus fun Ă coder, et qui colle mieux Ă mes envies du moment.
KIP a "simple" API to get infos from your IP
DDOManager is a "small" tool to deal with dynamic IP at home
KIP
Cette fois, je veux que la partie "code" reste aussi simple que possible. LâidĂ©e, câest de renvoyer juste lâessentiel : la date et lâheure actuelles (au fuseau horaire de mon VPS), lâadresse IP, le port utilisĂ©, et pourquoi pas le hostname pour faire joli. Le tout, bien proprement formatĂ© en JSON. Et quand je dis "rĂ©cupĂ©rer", je parle bien du cĂŽtĂ© utilisateur : aucune donnĂ©e nâest stockĂ©e cĂŽtĂ© serveur (Ă part ce que les logs Apache enregistrent par dĂ©faut). Juste une rĂ©ponse simple, directe, sans prise de tĂȘte.
Je ne vais pas mâĂ©tendre ici sur la mise en ligne du script, car dans mon cas, câest du trĂšs classique : jâai un utilisateur dĂ©diĂ© sur le serveur, le code est dans un dossier public_html Ă lâintĂ©rieur de son $HOME, et jâai créé un VirtualHost Apache spĂ©cifique juste pour ce "mini-site". Le tout passe sous HTTPS grĂące Ă Certbot.
Par contre, qui dit public dit potentiellement abusĂ©. Et mĂȘme si le script ne conserve rien, je prĂ©fĂšre poser une petite limite de requĂȘtes pour Ă©viter quâun bot ne vienne me ping 100 fois par seconde. Pour ça, rien de plus fiable et direct quâiptables.
ProtĂ©geons l'accĂšs SSH. Parce quâon ne veut surtout pas se bloquer soi-mĂȘme en appliquant des rĂšgles un peu trop strictes... Non, je ne parle pas d'expĂ©rience, voyons đ
Ensuite on ajoute la limite des nouvelles connexions Ă 1/seconde/ip.
Enfin on rejette les excĂšs (et rien d'autre !!!)
On peut vérifier les rÚgles avec la commande
Il est important de vérifier que les pages web sont encore accessible à ce stade, sans couper la connexion SSH. Si ce n'est pas le cas, il faut recommencer en supprimant toutes les rÚgles :
Si tout est bon, on installe le paquet pour les garder au redémarrage :
Lâinstalleur demande si l'on enregistre les rĂšgles actuelles pour IPv4 => Oui. Pour IPv6, chacun son choix (moi jâai mis Non). Ensuite on vĂ©rifie l'enregistrement comme ceci :
GOKeep
Ăa fait des annĂ©es que jâai envie de me mettre Ă un autre langage orientĂ© back-end, sans jamais rĂ©ussir Ă trancher. Dans ma liste, il y avait Rust et Golang. Rust, tout le monde en parle comme du messie, mĂȘme si la courbe dâapprentissage peut faire un peu peur, et toutes les vidĂ©os que j'ai pu voir parlaient de subtilitĂ©s de gestion de mĂ©moire... Pour un langage moderne (de bas niveau), on se retrouvait avec beaucoup de sujets qui rappellent lâĂ©poque du C. Du coup, jâai optĂ© pour Go. (mais je ne ferme pas la porte Ă Rust, juste je ne peux pas faire les deux en mĂȘme temps...)
Pour me faire une idĂ©e, jâai regardĂ© pas mal de vidĂ©os sur le sujet, et deux d'entre elles m'ont aidĂ© dans mon choix.
La premiĂšre, câest celle de Grafikart : un comparatif entre Go et JavaScript, trĂšs accessible, avec des exemples concrets, sans trop sâattarder sur les limitations.
La seconde, câest la prĂ©sentation de Jean-Laurent de Morlhon Ă DevoxxFR : âPourquoi Maurice ne doit surtout pas coder en Goâ. LĂ , on entre dans le dur : il liste pas mal de "limitations" du langage â formatage imposĂ© du code, gestion trĂšs manuelle des erreurs, syntaxe plutĂŽt verbeuse...
Mais en fait, tous ces points qui sont censĂ©s ĂȘtre des dĂ©fauts, je les ai trouvĂ©s... apaisants. Moins de choix, moins de rĂ©flexions inutiles... donc moins de charge mentale. Attention, cela ne veut pas dire quâon ne peut pas ĂȘtre crĂ©atif avec Go. Câest un peu comme avec le protocole Gemini : ça paraĂźt simpliste et limitant, mais au final, avoir un cadre rigide pousse Ă la crĂ©ativitĂ©. Et câest justement lâobjectif de Go : coder plus vite, plus simplement, sans sacrifier la lisibilitĂ© ni la performance.
Et si je devais donner un ultime argument : un code compilĂ© en Go donne un unique binaire autonome, qui s'exĂ©cute sans aucune dĂ©pendance. MĂȘme pas besoin dâavoir Go installĂ© pour le lancer. Pour le DevOps, câest juste royal.
Découverte du langage Go pour les développeurs JavaScript
Pourquoi Maurice ne doit surtout pas coder en GO
Je ne sais pas encore si ce choix sâavĂ©rera judicieux sur la durĂ©e, mais pour lâinstant, il me convient parfaitement.
Structure du script
La structure du projet est assez simple :
- Récupération de l'IP actuelle
- Récupération de l'IP en mémoire
- Si les deux adresses ne sont pas concordantes, alors on récupÚre la liste des domaines et sous domaines à gérer
- Via l'API d'OVH on vient modifier l'adresse IP des DNS de type A pour chaque sous domaines
- Enregistrement de la nouvelle IP
Le tout avec des logs.
J'aurais Ă©galement besoin de deux fichiers, le premier qui ne contiendra que l'adresse IP "en mĂ©moire", .ip_history et un second qui contient les informations nĂ©cessaires Ă la gestion de l'API d'OVH, .godnsfile. Ces fichiers doivent ĂȘtre prĂ©sents Ă la racine du dossier home de l'utilisateur courant. Voici la structure du fichier .godnsfile :
Maintenant, on code
On est maintenant prĂȘt Ă passer Ă la phase la plus satisfaisante du projet : Ă©crire du code. JâĂ©cris finalement cette partie de lâarticle aprĂšs avoir terminĂ© le dĂ©veloppement de la solution, parce que câĂ©tait plus simple pour moi de rester concentrĂ© sur la dĂ©couverte du langage, de faire des allers-retours avec la documentation, et de tester plein de petites choses sans avoir Ă formuler tout ça proprement en mĂȘme temps. Bref, jâai prĂ©fĂ©rĂ© coder dâabord, Ă©crire ensuite. (tout le monde ne sait pas coder et blogguer en mĂȘme temps...)
On commence par la base : interroger mon service KIP et récupérer mon IP publique.
Je lance avec `go run main.go` et... magie ! Mon JSON sâaffiche dans le terminal. On a notre point de dĂ©part. C'est vraiment agrĂ©able d'avoir autant d'outils dĂ©jĂ intĂ©grĂ© au langage. Finalement, pour des scripts simples, la plus grande difficultĂ© de Go (de ce que j'en vois) est de connaĂźtre la bonne librairie de base pour rĂ©aliser l'action que l'on souhaite.
Notons lâutilisation de defer : un mot-clĂ© tout simple, mais super pratique. Il permet de diffĂ©rer la fermeture de la connexion HTTP Ă la fin de la fonction, sans risquer de lâoublier plus tard. Moins dâoublis, moins de bugs.
PlutÎt que de bricoler une extraction à coups de regex ou de split, Go propose de typer proprement une réponse JSON via une struct. Je pourrai me contenter de ne déclarer que le champ "ip", mais autant faire les choses proprement.
Câest lĂ quâon commence Ă sentir un des aspects les plus dĂ©criĂ©s de Go : sa gestion des erreurs. Chaque appel potentiellement risquĂ© est suivi dâun if err != nil { ... }. Câest clair, câest explicite, mais... quâest-ce que câest rĂ©pĂ©titif. Jâai vite trouvĂ© une astuce rĂ©currente dans les vidĂ©os de devs Go : crĂ©er une petite fonction utilitaire check() qui encapsule ce comportement, que je veux unique dans mon script : afficher l'erreur et planter comme un lĂąche. Et hop, on remplace tous les "if err != nil" par de simples appels Ă "check(err)". On rĂ©duit drastiquement le nombre de lignes de notre code.
Go nâest pas un langage orientĂ© objet dans le sens classique du terme, mais sa capacitĂ© Ă dĂ©finir des structures de donnĂ©es typĂ©es, propres et claires est franchement plaisante.
Certains parlent mĂȘme de "POO implicite" en Go, grĂące Ă lâusage de struct et de receiver functions.
La programmation orientée objet dans le langage Go
Bon, je ne vais pas réécrire tout le script ici. La suite consiste Ă utiliser la lib officielle dâOVH pour identifier les enregistrements DNS correspondants, les mettre Ă jour, et rafraĂźchir la zone.
Une fois le script fonctionnel, j'ai remplacé l'affichage des erreurs par un systÚme de log avec "gopkg.in/natefinch/lumberjack.v2. Ce qui me permet d'enchainer sur le systÚme d'import des dépendances.
Un truc que jâai vraiment apprĂ©ciĂ© en Go, câest son systĂšme de gestion des dĂ©pendances. Contrairement Ă Composer (PHP) ou Maven (Java), ici pas de fichier de conf Ă remplir Ă la main, pas de commandes Ă©sotĂ©riques pour initialiser un projet. Tu importes un package, tu fais un go run ou un go build, et Go tĂ©lĂ©charge tout ce quâil faut.
Et mĂȘme pour du code local (dans le mĂȘme projet), il est possible de structurer son application avec des packages maison. Il suffit de les placer dans des sous-dossiers, puis de les importer avec leur chemin relatif:
Pas besoin dâautoload, de configuration compliquĂ©e ni de rĂ©flexion sur lâarborescence du namespace. Autre point fort : Go impose de ne pas avoir de dĂ©pendances non utilisĂ©es, comme pour les variables. Si tu dĂ©clares un import que tu nâutilises pas... le compilateur tâenvoie bouler. Câest brutal, mais ça force Ă garder un code propre. Un peu Ă la Unix : chaque outil fait une chose, mais il le fait bien.
Conclusion
J'utilise le couple Kip et GoKeep depuis quelques semaines et j'en suis ravi. Ce projet mâa permis de poser mes premiĂšres briques en Go, et franchement... jâai adorĂ©.
Câest un langage qui respire la simplicitĂ© sans ĂȘtre simpliste. Jâai Ă peine effleurĂ© ce quâil propose : je nâai pas encore jouĂ© avec les pointeurs, ni touchĂ© aux goroutines ou aux channels, qui sont pourtant parmi les concepts les plus puissants de Go. Mais rien que ce petit script mâa donnĂ© envie dâaller plus loin, de creuser davantage, et surtout de réécrire d'autres outils que jâavais bricolĂ©s en PHP ou Bash avec ce nouveau langage. (Le moteur de ce blog ? Tempo ?)
Jâai ensuite demandĂ© Ă ChatGPT de me gĂ©nĂ©rer un joli README.md pour accompagner le projet. Oui j'utilise les outis d'IA (ou LLM) sans avoir honte... cela ferait un bon article de blog.
Le code est maintenant disponible sur mon dĂ©pĂŽt GitLab, pour ceux que ça intĂ©resse, ou pour les curieux qui veulent voir un exemple simple et concret dâusage de lâAPI OVH en Go.
dépÎt GIT du projet "GoKeep"
Et toi, quel est le projet, le besoin, qui t'as motivé à apprendre un langage de programmation, voir le langage Golang ?
---
Cet article vous plaßt ? Vous avez envie d'échanger avec moi sur ce sujet ?
Vous ĂȘtes plus mail que Mastodon ?
tags :
permalinks :
gemini://darkblog.lhoir.me/2025-05-27-live-blog-coding-et-golang.gmi
https://darkblog.lhoir.me/2025-05-27-live-blog-coding-et-golang.html