Mise en place du logging centralisé : ELK Stack (augmentation RAM 8go, clé cryptage kibana, logging, pipeline, etc...)

This commit is contained in:
Waloshi6
2026-01-30 18:19:21 +01:00
parent c8204829e9
commit 88a99c0be1
19 changed files with 323 additions and 32 deletions

32
ProcédureGit.md Normal file
View File

@@ -0,0 +1,32 @@
# Test rapide avant d'enregistrer :
- Redémarrer le docker principale
cd C:\DevOpsProject\docker\
docker-compose -f docker-compose.yml down --remove-orphans
docker-compose -f docker-compose.yml up -d
- Redémarrer les autres dockers
cd C:\DevOpsProject\scripts\
.\start_other_ctnrs.ps1
# Pour afficher tous les conteneurs Docker, ainsi que les nœuds et pods Kubernetes :
- Conteneurs Docker
docker ps -a
- Nœuds Kubernetes
kubectl get nodes
- Pods Kubernetes
kubectl get pods --all-namespaces
✅ Docker : Tous les services (ELK, Gitea, NGINX, base de données, monitoring) sont Up et fonctionnels.
✅ Kubernetes : Les nœuds sont Ready, les pods système sont Running.
# Pusher le projet modifié dans git :
- Aller dans le dossier du projet
- cliq droit "git bash here"
- "git add ."
- "git commit -m "détail des modifs"
- "git push origin main"

View File

@@ -1,8 +1,8 @@
x-logging: &default-logging
driver: fluentd
driver: json-file
options:
fluentd-address: localhost:24224
tag: devops.*
max-size: "10m"
max-file: "5"
services:
db:

View File

@@ -13,6 +13,12 @@ services:
hard: -1
volumes:
- elasticsearch-data:/usr/share/elasticsearch/data
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:9200/_cluster/health?wait_for_status=yellow || exit 1"]
interval: 10s
timeout: 10s
retries: 10
start_period: 30s
ports:
- "9200:9200"
networks:
@@ -24,6 +30,8 @@ services:
environment:
- SERVER_HOST=0.0.0.0
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
volumes:
- ../monitoring/elklogs/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml:ro
ports:
- "5601:5601"
networks:
@@ -37,14 +45,16 @@ services:
environment:
- LS_JAVA_OPTS=-Xms512m -Xmx512m
volumes:
- /mnt/c/DevOpsProject/monitoring/elklogs/logstash/config:/usr/share/logstash/pipeline:ro
- /mnt/c/DevOpsProject/monitoring/elklogs/logstash/config/jvm.options:/usr/share/logstash/config/jvm.options:ro
- ../monitoring/elklogs/logstash/pipeline/pipelines.yml:/usr/share/logstash/pipeline/pipelines.yml:ro
- ../monitoring/elklogs/logstash/config/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
- ../monitoring/elklogs/logstash/config/jvm.options:/usr/share/logstash/config/jvm.options:ro
ports:
- "5044:5044"
networks:
- elk
depends_on:
- elasticsearch
elasticsearch:
condition: service_healthy
filebeat:
image: docker.elastic.co/beats/filebeat:8.17.0

View File

@@ -1,8 +1,8 @@
x-logging: &default-logging
driver: fluentd
driver: json-file
options:
fluentd-address: localhost:24224
tag: devops.*
max-size: "10m"
max-file: "5"
services:
gitea:

View File

@@ -1,8 +1,8 @@
x-logging: &default-logging
driver: fluentd
driver: json-file
options:
fluentd-address: localhost:24224
tag: devops.*
max-size: "10m"
max-file: "5"
services:
nginx:

View File

@@ -1,8 +1,8 @@
x-logging: &default-logging
driver: fluentd
driver: json-file
options:
fluentd-address: localhost:24224
tag: devops.*
max-size: "10m"
max-file: "5"
services:
app:

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000024
MANIFEST-000048

View File

