Déployer Hudu auto-hébergé sur Azure Container Apps avec Terraform

June 11, 2026
8 min

Un article de Jérémy Frandon

Pourquoi diable migrer vers Azure ?

Hudu est la source documentaire principale de nexxo. Tous nos techniciens TI en dépendent pour répondre aux demandes de nos clients. Ce n'est donc pas exagéré de dire qu'Hudu est un outil critique pour nexxo.

Jusqu'à récemment, nous hébergions Hudu sur un Droplet de DigitalOcean, conformément au tutoriel disponible sur leur site.

Ce déploiement fonctionnait bien mais avait trois limitations:

  • Les backups automatiques de la VM DigitalOcean étaient lourdes et ne permettaient pas facilement de changer de fournisseur.
  • La VM devait être changée pour un modèle avec plus de RAM lorsque trop de techniciens y travaillaient en même temps (surtout après une période d'embauche), puis elle était sous-utilisée par l'équipe de techniciens de nuit.

Ayant constaté cela, et fort de mon expérience dans le déploiement d'applications web sur mesure pour nos clients Automatisation/IA, j'ai proposé à notre directeur des opérations d'étudier la possibilité de déployer Hudu dans notre environnement Azure.

Ce déploiement permettrait :

  • Une gestion des backups de fichiers et de bases de données en copies instantanées
  • Une élasticité intrajournalière de l'affectation des ressources
  • La possibilité pour tous les membres Automatisation/IA d'effectuer les actions de maintenance

Et dans cet article je vous montre comment nous nous y sommes pris, de la rétro-ingénierie du déploiement officiel jusqu'à la soirée de bascule.

Chaque composant du docker-compose.yml a son équivalent Azure, et l'ensemble tient en un seul module Terraform.

La documentation ? Là où l'on va, on n'a pas besoin de documentation

Si vous cherchez le guide officiel pour déployer Hudu sur Azure, vous ne le trouverez pas (du moins, il n'existait pas encore au moment de la rédaction de cet article). Cependant, le guide de self-host officiel nous explique comment Hudu fonctionne via trois fichiers : .env, docker-compose.yml et default.conf.

En comprenant chacun de ces fichiers, nous pouvons trouver les équivalents Azure aux ressources auto-hébergées sur la machine virtuelle.

  • Le fichier .env permet la configuration de Hudu. Le fichier default.conf permet la configuration de nginx en serveur mandataire.
  • Le fichier docker-compose.yml définit plusieurs services: interagissant entre eux pour faire fonctionner l'application: une base de données PostgreSQL, un cache Redis, l'application Hudu hududocker/hudu:latest, l'exécuteur de tâches Hudu bundle exec sidekiq -C config/sidekiq.yml, et un serveur mandataire de sécurité linuxserver/swag.

Un conteneur, ça ne se souvient de rien

Je ne vais pas ici passer en revue les subtilités de docker-compose ou de la spécification des conteneurs OCI; gardez simplement à l'esprit que les conteneurs sont une méthode standard d'empaquetage d'application, et qu'il existe plusieurs plateformes pour exécuter ces applications comme Docker, Podman, Kubernetes, et Azure Container Apps

Chez nexxo nous utilisons cette dernière option pour héberger les automatisations et applications sur mesure de nos clients ; il était donc temps de nous autoéquiper.

Le principe de base du déploiement de conteneurs infonuagiques est de n'y conserver aucun état permanent. Si une application crashe, elle doit pouvoir être redémarrée instantanément sans perte de données. C'est pourquoi nous n'allons pas déployer PostgreSQL dans Azure Container App, mais seulement Hudu et Redis.

Pour les curieux, voici notre code Terraform, qui est presque une simple traduction du docker-compose.yml.

Le point clé ici est min_replicas = 0 : lorsque personne ne travaille la nuit, le conteneur s'arrête complètement et ne génère aucun coût de calcul. Les readiness_probe et liveness_probe s'assurent qu'Azure ne dirige pas de trafic vers un conteneur pas encore prêt à répondre.

PostgreSQL c'est PostgreSQL

J'écrivais tantôt qu'il est déconseillé de stocker les états dans Docker. Où donc héberger la base de données?

Il se trouve qu'Azure propose un service de base de données PostgreSQL géré: Azure Database pour PostgreSQL. C'est exactement ce qu'il nous faut pour notre base de données Hudu. De plus, le dépôt Azure Verified Modules a un module Terraform nous permettant de configurer la base de données facilement.

À la fin de cette section vous trouverez le code Terraform que nous utilisons. Il faut cependant noter la configuration azure.extensions; Hudu utilise certaines extensions PostgreSQL activées par défaut dans le déploiement Docker qui doivent être autorisées dans la configuration Azure avant d'être chargées. Le reste de la configuration est standard pour une base de données Azure à faible coût. La documentation des valeurs du module se trouve ici.

Nous avons volontairement choisi le SKU B_Standard_B2s — le moins cher disponible — avec la possibilité de le faire évoluer facilement si les besoins changent. C'est exactement l'élasticité qu'on ne pouvait pas obtenir sur DigitalOcean sans intervention manuelle.

S3 c'est (Presque) Blob

Les lecteurs avertis auront remarqué qu'il y a un autre état précédemment stocké dans Docker pour la configuration docker-compose.yml. Il s'agit des volumes:. Ceux-ci sont des systèmes de fichiers persistants pour Hudu et Redis. Or, j'ai précédemment indiqué que pour notre nouveau déploiement tous les fichiers associés à un conteneur sont perdus au redémarrage.

Pour Redis, qui est utilisé ici comme cache et non comme base de données, ce n'est pas grave. On peut accepter un peu de lenteur et que Hudu fasse des requêtes à la base de données le temps de réchauffer le cache.

Pour Hudu, les volumes sont utilisés pour stocker les pièces jointes de documentation. C'est une fonction critique qu'on ne peut simplement désactiver. Que faire?

Heureusement Hudu supporte de désactiver l'utilisation du système de fichiers au profit de n'importe quel hébergeur de fichiers supportant le protocole S3 nativement. Dans notre déploiement précédent nous utilisions un Espace de stockage d'objet de DigitalOcean. Mais nous souhaitons également porter ce stockage vers Azure. Cependant Azure ne supporte pas le protocole S3. Il faut donc trouver un adaptateur entre le protocole Azure Blob et S3. Depuis la dépréciation et suppression de Minio Gateway, il n'y a pas beaucoup d'alternatives abordables. Flexify.io a une fonction gateway dans leur édition communautaire. Leur documentation est très limitée, mais après plusieurs tentatives je suis arrivé au code Terraform suivant qui fonctionne.

Retrouvez ci-dessous le code Terraform pour le déploiement d'un Blob et de l'adaptateur Flexify dans un Container App.

Le principe est simple : Flexify reçoit les clés d'accès Azure Blob et expose un endpoint compatible S3 vers lequel Hudu peut pointer. Du point de vue de Hudu, rien ne change — il parle S3 comme avant. La partie compliquée était de trouver les bons arguments CLI pour le mapping de bucket virtuel, d'où les nombreuses tentatives mentionnées.

SSL & DNS

Une fois tous les composants de Hudu hébergés, il ne reste plus qu'à le mettre en ligne. Nous utilisions déjà Cloudflare comme DNS et le serveur mandataire de sécurité s'occupait de charger et renouveler le certificat.

Le code Terraform ci-dessous n'a rien de particulier. Il fait juste collaborer Cloudflare TLS Acme/Let's Encrypt et le Container App

La nuit de la bascule

En début de soirée, nous avons fait un premier pg_dump pour sauvegarder la base de données avant tout changement et déplacement. Nous avons ensuite mis à jour Hudu à sa dernière version mineure, tout juste sortie. Puis nous avons fait un deuxième pg_dump pour pg_restore dans la base de données Azure. C'est le moment qui concentre le risque maximal : les données ont bougé, mais l'application pointe encore vers l'ancienne base. Toute l'équipe avait le doigt sur le retour arrière.

Pendant ce temps, nous utilisions rclone (merci à Pierre-Baptiste d'avoir recommandé cet outil) pour copier les données du S3 sur DigitalOcean vers le nouveau.

Une fois les copies terminées, nous avons changé les configurations du .env sur DigitalOcean pour pointer vers les nouveaux services et vérifier la compatibilité. Dans l'éventualité d'une erreur, nous aurions simplement retourné vers l'ancienne configuration. Avoir répété ce retour arrière la semaine précédente nous a permis d'aborder cette étape sereinement. Étant donné qu'il n'y a pas eu d'erreur, il ne restait plus qu'à déployer la Container App d'Hudu.

Conclusion

Hudu est maintenant déployé dans Azure. J'ai rédigé les procédures de sauvegarde et de récupération. Deux mois après la migration, l'élasticité à zéro réplique la nuit a déjà réduit notre facture de calcul de façon visible. Et surtout, plusieurs membres de l'équipe Automatisation/IA peuvent maintenant effectuer une mise à jour de version en autonomie, sans solliciter notre directeur des opérations ; ce qui était l'objectif premier. Je vous ferai peut-être part des tests et résultats dans un prochain billet 😉

Gardez une longueur d'avance grâce aux conseils d'experts

Abonnez-vous à notre infolettre pour recevoir les derniers conseils et mises à jour dans l'industrie de la technologie.