Aller au contenu

Politique des conteneurs

Cette politique protège la disponibilité de CMonChoix Platform contre les dérives de mémoire, CPU, processus et journaux. Elle est calibrée pour le VPS de production mesuré avec 4 vCPU et 12 Go de RAM.

Mesure de référence

Le 30 juillet 2026, la stack CCX consommait environ 1,15 Go de RAM au repos. Les principaux consommateurs étaient :

  • MariaDB : environ 327 Mio ;
  • Prometheus : environ 200 Mio ;
  • WordPress : environ 183 Mio ;
  • Grafana : environ 139 Mio ;
  • Promtail : environ 115 Mio ;
  • cAdvisor : environ 104 Mio ;
  • Loki : environ 63 Mio.

Ces mesures sont un instantané, pas une capacité maximale. Le worker doit conserver une marge importante pendant les imports marchands.

Plafonds

Service Mémoire CPU PID
WordPress 1 Gio 1,5 256
MariaDB 2 Gio 2 256
Redis 256 Mio 0,5 64
Worker 3 Gio 2,5 256
Documentation 128 Mio 0,25 64
Loki 768 Mio 1 256
Promtail 384 Mio 0,75 128
Prometheus 1 Gio 1 256
Grafana 512 Mio 0,75 256
Node Exporter 128 Mio 0,25 64
cAdvisor 512 Mio 1 256

Le total théorique est inférieur à 10 Go. Les limites sont des plafonds, pas des réservations, et laissent de la capacité à Ubuntu, Nginx Proxy Manager, Portainer et aux pointes transitoires.

Toutes les valeurs peuvent être adaptées par les variables CCX_*_MEMORY_LIMIT, CCX_*_CPU_LIMIT et CCX_*_PIDS_LIMIT. Une modification exige de nouvelles mesures au repos et pendant un import complet.

Journaux

Chaque service utilise explicitement le pilote json-file avec rotation :

  • taille maximale par fichier : 50m ;
  • nombre maximal de fichiers : 5.

Les variables CCX_DOCKER_LOG_MAX_SIZE et CCX_DOCKER_LOG_MAX_FILES permettent un ajustement documenté.

Promtail monte /var/log et les journaux Docker en lecture seule.

Observabilité

Prometheus utilise le volume persistant prometheus_data sous /prometheus. Une recréation du conteneur ne doit donc plus supprimer son historique local.

Node Exporter monte la racine de l'hôte en lecture seule sous /host et utilise --path.rootfs=/host. Il observe ainsi l'hôte plutôt que le seul système de fichiers de son conteneur.

Images

Les onze images par défaut sont immuables. Chaque référence associe une version lisible à son RepoDigest SHA-256, collecté sur le VPS de production le 30 juillet 2026 :

Service Référence immuable
WordPress wordpress:6.9.4-php8.3-apache@sha256:5e6511a69cac9b6a42a062ea882b978c9d10edb58aa51623d30e41d30b4d795d
Worker WP-CLI wordpress:cli-2.12.0@sha256:dac35b8f34c6f4f1fafa0b32342642fa9eecd077bb0a8909b486c108874bd7f1
MariaDB mariadb:11.8.6@sha256:78a5047d3ba33975f183f183c2464cc7f1eab13ec8667e57cc9a5821d6da7577
Redis redis:7.4.9-alpine@sha256:6ab0b6e7381779332f97b8ca76193e45b0756f38d4c0dcda72dbb3c32061ab99
Nginx docs nginx:1.31-alpine@sha256:54f2a904c251d5a34adf545a72d32515a15e08418dae0266e23be2e18c66fefa
Loki grafana/loki:2.9.0@sha256:b025a0220f390baaab01578aea2fe0ba677584d9f248c3fe5af15f84dd1de60d
Promtail grafana/promtail:2.9.0@sha256:c2c423196c75a2c9c26f6fe0ba7200c3167334b14975747f5dcff678bd1a32e9
Prometheus prom/prometheus:v3.5.4@sha256:a75c5a35bc21d7afe69551eefa3cb1e1fb1775fe759408007a66b54ec3de1f29
Grafana grafana/grafana:13.1.0@sha256:121a7a9ece6dc10b969f1f96eed64b4f07dfac0d0b8abc070f7cb83bbde86f63
Node Exporter prom/node-exporter:v1.11.1@sha256:e9cff4fc67b1818f8c97adb115b9f12c9a54b533de86765d4a0effc01b357205
cAdvisor gcr.io/cadvisor/cadvisor:v0.55.1@sha256:3de2bd5203120b866d74a9b283b2ffb8ec382fbf9dc321814700c6ea6f44ec57

Les variables CCX_IMAGE_* restent disponibles pour un déploiement contrôlé, mais la CI refuse toute valeur rendue sans suffixe @sha256:<64 caractères hexadécimaux>. Un tag flottant, y compris latest, ne peut donc pas passer le contrat de production.

Mise à jour maîtrisée des images

Dependabot contrôle chaque semaine les dépendances Composer, les images Docker et les actions GitHub. Une proposition de mise à jour ne déclenche jamais un déploiement automatique.

Pour changer une image :

  1. créer une branche dédiée et identifier la version cible ainsi que son RepoDigest multi-architecture ;
  2. mettre à jour ensemble le tag et le SHA-256 dans le Compose et .env.example ;
  3. examiner les notes de version, les changements incompatibles et les avis de sécurité ;
  4. laisser toute la CI passer, puis effectuer une sauvegarde et un test de restauration ;
  5. déployer une seule image ou un lot cohérent pendant une fenêtre contrôlée ;
  6. exécuter make doctor, vérifier les métriques et conserver le commit précédent comme point de retour arrière.

Le retour arrière consiste à rétablir les références du commit précédent et à relancer docker compose up -d. Une migration de données irréversible exige son propre runbook avant approbation.

Validation

Le contrat statique est contrôlé avec :

make container-policy

Il vérifie les onze services :

  • limites mémoire, CPU et PID ;
  • politique unless-stopped ;
  • no-new-privileges ;
  • rotation des journaux ;
  • persistance Prometheus ;
  • montage hôte de Node Exporter ;
  • lecture seule des journaux par Promtail ;
  • empreinte SHA-256 immuable pour chaque image rendue.

Un résultat valide se termine par :

COMPOSE_POLICY_STATUS=PASS
COMPOSE_POLICY_SERVICES=11
COMPOSE_POLICY_PINNED_IMAGES=11

Après application du Compose, exécuter également :

make doctor
docker compose ps
docker stats --no-stream

Une limite ne doit être abaissée que sur la base de mesures répétées, notamment pendant un import complet et une reconstruction des projections.