1. La Stack Réelle (pas de Prometheus, pas d’ELK)

Le monitoring du serveur repose sur 4 briques légères, choisies pour tourner sur un Lightsail à RAM limitée (chaque service a un mem_limit strict) :

┌─────────────────────────────────────────────────────────────────┐
│                        MONITORING RÉEL                          │
│                                                                 │
│  LOGS TEMPS RÉEL          MÉTRIQUES SYSTÈME                     │
│  ┌──────────────┐         ┌──────────────┐   ┌───────────────┐  │
│  │    Dozzle    │         │  Beszel Hub  │◄──│ Beszel Agent  │  │
│  │  port 9999   │         │  port 8090   │   │ (host network)│  │
│  │ (docker.sock │         │ CPU/RAM/disk │   │ collecte les  │  │
│  │  read-only)  │         │ + containers │   │  métriques    │  │
│  └──────────────┘         └──────────────┘   └───────────────┘  │
│                                                                 │
│  LOGS CENTRALISÉS (historique + recherche)                      │
│  ┌───────────┐    ┌────────┐    ┌─────────────┐                 │
│  │ Promtail  │───►│  Loki  │───►│   Grafana   │                 │
│  │ (collecte │    │ (3100  │    │  port 3000  │                 │
│  │ les logs  │    │ interne)│   │ (dashboards)│                 │
│  │ Docker)   │    └────────┘    └─────────────┘                 │
│  └───────────┘                                                  │
│                                                                 │
│  UIs SPÉCIALISÉES                                               │
│  Kafka UI (8091) · RabbitMQ Mgmt (15672) · RedisInsight (5540)  │
│  Adminer (9093) · pgAdmin (5050) · Mongoku (stack clarajob)     │
└─────────────────────────────────────────────────────────────────┘

Il n’y a ni Prometheus, ni AlertManager, ni ELK (Elasticsearch/Logstash/Kibana) dans ce projet. Les rôles équivalents sont tenus par : Beszel (métriques), Loki+Promtail (logs), Grafana (visualisation), Dozzle (logs live).

2. Dozzle — Logs Docker Temps Réel

Container

clarajob-dozzle (image amir20/dozzle:latest)

Accès

http://<serveur>:9999 (variable DOZZLE_PORT)

Principe

Lit /var/run/docker.sock en lecture seule. Aucune donnée stockée, aucun agent dans les containers.

RAM

40 Mo max

Quand l’utiliser : premier réflexe pour « qu’est-ce qui se passe LÀ maintenant ? » — suivre un déploiement en live, voir un crash au démarrage, chercher une stack trace récente.

Utilisation : ouvrir la page → liste de tous les containers → cliquer un container → logs en streaming, recherche plein texte, split-screen multi-containers.

Limite : pas d’historique après rotation des logs → pour l’historique, utiliser Grafana/Loki.

3. Beszel — Métriques Système et Containers

Containers

beszel-hub (dashboard, port 8090) + beszel-agent (collecteur, network host, port 45876)

Accès

http://<serveur>:8090 — ou via Traefik : https://beszel.clarajob.com / https://beszel.marketisia.com

Premier login

Créer le compte admin à la première connexion

Liaison hub↔agent

Clé BESZEL_AGENT_KEY (variable d’env de l’agent)

RAM

hub 100 Mo, agent 50 Mo

Ce que tu y vois : CPU, RAM, disque, réseau du serveur + consommation par container, avec historique et graphes. C’est l’outil pour répondre à « pourquoi le serveur rame ? » et « quel container mange la RAM ? ».

Alertes : Beszel permet de configurer des alertes (seuils CPU/RAM/disque) depuis son UI, par système surveillé.

4. Loki + Promtail + Grafana — Logs Centralisés

promtail

grafana/promtail:3.4.2 — lit les logs de tous les containers (/var/lib/docker/containers + docker.sock) et les pousse vers Loki. Config : monitoring/promtail/promtail-config.yml.

loki

grafana/loki:3.4.2 — stocke et indexe les logs. Port 3100 interne (pas exposé sur l’hôte). Config : monitoring/loki/loki-config.yml. Volume loki-data.

grafana

grafana/grafana:12.0.0 — port 3000 (GRAFANA_PORT). Datasource Loki provisionnée automatiquement (monitoring/grafana/provisioning/). Login : GRAFANA_ADMIN_USER/GRAFANA_ADMIN_PASSWORD (défaut admin/admin). Volume grafana-data.

