Skip to content

Monitoring Infrastructure (Roadmap)

Vue d'ensemble

Stack de monitoring avancé et observabilité complète pour l'infrastructure.

Statut : Non implémenté. Le monitoring de base est opérationnel (voir ci-dessous) ; cette roadmap couvre uniquement la couche avancée (métriques time-series, logs centralisés, dashboards).

État actuel — Monitoring simple (opérationnel)

Le monitoring de base est assuré par Uptime Kuma (LXC 101) avec alertes email sur tous les incidents.

Groupe Ce qui est surveillé
Réseau Freebox (ping), DNS Cloudflare, DNS Google
Proxmox VE WebUI, node status, statut des 6 LXC via API Proxmox
LXC 100 – Média Jellyfin, Sonarr, Radarr, Prowlarr, Bazarr, SABnzbd, Seerr, Torznab Proxy, Tdarr
LXC 101 – Management Homepage, Portainer, Zensical, CoolerControl, Uptime Kuma
LXC 102 – PBS PBS WebUI
LXC 103 – Network Gateway Caddy (HTTP/HTTPS ports), Authelia
LXC 104 – Services Endurain, FreshRSS, Romm
LXC 105 – Web WP nliautaud.fr, WP alicesuretcanale.fr, WP lmdp.ncls.ltd
Domaines HTTPS publics 17 domaines (ncls.ltd, *.ncls.ltd, nliautaud.fr, alicesuretcanale.fr) avec vérification expiry SSL
Espaces Disques root, lxc-data, scratch, media, storage, pbs-secondary, ZFS rpool/data, ZFS rpool/pbs (seuils configurés, push toutes les 3 min)
Températures & Ventilateurs CPU Package, carte mère, ventilateurs 1 & 2, HDD sdc (HGST 4TB), HDD sdd (IronWolf 4TB) via Glances/smartctl

En complément, Glances tourne sur le host (:61208) pour les métriques système temps réel.

Ce que ce monitoring ne couvre pas (justification de la roadmap)

  • Pas d'historique de métriques (CPU, RAM, réseau) — Uptime Kuma ne fait que du up/down
  • Pas de métriques détaillées Caddy (requêtes/s, latences, status codes, upstreams)
  • Pas de logs centralisés — impossible de corréler un incident avec les logs Caddy ou Docker
  • Pas de métriques containers Docker (RAM/CPU par container)
  • Pas de dashboards agrégés pour visualiser les tendances sur plusieurs jours/semaines

Stack cible

┌─────────────────────────────────────────────────────────┐
│                    Grafana Dashboards                   │
│              https://monitoring.ncls.ltd                │
└────────────────────┬────────────────────────────────────┘
             ┌───────┴────────┐
             │                │
        ┌────▼───┐       ┌───▼────┐
        │Prometheus│     │  Loki  │
        │(Metrics)│      │ (Logs) │
        └────┬───┘       └───┬────┘
             │               │
   ┌─────────┼───────┐   ┌───┴──────┐
   │         │       │   │          │
┌──▼──┐  ┌───▼──┐ ┌──▼──┐ ┌────────▼─┐
│Caddy│  │ PVE  │ │cAdv.│ │ Promtail │
│Exp. │  │ Exp. │ │     │ │(caddy,   │
└─────┘  └──────┘ └─────┘ │ docker)  │
                           └──────────┘

Composants

1. Prometheus (Métriques)

Image: prom/prometheus:latest
Port: 9090
Fonction: Collecte et stockage métriques time-series

Exporters à ajouter :

  • Caddy via admin API (localhost:2019/metrics) — métriques natives Prometheus
  • node_exporter - Métriques système (CPU, RAM, Disk, Network)
  • cadvisor - Métriques conteneurs Docker
  • pve_exporter - Métriques Proxmox VE

Métriques Caddy (native Prometheus) :

# Via http://caddy:2019/metrics (format Prometheus natif)
caddy_http_requests_total
caddy_http_request_duration_seconds
caddy_http_response_size_bytes
caddy_reverse_proxy_upstreams_healthy

2. Grafana (Visualisation)

Image: grafana/grafana:latest
Port: 3001
Fonction: Dashboards et alerting

Dashboards recommandés :

  • Caddy Metrics (custom ou Grafana community)
  • Docker & System Monitoring (ID: 893)
  • Proxmox VE Cluster (ID: 10347)
  • Authelia SSO Stats (custom)

3. Loki (Logs)

Image: grafana/loki:latest
Port: 3100
Fonction: Agrégation logs