@@ -1 +1 @@
MANIFEST-000022
MANIFEST-000046

View File

@@ -100,3 +100,111 @@
07:31:18.922596 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
07:31:18.962518 db@janitor F·3 G·0
07:31:18.962774 db@open done T·47.494468ms
=============== Jan 30, 2026 (UTC) ===============
13:54:27.868593 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed
13:54:27.892455 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
13:54:27.892849 db@open opening
13:54:27.894307 journal@recovery F·1
13:54:27.894613 journal@recovery recovering @23
13:54:27.897603 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
13:54:27.947761 db@janitor F·3 G·0
13:54:27.947926 db@open done T·54.793348ms
=============== Jan 30, 2026 (UTC) ===============
14:15:33.586338 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed
14:15:33.592592 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
14:15:33.598256 db@open opening
14:15:33.599579 journal@recovery F·1
14:15:33.599862 journal@recovery recovering @25
14:15:33.602391 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
14:15:33.640088 db@janitor F·3 G·0
14:15:33.640289 db@open done T·41.7863ms
=============== Jan 30, 2026 (UTC) ===============
14:17:09.197281 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed
14:17:09.202591 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
14:17:09.202962 db@open opening
14:17:09.204108 journal@recovery F·1
14:17:09.204373 journal@recovery recovering @27
14:17:09.207398 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
14:17:09.239988 db@janitor F·3 G·0
14:17:09.240147 db@open done T·37.04192ms
=============== Jan 30, 2026 (UTC) ===============
14:27:40.555685 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed
14:27:40.563000 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
14:27:40.563425 db@open opening
14:27:40.564901 journal@recovery F·1
14:27:40.565188 journal@recovery recovering @29
14:27:40.568025 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
14:27:40.618333 db@janitor F·3 G·0
14:27:40.618563 db@open done T·54.973788ms
=============== Jan 30, 2026 (UTC) ===============
14:33:00.048029 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed
14:33:00.070767 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
14:33:00.072809 db@open opening
14:33:00.074262 journal@recovery F·1
14:33:00.075293 journal@recovery recovering @31
14:33:00.095031 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
14:33:00.177600 db@janitor F·3 G·0
14:33:00.178954 db@open done T·105.87586ms
=============== Jan 30, 2026 (UTC) ===============
14:37:56.105146 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed
14:37:56.143515 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
14:37:56.144085 db@open opening
14:37:56.158985 journal@recovery F·1
14:37:56.159486 journal@recovery recovering @33
14:37:56.168153 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
14:37:56.245259 db@janitor F·3 G·0
14:37:56.245604 db@open done T·101.341687ms
=============== Jan 30, 2026 (UTC) ===============
14:58:51.261319 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed
14:58:51.268236 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
14:58:51.268769 db@open opening
14:58:51.270343 journal@recovery F·1
14:58:51.270594 journal@recovery recovering @35
14:58:51.273508 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
14:58:51.304932 db@janitor F·3 G·0
14:58:51.305182 db@open done T·36.20052ms
=============== Jan 30, 2026 (UTC) ===============
15:02:02.430077 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed
15:02:02.436038 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
15:02:02.436457 db@open opening
15:02:02.438119 journal@recovery F·1
15:02:02.438396 journal@recovery recovering @37
15:02:02.440960 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
15:02:02.471433 db@janitor F·3 G·0
15:02:02.471668 db@open done T·35.052337ms
=============== Jan 30, 2026 (UTC) ===============
15:03:56.374460 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed
15:03:56.380375 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
15:03:56.380849 db@open opening
15:03:56.382082 journal@recovery F·1
15:03:56.382416 journal@recovery recovering @39
15:03:56.385389 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
15:03:56.418633 db@janitor F·3 G·0
15:03:56.418842 db@open done T·37.830034ms
=============== Jan 30, 2026 (UTC) ===============
15:05:39.076957 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed
15:05:39.083558 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
15:05:39.084101 db@open opening
15:05:39.086277 journal@recovery F·1
15:05:39.086634 journal@recovery recovering @41
15:05:39.090198 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
15:05:39.126223 db@janitor F·3 G·0
15:05:39.126403 db@open done T·42.051216ms
=============== Jan 30, 2026 (UTC) ===============
15:12:38.550365 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed
15:12:38.572801 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
15:12:38.573301 db@open opening
15:12:38.575371 journal@recovery F·1
15:12:38.576023 journal@recovery recovering @43
15:12:38.580508 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
15:12:38.617431 db@janitor F·3 G·0
15:12:38.621316 db@open done T·47.850414ms
=============== Jan 30, 2026 (UTC) ===============
16:51:56.898330 log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed
16:51:56.914950 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
16:51:56.915351 db@open opening
16:51:56.919693 journal@recovery F·1
16:51:56.919967 journal@recovery recovering @45
16:51:56.927562 version@stat F·[0 1] S·577B[0B 577B] Sc·[0.00 0.00]
16:51:56.988766 db@janitor F·3 G·0
16:51:56.988996 db@open done T·73.514866ms