Quand l’utiliser : recherche dans l’historique des logs, corrélation entre services, investigation post-mortem (« que s’est-il passé cette nuit à 3h ? »).

Requêtes LogQL utiles (Grafana → Explore → datasource Loki) :

# Tous les logs d'un container
{container="clarajob-front-api"}

# Erreurs sur tous les containers
{job=~".+"} |= "ERROR"

# Erreurs de l'API ClaraJob sur la dernière heure
{container="clarajob-front-api"} |= "ERROR"

# Exceptions Java avec stack trace
{container="marketisia-front-api"} |~ "Exception|Caused by"

# Logs des backups Ansible (si collectés via le host)
{container=~"clarajob-ddl|clarajob-mongo"} |= "dump"

5. UIs Spécialisées par Technologie

Outil Container Accès Sert à

Kafka UI

marketisia-kafka-ui

port 8091

Topics, offsets, consumer lag, brokers — et produire un message manuellement (Topics → Produce Message)

RabbitMQ Management

rabbitmq

port 15672

Queues, exchanges, connexions — et publier un message (login RABBITMQ_USER/RABBITMQ_PASS, défaut dev/dev)

RedisInsight

redisinsight

port 5540

Explorer les clés Redis, monitoring. Connexion : redis://default:${REDIS_PASSWORD}@redis:6379

Adminer

adminer

port 9093 / adminer.clarajob.com

Requêtes SQL rapides sur PostgreSQL (clarajob-ddl, marketisia-ddl, auth_server_db)

pgAdmin

marketisia-pgadmin

port 5050

Administration PostgreSQL avancée (serveurs pré-provisionnés via servers.json)

Mongoku

clarajob-mongoku (stack clarajob_sa)

voir compose clarajob_sa

Explorer MongoDB ClaraJob

Semaphore

semaphore

port 3001

Lancer les playbooks Ansible depuis le navigateur (backup/restore/deploy)

Rundeck

rundeck

port 4440

Alternative à Semaphore : workflows, RBAC, scheduler (⚠️ ~1 Go RAM)

6. Quel Outil pour Quel Problème ?

Situation Outil

« L’appli vient de crasher, je veux voir pourquoi »

Dozzle (logs live)

« Le serveur est lent depuis ce matin »

Beszel (CPU/RAM/disque par container)

« Que s’est-il passé cette nuit à 3h ? »

Grafana/Loki (historique des logs)

« Les messages Kafka sont-ils consommés ? »

Kafka UI (consumer lag)

« Je veux tester un message dans la queue »

Kafka UI / RabbitMQ Management (produce/publish)

« Cette clé est-elle en cache ? »

RedisInsight

« Vérifier une donnée en base »

Adminer (rapide) / pgAdmin (avancé) / Mongoku (Mongo)

« Lancer un backup sans terminal »

Semaphore (UI Ansible)

« Le backup de cette nuit a-t-il tourné ? »

SSH : tail /var/log/ansible-backup.log

7. Démarrer / Redémarrer le Monitoring

# Sur le serveur, depuis /home/admin/app/sever-admin :
docker compose up -d                                          # tout le stack infra
docker compose -f docker-compose.monitoring.yml up -d         # Dozzle + Beszel + RedisInsight
docker compose -f docker-compose.observability.yml up -d      # Loki + Promtail + Grafana
docker compose restart grafana                                # un seul service

# Via Ansible depuis ton poste (seul dozzle a une cible make deploy) :
make deploy APP=dozzle

8. Vérifications de Santé Régulières

ssh -i ~/.ssh/serverAdminSSHKeypair.pem admin@18.158.207.98

# Les services de monitoring tournent-ils ?
docker ps --format 'table {{.Names}}\t{{.Status}}' | \
  grep -E "dozzle|beszel|loki|promtail|grafana|redisinsight"

# Healthchecks intégrés (loki et grafana en ont)
docker inspect --format '{{.State.Health.Status}}' loki grafana

# Espace disque (Loki et les dumps DB remplissent le disque avec le temps)
df -h /
du -sh /var/lib/docker/volumes/*loki* 2>/dev/null

9. Checklist Monitoring Après un Déploiement

□ Dozzle : le container redéployé log-t-il normalement ? (pas de boucle de crash)
□ Beszel : CPU/RAM du container dans les normes habituelles ?
□ Grafana/Loki : pas de vague d'erreurs depuis le déploiement ?
□ Si Kafka concerné : Kafka UI → consumer lag stable ?
□ docker ps : STATUS "Up" (pas "Restarting") pour tous les containers touchés

10. Prochaines Étapes