Aller au contenu
  1. Portfolio/

Architecture multi-services Docker avec HAProxy

·2 mins
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 → Portfolio
  • https://grafana.monsite.fr → Monitoring et dashboards
  • https://plantuml.monsite.fr → Online PlantUML editor

Supervision #

  • Prometheus collecte les métriques de node_exporter, haproxy et grafana.
  • 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.