graph TD
classDef developer fill:#e6f3ff,stroke:#4a90e2,stroke-width:2px,color:black;
classDef github fill:#f7f7f7,stroke:#24292e,stroke-width:2px,color:black;
classDef actions fill:#dcffe4,stroke:#28a745,stroke-width:2px,color:black;
classDef docker fill:#e9f5ff,stroke:#0db7ed,stroke-width:2px,color:black;
classDef staging fill:#fff0db,stroke:#f4a261,stroke-width:2px,color:black;
classDef production fill:#ffe6e6,stroke:#e63946,stroke-width:2px,color:black;
classDef server fill:#f0f0f0,stroke:#666666,stroke-width:2px,color:black;
Dev[Developer]:::developer -->|Push staging branch| Git[GitHub Repository]:::github
Git --> Actions[GitHub Actions]:::github
subgraph Actions
A[Build Docker Images]:::actions --> B[Run Tests]:::actions
B --> C[Prepare Images]:::actions
end
Actions --> D[DockerHub Registry]:::docker
D -->|Webhook Notification| E[Caddy Port 9000]:::server
E -->|ops.example.com/hooks/update| F[Staging Deployment Script]:::staging
F -->|Port 8001| Staging[Staging Environment<br/>staging.example.com]:::staging
D --> |Manual Deployment| Prod[Production Environment<br/>example.com<br/>Port 8000]:::production
Le processus débute par une action simple : un push sur la branche staging du repository GitHub. Cette action représente le point de départ de toute la chaîne de déploiement, initiant une série d'événements automatisés.
*Avoir un environnement de staging est très important car il permet de tester son code sur un environnement équivalent à celui de la prod et donc de limiter les risques de casser la prod lors d'un déploiement.
Lorsque le code atteint GitHub, les GitHub Actions entrent en jeu. Ces workflows automatisés prennent en charge plusieurs tâches cruciales :
- La construction des images Docker
- L'exécution des tests nécessaires
- La préparation des images pour leur distribution
DockerHub intervient ensuite comme plateforme de stockage et de distribution. Les images créées par GitHub Actions sont stockées dans ce registre central, permettant une gestion efficace des versions et une distribution simplifiée.
Un aspect crucial du système réside dans la communication entre DockerHub et le serveur. À chaque mise à jour d'image, DockerHub envoie une notification via l'URL https://ops.example.com/hooks/update. Caddy, configuré sur le port 9000, réceptionne ces notifications.
Le système maintient deux environnements distincts :
- L'environnement de production, accessible via https://example.com (port 8000)
- L'environnement de staging, accessible via https://staging.example.com (port 8001)
La réception d'une notification déclenche un script de déploiement qui :
- Arrête les conteneurs existants
- Télécharge les nouvelles images
- Démarre les nouveaux conteneurs
Caddy assure plusieurs fonctions essentielles dans cette architecture :
- La gestion automatique des certificats HTTPS
- Le routage vers les différents environnements
- La sécurisation des webhooks
Cette architecture apporte plusieurs avantages significatifs :
- Une automatisation complète du processus de déploiement
- Une séparation claire entre les environnements
- Une traçabilité des opérations
Le système ainsi mis en place permet de maintenir un cycle de déploiement continu efficace et sécurisé, adapté aux exigences modernes du développement logiciel.