View File

@@ -0,0 +1,31 @@
# =================================== Kibana Configuration ===================================
# Configuration principale pour Kibana 8.17
# --- Serveur ---
server.host: "0.0.0.0" # Écoute sur toutes les interfaces réseau
server.port: 5601 # Port d'accès à l'interface web
server.name: "kibana-devops" # Nom affiché dans les logs et l'UI
# --- Elasticsearch ---
elasticsearch.hosts: ["http://elasticsearch:9200"] # URL du cluster Elasticsearch
elasticsearch.requestTimeout: 30000 # Délai max pour les requêtes (ms)
# --- Sécurité ---
xpack.encryptedSavedObjects.encryptionKey: "b524234a31e5bf211a0bb157192b6faf"
# Chiffre les objets sauvegardés (dashboards, visualisations)
xpack.reporting.encryptionKey: "111d1cb71e564e0ac3aafae85151b895"
# Chiffre les rapports générés par Reporting
xpack.security.encryptionKey: "ecb7071b9737158642ca555ce25206fd"
# Chiffre les sessions utilisateur
# --- Fonctionnalités avancées ---
xpack.reporting.roles.enabled: false # ✅ Désactive le système de rôles déprécié
# Active le nouveau système basé sur les privilèges Kibana (requis pour les futures versions)
monitoring.kibana.collection.enabled: true # Active la collecte des métriques Kibana
# Affiche les performances de Kibana dans l'onglet Monitoring
# --- Interface ---
i18n.locale: "fr-FR" # Langue par défaut de l'interface

View File

@@ -1,6 +1,8 @@
-Xms1g
-Xmx1g
-Djava.awt.headless=true
-Dfile.encoding=UTF-8
-Xms512m
-Xmx512m
-XX:+UseG1GC
-XX:+HeapDumpOnOutOfMemoryError
-Djava.security.egd=file:/dev/urandom
-XX:HeapDumpPath=/usr/share/logstash/logs/heap_dump.hprof
-XX:MaxMetaspaceSize=256m
-XX:+DisableExplicitGC
-XX:+AlwaysPreTouch

View File

@@ -0,0 +1,14 @@
# pipelines.yml — Fichier de configuration principale pour Logstash
# Il définit quels pipelines (flux de traitement) Logstash doit charger.
# Ce fichier ne remplace pas logstash.conf, il le référence.
- pipeline.id: main
# ✅ Identifiant unique obligatoire du pipeline
path.config: "/usr/share/logstash/pipeline/logstash.conf"
# ✅ Chemin vers le fichier .conf à charger (doit exister dans le conteneur)
pipeline.workers: 2
# Nombre de threads pour traiter les événements (par défaut: nombre de CPU)
pipeline.batch.size: 125
# Taille du lot d'événements traités ensemble
queue.type: memory
# Type de file d'attente : "memory" (par défaut) ou "persisted" (sur disque)

