<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: yohann streibel</title>
    <description>The latest articles on DEV Community by yohann streibel (@yohann_streibel_7e1f7b4b8).</description>
    <link>https://dev.to/yohann_streibel_7e1f7b4b8</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2880966%2F7c05addc-b0f9-4811-9b22-121f24158f04.png</url>
      <title>DEV Community: yohann streibel</title>
      <link>https://dev.to/yohann_streibel_7e1f7b4b8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yohann_streibel_7e1f7b4b8"/>
    <language>en</language>
    <item>
      <title>DevOps Rex 2025 : Retour sur deux jours de conférences</title>
      <dc:creator>yohann streibel</dc:creator>
      <pubDate>Mon, 15 Dec 2025 10:38:52 +0000</pubDate>
      <link>https://dev.to/onepoint/devops-rex-2025-retour-sur-deux-jours-de-conferences-3908</link>
      <guid>https://dev.to/onepoint/devops-rex-2025-retour-sur-deux-jours-de-conferences-3908</guid>
      <description>&lt;p&gt;&lt;strong&gt;10-11 décembre 2025 — Cité des Sciences, Paris&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La 6ᵉ édition de DevOps Rex a rassemblé la communauté DevOps francophone pour deux jours de retours d'expérience 100% terrain. L'événement s'est tenu en parallèle du salon &lt;strong&gt;Open Source Experience&lt;/strong&gt;, le rendez-vous européen des solutions open source. Les participants pouvaient ainsi alterner entre les conférences DevOps Rex et les stands de présentation des éditeurs de logiciels open source dans l'espace Solutions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Programme des talks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Jour 1 — Mercredi 10 décembre
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Horaire&lt;/th&gt;
&lt;th&gt;Talk&lt;/th&gt;
&lt;th&gt;Intervenant&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10h10 - 10h30&lt;/td&gt;
&lt;td&gt;Codeshift : Démarche DevSecOps chez les Ops de BPCE-IT&lt;/td&gt;
&lt;td&gt;Julien Fouqueray, Clément Rochas (BPCE-IT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10h30 - 11h00&lt;/td&gt;
&lt;td&gt;Engineering Platform boostée à l'IA : ok mais pour quoi faire ?&lt;/td&gt;
&lt;td&gt;Matthieu Vincent (Sopra Steria)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11h30 - 12h00&lt;/td&gt;
&lt;td&gt;Comment nous avons mis en place la pratique DevSecOps chez Orange&lt;/td&gt;
&lt;td&gt;Girija Saint-Ange, Cédric Olivier (Orange)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12h00 - 12h15&lt;/td&gt;
&lt;td&gt;Confiance opérationnelle : quand Sécurité et Delivery co-conçoivent les modèles d'accès&lt;/td&gt;
&lt;td&gt;Isabelle Kraemer (Datadog)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14h00 - 14h25&lt;/td&gt;
&lt;td&gt;Keynote : La géopolitique du numérique&lt;/td&gt;
&lt;td&gt;Ophélie Coelho (IRIS / CIS - CNRS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14h25 - 14h55&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Quitter AWS : une migration vers le cloud souverain (presque) sans douleur&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Jérôme Galais (Kaliop)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14h55 - 15h25&lt;/td&gt;
&lt;td&gt;Migration de la plateforme Data de Matmut sur le cloud S3NS&lt;/td&gt;
&lt;td&gt;Pascal Deshayes (TerraOps), Jean-Jacques Mok (Matmut)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Jour 2 — Jeudi 11 décembre
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Horaire&lt;/th&gt;
&lt;th&gt;Talk&lt;/th&gt;
&lt;th&gt;Intervenant&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10h05 - 10h25&lt;/td&gt;
&lt;td&gt;L'importance du contexte en IA x Infra : Votre infrastructure est un graphe&lt;/td&gt;
&lt;td&gt;Roxane Fischer (Anyshift.io)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10h30 - 11h00&lt;/td&gt;
&lt;td&gt;Agentic AI : Et si c'était l'IA qui faisait ta code review ?&lt;/td&gt;
&lt;td&gt;Oussama Abai, Kenza Barnier (Les Filles &amp;amp; Les Garçons de la Tech)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11h30 - 12h00&lt;/td&gt;
&lt;td&gt;Industrialiser un LLMaaS souverain : scalabilité, sécurité… et une IA qui aide à se créer elle-même&lt;/td&gt;
&lt;td&gt;Alexandru Lata (Cloud Temple)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12h00 - 12h30&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ChatBot/RAG 100% Souverain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Antoine Durand (Accure IT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14h00 - 14h35&lt;/td&gt;
&lt;td&gt;Unifier le delivery legacy et cloud-native : le défi DevOps d'iMSA&lt;/td&gt;
&lt;td&gt;Nicolas Cazottes (iMSA)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Focus #1 : Quitter AWS — Migration cloud souverain (Kaliop)
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Le coup de cœur de Yohann&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Le contexte
&lt;/h3&gt;

&lt;p&gt;Jérôme Galais (Technical Expert DevOps &amp;amp; Cloud chez Kaliop) a présenté l'accompagnement d'une entreprise en forte croissance sur une application de monitoring hébergée sur AWS. L'audit préalable révélait plusieurs problèmes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infrastructure AWS plus suffisamment optimisée&lt;/li&gt;
&lt;li&gt;Plusieurs clusters Elasticsearch sur instances EC2&lt;/li&gt;
&lt;li&gt;Utilisation d'AWS Kinesis pour la brique temps réel&lt;/li&gt;
&lt;li&gt;Application Python utilisant beaucoup de ressources&lt;/li&gt;
&lt;li&gt;Portabilité de code limitée&lt;/li&gt;
&lt;li&gt;Empilement de dette technique dû à une forte croissance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Contrainte majeure&lt;/strong&gt; : réduire les coûts de 50%.&lt;/p&gt;

&lt;h3&gt;
  
  
  Les chiffres de la plateforme
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrique&lt;/th&gt;
&lt;th&gt;Valeur&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Utilisateurs&lt;/td&gt;
&lt;td&gt;80 000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clients actifs&lt;/td&gt;
&lt;td&gt;22 000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clés Redis&lt;/td&gt;
&lt;td&gt;6 millions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opérations/seconde&lt;/td&gt;
&lt;td&gt;1 000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bande passante moyenne&lt;/td&gt;
&lt;td&gt;10 Go&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  La solution : Scaleway avec bare metal + services managés
&lt;/h3&gt;

&lt;p&gt;L'équipe a migré d'AWS vers &lt;strong&gt;Scaleway&lt;/strong&gt;, adoptant une architecture hybride combinant services managés et serveurs physiques (ElasticMetal) :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Services managés (Scaleway)&lt;/strong&gt; : Load balancer, Kubernetes, Queues managées, Base de données, Stockage Objet&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Serveurs physiques (ElasticMetal)&lt;/strong&gt; : Rancher (downstream clusters) avec ElasticSearch et Kafka&lt;/p&gt;

&lt;p&gt;L'utilisation de bare metal plutôt que des instances managées permet de bénéficier d'une &lt;strong&gt;bande passante de 10 Gb/s&lt;/strong&gt; pour un &lt;strong&gt;coût 25% moins élevé&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Résultat
&lt;/h3&gt;

&lt;p&gt;La migration a été réalisée en &lt;strong&gt;4 mois&lt;/strong&gt; avec une équipe de &lt;strong&gt;3 personnes à temps plein&lt;/strong&gt;, pour un coût projet d'environ &lt;strong&gt;une centaine de milliers d'euros&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Le gain financier est significatif : la facture mensuelle est passée de &lt;strong&gt;~50 000 €/mois à ~20 000 €/mois&lt;/strong&gt;, soit une &lt;strong&gt;réduction de plus de 50%&lt;/strong&gt; des coûts d'hébergement.&lt;/p&gt;

&lt;p&gt;À noter : la présentation de Jérôme Galais s'est distinguée par son aisance, son rythme soutenu et une touche d'humour bienvenue qui a rendu le retour d'expérience particulièrement agréable à suivre.&lt;/p&gt;

&lt;p&gt;Ce retour d'expérience est détaillé dans un article dédié : &lt;a href="https://www.kaliop.com/fr/migration-cloud-to-cloud-aws-scaleway/" rel="noopener noreferrer"&gt;Retour d’expérience : comment Plecto a migré sa plateforme cloud-to-cloud d’un hyperscaler vers Scaleway&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://youtu.be/87sla-hCb_g?si=ALXl1kl4V_yfeXNh" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwynxvosh885hkzeorppw.jpg" alt="lien vidéo" width="480" height="360"&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Focus #2 : ChatBot/RAG 100% Souverain (Accure IT)
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Le coup de cœur d'Antonin&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Le constat de départ
&lt;/h3&gt;

&lt;p&gt;Antoine Durand, Architecte Data &amp;amp; Cloud chez &lt;a href="https://accure.fr/" rel="noopener noreferrer"&gt;Accure IT&lt;/a&gt;, a ouvert sa présentation sur un chiffre marquant : &lt;strong&gt;70 à 88% des POC IA ne passent jamais en production&lt;/strong&gt; (source : IDC/Lenovo &amp;amp; McKinsey 2025). La raison ? Manque d'industrialisation et ROI non démontré. Un constat qui illustre bien la "FOMO de l'IA" actuelle : cette peur de rater le train de l'intelligence artificielle qui pousse les organisations à lancer des projets sans toujours anticiper leur passage en production.&lt;/p&gt;

&lt;h3&gt;
  
  
  Le contexte client
&lt;/h3&gt;

&lt;p&gt;Début 2025, un client dans les Énergies Renouvelables contacte Accure IT en exigeant la signature d'un NDA avant même d'entamer les discussions. L'enjeu : exploiter un immense pool de données non structurées (doc, docx, pdf, images, xls...) pour améliorer les process R&amp;amp;D (veille technologique, brevets) et le support (questions/réponses instantanées).&lt;/p&gt;

&lt;p&gt;Contrainte absolue : &lt;strong&gt;100% souverain, 100% français&lt;/strong&gt;, sans exposition au Cloud Act ou Patriot Act. Exit donc les hyperscalers classiques (Azure, AWS, Google). Cela s'explique par le fait que leur propriété intellectuelle est leur coeur de métier.&lt;/p&gt;

&lt;h3&gt;
  
  
  L'approche technique
&lt;/h3&gt;

&lt;p&gt;Accure IT a relevé le défi en mettant en production une v1 dès juillet 2025, hébergée sur &lt;a href="https://www.clever.cloud/fr/" rel="noopener noreferrer"&gt;Clever Cloud&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack technique&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hosting PaaS&lt;/strong&gt; : Clever Cloud (Docker + S3)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt; : StreamLit / Python&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Base vectorielle&lt;/strong&gt; : Postgres 17 + pgVector&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versionning&lt;/strong&gt; : Heptapod (GitLab open source)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM&lt;/strong&gt; : Mistral AI (Embed + AI) via API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration&lt;/strong&gt; : Airflow 3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L'architecture repose sur un pipeline RAG classique : ingestion des documents, vectorisation, stockage dans une base de connaissances, puis interrogation via le chatbot connecté à Mistral AI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Les axes du retour d'expérience
&lt;/h3&gt;

&lt;p&gt;La présentation a couvert quatre dimensions clés : la gouvernance et souveraineté (faire du "made in France, hosted in France" à la pointe), la stack IA en production, les pratiques DevOps/DataOps pour la CI/CD et le cycle de vie de la data, et enfin le FinOps pour contenir les coûts tout en assurant le service.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.youtube.com/watch?v=-iHcRkoFP3M" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwkk9t0ux8beh2dl0v19p.jpg" alt="lien vidéo" width="480" height="360"&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Les tendances clés de l'édition 2025
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;IA intégrée au cycle DevOps&lt;/strong&gt; — Sopra Steria a présenté sa vision "Agentic AI in the Software Delivery Lifecycle" avec des agents IA (Maia, heiDI, DEP.AI) intervenant à chaque étape : définition des requirements, user stories, architecture, tests, code review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Souveraineté numérique&lt;/strong&gt; — Plusieurs talks ont abordé les alternatives aux hyperscalers américains, que ce soit via bare metal ou cloud providers français comme Scaleway ou Clever Cloud.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grilles de maturité DevSecOps&lt;/strong&gt; — BPCE a partagé sa grille de maturité "à la Nutriscore" (ABCDE) pour mesurer et accompagner la progression des équipes sur 4 axes : Craft, CI, CD, Sécurité.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attention à la dette Kubernetes&lt;/strong&gt; — Message récurrent : mettre à jour régulièrement, ne pas tout containériser, refactoriser tôt pour éviter les "macroservices".&lt;/p&gt;




&lt;h2&gt;
  
  
  À retenir
&lt;/h2&gt;

&lt;p&gt;DevOps Rex 2025 confirme la maturité de l'écosystème DevOps français. L'IA s'invite désormais à chaque étape du cycle, la souveraineté devient un critère de choix assumé, et les retours d'expérience partagés montrent des organisations qui n'hésitent plus à remettre en question leurs choix d'infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rendez-vous en 2026.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Pour vous donner envi de venir à de l'événement 2026, voici la playlist des vidéos de l'édition 2025 :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=zjMgX8ZFH-0&amp;amp;list=PL7l-zOgt89E6rWGKm1jQDHgnXYTn91BDi" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3eqvhhmsks4i1d58p8ok.jpg" alt="DevOps Rex 2025 - Playlist " width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vous pouvez nous retrouver sur les réseaux sociaux - LinkedIn &lt;a href="https://www.linkedin.com/in/antonin-brugnot-a7ab1b14/" rel="noopener noreferrer"&gt;Antonin Brugnot&lt;/a&gt; et &lt;a href="https://www.linkedin.com/in/yohann-s-73a8a293/" rel="noopener noreferrer"&gt;Yohann Streibel&lt;/a&gt; - pour plus de retours et discussions autour des sujets DevOps !&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cloud</category>
      <category>rex</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🚀 SWAG : Le Reverse Proxy Docker qui va révolutionner votre homelab !</title>
      <dc:creator>yohann streibel</dc:creator>
      <pubDate>Sun, 07 Dec 2025 08:14:22 +0000</pubDate>
      <link>https://dev.to/onepoint/swag-le-reverse-proxy-docker-qui-va-revolutionner-votre-homelab--1ik4</link>
      <guid>https://dev.to/onepoint/swag-le-reverse-proxy-docker-qui-va-revolutionner-votre-homelab--1ik4</guid>
      <description>&lt;p&gt;Salut les dev ! 👋&lt;/p&gt;

&lt;p&gt;Aujourd'hui, je vais vous parler d'un outil qui a littéralement transformé ma façon de gérer mes services web : &lt;strong&gt;SWAG&lt;/strong&gt; (Secure Web Application Gateway). Si vous êtes dans le monde du homelab ou si vous déployez plusieurs services web, cet article va vous intéresser !&lt;/p&gt;

&lt;h2&gt;
  
  
  Table des matières
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Mais qu'est-ce que SWAG exactement ?&lt;/li&gt;
&lt;li&gt;Pourquoi SWAG plutôt qu'autre chose ?&lt;/li&gt;
&lt;li&gt;Notre architecture cible&lt;/li&gt;
&lt;li&gt;
Configuration réseau et DNS (étape cruciale !)

&lt;ul&gt;
&lt;li&gt;4.1 Configuration chez votre provider (exemple Free)
&lt;/li&gt;
&lt;li&gt;4.2 Configuration DuckDNS
&lt;/li&gt;
&lt;li&gt;4.3 Vérification IP publique
&lt;/li&gt;
&lt;li&gt;4.4 Test de connectivité
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Installation avec Docker Compose&lt;/li&gt;
&lt;li&gt;
Configuration étape par étape

&lt;ul&gt;
&lt;li&gt;6.1 Préparation des variables d'environnement
&lt;/li&gt;
&lt;li&gt;6.2 Configuration DuckDNS automatique
&lt;/li&gt;
&lt;li&gt;6.3 Premiers pas après démarrage
&lt;/li&gt;
&lt;li&gt;6.4 Structure des dossiers créés
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Ajouter nos premiers services

&lt;ul&gt;
&lt;li&gt;7.1 Service 1 : Home Assistant
&lt;/li&gt;
&lt;li&gt;7.2 Configuration du proxy dans SWAG
&lt;/li&gt;
&lt;li&gt;7.3 Test de votre configuration
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Troubleshooting réseau&lt;/li&gt;
&lt;li&gt;
Tips et bonnes pratiques

&lt;ul&gt;
&lt;li&gt;9.1 Réseau Docker dédié
&lt;/li&gt;
&lt;li&gt;9.2 Gestion des logs
&lt;/li&gt;
&lt;li&gt;9.3 Test de configuration
&lt;/li&gt;
&lt;li&gt;9.4 Wildcard certificates
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sécurisation avec Authelia (bonus)&lt;/li&gt;
&lt;li&gt;Résultat final&lt;/li&gt;
&lt;li&gt;Debugging courant&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;Pour aller plus loin&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 Mais qu'est-ce que SWAG exactement ?
&lt;/h2&gt;

&lt;p&gt;SWAG, c'est un reverse proxy tout-en-un basé sur nginx qui gère automatiquement vos certificats SSL Let's Encrypt. En gros, c'est votre portier numérique qui :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔒 Sécurise automatiquement vos services avec des certificats SSL&lt;/li&gt;
&lt;li&gt;🌐 Expose vos services Docker sur des sous-domaines propres&lt;/li&gt;
&lt;li&gt;🛡️ Protège vos applications avec une authentification centralisée&lt;/li&gt;
&lt;li&gt;📋 Gère tout ça avec de la configuration simple&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💭 Pourquoi SWAG plutôt qu'autre chose ?
&lt;/h2&gt;

&lt;p&gt;Avant SWAG, j'utilisais nginx classique avec certbot... Quelle galère ! 😅 Entre les renouvellements de certificats qui plantent, les configs nginx à maintenir manuellement, et la gestion des domaines, c'était un vrai casse-tête.&lt;/p&gt;

&lt;p&gt;SWAG résout tout ça d'un coup :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Certificats wildcard automatiques&lt;/li&gt;
&lt;li&gt;Configs pré-faites pour les services populaires&lt;/li&gt;
&lt;li&gt;Intégration native avec Docker&lt;/li&gt;
&lt;li&gt;Support de l'authentification (Authelia, OAuth, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🏗️ Notre architecture cible
&lt;/h2&gt;

&lt;p&gt;Imaginons qu'on veuille exposer plusieurs services :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un Home Assistant sur &lt;code&gt;homeassistant.mondomaine.fr&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Un serveur de fichiers sur &lt;code&gt;files.mondomaine.fr&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Une interface d'administration sur &lt;code&gt;admin.mondomaine.fr&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avec SWAG, tout passe par un seul point d'entrée sécurisé !&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🌐 Configuration réseau et DNS (étape cruciale !)
&lt;/h2&gt;

&lt;p&gt;Avant de plonger dans Docker, il faut préparer le terrain côté réseau. C'est souvent l'étape que les débutants oublient ! 😅&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Configuration chez votre provider (exemple Free)
&lt;/h3&gt;

&lt;p&gt;Chez Free, il faut :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Se connecter à l'interface Freebox&lt;/strong&gt; : &lt;code&gt;http://mafreebox.freebox.fr&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aller dans "Paramètres de la Freebox" &amp;gt; "Gestion des ports"&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Créer une redirection de port&lt;/strong&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Port externe&lt;/strong&gt; : 443 (HTTPS)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port interne&lt;/strong&gt; : 443&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IP destination&lt;/strong&gt; : IP locale de votre serveur (ex: 192.168.1.100)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protocole&lt;/strong&gt; : TCP&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Optionnel : Port 80&lt;/strong&gt; pour les redirections HTTP vers HTTPS :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Port externe&lt;/strong&gt; : 80&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port interne&lt;/strong&gt; : 80&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IP destination&lt;/strong&gt; : 192.168.1.100&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip sécurité&lt;/strong&gt; : Au lieu d'exposer directement les ports 80/443, vous pouvez utiliser des ports custom (ex: 8443) et faire la redirection. Plus sécurisé !&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Configuration DuckDNS
&lt;/h3&gt;

&lt;p&gt;DuckDNS, c'est le DNS dynamique gratuit parfait pour les homelabs !&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inscription sur&lt;/strong&gt; &lt;a href="https://www.duckdns.org" rel="noopener noreferrer"&gt;duckdns.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Créer votre domaine&lt;/strong&gt; : &lt;code&gt;monhomelab.duckdns.org&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Noter votre token&lt;/strong&gt; (on en aura besoin dans Docker)&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Alternative DNS providers&lt;/strong&gt; : DuckDNS n'est pas obligatoire ! SWAG supporte plein d'autres providers :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gratuits :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DuckDNS&lt;/strong&gt; (&lt;code&gt;duckdns&lt;/code&gt;) - Le plus simple pour débuter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FreeDNS&lt;/strong&gt; (&lt;code&gt;freedns&lt;/code&gt;) - Autre alternative gratuite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No-IP&lt;/strong&gt; (&lt;code&gt;noip&lt;/code&gt;) - Service populaire avec version gratuite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Payants (mais plus pro) :&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare&lt;/strong&gt; (&lt;code&gt;cloudflare&lt;/code&gt;) - Excellent, rapide et pas cher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OVH&lt;/strong&gt; (&lt;code&gt;ovh&lt;/code&gt;) - Provider français&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gandi&lt;/strong&gt; (&lt;code&gt;gandi&lt;/code&gt;) - Interface simple&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Route53&lt;/strong&gt; (&lt;code&gt;route53&lt;/code&gt;) - AWS, très fiable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DigitalOcean&lt;/strong&gt; (&lt;code&gt;digitalocean&lt;/code&gt;) - Simple à utiliser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Namecheap&lt;/strong&gt; (&lt;code&gt;namecheap&lt;/code&gt;) - Bon rapport qualité/prix&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Configuration type pour Cloudflare&lt;/strong&gt; :&lt;/p&gt;


&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;URL=mondomaine.com&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;VALIDATION=dns&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DNSPLUGIN=cloudflare&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;EMAIL=votre-email@example.com&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;CLOUDFLARETOKEN=votre-api-token-cloudflare&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;La liste complète est dispo dans la &lt;a href="https://docs.linuxserver.io/general/swag" rel="noopener noreferrer"&gt;doc SWAG&lt;/a&gt; ! 📚&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Vérification IP publique
&lt;/h3&gt;

&lt;p&gt;Votre DuckDNS doit pointer vers votre IP publique :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Vérifier votre IP publique&lt;/span&gt;
curl ifconfig.me

&lt;span class="c"&gt;# Vérifier que DuckDNS pointe bien dessus&lt;/span&gt;
nslookup monhomelab.duckdns.org
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si les IPs correspondent, c'est bon ! 🎯&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Test de connectivité
&lt;/h3&gt;

&lt;p&gt;Avant même de démarrer SWAG, testez que le port forwarding fonctionne :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Sur votre serveur local, démarrez un serveur web simple&lt;/span&gt;
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 8080

&lt;span class="c"&gt;# Depuis l'extérieur, testez avec votre domaine&lt;/span&gt;
curl http://monhomelab.duckdns.org:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si ça marche, vous êtes prêts pour SWAG !&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Installation avec Docker Compose
&lt;/h2&gt;

&lt;p&gt;Première étape : créer notre &lt;code&gt;docker-compose.yml&lt;/code&gt; pour SWAG.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.8"&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web-proxy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;swag&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;lscr.io/linuxserver/swag:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;swag&lt;/span&gt;
    &lt;span class="na"&gt;cap_add&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;NET_ADMIN&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PUID=1000&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PGID=1000&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;TZ=Europe/Paris&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;URL=monhomelab.duckdns.org&lt;/span&gt;  &lt;span class="c1"&gt;# Votre domaine DuckDNS&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;VALIDATION=duckdns&lt;/span&gt;          &lt;span class="c1"&gt;# Validation via DuckDNS&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DUCKDNSTOKEN=12345678-1234-1234-1234-123456789012&lt;/span&gt;  &lt;span class="c1"&gt;# Votre token DuckDNS&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SUBDOMAINS=wildcard&lt;/span&gt;         &lt;span class="c1"&gt;# Permet *.monhomelab.duckdns.org&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;EMAIL=votre-email@example.com&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ONLY_SUBDOMAINS=false&lt;/span&gt;       &lt;span class="c1"&gt;# Important pour que le domaine principal marche&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./swag/data:/config&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;80:80"&lt;/span&gt;     &lt;span class="c1"&gt;# HTTP (redirections vers HTTPS)&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;443:443"&lt;/span&gt;   &lt;span class="c1"&gt;# HTTPS (vos services sécurisés)&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;web-proxy&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 Configuration étape par étape
&lt;/h2&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Préparation des variables d'environnement
&lt;/h3&gt;

&lt;p&gt;Les variables importantes à comprendre :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL&lt;/strong&gt; : Votre domaine complet (DuckDNS, Cloudflare, ou autre provider)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VALIDATION=duckdns&lt;/strong&gt; : Type de validation selon votre provider (voir liste ci-dessus)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SUBDOMAINS=wildcard&lt;/strong&gt; : Génère un certificat pour tous vos sous-domaines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DUCKDNSTOKEN&lt;/strong&gt; : Token/API key de votre provider DNS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ONLY_SUBDOMAINS=false&lt;/strong&gt; : Permet d'utiliser le domaine principal aussi&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💭 &lt;strong&gt;Pourquoi DuckDNS dans cet exemple ?&lt;/strong&gt; C'est gratuit et ultra simple pour débuter ! Mais si vous avez déjà un domaine chez Cloudflare/OVH/Gandi, utilisez-le directement.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Configuration DuckDNS automatique
&lt;/h3&gt;

&lt;p&gt;SWAG va automatiquement :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mettre à jour votre IP sur DuckDNS&lt;/li&gt;
&lt;li&gt;Valider votre domaine via l'API DuckDNS&lt;/li&gt;
&lt;li&gt;Générer le certificat wildcard&lt;/li&gt;
&lt;li&gt;Renouveler automatiquement tout ça !&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;C'est la magie de cette combo SWAG + DuckDNS ! ✨&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Premiers pas après démarrage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Démarrer SWAG&lt;/span&gt;
docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt; swag

&lt;span class="c"&gt;# Vérifier les logs&lt;/span&gt;
docker logs swag

&lt;span class="c"&gt;# Vous devriez voir quelque chose comme :&lt;/span&gt;
&lt;span class="c"&gt;# "Server ready"&lt;/span&gt;
&lt;span class="c"&gt;# "Certificate renewal successful"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Structure des dossiers créés
&lt;/h3&gt;

&lt;p&gt;Après le premier démarrage, SWAG crée cette structure :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;swag/data/
├── nginx/
│   ├── nginx.conf
│   ├── site-confs/
│   └── proxy-confs/     # ← Les configs de nos services !
├── keys/
│   └── letsencrypt/     # ← Nos certificats SSL
└── log/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Ajouter nos premiers services
&lt;/h2&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Service 1 : Home Assistant
&lt;/h3&gt;

&lt;p&gt;Créons notre service Home Assistant dans le même réseau :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Ajout dans docker-compose.yml&lt;/span&gt;
  &lt;span class="na"&gt;homeassistant&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;homeassistant/home-assistant:stable&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;homeassistant&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;TZ=Europe/Paris&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./homeassistant/data:/config&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;web-proxy&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8123:8123"&lt;/span&gt;  &lt;span class="c1"&gt;# Optionnel, pour accès direct local&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuration du proxy dans SWAG
&lt;/h3&gt;

&lt;p&gt;Créer le fichier : &lt;code&gt;swag/data/nginx/proxy-confs/homeassistant.subdomain.conf&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;homeassistant.*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="n"&gt;/config/nginx/ssl.conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;client_max_body_size&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="n"&gt;/config/nginx/proxy.conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="n"&gt;/config/nginx/resolver.conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$upstream_app&lt;/span&gt; &lt;span class="s"&gt;homeassistant&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$upstream_port&lt;/span&gt; &lt;span class="mi"&gt;8123&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$upstream_proto&lt;/span&gt; &lt;span class="s"&gt;http&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="nv"&gt;$upstream_proto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;//&lt;/span&gt;&lt;span class="nv"&gt;$upstream_app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$upstream_port&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Support des WebSockets (important pour Home Assistant !)&lt;/span&gt;
    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/api/websocket&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="n"&gt;/config/nginx/proxy.conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;include&lt;/span&gt; &lt;span class="n"&gt;/config/nginx/resolver.conf&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$upstream_app&lt;/span&gt; &lt;span class="s"&gt;homeassistant&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$upstream_port&lt;/span&gt; &lt;span class="mi"&gt;8123&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;$upstream_proto&lt;/span&gt; &lt;span class="s"&gt;http&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="nv"&gt;$upstream_proto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;//&lt;/span&gt;&lt;span class="nv"&gt;$upstream_app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$upstream_port&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="s"&gt;"upgrade"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Test de votre configuration
&lt;/h3&gt;

&lt;p&gt;Une fois tout configuré, testez vos URLs :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;https://monhomelab.duckdns.org&lt;/code&gt; → Page par défaut SWAG&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;https://homeassistant.monhomelab.duckdns.org&lt;/code&gt; → Votre Home Assistant&lt;/li&gt;
&lt;li&gt;✅ Certificat SSL valide et wildcard !&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 Troubleshooting réseau
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problème : "Site inaccessible depuis l'extérieur"
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Vérifiez votre IP publique&lt;/strong&gt; :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Sur votre serveur&lt;/span&gt;
curl ifconfig.me

&lt;span class="c"&gt;# Doit correspondre à :&lt;/span&gt;
nslookup monhomelab.duckdns.org
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Testez le port forwarding&lt;/strong&gt; :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Depuis l'extérieur (4G par exemple)&lt;/span&gt;
telnet monhomelab.duckdns.org 443
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Vérifiez les logs SWAG&lt;/strong&gt; :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker logs swag | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"certificate&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;duckdns"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Problème : "DuckDNS validation failed"
&lt;/h3&gt;

&lt;p&gt;Vérifiez votre token DuckDNS :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Test manuel de l'API DuckDNS&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://www.duckdns.org/update?domains=monhomelab&amp;amp;token=VOTRE_TOKEN&amp;amp;ip="&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Doit retourner "OK" si le token est bon.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problème : "Certificat non généré"
&lt;/h3&gt;

&lt;p&gt;Souvent c'est un souci de timing. DuckDNS peut mettre quelques minutes à propager :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Redémarrez SWAG après quelques minutes&lt;/span&gt;
docker restart swag

&lt;span class="c"&gt;# Surveillez les logs&lt;/span&gt;
docker logs &lt;span class="nt"&gt;-f&lt;/span&gt; swag
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔥 Tips et bonnes pratiques
&lt;/h2&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Réseau Docker dédié
&lt;/h3&gt;

&lt;p&gt;Créez toujours un réseau dédié pour vos services web :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Créer le réseau manuellement&lt;/span&gt;
docker network create web-proxy

&lt;span class="c"&gt;# Ou le définir comme external dans docker-compose&lt;/span&gt;
networks:
  web-proxy:
    external: &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Gestion des logs
&lt;/h3&gt;

&lt;p&gt;Surveillez les logs pour déboguer :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Logs SWAG en temps réel&lt;/span&gt;
docker logs &lt;span class="nt"&gt;-f&lt;/span&gt; swag

&lt;span class="c"&gt;# Logs nginx spécifiques&lt;/span&gt;
docker &lt;span class="nb"&gt;exec &lt;/span&gt;swag &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /config/log/nginx/error.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Test de configuration
&lt;/h3&gt;

&lt;p&gt;Avant de redémarrer, testez toujours :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Test de la config nginx&lt;/span&gt;
docker &lt;span class="nb"&gt;exec &lt;/span&gt;swag nginx &lt;span class="nt"&gt;-t&lt;/span&gt;

&lt;span class="c"&gt;# Rechargement à chaud (si test OK)&lt;/span&gt;
docker &lt;span class="nb"&gt;exec &lt;/span&gt;swag nginx &lt;span class="nt"&gt;-s&lt;/span&gt; reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Wildcard certificates
&lt;/h3&gt;

&lt;p&gt;Avec les certificats wildcard, vous pouvez ajouter autant de sous-domaines que vous voulez sans renouveler le certificat !&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🛡️ Sécurisation avec Authelia (bonus)
&lt;/h2&gt;

&lt;p&gt;Pour aller plus loin, on peut ajouter une authentification centralisée :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Service Authelia&lt;/span&gt;
  &lt;span class="na"&gt;authelia&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;authelia/authelia:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;authelia&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./authelia/data:/config&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;web-proxy&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;TZ=Europe/Paris&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et dans notre config nginx, on ajoute :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="c1"&gt;# En haut du fichier de config de service&lt;/span&gt;
&lt;span class="k"&gt;include&lt;/span&gt; &lt;span class="n"&gt;/config/nginx/authelia-server.conf&lt;/span&gt;;

&lt;span class="c1"&gt;# Dans la location /&lt;/span&gt;
&lt;span class="k"&gt;include&lt;/span&gt; &lt;span class="n"&gt;/config/nginx/authelia-location.conf&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Résultat final
&lt;/h2&gt;

&lt;p&gt;Une fois tout configuré, vous avez :&lt;/p&gt;

&lt;p&gt;✅ &lt;code&gt;https://homeassistant.monhomelab.duckdns.org&lt;/code&gt; - Sécurisé avec SSL&lt;br&gt;&lt;br&gt;
✅ &lt;code&gt;https://files.monhomelab.duckdns.org&lt;/code&gt; - Protégé par authentification&lt;br&gt;&lt;br&gt;
✅ &lt;code&gt;https://admin.monhomelab.duckdns.org&lt;/code&gt; - Accessible uniquement pour les admins  &lt;/p&gt;

&lt;p&gt;Le tout avec &lt;strong&gt;un seul certificat wildcard&lt;/strong&gt; qui se renouvelle automatiquement !&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🐛 Debugging courant
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Problème : "502 Bad Gateway"
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Vérifier que le service target existe&lt;/span&gt;
docker ps | &lt;span class="nb"&gt;grep &lt;/span&gt;nom-du-service

&lt;span class="c"&gt;# Vérifier la résolution DNS interne&lt;/span&gt;
docker &lt;span class="nb"&gt;exec &lt;/span&gt;swag nslookup nom-du-service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Problème : Certificat non généré
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Vérifier les logs de génération&lt;/span&gt;
docker logs swag | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"certificate&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;duckdns"&lt;/span&gt;

&lt;span class="c"&gt;# Tester manuellement DuckDNS&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://www.duckdns.org/update?domains=VOTRE_DOMAINE&amp;amp;token=VOTRE_TOKEN&amp;amp;ip="&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Problème : WebSockets qui ne passent pas
&lt;/h3&gt;

&lt;p&gt;Ajoutez toujours ces headers dans vos configs :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="s"&gt;"upgrade"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;proxy_cache_bypass&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎉 Conclusion
&lt;/h2&gt;

&lt;p&gt;SWAG a vraiment simplifié ma vie de homelabber ! En quelques fichiers de config, j'ai :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Des certificats SSL automatiques&lt;/li&gt;
&lt;li&gt;Des sous-domaines propres pour tous mes services
&lt;/li&gt;
&lt;li&gt;Une authentification centralisée&lt;/li&gt;
&lt;li&gt;Une maintenance quasi nulle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si vous hésitez encore à passer le cap, foncez ! C'est un investissement en temps qui se rentabilise très vite.&lt;/p&gt;

&lt;p&gt;&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 Pour aller plus loin
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.linuxserver.io/general/swag" rel="noopener noreferrer"&gt;Documentation SWAG officielle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/linuxserver/reverse-proxy-confs" rel="noopener noreferrer"&gt;Exemples de configs nginx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.authelia.com/integration/proxies/nginx/" rel="noopener noreferrer"&gt;Guide Authelia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Et vous, vous utilisez quoi comme reverse proxy ? Dites-moi en commentaire ! 💬&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  docker #nginx #ssl #homelab #reverseproxy #swag #letsencrypt #devops
&lt;/h1&gt;

</description>
      <category>adventoftech2025</category>
      <category>docker</category>
      <category>homelab</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
