🧠 Création et déploiement automatisé de mon portfolio avec GitLab, Docker et Traefik
🎯 Introduction
Dans le cadre de mon portfolio professionnel, j’ai souhaité mettre en ligne un site statique pour présenter mes projets et mes compétences. Ce site devait être simple à maintenir, facilement modifiable et intégré dans une logique DevOps.
🔗 Dépôt GitLab du projet : https://gitlab.ggcorp.ovh/GGauzins/portfolio
🧠 Pourquoi GitLab ?
J’ai choisi d’utiliser GitLab comme plateforme principale pour héberger et déployer mon site pour plusieurs raisons :
Self-hosting possible : GitLab peut être hébergé sur mes propres serveurs, ce qui me donne un contrôle total sur mon infrastructure, la sécurité et les données.
Simplicité du déploiement : je n’ai qu’à cloner le dépôt, modifier, puis
git push
pour publier.Automatisation via CI/CD : GitLab construit l’image Docker à chaque commit.
Développement structuré : je peux développer ou tester mon site sur des branches secondaires sans impacter la production. Le déploiement ne se déclenche que sur la branche principale (
main
).
💡 Idée initiale : GitLab Pages
Mon idée de départ était d’héberger mon site via GitLab Pages directement sur mon instance GitLab auto-hébergée.
Cette solution avait plusieurs avantages :
- Tout était intégré à GitLab (CI + Pages).
- Le déploiement statique Hugo était très simple.
Mais j’ai vite rencontré une limitation : l’utilisation d’un domaine personnalisé (www.ggauzins.fr
) n’est pas possible sans une deuxième adresse IP publique sur le serveur GitLab. Cette contrainte réseau ne s’adaptait pas à mon infrastructure personnelle.
🔁 Nouvelle stratégie : Docker + Watchtower
Pour pallier cette contrainte, j’ai opté pour une solution Dockerisée :
- Le site est généré avec Hugo via GitLab CI.
- Une image Docker est construite et poussée dans le GitLab Container Registry.
- Une VM personnelle sous Docker exécute un conteneur basé sur cette image.
- Watchtower surveille ce conteneur et tire automatiquement la dernière version publiée.
Résultat : je garde la simplicité d’un git push
pour publier, tout en gardant le contrôle total de l’hébergement et de mon domaine personnalisé.
🛠️ Technologies utilisées
- Hugo — Générateur de site statique
- Docker — Conteneurisation du site
- GitLab CI/CD — Build et déploiement automatisé
- GitLab Container Registry — Stockage des images
- Watchtower — Déploiement automatisé des mises à jour Docker
- Traefik — Reverse proxy + gestion SSL avec Let’s Encrypt
- DNS OVH + (DNS challenge et wildcard)
⚙️ CI/CD avec GitLab
Le pipeline GitLab CI (.gitlab-ci.yml
) est structuré en deux étapes :
build_image
- Construction de l’image Docker avec Hugo.
- Push dans le Container Registry GitLab.
pages
- Build statique Hugo (non utilisé ici en production, mais disponible).
Seule la branche main
déclenche le build et le push de l’image.
🧾 Fichier .gitlab-ci.yml
Voici la configuration complète utilisée pour automatiser la génération du site et la création de l’image Docker :
|
|
🐋 Dockerfile
Le fichier Dockerfile
utilisé pour builder l’image Docker à partir du site Hugo :
|
|
🌍 Reverse Proxy avec Traefik
🌐 Site principal – www.ggauzins.fr
Voici la configuration utilisée pour exposer mon conteneur hugo-portfolio
:
|
|
Cela permet :
- De sécuriser les deux domaines (
www.
et nu) avec HTTPS via Let’s Encrypt. - De rediriger automatiquement
ggauzins.fr
verswww.ggauzins.fr
.
📁 GitLab Pages – *.pages.ggcorp.ovh
Même si je n’utilise pas GitLab Pages pour le site final, j’ai quand même configuré Traefik pour qu’ils soient accessibles si besoin :
|
|
⚠️ Cette configuration nécessite un certificat wildcard via DNS challenge.
J’ai donc configuré Traefik avec le DNS challenge OVH pour obtenir ce certificat automatiquement via Let’s Encrypt.
🐳 Docker Compose utilisé
Voici le fichier docker-compose.yml
que j’utilise sur ma VM pour exécuter le site et Watchtower :
|
|
Ce fichier permet :
- D’exécuter automatiquement l’image Docker générée par GitLab CI
- De mettre à jour automatiquement le conteneur dès qu’une nouvelle image est disponible dans le registre
✅ Résultat final
- Site en ligne avec HTTPS à l’adresse : https://www.ggauzins.fr
- Déploiement 100 % automatisé : un simple
git push
suffit - Image Docker toujours à jour sur ma VM grâce à Watchtower
- Domaine personnalisé et infrastructure maîtrisée
🔚 Conclusion
Ce projet m’a permis de mettre en pratique des compétences DevOps complètes :
CI/CD, conteneurisation, reverse proxy, gestion de certificat SSL, automatisation du déploiement.