View File

@@ -0,0 +1,92 @@
# ===================================
# Fichier : logstash.conf
# Description : Configuration complète de Logstash
# Auteur : DevOps Project
# Date : 30 janvier 2026
# ===================================
# ——— SECTION INPUT ———
# Définit les sources des logs
input {
# Entrée via Beats (Filebeat, Metricbeat, etc.) recommandé
beats {
port => 5044
# host => "0.0.0.0" # Écoute sur toutes les interfaces
}
# Exemple : lecture de fichiers logs locaux
# file {
# path => ["/var/log/*.log", "/app/logs/*.log"]
# start_position => "beginning"
# sincedb_path => "/dev/null" # Pour relire les fichiers à chaque démarrage (développement)
# }
# Exemple : réception de logs Syslog via UDP/TCP
# syslog {
# port => 514
# type => "syslog"
# }
}
# ——— SECTION FILTER ———
# Traitement, parsing et enrichissement des logs
filter {
# Exemple : filtrer uniquement les logs de type "nginx"
# if [type] == "nginx" {
# grok {
# match => { "message" => "%{COMBINEDAPACHELOG}" }
# }
# date {
# match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
# }
# }
# Exemple : parser des logs JSON
# json {
# source => "message"
# }
# Ajout de champs métadonnées
mutate {
add_field => {
"environment" => "production"
"project" => "DevOpsProject"
}
# Supprimer des champs inutiles
# remove_field => ["agent", "input_type"]
}
# Gestion des erreurs de parsing
# if "_grokparsefailure" in [tags] {
# drop {}
# }
}
# ——— SECTION OUTPUT ———
# Envoi des logs vers une destination
output {
# Sortie vers Elasticsearch
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "logs-%{+YYYY.MM.dd}"
# user => "elastic"
# password => "changeme"
}
# Sortie vers la console (utile pour le debug)
stdout {
codec => rubydebug
}
# Exemple : sortie vers un fichier
# file {
# path => "/logs/parsed-%{+YYYY-MM-dd}.log"
# codec => json
# }
}
# ——— CONSEILS ———
# - Placez ce fichier dans : ./pipeline/logstash.conf
# - Montez le dossier dans le conteneur Docker
# - Assurez-vous quElasticsearch est prêt avant Logstash
# - Utilisez `depends_on` avec condition de santé dans docker-compose.yml

View File

@@ -1,7 +1,4 @@
# Définit le chemin vers le dossier contenant tous tes fichiers docker-compose.yml
$projectPath = "C:\DevOpsProject\docker"
# La liste de tous tes fichiers docker-compose YAML à lancer
$composeFiles = @(
"docker-compose-db.yml",
"docker-compose-elk.yml",
@@ -9,12 +6,17 @@ $composeFiles = @(
"docker-compose-nginx.yml"
)
# Pour chaque fichier dans la liste
foreach ($file in $composeFiles) {
# Lance une nouvelle instance de 'docker-compose' pour ce fichier, en mode détaché (-d)
# Start-Process permet de lancer la commande en arrière-plan, sans bloquer le script
Start-Process -NoNewWindow -FilePath "docker-compose" -ArgumentList "-f `"$projectPath\$file`" up -d"
}
Write-Host "🔄 Arrêt du service $file..." -ForegroundColor Yellow
docker-compose -f "$projectPath\$file" down
# Affiche un message une fois tous les containers lancés
Write-Host "Tous les environnements ont été lancés."
Write-Host "🚀 Démarrage du service $file..." -ForegroundColor Cyan
docker-compose -f "$projectPath\$file" up -d
if ($LASTEXITCODE -eq 0) {
Write-Host "$file démarré avec succès." -ForegroundColor Green
} else {
Write-Host "❌ Échec lors du démarrage de $file." -ForegroundColor Red
}
}
Write-Host "🎉 Tous les services ont été relancés." -ForegroundColor Yellow