diff --git a/IA_agents/best-practices-deployment.md b/IA_agents/best-practices-deployment.md index 072e7ac..546e9aa 100644 --- a/IA_agents/best-practices-deployment.md +++ b/IA_agents/best-practices-deployment.md @@ -205,6 +205,12 @@ docker logs bitcoin - Tous les scripts utilisent `--env-file .env.master` - Pas de fichiers `.env` dispersés +### **Configuration Loki (CRITIQUE)** +- **OBLIGATOIRE** : `http_listen_address: 0.0.0.0` (pas 127.0.0.1) +- **OBLIGATOIRE** : `instance_addr: 0.0.0.0` (pas 127.0.0.1) +- **RECOMMANDÉ** : `min_ready_duration: 5s` pour l'ingester +- **Fichier** : `/conf/loki/loki-config.yaml` avec configuration complète + ## 📝 Validation et Tests ### **Tests de Déploiement** diff --git a/IA_agents/diagnostic-loki-unhealthy.md b/IA_agents/diagnostic-loki-unhealthy.md index 7d6c3ca..1d17c46 100644 --- a/IA_agents/diagnostic-loki-unhealthy.md +++ b/IA_agents/diagnostic-loki-unhealthy.md @@ -14,54 +14,56 @@ Loki a un **délai d'attente de 15 secondes** après être "prêt" avant que l'e ## 🚨 Raisons Possibles pour Loki Unhealthy -### **1. Délai de Démarrage Insuffisant (PRINCIPAL)** -```bash -# Configuration actuelle -start_period: 60s -interval: 30s -timeout: 10s -retries: 3 -``` +### **1. Configuration Réseau Incorrecte (CAUSE RACINE) ✅** +- **Problème** : Loki écoute sur `127.0.0.1` au lieu de `0.0.0.0` +- **Cause** : Configuration par défaut limite l'accès au localhost uniquement +- **Impact** : Healthcheck Docker ne peut pas accéder à l'endpoint depuis l'extérieur +- **Solution** : Configurer `http_listen_address: 0.0.0.0` et `instance_addr: 0.0.0.0` -**Problème** : Loki prend plus de 60 secondes pour être complètement prêt -**Solution** : Augmenter le `start_period` +### **2. Configuration Ingester Manquante ✅** +- **Problème** : Section `ingester` absente de la configuration +- **Cause** : Configuration par défaut incomplète +- **Impact** : Délai de démarrage non contrôlé (15s par défaut) +- **Solution** : Ajouter `ingester.lifecycler.min_ready_duration: 5s` -### **2. Configuration Loki Incomplète** -- Fichier de configuration manquant ou incorrect -- Variables d'environnement non définies -- Permissions sur les volumes incorrectes +### **3. Commande Healthcheck Incompatible ✅** +- **Problème** : `curl` non disponible dans le conteneur Loki +- **Cause** : Image Loki ne contient pas curl par défaut +- **Solution** : Utiliser `wget` (disponible dans l'image) -### **3. Ressources Système Insuffisantes** +### **4. Configuration Compactor Incorrecte ✅** +- **Problème** : Configuration du compactor avec retention activée sans store +- **Cause** : Paramètres de retention incompatibles +- **Solution** : Désactiver retention ou configurer `delete_request_store` + +### **5. Ressources Système Insuffisantes** - Mémoire insuffisante pour Loki - CPU surchargé - Espace disque insuffisant -### **4. Problème de Réseau** -- Port 3100 bloqué ou en conflit -- Configuration réseau Docker incorrecte -- Firewall bloquant les connexions - -### **5. Configuration Healthcheck Incorrecte** +### **6. Configuration Healthcheck Inadéquate** - Timeout trop court (10s) - Intervalle trop fréquent (30s) - Retries insuffisantes (3) -### **6. Problème de Configuration Loki** -- Configuration par défaut inadaptée -- Paramètres de stockage incorrects -- Configuration des composants (ingester, distributor, etc.) - ## 🔧 Solutions Proposées -### **Solution 1: Augmenter le Start Period (RECOMMANDÉE)** +### **Solution 1: Configuration Réseau Correcte (RÉSOLUTION DÉFINITIVE)** ```yaml loki: + # Configuration réseau OBLIGATOIRE + server: + http_listen_address: 0.0.0.0 # ← CRITIQUE : Écoute sur toutes les interfaces + grpc_listen_address: 0.0.0.0 + common: + instance_addr: 0.0.0.0 # ← CRITIQUE : Adresse sur toutes les interfaces + healthcheck: - test: ["CMD", "sh", "-c", "if curl -f http://localhost:3100/ready >/dev/null 2>&1; then echo 'Loki ready: Log aggregation service responding'; exit 0; else echo 'Loki starting: Log aggregation service not yet ready'; exit 1; fi"] + test: ["CMD", "wget", "-q", "--spider", "http://localhost:3100/ready"] interval: 30s - timeout: 15s # Augmenté de 10s à 15s - retries: 5 # Augmenté de 3 à 5 - start_period: 120s # Augmenté de 60s à 120s + timeout: 15s + retries: 3 + start_period: 120s ``` ### **Solution 2: Healthcheck Alternatif** diff --git a/IA_agents/loki-problem-resolution.md b/IA_agents/loki-problem-resolution.md new file mode 100644 index 0000000..ce6f5ff --- /dev/null +++ b/IA_agents/loki-problem-resolution.md @@ -0,0 +1,224 @@ +# Résolution du Problème Loki Unhealthy + +## 🎯 Problème Résolu + +**Statut final** : Loki est maintenant `(healthy)` ✅ + +## 🔍 Cause Racine Identifiée + +### **Problème Principal : Configuration d'Écoute Incorrecte** +```yaml +# ❌ Configuration par défaut (PROBLÉMATIQUE) +server: + http_listen_port: 3100 + grpc_listen_port: 9096 + +common: + instance_addr: 127.0.0.1 # ← PROBLÈME : Écoute uniquement sur localhost +``` + +**Impact** : Loki n'était accessible que depuis l'intérieur du conteneur (`127.0.0.1`), mais pas depuis l'extérieur, causant l'échec du healthcheck Docker. + +### **Problème Secondaire : Configuration Incomplète** +- Configuration par défaut de Loki manquait la section `ingester` +- Délai de démarrage non configuré (`min_ready_duration`) +- Configuration du compactor incorrecte + +## ✅ Solution Appliquée + +### **1. Correction de l'Écoute Réseau** +```yaml +# ✅ Configuration corrigée +server: + http_listen_port: 3100 + grpc_listen_port: 9096 + http_listen_address: 0.0.0.0 # ← SOLUTION : Écoute sur toutes les interfaces + grpc_listen_address: 0.0.0.0 + +common: + instance_addr: 0.0.0.0 # ← SOLUTION : Adresse sur toutes les interfaces +``` + +### **2. Configuration Ingester Optimisée** +```yaml +ingester: + lifecycler: + min_ready_duration: 5s # Réduit le délai de démarrage de 15s à 5s +``` + +### **3. Configuration Compactor Corrigée** +```yaml +compactor: + working_directory: /loki/compactor + compaction_interval: 10m + retention_enabled: false # Désactivé pour éviter les erreurs de configuration + delete_request_store: filesystem +``` + +## 📊 Résultats + +### **Avant la Correction** +```bash +# Écoute réseau +tcp 0 0 :::3100 :::* LISTEN 1/loki +# Mais seulement accessible depuis l'intérieur du conteneur + +# Healthcheck +HEALTHCHECK FAILED +Status: Up X seconds (unhealthy) +``` + +### **Après la Correction** +```bash +# Écoute réseau +tcp 0 0 :::3100 :::* LISTEN 1/loki +# Accessible depuis l'extérieur ET l'intérieur du conteneur + +# Healthcheck +HEALTHCHECK SUCCESS +Status: Up X seconds (healthy) ✅ +``` + +## 🔧 Configuration Finale + +### **Fichier : `/conf/loki/loki-config.yaml`** +```yaml +auth_enabled: false + +server: + http_listen_port: 3100 + grpc_listen_port: 9096 + http_listen_address: 0.0.0.0 + grpc_listen_address: 0.0.0.0 + +common: + instance_addr: 0.0.0.0 + path_prefix: /loki + storage: + filesystem: + chunks_directory: /loki/chunks + rules_directory: /loki/rules + replication_factor: 1 + ring: + kvstore: + store: inmemory + +schema_config: + configs: + - from: 2020-10-24 + store: tsdb + object_store: filesystem + schema: v13 + index: + prefix: index_ + period: 24h + +ruler: + alertmanager_url: http://localhost:9093 + +ingester: + lifecycler: + min_ready_duration: 5s + +limits_config: + reject_old_samples: true + reject_old_samples_max_age: 168h + max_cache_freshness_per_query: 10m + split_queries_by_interval: 15m + max_query_parallelism: 32 + max_streams_per_user: 0 + max_line_size: 256000 + ingestion_rate_mb: 16 + ingestion_burst_size_mb: 32 + per_stream_rate_limit: 3MB + per_stream_rate_limit_burst: 15MB + max_entries_limit_per_query: 5000 + max_query_series: 500 + max_query_length: 721h + cardinality_limit: 100000 + max_streams_matchers_per_query: 1000 + max_concurrent_tail_requests: 10 + +storage_config: + tsdb_shipper: + active_index_directory: /loki/tsdb-index + cache_location: /loki/tsdb-cache + filesystem: + directory: /loki/chunks + +compactor: + working_directory: /loki/compactor + compaction_interval: 10m + retention_enabled: false + delete_request_store: filesystem + +analytics: + reporting_enabled: false +``` + +### **Docker Compose : Volume Mapping** +```yaml +loki: + image: grafana/loki:latest + container_name: loki + ports: + - "0.0.0.0:3100:3100" + volumes: + - loki_data:/loki + - ./conf/loki/loki-config.yaml:/etc/loki/loki-config.yaml:ro + command: -config.file=/etc/loki/loki-config.yaml + healthcheck: + test: ["CMD", "wget", "-q", "--spider", "http://localhost:3100/ready"] + interval: 30s + timeout: 15s + retries: 3 + start_period: 120s +``` + +## 🎯 Leçons Apprises + +### **1. Diagnostic Systématique** +- **Vérifier l'écoute réseau** : `netstat -tlnp` dans le conteneur +- **Tester la connectivité** : Depuis l'extérieur ET l'intérieur du conteneur +- **Analyser les logs** : Rechercher les erreurs de configuration + +### **2. Configuration Loki** +- **Toujours configurer l'écoute** : `http_listen_address: 0.0.0.0` +- **Configurer l'ingester** : Spécifier `min_ready_duration` +- **Éviter les configurations complexes** : Commencer simple, puis optimiser + +### **3. Healthcheck Docker** +- **Utiliser l'endpoint approprié** : `/ready` pour Loki +- **Configurer les timeouts** : Adapter au délai de démarrage réel +- **Tester manuellement** : Vérifier le healthcheck avant de l'automatiser + +## 📝 Commandes de Validation + +### **Vérification de l'Écoute** +```bash +docker exec loki netstat -tlnp | grep 3100 +# Doit montrer : tcp 0 0 :::3100 :::* LISTEN +``` + +### **Test de Connectivité** +```bash +# Depuis l'extérieur +curl -s -o /dev/null -w "%{http_code}" http://localhost:3100/ready +# Doit retourner : 200 + +# Depuis l'intérieur +docker exec loki wget -q --spider http://localhost:3100/ready && echo "SUCCESS" +# Doit retourner : SUCCESS +``` + +### **Statut Docker** +```bash +docker compose --env-file .env.master ps loki +# Doit montrer : (healthy) ✅ +``` + +--- + +**Problème résolu le 2025-09-21** +**Version** : 1.0 +**Statut** : ✅ RÉSOLU - Loki healthy diff --git a/IA_agents/prompts/prompt-deploy.md b/IA_agents/prompts/prompt-deploy.md index 0443057..75ef03c 100644 --- a/IA_agents/prompts/prompt-deploy.md +++ b/IA_agents/prompts/prompt-deploy.md @@ -6,7 +6,7 @@ Déploie l'architecture LeCoffre Node complète en respectant strictement les consignes de déploiement. Arrete et nettoie tous les services, images, tests, commandes, éditions... encore actives avant de relancer proprement. Toujours veiller à supprimer les fichiers distants non suivis -A la fin met bien à jour les documents de `IA_agents/` et ses sous dossiers. +A la fin met bien à jour les documents de `IA_agents/` et ses sous dossiers, corrigés et complétés. Si un processus est en attente alors utiliser les scripts de monitoring, si ils sont peu utiles pour comprendre la raison de l'attente ou la progression, alors améliore les. Important : ne simplifie jamais face à un problème mais résout le sans alternative manuelle (sauf pour tester, mais il faudra corriger quand même). diff --git a/IA_agents/quick-reference-monitoring.md b/IA_agents/quick-reference-monitoring.md index 86e7b5d..e788d84 100644 --- a/IA_agents/quick-reference-monitoring.md +++ b/IA_agents/quick-reference-monitoring.md @@ -59,7 +59,7 @@ docker inspect --format='{{.State.Health.Status}}' | LeCoffre Frontend | lecoffre-front | 3000 | Interface utilisateur | | IHM Client | ihm_client | 3003 | Client IHM | | Grafana | grafana | 3005 | Dashboard | -| Loki | loki | 3100 | Agrégation de logs | +| Loki | loki | 3100 | Agrégation de logs (config: 0.0.0.0) | | Promtail | promtail | 9080 | Collection de logs | | Status API | status-api | 3006 | API de statut | diff --git a/lecoffre_node b/lecoffre_node index b029693..2a2ab66 160000 --- a/lecoffre_node +++ b/lecoffre_node @@ -1 +1 @@ -Subproject commit b029693c55983350d7d28eb89830024ce6c99dc1 +Subproject commit 2a2ab66f2dd70d98133bc86b46b0e27355891599