Cloud & DevOps · Featured

Cleaning

Application de gestion de stock avec stack DevOps complète

Application web Laravel 9 de gestion de stock pour entreprise de nettoyage industriel, déployée avec une stack DevOps de production : conteneurisation Docker, CI/CD GitLab automatisé, observabilité 3-piliers (logs/métriques/traces), alerting multi-sévérité et tests de charge automatisés.

A propos

Projet: Plateforme de gestion de stock pour le secteur du nettoyage industriel, livrée avec une stack DevOps de production : observabilité 3-piliers, alerting SRE et tests de charge.


Stack
Laravel 9PHP 8.2MySQL 8DockerDocker ComposeNginxPHP-FPMGitLab CI/CDPrometheusAlertmanagerGrafanaLokiPromtailTempoOpenTelemetrycAdvisormysqld-exporterk6


Mes tâches
Conception de l'architecture de l'app
Conteneurisation complète Docker (multi-stage PHP-FPM + Nginx, 2 réseaux isolés, healthchecks)
Pipeline CI/CD GitLab : stage test (PHPUnit) + stage deploy SSH conditionné à main
Stack observabilité 3 piliers : Loki + Promtail (logs), Prometheus + cAdvisor + mysqld-exporter (métriques), OTel Collector + Tempo (traces)
6 règles d'alerting Prometheus avec routage Alertmanager différencié et inhibition par composant
Tests de charge k6 (smoke / load / stress) avec seuils SLO partagés

Contexte

Entreprise de nettoyage industriel avec besoin de tracer l'ensemble de son matériel sortant et rentrant des chantiers clients : équipements, produits consommables, seuils de sécurité, écarts d'inventaire, et permissions différenciées par profil métier. La problématique n'était pas seulement applicative — il fallait aussi prouver que la solution tournait de manière fiable en production, avec des métriques observables et un alerting opérationnel.

Résultats & chiffres

6

Règles d'alerting Prometheus

critical + warning, par composant

< 1.5s

SLO p95

vérifié via k6 jusqu'à 200 VUs

13

Stack containers

app + monitoring sur 2 réseaux isolés

Captures de production

Dashboards Grafana en exécution et pipeline GitLab CI/CD — cliquez sur une image pour l'agrandir.

Réalisations clés

  • Pipeline complet Laravel → stdout → Promtail → Loki → Grafana opérationnel en production.
  • Auto-instrumentation OpenTelemetry zero-code côté Laravel (traces via extension PHP).
  • 6 alertes avec sémantique SRE (symptom-based plutôt que cause-based, for: clause anti-flapping).
  • Notifications Slack via webhook, secret jamais committé.

Stack technique

Backend & frontend

  • PHP 8.2 / Laravel 9 (Eloquent, Spatie Permissions)
  • MySQL 8.0 (UUIDs, soft-deletes)

Conteneurisation & runtime

  • Docker / Docker Compose (séparation local / prod)
  • Image custom multi-stage : PHP-FPM 8.2 + Nginx
  • Extensions PHP : APCu, OpenTelemetry, Xdebug, OPcache, GD, MySQLi, BCMath
  • Volumes nommés pour persistance
  • Réseaux Docker isolés (app / monitoring) avec dual-network sur le service api
  • Healthcheck MySQL + dépendances ordonnées (service_healthy)

CI/CD — GitLab CI

  • Pipeline 2 étapes (test → deploy), runner Docker
  • Stage test : php:8.2-cli + PHPUnit (sur develop et main)
  • Stage deploy : alpine + SSH sur VPS (uniquement sur main)
  • Environnement GitLab production lié à l'URL
  • Variables sensibles dans GitLab CI/CD Variables

Observabilité — 3 piliers

  • Logs — Loki 3.1 + Promtail 3.1 (Docker SD)
  • Métriques — Prometheus 2.53 + cAdvisor + mysqld-exporter, /metrics Laravel via promphp + APCu
  • Traces — OpenTelemetry Collector 0.102 + Tempo 2.5 (auto-instrumentation PHP zero-code)
  • Visualisation — Grafana 10.4 (datasources et dashboard provisionnés)

Alerting — Alertmanager 0.27

  • 6 règles Prometheus organisées par sévérité (critical / warning) et composant (api / database / infra)
  • Webhook Slack injecté à runtime via entrypoint custom

Architecture

Vue d'ensemble — Application + Observabilité + CI/CD

Architecture globale : du push développeur jusqu'au VPS de production, en passant par le pipeline GitLab CI (test → deploy SSH) et la chaîne d'observabilité.

Chargement du diagramme...

Pipeline CI/CD — GitLab

Stage test sur develop et main, stage deploy uniquement sur main avec dépendance needs:. Déploiement par SSH (clé en variable GitLab base64), pull + build + up + prune côté VPS.

Chargement du diagramme...