Architecture multi-services Docker avec HAProxy
·2 mins
Sommaire
Projet démonstratif reproduisant une infrastructure Docker modulaire intégrant un proxy inversé HAProxy, des services web (Hugo, PlantUML), des outils de supervision (Grafana, Prometheus, Node Exporter) et un tableau de bord de disponibilité (Uptime Kuma).
Objectifs #
- Centraliser l’accès à plusieurs services internes via un seul proxy (
HAProxy). - Surveiller l’état des services avec Prometheus + Grafana.
- Visualiser la disponibilité grâce à Uptime Kuma.
- Déployer un site statique Hugo optimisé derrière Varnish et HAProxy.
Aperçu architectural #
graph TD;
subgraph Internet
A[Utilisateur]
end
subgraph ReverseProxy
B[HAProxy]
V[Varnish]
end
subgraph Apps
H[Hugo Nginx]
K[Uptime Kuma]
G[Grafana]
P[Prometheus]
N[Node Exporter]
U[UnifiedPush]
M[PlantUML]
end
A --> B
B --> V
V --> H
B --> K
B --> G
B --> U
B --> M
G --> P
P --> N
Stack Docker Compose #
docker-compose.yml #
services:
haproxy:
container_name: haproxy
build:
context: .
dockerfile: Dockerfile
ports:
- "80:80"
- "443:443"
volumes:
- ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
- ./haproxy_certs:/usr/local/etc/haproxy/certs:ro
networks:
- reverse-proxy
restart: unless-stopped
mem_limit: 1g
cpus: 1.5
hugo-nginx:
extends:
file: ./hugo-nginx/docker-compose.yml
service: nginx
ports:
- "127.0.0.1:8801:80"
networks:
- reverse-proxy
plantuml:
extends:
file: ./plantuml/docker-compose.yml
service: plantuml
ports:
- "127.0.0.1:3002:3001"
networks:
- reverse-proxy
grafana:
image: grafana/grafana:12.2.0
ports:
- "127.0.0.1:3000:3000"
depends_on:
- prometheus
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
networks:
- reverse-proxy
volumes:
- grafana_data:/var/lib/grafana
prometheus:
image: prom/prometheus:v3.6.0
ports:
- "127.0.0.1:9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
networks:
- reverse-proxy
node_exporter:
image: prom/node-exporter:v1.9.0
ports:
- "127.0.0.1:9100:9100"
networks:
- reverse-proxy
plantuml-server:
image: plantuml/plantuml-server:latest
ports:
- "127.0.0.1:3003:8080"
networks:
- reverse-proxy
networks:
reverse-proxy:
driver: bridge
volumes:
grafana_data:
prometheus_data:
Extrait de configuration HAProxy #
frontend https_in
mode http
bind *:443 ssl crt /usr/local/etc/haproxy/certs/
acl host_hugo hdr(host) -i hugo.monsite.fr
acl host_grafana hdr(host) -i grafana.monsite.fr
acl host_plantuml hdr(host) -i plantuml.monsite.fr
use_backend backend_hugo if host_hugo
use_backend backend_grafana if host_grafana
use_backend backend_plantuml if host_plantuml
default_backend backend_drop
backend backend_hugo
server hugo varnish:6081 check
backend backend_grafana
server grafana grafana:3000 check
backend backend_kuma
server kuma uptime_kuma:3001 check
Lancement #
docker compose up -d
https://hugo.monsite.fr→ Portfoliohttps://grafana.monsite.fr→ Monitoring et dashboardshttps://plantuml.monsite.fr→ Online PlantUML editor
Supervision #
- Prometheus collecte les métriques de
node_exporter,haproxyetgrafana. - Grafana affiche les tableaux de bord de performance.
- Uptime Kuma surveille en continu les URL exposées.
Note : Ce projet est inspiré de l’environnement de production réel, simplifié à des fins de démonstration dans ce portfolio.