<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Geraud GAUZINS</title><link>https://www.ggauzins.fr/post/</link><description>Recent content in Posts on Geraud GAUZINS</description><generator>Hugo -- gohugo.io</generator><language>fr</language><lastBuildDate>Sat, 03 May 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://www.ggauzins.fr/post/index.xml" rel="self" type="application/rss+xml"/><item><title>👉 🏠 Présentation de mon infrastructure</title><link>https://www.ggauzins.fr/p/presentation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.ggauzins.fr/p/presentation/</guid><description>&lt;img src="https://www.ggauzins.fr/p/presentation/img/server-hpe.jpg" alt="Featured image of post 👉 🏠 Présentation de mon infrastructure" />&lt;h2 id="-projet-personnel--infrastructure-complète">🧪 Projet personnel – Infrastructure complète
&lt;/h2>&lt;h3 id="-virtualisation--xcp-ng--xen-orchestra">🖥️ Virtualisation – XCP-ng + Xen Orchestra
&lt;/h3>&lt;ul>
&lt;li>Hardware : HPE DL380 G9 Intel(R) Xeon(R) CPU E5-2697 v3 @ 2.60GHz (28c/56t) - RAM ECC 128 Go&lt;/li>
&lt;li>20+ machines virtuelles sous Debian, FreeBSD, Windows Server 2022, Home Assistant OS&lt;/li>
&lt;li>Services en VM : GitLab, Jellyfin, Docker, Pterodactyl, AD-DNS-DHCP, OPNsense, GestióIP, Nginx&lt;/li>
&lt;li>Services en conteneur : Traefik, Vaultwarden, Prometheus, Grafana, Homarr, Authentik&lt;/li>
&lt;li>Supervision centralisée avec Prometheus et Grafana&lt;/li>
&lt;li>Réseau segmenté par VLAN (IoT, Admin, LAN, DMZint, DMZext, PROD)&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="-conteneurisation--docker--portainer-ce">🐳 Conteneurisation – Docker + Portainer CE
&lt;/h3>&lt;ul>
&lt;li>Gestion de 5 nœuds Docker via Portainer, répartis sur mes sous-réseaux :
&lt;ul>
&lt;li>&lt;code>srv-traefik&lt;/code> : héberge le reverse proxy&lt;/li>
&lt;li>&lt;code>srv-docker-PROD&lt;/code> : conteneurs de monitoring/gestion (Prometheus, Grafana, Homarr,&amp;hellip;)&lt;/li>
&lt;li>&lt;code>srv-docker-DMZint&lt;/code> : conteneurs des services exposés sur internet via le reverse proxy&lt;/li>
&lt;li>&lt;code>srv-immich&lt;/code> : conteneur Immich (gestionnaire de photos)&lt;/li>
&lt;li>&lt;code>srv-docker-mediarr&lt;/code> : services pour la gestion des médias présents sur Jellyfin&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="-stockage--truenas-scale">💾 Stockage – TrueNAS SCALE
&lt;/h3>&lt;ul>
&lt;li>Hardware : HPE DL380 G9 Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz (16c/32t) - RAM ECC 128 Go&lt;/li>
&lt;li>2 pools ZFS :
&lt;ul>
&lt;li>&lt;code>GGcorp-pool&lt;/code> (RAID 6 – 12 HDD de 12 To - 43 To - SMB/NFS)&lt;/li>
&lt;li>&lt;code>nvme-pool&lt;/code> (RAID 0 – 2 NVMe de 1 To - 1.76 To - iSCSI)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Connexion iSCSI à l’hyperviseur via switch 10 GbE dédié&lt;/li>
&lt;li>Partages SMB/NFS pour les services et sauvegardes&lt;/li>
&lt;li>RAM ECC 128 Go – scrubbing régulier, température et S.M.A.R.T surveillés&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="-réseau-et-sécurité">🌐 Réseau et sécurité
&lt;/h3>&lt;ul>
&lt;li>Hardware :
&lt;ul>
&lt;li>Switch 24 ports DELL 5524 1 Gb/s&lt;/li>
&lt;li>MikroTik CRS309-1G-8S 10 Gb/s&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Schéma réseau complet modélisé avec Draw.io&lt;/li>
&lt;li>Routage inter-VLAN via double pare-feu OPNsense EXT/INT&lt;/li>
&lt;li>DMZ interne et externe, NAT, reverse proxy Traefik&lt;/li>
&lt;li>VLAN :
&lt;ul>
&lt;li>&lt;code>VLAN 2&lt;/code> : LAN utilisateur&lt;/li>
&lt;li>&lt;code>VLAN 3&lt;/code> : ADMIN&lt;/li>
&lt;li>&lt;code>VLAN 10&lt;/code> : PROD&lt;/li>
&lt;li>&lt;code>VLAN 11&lt;/code> : IoT&lt;/li>
&lt;li>&lt;code>VLAN 20&lt;/code> : DMZ interne&lt;/li>
&lt;li>&lt;code>VLAN 21&lt;/code> : DMZ externe&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr></description></item><item><title>🚀🛠️ Déploiement automatisé de mon portfolio avec GitLab et Docker</title><link>https://www.ggauzins.fr/p/projet-portfolio-gitlab-ci/</link><pubDate>Sat, 03 May 2025 00:00:00 +0000</pubDate><guid>https://www.ggauzins.fr/p/projet-portfolio-gitlab-ci/</guid><description>&lt;h1 id="-création-et-déploiement-automatisé-de-mon-portfolio-avec-gitlab-docker-et-traefik">🧠 Création et déploiement automatisé de mon portfolio avec GitLab, Docker et Traefik
&lt;/h1>&lt;h2 id="-introduction">🎯 Introduction
&lt;/h2>&lt;p>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.&lt;/p>
&lt;p>🔗 Dépôt GitLab du projet : &lt;a class="link" href="https://gitlab.ggcorp.ovh/GGauzins/portfolio" target="_blank" rel="noopener"
>https://gitlab.ggcorp.ovh/GGauzins/portfolio&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="-pourquoi-gitlab-">🧠 Pourquoi GitLab ?
&lt;/h2>&lt;p>J’ai choisi d’utiliser &lt;strong>GitLab&lt;/strong> comme plateforme principale pour héberger et déployer mon site pour plusieurs raisons :&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Self-hosting possible&lt;/strong> : 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.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Simplicité du déploiement&lt;/strong> : je n’ai qu’à cloner le dépôt, modifier, puis &lt;code>git push&lt;/code> pour publier.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Automatisation via CI/CD&lt;/strong> : GitLab construit l’image Docker à chaque commit.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Développement structuré&lt;/strong> : 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 (&lt;code>main&lt;/code>).&lt;/p>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="-idée-initiale--gitlab-pages">💡 Idée initiale : GitLab Pages
&lt;/h2>&lt;p>Mon idée de départ était d’héberger mon site via &lt;strong>GitLab Pages&lt;/strong> directement sur mon instance GitLab auto-hébergée.&lt;br>
Cette solution avait plusieurs avantages :&lt;/p>
&lt;ul>
&lt;li>Tout était intégré à GitLab (CI + Pages).&lt;/li>
&lt;li>Le déploiement statique Hugo était très simple.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Mais&lt;/strong> j’ai vite rencontré une limitation : &lt;strong>l’utilisation d’un domaine personnalisé (&lt;code>www.ggauzins.fr&lt;/code>) n’est pas possible sans une deuxième adresse IP publique&lt;/strong> sur le serveur GitLab. Cette contrainte réseau ne s’adaptait pas à mon infrastructure personnelle.&lt;/p>
&lt;hr>
&lt;h2 id="-nouvelle-stratégie--docker--watchtower">🔁 Nouvelle stratégie : Docker + Watchtower
&lt;/h2>&lt;p>Pour pallier cette contrainte, j’ai opté pour une solution &lt;strong>Dockerisée&lt;/strong> :&lt;/p>
&lt;ul>
&lt;li>Le site est généré avec Hugo via GitLab CI.&lt;/li>
&lt;li>Une image Docker est construite et poussée dans le GitLab Container Registry.&lt;/li>
&lt;li>Une &lt;strong>VM personnelle&lt;/strong> sous Docker exécute un conteneur basé sur cette image.&lt;/li>
&lt;li>&lt;strong>Watchtower&lt;/strong> surveille ce conteneur et tire automatiquement la dernière version publiée.&lt;/li>
&lt;/ul>
&lt;p>Résultat : je garde la simplicité d’un &lt;code>git push&lt;/code> pour publier, tout en gardant le contrôle total de l’hébergement et de mon domaine personnalisé.&lt;/p>
&lt;hr>
&lt;h2 id="-technologies-utilisées">🛠️ Technologies utilisées
&lt;/h2>&lt;ul>
&lt;li>&lt;a class="link" href="https://gohugo.io/" target="_blank" rel="noopener"
>Hugo&lt;/a> — Générateur de site statique&lt;/li>
&lt;li>&lt;a class="link" href="https://www.docker.com/" target="_blank" rel="noopener"
>Docker&lt;/a> — Conteneurisation du site&lt;/li>
&lt;li>&lt;a class="link" href="https://docs.gitlab.com/ee/ci/" target="_blank" rel="noopener"
>GitLab CI/CD&lt;/a> — Build et déploiement automatisé&lt;/li>
&lt;li>&lt;a class="link" href="https://docs.gitlab.com/ee/user/packages/container_registry/" target="_blank" rel="noopener"
>GitLab Container Registry&lt;/a> — Stockage des images&lt;/li>
&lt;li>&lt;a class="link" href="https://containrrr.dev/watchtower/" target="_blank" rel="noopener"
>Watchtower&lt;/a> — Déploiement automatisé des mises à jour Docker&lt;/li>
&lt;li>&lt;a class="link" href="https://traefik.io/" target="_blank" rel="noopener"
>Traefik&lt;/a> — Reverse proxy + gestion SSL avec Let’s Encrypt&lt;/li>
&lt;li>DNS OVH + (DNS challenge et wildcard)&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="-cicd-avec-gitlab">⚙️ CI/CD avec GitLab
&lt;/h2>&lt;p>Le pipeline GitLab CI (&lt;code>.gitlab-ci.yml&lt;/code>) est structuré en deux étapes :&lt;/p>
&lt;h3 id="build_image">&lt;code>build_image&lt;/code>
&lt;/h3>&lt;ul>
&lt;li>Construction de l’image Docker avec Hugo.&lt;/li>
&lt;li>Push dans le Container Registry GitLab.&lt;/li>
&lt;/ul>
&lt;h3 id="pages">&lt;code>pages&lt;/code>
&lt;/h3>&lt;ul>
&lt;li>Build statique Hugo (non utilisé ici en production, mais disponible).&lt;/li>
&lt;/ul>
&lt;p>Seule la branche &lt;code>main&lt;/code> déclenche le build et le push de l’image.&lt;/p>
&lt;hr>
&lt;h2 id="-fichier-gitlab-ciyml">🧾 Fichier &lt;code>.gitlab-ci.yml&lt;/code>
&lt;/h2>&lt;p>Voici la configuration complète utilisée pour automatiser la génération du site et la création de l’image Docker :&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;span class="lnt">60
&lt;/span>&lt;span class="lnt">61
&lt;/span>&lt;span class="lnt">62
&lt;/span>&lt;span class="lnt">63
&lt;/span>&lt;span class="lnt">64
&lt;/span>&lt;span class="lnt">65
&lt;/span>&lt;span class="lnt">66
&lt;/span>&lt;span class="lnt">67
&lt;/span>&lt;span class="lnt">68
&lt;/span>&lt;span class="lnt">69
&lt;/span>&lt;span class="lnt">70
&lt;/span>&lt;span class="lnt">71
&lt;/span>&lt;span class="lnt">72
&lt;/span>&lt;span class="lnt">73
&lt;/span>&lt;span class="lnt">74
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">variables&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">DART_SASS_VERSION&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;1.85.0&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">GIT_DEPTH&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">GIT_STRATEGY&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">clone&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">GIT_SUBMODULE_STRATEGY&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">recursive&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">HUGO_VERSION&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;0.144.2&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">NODE_VERSION&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;23.x&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">TZ&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Europe/Paris&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">stages&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">build_image&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">build_image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">stage&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">build_image&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">docker:latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">docker:dind&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">alias&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">docker&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">variables&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">DOCKER_HOST&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;tcp://docker:2375&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">DOCKER_TLS_CERTDIR&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">before_script&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">docker login -u gitlab-ci-token -p &amp;#34;$CI_JOB_TOKEN&amp;#34; &amp;#34;$CI_REGISTRY&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">docker info&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> docker build \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> --build-arg HUGO_VERSION=$HUGO_VERSION \
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> -t &amp;#34;$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA&amp;#34; .&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">docker push &amp;#34;$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> if [ &amp;#34;$CI_COMMIT_BRANCH&amp;#34; = &amp;#34;$CI_DEFAULT_BRANCH&amp;#34; ]; then
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> docker tag &amp;#34;$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA&amp;#34; &amp;#34;$CI_REGISTRY_IMAGE:latest&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> docker push &amp;#34;$CI_REGISTRY_IMAGE:latest&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> fi&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">allow_failure&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">rules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">if&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">when&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">on_success&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">when&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">never&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">pages&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">stage&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">golang:1.23.4-bookworm&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">apt-get update&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">apt-get install -y brotli&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">curl -LJO https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">tar -xf dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">cp -r dart-sass/ /usr/local/bin&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">rm -rf dart-sass*&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">export PATH=/usr/local/bin/dart-sass:$PATH&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">curl -LJO https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">apt-get install -y ./hugo_extended_${HUGO_VERSION}_linux-amd64.deb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">rm hugo_extended_${HUGO_VERSION}_linux-amd64.deb&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">curl -fsSL https://deb.nodesource.com/setup_${NODE_VERSION} | bash -&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">apt-get install -y nodejs&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s1">&amp;#39;[[ -f package-lock.json || -f npm-shrinkwrap.json ]] &amp;amp;&amp;amp; npm ci || true&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">hugo --gc --minify --baseURL ${CI_PAGES_URL}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">find public -type f -regex &amp;#39;.*\.(css|html|js|txt|xml)$&amp;#39; -exec gzip -f -k {} \;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">find public -type f -regex &amp;#39;.*\.(css|html|js|txt|xml)$&amp;#39; -exec brotli -f -k {} \;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">artifacts&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">paths&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">public&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">rules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">if&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">when&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">always&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">when&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">never&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="-dockerfile">🐋 Dockerfile
&lt;/h2>&lt;p>Le fichier &lt;code>Dockerfile&lt;/code> utilisé pour builder l’image Docker à partir du site Hugo :&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-dockerfile" data-lang="dockerfile">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># --- ÉTAPE 1 : builder avec Go et Hugo Extended ---&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> FROM golang:1.23.4-bookworm AS builder&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="c1"># variables&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> ARG &lt;span class="nv">HUGO_VERSION&lt;/span>&lt;span class="o">=&lt;/span>0.144.2&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="c1"># installer git et ca-certificates pour cloner Hugo et gérer HTTPS&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> RUN apt-get update &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> apt-get install -y --no-install-recommends git ca-certificates &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> rm -rf /var/lib/apt/lists/*&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="c1"># récupérer le code source de Hugo&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> WORKDIR /go/src/hugo&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> RUN git clone --branch v&lt;span class="si">${&lt;/span>&lt;span class="nv">HUGO_VERSION&lt;/span>&lt;span class="si">}&lt;/span> https://github.com/gohugoio/hugo.git . &lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="c1"># compiler Hugo avec le tag &amp;#39;extended&amp;#39;&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> RUN go build --tags extended -ldflags&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;-s -w&amp;#34;&lt;/span> -o /usr/local/bin/hugo&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="c1"># copier votre site et générer&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> WORKDIR /src&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> COPY . .&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> RUN /usr/local/bin/hugo --gc --minify&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="c1"># --- ÉTAPE 2 : runtime léger avec Nginx ---&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> FROM nginx:1.25-alpine AS runtime&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="c1"># on ne conserve que le dossier public généré&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> COPY --from&lt;span class="o">=&lt;/span>builder /src/public /usr/share/nginx/html&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> &lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> EXPOSE &lt;span class="m">80&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="err">&lt;/span> CMD &lt;span class="o">[&lt;/span>&lt;span class="s2">&amp;#34;nginx&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;-g&amp;#34;&lt;/span>, &lt;span class="s2">&amp;#34;daemon off;&amp;#34;&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="err">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="-reverse-proxy-avec-traefik">🌍 Reverse Proxy avec Traefik
&lt;/h2>&lt;h3 id="-site-principal--wwwggauzinsfr">🌐 Site principal – &lt;code>www.ggauzins.fr&lt;/code>
&lt;/h3>&lt;p>Voici la configuration utilisée pour exposer mon conteneur &lt;code>hugo-portfolio&lt;/code> :&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">http&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">routers&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">hugo-portfolio&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">entryPoints&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">websecure&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">rule&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Host(`www.ggauzins.fr`)&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">tls&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">certResolver&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">lets-encr&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">domains&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">main&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;www.ggauzins.fr&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">service&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">hugo-portfolio&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">redirect-naked&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">entryPoints&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">websecure&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">rule&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Host(`ggauzins.fr`)&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">middlewares&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">redirect-to-www&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">service&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">noop@internal&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">tls&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">certResolver&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">lets-encr&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">domains&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">main&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;ggauzins.fr&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">middlewares&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">redirect-to-www&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">redirectRegex&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">regex&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;^https?://ggauzins\.fr/(.*)&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">replacement&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;https://www.ggauzins.fr/&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">permanent&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">hugo-portfolio&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">loadBalancer&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">servers&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;http://172.16.20.7:8086/&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Cela permet :&lt;/p>
&lt;ul>
&lt;li>De sécuriser les deux domaines (&lt;code>www.&lt;/code> et nu) avec HTTPS via Let’s Encrypt.&lt;/li>
&lt;li>De rediriger automatiquement &lt;code>ggauzins.fr&lt;/code> vers &lt;code>www.ggauzins.fr&lt;/code>.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="-gitlab-pages--pagesggcorpovh">📁 GitLab Pages – &lt;code>*.pages.ggcorp.ovh&lt;/code>
&lt;/h3>&lt;p>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 :&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">http&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">routers&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">gitlab-pages&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">entryPoints&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;websecure&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">rule&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;HostRegexp(`^.+\.pages\.ggcorp\.ovh$`)&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">tls&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">certResolver&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">lets-encr&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">domains&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">main&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;pages.ggcorp.ovh&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">sans&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;*.pages.ggcorp.ovh&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">service&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">gitlab-pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">gitlab-pages&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">loadBalancer&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">servers&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;http://172.16.20.8:8090&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>⚠️ Cette configuration nécessite un &lt;strong>certificat wildcard&lt;/strong> via DNS challenge.&lt;br>
J’ai donc configuré &lt;strong>Traefik avec le DNS challenge OVH&lt;/strong> pour obtenir ce certificat automatiquement via Let’s Encrypt.&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="-docker-compose-utilisé">🐳 Docker Compose utilisé
&lt;/h2>&lt;p>Voici le fichier &lt;code>docker-compose.yml&lt;/code> que j’utilise sur ma VM pour exécuter le site et Watchtower :&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">portfolio&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">registry.gitlab.ggcorp.ovh/ggauzins/portfolio:latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">container_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">portfolio&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">restart&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">unless-stopped&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">ports&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;8086:80&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">watchtower&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">containrrr/watchtower&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">container_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">watchtower&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">environment&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">WATCHTOWER_POLL_INTERVAL=300 &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># toutes les 10 minutes&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">WATCHTOWER_CLEANUP=false &lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># supprime les anciennes images&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">/var/run/docker.sock:/var/run/docker.sock&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">command&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">portfolio&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Ce fichier permet :&lt;/p>
&lt;ul>
&lt;li>D’exécuter automatiquement l’image Docker générée par GitLab CI&lt;/li>
&lt;li>De mettre à jour automatiquement le conteneur dès qu’une nouvelle image est disponible dans le registre&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="-résultat-final">✅ Résultat final
&lt;/h2>&lt;ul>
&lt;li>Site en ligne avec HTTPS à l’adresse : &lt;a class="link" href="https://www.ggauzins.fr" target="_blank" rel="noopener"
>https://www.ggauzins.fr&lt;/a>&lt;/li>
&lt;li>Déploiement 100 % automatisé : un simple &lt;code>git push&lt;/code> suffit&lt;/li>
&lt;li>Image Docker toujours à jour sur ma VM grâce à Watchtower&lt;/li>
&lt;li>Domaine personnalisé et infrastructure maîtrisée&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="-conclusion">🔚 Conclusion
&lt;/h2>&lt;p>Ce projet m’a permis de mettre en pratique des compétences DevOps complètes :&lt;br>
CI/CD, conteneurisation, reverse proxy, gestion de certificat SSL, automatisation du déploiement.&lt;/p></description></item><item><title>🎓🖥️ Projet BTS : présentation de l'infrastructure</title><link>https://www.ggauzins.fr/p/projet-fin-bts/</link><pubDate>Thu, 23 May 2024 00:00:00 +0000</pubDate><guid>https://www.ggauzins.fr/p/projet-fin-bts/</guid><description>&lt;h1 id="plan-du-réseau">Plan du réseau
&lt;/h1>&lt;h2 id="schéma-physique">Schéma physique
&lt;/h2>&lt;p>&lt;img src="https://www.ggauzins.fr/p/projet-fin-bts/img/schema-physique.png"
width="601"
height="315"
srcset="https://www.ggauzins.fr/p/projet-fin-bts/img/schema-physique_hu_c7cd503c2f581476.png 480w, https://www.ggauzins.fr/p/projet-fin-bts/img/schema-physique_hu_c631e1fad77dea44.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="190"
data-flex-basis="457px"
>&lt;/p>
&lt;p>Notre réseau physique est composé de deux switch Cisco Catalyst 2960 qui sont notre cœur de réseau, d’un autre switch Cisco que nous n’utilisons pas et d’un switch DELL PowerConnect 2708 qui interconnecte nos 3 serveurs HPE de virtualisation. Nous avons aussi un NAS qnap nous permettant de stocker les backups des machines virtuelles et les ISO des OS utilisés pour la création des VM. Sur nos quatre switch nous utilisons le protocole 802.1q afin de taguer certains liens, notamment les trois liens allant des trois switch cœur de réseau au switch DELL et trois autres liens allant des serveurs au switch DELL nous permettant de créer des machines virtuelles sur n’importe quel VLAN (réseau). Notre lien internet arrive sur un port de SW02 qui se trouve dans le vlan WAN, ce qui nous permet de virtualiser notre pare-feu.&lt;/p>
&lt;p>Sur nos serveurs, nous avons installé l’OS XCP-ng pour la virtualisation. XCP‑ng est un projet de plate‑forme de virtualisation permettant de déployer des infrastructures de Machines Virtuelles. La plate‑forme est basée sur l’hyperviseur Xen et embarque l’API Xen (XAPI). XCP‑ng est un fork de la solution Citrix Hypervisor. Pour pouvoir administrer les serveurs XCP-ng, nous avons installé Xen Orchestra qui est une solution de gestion et de backup d&amp;rsquo;infrastructures et d&amp;rsquo;environnements virtuels basés sur Xen. Elle fonctionne aussi bien avec Citrix XenServer qu&amp;rsquo;avec XCP-ng.&lt;/p>
&lt;hr>
&lt;h2 id="schéma-logique">Schéma logique
&lt;/h2>&lt;p>&lt;img src="https://www.ggauzins.fr/p/projet-fin-bts/img/schema-logique.png"
width="876"
height="1055"
srcset="https://www.ggauzins.fr/p/projet-fin-bts/img/schema-logique_hu_ed24c22c7d4c5e79.png 480w, https://www.ggauzins.fr/p/projet-fin-bts/img/schema-logique_hu_48956d0968e4f695.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="83"
data-flex-basis="199px"
>&lt;/p>
&lt;hr>
&lt;h2 id="mots-de-passe-des-services-des-machines-virtuelles-et-du-matériel">Mots de passe des services, des machines virtuelles et du matériel
&lt;/h2>&lt;h3 id="identifiant-et-mots-de-passe-des-machines-virtuelles-accessibles-en-sshrdp">Identifiant et mots de passe des machines virtuelles accessibles en ssh/rdp
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Nom du serveur&lt;/th>
&lt;th>Identifiant&lt;/th>
&lt;th>Mot de passe&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>srv-glpi (ssh)&lt;/td>
&lt;td>glpi&lt;/td>
&lt;td>glpi&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>srv-docker-PROD (ssh)&lt;/td>
&lt;td>docker&lt;/td>
&lt;td>gsb$generique,1234&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>srv-docker-DMZ (ssh)&lt;/td>
&lt;td>docker&lt;/td>
&lt;td>gsb$generique,1234&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>srv-docker-MGT (ssh)&lt;/td>
&lt;td>docker&lt;/td>
&lt;td>gsb$generique,1234&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>srv-xoa (ssh)&lt;/td>
&lt;td>xoa&lt;/td>
&lt;td>gsb$generique,1234&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>srv-ad [DHCP,DNS,AD] (rdp)&lt;/td>
&lt;td>administrateur&lt;/td>
&lt;td>gsb$generique,1234&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3 id="identifiant-et-mots-de-passe-des-services">Identifiant et mots de passe des services
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Nom du service&lt;/th>
&lt;th>Nom de la VM où tourne le service&lt;/th>
&lt;th>Protocole/port d’accès&lt;/th>
&lt;th>Identifiant&lt;/th>
&lt;th>Mot de passe&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Xen Orchestra&lt;/td>
&lt;td>srv-xoa&lt;/td>
&lt;td>HTTPS&lt;/td>
&lt;td>admin&lt;/td>
&lt;td>gsb$generique,1234&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>qnap&lt;/td>
&lt;td>qnap&lt;/td>
&lt;td>HTTPS&lt;/td>
&lt;td>admin&lt;/td>
&lt;td>gsb$generique,1234&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Portainer&lt;/td>
&lt;td>srv-docker-MGT&lt;/td>
&lt;td>HTTPS:9443&lt;/td>
&lt;td>admin&lt;/td>
&lt;td>gsb$generique,1234&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Heimdall&lt;/td>
&lt;td>srv-docker-MGT&lt;/td>
&lt;td>HTTPS dashboard.a.net&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Grafana&lt;/td>
&lt;td>srv-docker-MGT&lt;/td>
&lt;td>HTTP:3000&lt;/td>
&lt;td>admin&lt;/td>
&lt;td>gsb$generique,1234&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Prometheus&lt;/td>
&lt;td>srv-docker-MGT&lt;/td>
&lt;td>HTTP:9090&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>snmp-exporter&lt;/td>
&lt;td>srv-docker-MGT&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>xen01,02&lt;/td>
&lt;td>srv-docker-MGT&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Wordpress&lt;/td>
&lt;td>srv-docker-PROD&lt;/td>
&lt;td>wordpress.a.net&lt;/td>
&lt;td>admin&lt;/td>
&lt;td>gsb$generique,1234&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3 id="identifiants-et-mots-de-passe-du-matériel">Identifiants et mots de passe du matériel
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Matériel&lt;/th>
&lt;th>Identifiant&lt;/th>
&lt;th>Mot de passe&lt;/th>
&lt;th>Accès&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Switchs&lt;/td>
&lt;td>admin&lt;/td>
&lt;td>changeme&lt;/td>
&lt;td>SSH&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>XCP-NG01,02&lt;/td>
&lt;td>root&lt;/td>
&lt;td>changeme&lt;/td>
&lt;td>Physique via KVM&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Linksys05253&lt;/td>
&lt;td>&lt;/td>
&lt;td>admin&lt;/td>
&lt;td>linksys.a.net&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="description-des-services">Description des services
&lt;/h2>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Service&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Wordpress&lt;/td>
&lt;td>Site vitrine exposé au réseau externe via le reverse-proxy Traefik.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Traefik&lt;/td>
&lt;td>Reverse proxy pour rediriger les requêtes http en fonction de l’url utilisée.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Heimdall&lt;/td>
&lt;td>Dashboard pour centraliser l’accès aux outils de gestion et de monitoring.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OPNsense&lt;/td>
&lt;td>OPNsense est une distribution open-source de pare-feu et de routeur basée sur le système d&amp;rsquo;exploitation FreeBSD. Elle offre une interface utilisateur conviviale et une gamme de fonctionnalités de sécurité avancées, y compris la détection d&amp;rsquo;intrusion, le filtrage de contenu, la gestion des réseaux privés virtuels (VPN),&amp;hellip;&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>XCP-ng&lt;/td>
&lt;td>XCP‑ng est un projet de plate‑forme de virtualisation permettant de déployer des infrastructures de Machines Virtuelles. La plate‑forme est basée sur l’hyperviseur Xen et embarque l’API Xen (XAPI). XCP‑ng est un fork de la solution Citrix Hypervisor.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Xen orchestra&lt;/td>
&lt;td>Xen Orchestra est une solution de gestion et de backup d&amp;rsquo;infrastructures et d&amp;rsquo;environnements virtuels basés sur Xen. Elle fonctionne aussi bien avec Citrix XenServer qu&amp;rsquo;avec XCP-ng.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Grafana&lt;/td>
&lt;td>Grafana est une plateforme open source de monitoring, analyse et visualisation des données systèmes en temps réel.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Prometheus&lt;/td>
&lt;td>Prometheus est un logiciel libre de surveillance informatique. Il enregistre des métriques en temps réel dans une base de données de séries temporelles (avec une capacité d&amp;rsquo;acquisition élevée) en se basant sur le contenu de point d&amp;rsquo;entrée exposé à l&amp;rsquo;aide du protocole HTTP.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>snmp-exporter&lt;/td>
&lt;td>Le snmp-exporter est un composant utilisé dans l&amp;rsquo;écosystème de surveillance Prometheus pour collecter des données à partir d&amp;rsquo;appareils utilisant le protocole SNMP&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>xen-exporter&lt;/td>
&lt;td>Le &amp;ldquo;xen-exporter&amp;rdquo; est un outil conçu pour exporter des métriques de XCP-ng (XenServer) vers Prometheus. Il s&amp;rsquo;agit d&amp;rsquo;un script Python qui collecte diverses statistiques système à partir de l&amp;rsquo;API RRD de XCP-ng.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Docker&lt;/td>
&lt;td>Service de conteneurisation pour faciliter le déploiement d’applications et optimiser les ressources utilisées. Trois serveurs Docker sont utilisés dans trois VLANs différents pour séparer les services.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Portainer&lt;/td>
&lt;td>Outil de gestion centralisée des serveurs docker. Nous l&amp;rsquo;utilisons pour déployer des stacks sur chaque serveur (équivalent au fichier docker-compose). Un conteneur Portainer est installé sur le serveur Docker-MGT et un conteneur Portainer-Agent est installé sur les deux autres.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>GLPI&lt;/td>
&lt;td>GLPI est un logiciel de gestion de services informatiques qui permet de gérer les ressources informatiques de l&amp;rsquo;infra. Il offre des fonctionnalités telles que l&amp;rsquo;inventaire des équipements et la gestion des tickets d&amp;rsquo;incidents et des demandes de support.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Active Directory&lt;/td>
&lt;td>Un serveur AD est un service de gestion d&amp;rsquo;annuaire pour les réseaux Windows. Il centralise l&amp;rsquo;administration et la sécurité des utilisateurs et des ressources, permettant l&amp;rsquo;authentification et l&amp;rsquo;autorisation sur le réseau. Nous l&amp;rsquo;utilisons pour les comptes d’utilisateur.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DNS&lt;/td>
&lt;td>Un serveur DNS interne traduit les noms de domaine en adresses IP pour les ordinateurs d&amp;rsquo;un réseau privé. Il facilite la résolution des noms pour les ressources internes, comme les sites web et les serveurs locaux. Cela améliore la gestion et l&amp;rsquo;efficacité des communications au sein du réseau d&amp;rsquo;entreprise.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DHCP&lt;/td>
&lt;td>Un serveur DHCP dans un réseau local attribue automatiquement des adresses IP aux dispositifs connectés, comme les ordinateurs et les smartphones. En présence d&amp;rsquo;une borne Wi-Fi, il permet aux appareils de se connecter sans configuration manuelle, simplifiant ainsi la gestion du réseau.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>QNAP&lt;/td>
&lt;td>Serveur NAS utilisé pour stocker les images ISO nécessaires à la création des machines virtuelles. Nous stockons également les backups des VMs*.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>*Nous n’avons pas mis en place de réelle stratégie de sauvegarde dû au fait que nous devions éteindre fréquemment les serveurs, on effectue une sauvegarde manuelle des VM avant chaque extinction. Une tâche de sauvegarde complète est programmée à 2h du matin mais dû à ces contraintes, elles ne sont pas effectuées.&lt;/p>
&lt;hr>
&lt;h2 id="plan-du-réseau-1">Plan du réseau
&lt;/h2>&lt;h3 id="vlans">Vlans
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Nom&lt;/th>
&lt;th>N° VLAN&lt;/th>
&lt;th>Adresse CIDR&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>PROD&lt;/td>
&lt;td>10&lt;/td>
&lt;td>172.16.10.0/24&lt;/td>
&lt;td>Serveurs de production&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>MGT&lt;/td>
&lt;td>11&lt;/td>
&lt;td>172.16.11.0/24&lt;/td>
&lt;td>VLAN Management&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DMZ&lt;/td>
&lt;td>100&lt;/td>
&lt;td>172.16.100.0/24&lt;/td>
&lt;td>DMZ&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>SI&lt;/td>
&lt;td>2&lt;/td>
&lt;td>192.168.2.0/24&lt;/td>
&lt;td>Service Informatique&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DG&lt;/td>
&lt;td>3&lt;/td>
&lt;td>192.168.3.0/24&lt;/td>
&lt;td>Direction Générale&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>EMP&lt;/td>
&lt;td>4&lt;/td>
&lt;td>192.168.4.0/24&lt;/td>
&lt;td>Employé&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>WAN&lt;/td>
&lt;td>110&lt;/td>
&lt;td>192.36.253.0/24&lt;/td>
&lt;td>WAN&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Notre adresse externe :&lt;/strong> &lt;code>192.36.253.10/24&lt;/code>&lt;/p>
&lt;hr>
&lt;h3 id="switchs">Switchs
&lt;/h3>&lt;h4 id="a-sw01">A-SW01
&lt;/h4>&lt;ul>
&lt;li>&lt;strong>État :&lt;/strong> Pas utilisé / pas configuré&lt;/li>
&lt;li>&lt;strong>Fast Ethernet :&lt;/strong> Aucun port utilisé&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h4 id="a-sw02">A-SW02
&lt;/h4>&lt;ul>
&lt;li>&lt;strong>Adresse de management :&lt;/strong> 172.16.11.2&lt;/li>
&lt;li>&lt;strong>Ports Fast Ethernet :&lt;/strong>
&lt;ul>
&lt;li>VLAN 11 : Fa0/1, Fa0/2&lt;/li>
&lt;li>VLAN 2 : Fa0/3&lt;/li>
&lt;li>VLAN 4 : Fa0/4&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Ports Gigabit Ethernet :&lt;/strong>
&lt;ul>
&lt;li>Trunk : &lt;span style="color: rgb(0, 0, 0); background-color: rgb(6, 128, 32);">Gi0/1 (vert)&lt;/span>, &lt;span style="color: rgb(0, 0, 0); background-color: rgb(182, 103, 1);">Gi0/2 (orange)&lt;/span>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h4 id="a-sw03">A-SW03
&lt;/h4>&lt;ul>
&lt;li>&lt;strong>Adresse de management :&lt;/strong> 172.16.11.3&lt;/li>
&lt;li>&lt;strong>Ports Fast Ethernet :&lt;/strong>
&lt;ul>
&lt;li>VLAN 2 : Fa0/1&lt;/li>
&lt;li>VLAN 3 : Fa0/2&lt;/li>
&lt;li>VLAN 4 : Fa0/3, Fa0/4&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Ports Gigabit Ethernet :&lt;/strong>
&lt;ul>
&lt;li>Trunk : &lt;span style="color: rgb(0, 0, 0); background-color: rgb(6, 128, 32);">Gi0/1 (vert)&lt;/span>, &lt;span style="color: rgb(0, 0, 0); background-color: rgb(1, 32, 211);">Gi0/2 (bleu)&lt;/span>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h4 id="a-sw04">A-SW04
&lt;/h4>&lt;ul>
&lt;li>&lt;strong>Gi0/1, Gi0/2, Gi0/3 et Gi0/4 :&lt;/strong> Vers les serveurs&lt;/li>
&lt;li>&lt;strong>Gi0/5 et Gi0/6 :&lt;/strong> Vers les switch A-SW02 et A-SW03&lt;/li>
&lt;li>&lt;strong>Gi0/7 :&lt;/strong> Vers le NAS de backup&lt;/li>
&lt;/ul>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Gi0/1 - Gi0/2&lt;/th>
&lt;th>Gi0/3 - Gi0/4&lt;/th>
&lt;th>Gi0/5 - Gi0/6&lt;/th>
&lt;th>Gi0/7 - Gi0/8&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Trunk&lt;/td>
&lt;td>Trunk&lt;/td>
&lt;td>&lt;span style="color: rgb(0, 0, 0); background-color: rgb(182, 103, 1);">Trunk&lt;/span>&lt;/td>
&lt;td>VLAN 2&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Trunk&lt;/td>
&lt;td>Trunk&lt;/td>
&lt;td>&lt;span style="color: rgb(0, 0, 0); background-color: rgb(1, 32, 211);">Trunk&lt;/span>&lt;/td>
&lt;td>-&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3 id="plan-des-ips">Plan des IPs
&lt;/h3>&lt;h4 id="vlan-de-management-mgt">VLAN de Management (MGT)
&lt;/h4>&lt;p>&lt;strong>Plage d&amp;rsquo;adresses :&lt;/strong> &lt;code>172.16.11.0/24&lt;/code>&lt;br>
&lt;strong>DHCP :&lt;/strong> de &lt;code>172.16.11.100&lt;/code> à &lt;code>172.16.11.150&lt;/code>&lt;/p>
&lt;p>Adresses statiques :&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Adresse IP&lt;/th>
&lt;th>Nom&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>172.16.11.1&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.11.2&lt;/td>
&lt;td>A-SW02&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.11.3&lt;/td>
&lt;td>A-SW03&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.11.4&lt;/td>
&lt;td>srv-xoa&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.11.5&lt;/td>
&lt;td>qnap&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.11.6&lt;/td>
&lt;td>srv-docker&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.11.7&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.11.8&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.11.9&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.11.10&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.11.11&lt;/td>
&lt;td>XCP-NG01&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.11.12&lt;/td>
&lt;td>XCP-NG02&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.11.13&lt;/td>
&lt;td>XCP-NG03&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.11.14&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.11.254&lt;/td>
&lt;td>OPNsense (FW + NTP)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Services hébergés sur &lt;code>srv-docker&lt;/code> (172.16.11.6)&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Port&lt;/th>
&lt;th>Service&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>80&lt;/td>
&lt;td>Heimdall&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>443&lt;/td>
&lt;td>Heimdall&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>9443&lt;/td>
&lt;td>Portainer&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>9090&lt;/td>
&lt;td>Prometheus&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3000&lt;/td>
&lt;td>Grafana&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3100&lt;/td>
&lt;td>Loki&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>9116&lt;/td>
&lt;td>SNMP Exporter&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>9116&lt;/td>
&lt;td>SNMP Exporter&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>116&lt;/td>
&lt;td>SNMP Exporter&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h4 id="vlan-de-production-prod">VLAN de Production (PROD)
&lt;/h4>&lt;p>&lt;strong>Plage d&amp;rsquo;adresses :&lt;/strong> &lt;code>172.16.10.0/24&lt;/code>&lt;br>
&lt;strong>DHCP :&lt;/strong> non&lt;/p>
&lt;p>Adresses statiques :&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Adresse IP&lt;/th>
&lt;th>Nom&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>172.16.10.1&lt;/td>
&lt;td>srv-dc&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.10.2&lt;/td>
&lt;td>srv-glpi&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.10.3&lt;/td>
&lt;td>srv-docker-prod&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.10.4&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.10.5&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.10.6&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.10.7&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.10.254&lt;/td>
&lt;td>OPNsense (FW + NTP)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Services hébergés sur &lt;code>srv-docker-prod&lt;/code> (172.16.10.3)&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Port&lt;/th>
&lt;th>Service&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>8081&lt;/td>
&lt;td>Wordpress&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h4 id="vlan-zone-dmz">VLAN zone DMZ
&lt;/h4>&lt;p>&lt;strong>Plage d&amp;rsquo;adresses :&lt;/strong> &lt;code>172.16.100.0/24&lt;/code>&lt;br>
&lt;strong>DHCP :&lt;/strong> non&lt;/p>
&lt;p>Adresses statiques :&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Adresse IP&lt;/th>
&lt;th>Nom&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>172.16.100.1&lt;/td>
&lt;td>srv-docker-dmz&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.100.2&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.100.3&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.100.4&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.100.5&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.100.6&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.100.7&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.100.8&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.100.9&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.100.10&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.100.11&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>172.16.100.254&lt;/td>
&lt;td>OPNsense (FW + NTP)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Services hébergés sur &lt;code>srv-docker-dmz&lt;/code> (172.16.100.1)&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Port&lt;/th>
&lt;th>Service&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>80&lt;/td>
&lt;td>EntryPoint HTTP&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>8080&lt;/td>
&lt;td>Web UI Traefik&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>443&lt;/td>
&lt;td>EntryPoints HTTPS&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h4 id="vlan-service-informatique-si">VLAN service informatique (SI)
&lt;/h4>&lt;p>&lt;strong>Plage d&amp;rsquo;adresses :&lt;/strong> &lt;code>192.168.2.0/24&lt;/code>&lt;br>
&lt;strong>DHCP :&lt;/strong> de &lt;code>192.168.2.1&lt;/code> à &lt;code>192.168.2.252&lt;/code>&lt;/p>
&lt;p>Adresses statiques :&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Adresse IP&lt;/th>
&lt;th>Nom&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>192.168.2.1&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>192.168.2.2&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>192.168.2.3&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>192.168.2.253&lt;/td>
&lt;td>Borne Wifi&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>192.168.2.254&lt;/td>
&lt;td>OPNsense (FW + NTP)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h4 id="vlan-employés-emp">VLAN employés (EMP)
&lt;/h4>&lt;p>&lt;strong>Plage d&amp;rsquo;adresses :&lt;/strong> &lt;code>192.168.4.0/24&lt;/code>&lt;br>
&lt;strong>DHCP :&lt;/strong> de &lt;code>192.168.4.1&lt;/code> à &lt;code>192.168.4.253&lt;/code>&lt;/p>
&lt;p>Adresses statiques :&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Adresse IP&lt;/th>
&lt;th>Nom&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>192.168.4.1&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>192.168.4.2&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>192.168.4.254&lt;/td>
&lt;td>OPNsense (FW + NTP)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h4 id="vlan-direction-générale-dg">VLAN direction générale (DG)
&lt;/h4>&lt;p>&lt;strong>Plage d&amp;rsquo;adresses :&lt;/strong> &lt;code>192.168.3.0/24&lt;/code>&lt;br>
&lt;strong>DHCP :&lt;/strong> de &lt;code>192.168.3.1&lt;/code> à &lt;code>192.168.3.253&lt;/code>&lt;/p>
&lt;p>Adresses statiques :&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Adresse IP&lt;/th>
&lt;th>Nom&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>192.168.3.1&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>192.168.3.2&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>192.168.3.254&lt;/td>
&lt;td>OPNsense (FW + NTP)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="la-vm-srv-ad">La VM srv-ad
&lt;/h2>&lt;p>L’annuaire AD, DHCP et DNS sont hébergés sur la même machine virtuelle appelée &lt;code>srv-ad&lt;/code>.&lt;br>
Cette VM assure plusieurs rôles essentiels au bon fonctionnement du réseau :&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Annuaire Active Directory (AD)&lt;/strong> : centralise l&amp;rsquo;authentification des utilisateurs et des équipements, permettant une gestion centralisée des comptes, des permissions et des politiques de sécurité.&lt;/li>
&lt;li>&lt;strong>Serveur DNS interne&lt;/strong> : résout les noms de domaine privés en adresses IP pour faciliter l&amp;rsquo;accès aux ressources internes (serveurs, sites internes, services réseau).&lt;/li>
&lt;li>&lt;strong>Serveur DHCP&lt;/strong> : attribue automatiquement des adresses IP aux équipements connectés aux VLANs, assurant une gestion dynamique et sans conflit des adresses réseau.&lt;/li>
&lt;li>&lt;strong>Authentification SSO (Single Sign-On)&lt;/strong> : l&amp;rsquo;Active Directory est également utilisé pour permettre l&amp;rsquo;authentification unique (SSO) sur différents services internes, évitant ainsi aux utilisateurs d&amp;rsquo;avoir à saisir leurs identifiants multiples fois.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="règles-de-nat-port-forward">Règles de NAT (Port Forward)
&lt;/h2>&lt;p>Traduction d&amp;rsquo;adresses réseau pour accéder aux ressources internes depuis l&amp;rsquo;extérieur.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Port 80 (HTTP)&lt;/strong> :
&lt;ul>
&lt;li>Redirection de l&amp;rsquo;IP public &lt;code>192.36.253.10&lt;/code> vers IP interne &lt;code>172.16.100.1&lt;/code> &lt;strong>(Traefik)&lt;/strong> sur le port 80.&lt;/li>
&lt;li>Interface : WAN.&lt;/li>
&lt;li>Port externe : 80 ➔ Port interne : 80 (HTTP).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="règles-de-pare-feu-firewall-rules">Règles de pare-feu (Firewall Rules)
&lt;/h2>&lt;p>Définissent les autorisations et les blocages du trafic réseau entrant et sortant.&lt;br>
Priorité donnée à la &lt;strong>sécurité des VLANs&lt;/strong> et à &lt;strong>l&amp;rsquo;accès contrôlé&lt;/strong> aux services.&lt;/p>
&lt;h3 id="wan">WAN
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Autoriser&lt;/strong> (pass) :
&lt;ul>
&lt;li>Protocole : IPv4 TCP&lt;/li>
&lt;li>Destination : 172.16.100.1 (port 80 / HTTP)&lt;/li>
&lt;li>Action : Autoriser le trafic entrant (Régle qui est associée avec celle du NAT)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Bloquer&lt;/strong> (block) :
&lt;ul>
&lt;li>Rejet des connexions non sollicitées.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="mgt-management">MGT (Management)
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Autoriser&lt;/strong> (pass) :
&lt;ul>
&lt;li>Trafic sortant autorisé.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Bloquer&lt;/strong> (block) :
&lt;ul>
&lt;li>Rejet explicite de connexions non autorisées.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="emp-employés">EMP (Employés)
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Autoriser&lt;/strong> (pass) :
&lt;ul>
&lt;li>Trafic sortant vers le réseau interne autorisé.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Bloquer&lt;/strong> (block) :
&lt;ul>
&lt;li>Refus des connexions sortantes vers PROD.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="dmz">DMZ
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Autoriser&lt;/strong> (pass) :
&lt;ul>
&lt;li>Trafic autorisé vers Internet et vers PROD pour le serveur web.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Bloquer&lt;/strong> (block) :
&lt;ul>
&lt;li>Rejet par défaut de tout trafic non autorisé.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="relai-dhcp">Relai DHCP
&lt;/h2>&lt;p>Mise en place d&amp;rsquo;un &lt;strong>relai DHCP&lt;/strong> permettant aux VLANs de recevoir des adresses IP dynamiquement depuis le serveur DHCP centralisé (srv-ad).&lt;/p>
&lt;p>&lt;img src="https://www.ggauzins.fr/p/projet-fin-bts/img/relai-DHCP.png"
width="1195"
height="559"
srcset="https://www.ggauzins.fr/p/projet-fin-bts/img/relai-DHCP_hu_656c602a26be12fa.png 480w, https://www.ggauzins.fr/p/projet-fin-bts/img/relai-DHCP_hu_fdac387d9e173b54.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="213"
data-flex-basis="513px"
>&lt;/p>
&lt;hr>
&lt;h2 id="auteur">Auteur
&lt;/h2>&lt;p>Projet réalisé dans le cadre de l&amp;rsquo;épreuve de fin d&amp;rsquo;année de BTS&lt;br>
📅 Année : 2024&lt;br>
👨‍🎓 Étudiant : Géraud GAUZINS &lt;br>
🏫 Établissement : Lycée Monnet-Mermoz à Aurillac&lt;/p></description></item></channel></rss>