
5 mai 2026
Après avoir multiplié les petits projets personnels, j’ai voulu reprendre la main sur toute la chaîne de développement : héberger mes dépôts, lancer mes automatisations et suivre les Pull Requests sans dépendre uniquement de plateformes externes. J’ai donc mis en place une forge personnelle avec Forgejo, accompagnée d’un runner, de Renovate et de mon instance Hermes Agent sur VPS pour automatiser une partie des reviews.
Je cherchais une forge légère, simple à maintenir et suffisamment complète pour un usage personnel : dépôts Git, issues, Pull Requests, gestion des utilisateurs et intégration avec des runners. Forgejo répond bien à ce besoin. L’interface reste familière, la consommation est raisonnable, et l’administration est plus simple qu’une plateforme beaucoup plus lourde.

La plateforme repose sur trois briques : le service Forgejo, un moteur d’exécution isolé pour les jobs, et un runner chargé de lancer les automatisations. Cette séparation permet de garder la forge lisible tout en évitant de mélanger l’hébergement des dépôts et l’exécution des workflows.
Le choix Docker Compose rend la stack lisible : un service pour la forge, un service pour l’exécution des jobs, et un service pour le runner. Je peux sauvegarder les données utiles et redéployer l’ensemble sans reconstituer la configuration à la main.
J’ai choisi une approche rootless pour limiter les privilèges du service principal. Les données restent persistantes, et la configuration garde des dates cohérentes dans l’interface comme dans les logs.
L’interface web et les opérations Git en SSH restent séparées. Cela permet de distinguer clairement l’usage utilisateur, l’accès Git et l’exposition publique gérée par le reverse proxy.
Pour exécuter des jobs, j’ai ajouté un runner Forgejo. Il s’appuie sur un conteneur Docker-in-Docker qui expose le daemon Docker uniquement sur le réseau interne Compose. Le runner utilise ensuite ce moteur interne pour créer les environnements nécessaires aux automatisations.
Le moteur d’exécution des jobs demande de rester prudent : il doit rester isolé et réservé aux workflows que je contrôle. Dans mon cas, il sert surtout à automatiser mes propres dépôts et à éviter d’exécuter ces tâches directement sur l’hôte.

J’ai aussi mis en place Renovate pour surveiller les dépendances de mes projets. L’objectif n’est pas de tout mettre à jour automatiquement sans contrôle, mais de recevoir des Pull Requests claires, avec le changelog et le contexte nécessaire pour décider rapidement si la mise à jour est acceptable.
Sur une forge personnelle, Renovate est particulièrement utile parce qu’il évite l’accumulation de petites versions oubliées. Les mises à jour arrivent sous forme de PR, ce qui garde une trace propre des changements et permet de tester avant de fusionner.

Pour aller plus loin, j’ai relié la forge à mon instance Hermes Agent hébergée sur un VPS. L’idée est d’avoir une première review automatique sur les Pull Requests : repérer les changements risqués, signaler les incohérences évidentes et m’aider à relire plus vite sans remplacer la validation humaine.
Cette partie est surtout intéressante sur les PR générées par Renovate. Hermes peut donner un premier avis sur la portée du changement, ce qui me permet de prioriser les mises à jour simples et de garder plus d’attention pour les modifications qui touchent au build, à la sécurité ou à la configuration.
Cette forge personnelle me donne une chaîne de développement plus autonome : les dépôts sont hébergés chez moi, les jobs peuvent tourner via le runner, Renovate garde les dépendances sous surveillance et Hermes Agent apporte une première lecture automatique des Pull Requests. Le tout reste assez simple à maintenir grâce à Docker Compose, tout en laissant la possibilité d’ajouter progressivement de nouveaux workflows.