Sources :

  • Logs Caddy (/var/log/caddy/*.log)
  • Logs Docker (docker logs)
  • Logs système LXC

4. Promtail (Agent Loki)

Image: grafana/promtail:latest
Fonction: Collecte et envoi logs vers Loki

Configuration Caddy pour monitoring

Caddy expose nativement des métriques Prometheus via son admin API. Il suffit d'activer le endpoint dans le Caddyfile global :

{
    servers {
        metrics
    }
}

Les métriques sont accessibles à http://127.0.0.1:2019/metrics (admin API, interne au container uniquement).

Configurer le scrape Prometheus :

# prometheus.yml
scrape_configs:
    - job_name: "caddy"
      static_configs:
          - targets: ["caddy:2019"]
            labels:
                instance: "lxc-103-caddy"

Docker Compose complet (futur)

version: "3.8"

services:
    # Existing services (caddy, authelia, wireguard)
    # ...

    prometheus:
        image: prom/prometheus:latest
        container_name: prometheus
        restart: unless-stopped
        command:
            - "--config.file=/etc/prometheus/prometheus.yml"
            - "--storage.tsdb.path=/prometheus"
            - "--storage.tsdb.retention.time=30d"
        ports:
            - "9090:9090"
        volumes:
            - ./monitoring/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
            - ./monitoring/prometheus/data:/prometheus
        networks:
            - proxy

    grafana:
        image: grafana/grafana:latest
        container_name: grafana
        restart: unless-stopped
        ports:
            - "3001:3000"
        environment:
            - GF_SECURITY_ADMIN_USER=admin
            - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
            - GF_SERVER_ROOT_URL=https://monitoring.ncls.ltd
        volumes:
            - ./monitoring/grafana/data:/var/lib/grafana
            - ./monitoring/grafana/provisioning:/etc/grafana/provisioning
        networks:
            - proxy
        depends_on:
            - prometheus
            - loki

    loki:
        image: grafana/loki:latest
        container_name: loki
        restart: unless-stopped
        ports:
            - "3100:3100"
        command: -config.file=/etc/loki/local-config.yaml
        volumes:
            - ./monitoring/loki/data:/loki
            - ./monitoring/loki/config.yaml:/etc/loki/local-config.yaml:ro
        networks:
            - proxy

    promtail:
        image: grafana/promtail:latest
        container_name: promtail
        restart: unless-stopped
        volumes:
            - ./monitoring/promtail/config.yaml:/etc/promtail/config.yaml:ro
            - ./caddy/logs:/var/log/caddy:ro
            - /var/lib/docker/containers:/var/lib/docker/containers:ro
        command: -config.file=/etc/promtail/config.yaml
        networks:
            - proxy
        depends_on:
            - loki

    node-exporter:
        image: prom/node-exporter:latest
        container_name: node-exporter
        restart: unless-stopped
        command:
            - "--path.rootfs=/host"
        ports:
            - "9100:9100"
        volumes:
            - /:/host:ro,rslave
        networks:
            - proxy

Proxy host Grafana

Ajouter dans le Caddyfile (LXC 103) :

monitoring.ncls.ltd {
    import security_headers
    import authelia_sso
    reverse_proxy grafana:3000
}

Alerting (exemples)

Prometheus alerting rules

Fichier : monitoring/prometheus/alerts.yml

groups:
    - name: caddy_alerts
      interval: 30s
      rules:
          - alert: CaddyDown
            expr: up{job="caddy"} == 0
            for: 1m
            labels:
                severity: critical
            annotations:
                summary: "Caddy is down"

          - alert: HighErrorRate
            expr: rate(caddy_http_requests_total{code=~"5.."}[5m]) > 0.05
            for: 5m
            labels:
                severity: warning
            annotations:
                summary: "High 5xx error rate on {{ $labels.host }}"

          - alert: SSLCertExpiringSoon
            expr: (caddy_tls_certificates_expiry_seconds < 86400 * 7)
            for: 1h
            labels:
                severity: warning
            annotations:
                summary: "SSL certificate expiring in < 7 days"

Métriques business (exemples)

# Top 5 services les plus utilisés
topk(5, sum by (host) (rate(caddy_http_requests_total[1h])))

# Temps de réponse moyen par service
avg by (host) (caddy_http_request_duration_seconds)

# Taux d'erreur Authelia
rate(caddy_http_requests_total{host="auth.ncls.ltd", code=~"5.."}[5m])

# Bande passante par service
sum by (host) (rate(caddy_http_response_size_bytes[5m]))

Prochaines étapes

L'alerting de base (services up/down, disques, températures, SSL) est déjà couvert par Uptime Kuma. Les phases suivantes apportent la couche métriques historiques et logs centralisés, orthogonale à Uptime Kuma.

  1. Phase 1 : Métriques Caddy (priorité haute)

    • Activer métriques Prometheus dans le Caddyfile (servers { metrics }) → déployer Prometheus
    • Dashboard Grafana : requêtes/s par domaine, latences p95, taux d'erreur 5xx
  2. Phase 2 : Logs centralisés

    • Ajouter Loki + Promtail (logs Caddy + Docker)
    • Corrélation logs ↔ métriques dans Grafana
  3. Phase 3 : Infrastructure complète

    • cadvisor pour métriques RAM/CPU par container Docker
    • pve_exporter pour métriques Proxmox VE (CPU/RAM des LXC dans le temps)
    • node_exporter si besoin de métriques réseau/IO granulaires au niveau host
  4. Phase 4 : Alerting avancé (optionnel — Uptime Kuma couvre déjà l'essentiel)

    • Alertmanager pour règles PromQL (taux d'erreur, latence)
    • Notifications Discord en complément de l'email existant

Ressources

Estimation ressources

Déploiement dans LXC 103 (Caddy co-location) :

  • RAM : +1,5 GB (Prometheus 512MB, Grafana 512MB, Loki 512MB) — LXC 103 actuellement à 2GB
  • Disk : +20 GB (rétention métriques 30j)
  • Solution simple si LXC 103 est upgradé à 4GB RAM

Ou LXC dédié :

  • Nouveau LXC 106 "monitoring"
  • 4 GB RAM, 40 GB disk, 2 cores
  • Séparation des préoccupations, n'impacte pas le gateway réseau