Files
Blog/content/post/16-how-I-deploy-application.fr.md
Gitea Actions 6f0b6363e0
All checks were successful
Blog Deployment / Merge (push) Successful in 6s
Blog Deployment / Deploy-Production (push) Successful in 9s
Blog Deployment / Test-Production (push) Successful in 2s
Blog Deployment / Clean (push) Has been skipped
Blog Deployment / Notify (push) Successful in 2s
Blog Deployment / Check-Rebuild (push) Successful in 5s
Blog Deployment / Build (push) Has been skipped
Blog Deployment / Deploy-Staging (push) Successful in 9s
Blog Deployment / Test-Staging (push) Successful in 2s
Auto-update blog content from Obsidian: 2026-02-02 20:29:09
2026-02-02 20:29:09 +00:00

170 lines
8.5 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
slug: how-I-deploy-application
title: Comment je Déploie des Applications Aujourdhui
description: La méthode que jutilise aujourdhui pour déployer de nouvelles applications dans mon homelab. Workflow simple tirant parti de Docker Compose dans une VM sur Proxmox VE
date: 2026-01-31
draft: false
tags:
- docker
- proxmox
- opnsense
- treafik
- gitea
categories:
- homelab
---
## Intro
Dans cet article, je ne vais pas expliquer les bonnes pratiques pour déployer des applications. À la place, je veux documenter comment je déploie actuellement de nouvelles applications dans mon homelab.
Considérez cet article comme un snapshot. Cest comme ça que les choses fonctionnent vraiment aujourdhui, sachant que dans un futur proche jaimerais évoluer vers un workflow plus orienté GitOps.
La méthode que jutilise est assez simple. Jai essayé de la standardiser autant que possible, mais elle implique encore pas mal détapes manuelles. Jexpliquerai aussi comment je mets à jour les applications, ce qui est, à mon avis, la plus grande faiblesse de cette configuration. À mesure que le nombre dapplications augmente, garder le tout à jour demande de plus en plus de temps.
---
## Overview de la Plateforme
Avant dentrer dans le workflow, voici un rapide aperçu des principaux composants impliqués.
### Docker
Docker est la base de ma stack applicative. Quand cest possible, je déploie les applications sous forme de conteneurs.
Jutilise Docker Compose depuis des années. À lépoque, tout tournait sur un seul serveur physique. Aujourdhui, mon installation est basée sur des VM, et je pourrais migrer vers Docker Swarm, mais jai choisi de ne pas le faire. Cela peut avoir du sens dans certains scénarios, mais ce nest pas aligné avec là où je veux aller à long terme.
Pour linstant, je mappuie toujours sur une seule VM pour héberger toutes les applications Docker. Cette VM est plus ou moins un clone de mon ancien serveur physique, simplement virtualisé.
### Proxmox VE
Cette VM est hébergée sur un cluster Proxmox VE, composé de trois nœuds et utilisant Ceph comme stockage distribué.
Cela me donne de la haute disponibilité et facilite grandement la gestion des VM, même si le workload Docker n'est pas hautement disponible.
### Traefik
Traefik tourne directement sur lhôte Docker et fait office de reverse proxy.
Il est responsable dacheminer le trafic HTTPS vers les bons conteneurs et de gérer automatiquement les certificats TLS via Lets Encrypt. Cela garde la configuration au niveau des applications simple et centralisée.
### OPNsense
OPNsense est mon routeur, pare-feu et agit aussi comme reverse proxy.
Le trafic HTTPS entrant est transféré vers Traefik en utilisant le plugin Caddy avec des règles Layer 4. Le TLS nest pas terminé au niveau du pare-feu. Il est transmis à Traefik, qui gère lémission et le renouvellement des certificats.
### Gitea
Gitea est un dépôt Git self-hosted, jai une instance qui tourne dans mon homelab.
Dans Gitea, jai un dépôt privé qui contient toutes mes configurations Docker Compose. Chaque application a son propre dossier, ce qui rend le dépôt facile à parcourir et à maintenir.
---
## Déployer une Nouvelle Application
Pour standardiser les déploiements, jutilise un template `docker-compose.yml` qui ressemble à ceci :
```yml
services:
NAME:
image: IMAGE
container_name: NAME
volumes:
- /appli/data/NAME/:/
environment:
- TZ=Europe/Paris
networks:
- web
labels:
- traefik.enable=true
- traefik.http.routers.NAME.rule=Host(`HOST.vezpi.com`)
- traefik.http.routers.NAME.entrypoints=https
- traefik.http.routers.NAME.tls.certresolver=letsencrypt
- traefik.http.services.NAME.loadbalancer.server.port=PORT
restart: always
networks:
web:
external: true
```
Laissez-moi expliquer.
Pour limage, selon lapplication, le registre utilisé peut varier, mais jutilise quand même Docker Hub par défaut. Quand jessaie une nouvelle application, je peux utiliser le tag `latest` au début. Ensuite, si je choisis de la garder, je préfère épingler la version actuelle plutôt que `latest`.
Jutilise des montages de volumes pour tout ce qui est stateful. Chaque application a son propre dossier dans le filesystem `/appli/data`.
Quand une application doit être accessible en HTTPS, je relie le conteneur qui sert les requêtes au réseau `web`, qui est géré par Traefik et je lui associe des labels. Les `entrypoint` et `certresolver` sont définis dans ma configuration Traefik. LURL définie dans `Host()` est celle qui sera utilisée pour accéder à lapplication. Elle doit être identique à ce qui est défini dans la route Layer4 du plugin Caddy dOPNsense.
Si plusieurs conteneurs doivent communiquer entre eux, jajoute un réseau `backend` qui sera créé lors du déploiement de la stack, dédié à lapplication. Ainsi, aucun port na besoin dêtre ouvert sur lhôte.
### Étapes de Déploiement
La plupart du travail est effectué depuis VScode :
- Créer un nouveau dossier dans ce dépôt, avec le nom de lapplication.
- Copier le template ci-dessus dans ce dossier.
- Adapter le template avec les valeurs fournies par la documentation de lapplication.
- Créer un fichier `.env` pour les secrets si nécessaire. Ce fichier est ignoré par `.gitignore`.
- Démarrer les services directement depuis VS Code en utilisant lextension Docker.
Puis dans linterface Web OPNsense, je mets à jour 2 routes Layer4 pour le plugin Caddy:
- Selon que lapplication doit être exposée sur Internet ou non, jai une route _Internal_ et une route _External_. Jajoute lURL donnée à Traefik dans lune delles.
- Jajoute aussi cette URL dans une autre route pour rediriger le challenge HTTP Lets Encrypt vers Traefik.
Une fois terminé, je teste lURL. Si tout est correctement configuré, lapplication devrait être accessible en HTTPS.
Quand tout fonctionne comme prévu, je commit le nouveau dossier de lapplication dans le dépôt.
---
## Mettre à Jour une Application
Les mises à jour dapplications sont encore entièrement manuelles.
Je nutilise pas doutils automatisés comme Watchtower pour linstant. Environ une fois par mois, je cherche de nouvelles versions en regardant Docker Hub, les releases GitHub ou la documentation de lapplication.
Pour chaque application que je veux mettre à jour, je passe en revue:
- Nouvelles fonctionnalités
- Breaking changes
- Chemins de mise à niveau si nécessaire
La plupart du temps, les mises à jour sont simples:
- Mettre à jour le tag de limage dans le fichier Docker Compose
- Redémarrer la stack.
- Vérifier que les conteneurs redémarrent correctement
- Consulter les logs Docker
- Tester lapplication pour détecter des régressions
Si ça fonctionne, je continue à mettre à niveau étape par étape jusquà atteindre la dernière version disponible.
Sinon, je débogue jusquà corriger le problème. Les retours arrière sont pénibles.
Une fois la dernière version atteinte, je commit les changements dans le dépôt.
---
## Avantages et inconvénients
Quest-ce qui fonctionne bien et quest-ce qui fonctionne moins ?
### Avantages
- Modèle simple, une VM, un fichier compose par application.
- Facile à déployer, idéal pour tester une application.
- Emplacement central pour les configurations.
### Inconvénients
- La VM Docker unique est un point de défaillance unique.
- Les mises à jour manuelles ne passent pas à léchelle quand le nombre dapplications augmente.
- Devoir déclarer lURL dans Caddy est fastidieux.
- Difficile de suivre ce qui est en ligne et ce qui ne lest pas.
- Les secrets dans .env sont pratiques mais basiques.
- Pas de moyen rapide de rollback.
- Les opérations sur la VM sont critiques.
---
## Conclusion
Cette configuration fonctionne, et elle ma bien servi jusquici. Elle est simple et intuitive. Cependant, elle est aussi très manuelle, surtout pour les mises à jour et la maintenance à long terme.
À mesure que le nombre dapplications augmente, cette approche ne passe clairement pas très bien à léchelle. Cest lune des principales raisons pour lesquelles je regarde vers GitOps et des workflows plus déclaratifs pour lavenir.
Pour l'instant, cependant, c'est ainsi que je déploie des applications dans mon homelab, et cet article sert de point de référence pour savoir par où j'ai commencé.