From 88a99c0be1622242ecde3e342f309ab24e3df768 Mon Sep 17 00:00:00 2001 From: Waloshi6 Date: Fri, 30 Jan 2026 18:19:21 +0100 Subject: [PATCH] =?UTF-8?q?Mise=20en=20place=20du=20logging=20centralis?= =?UTF-8?q?=C3=A9=20:=20ELK=20Stack=20(augmentation=20RAM=208go,=20cl?= =?UTF-8?q?=C3=A9=20cryptage=20kibana,=20logging,=20pipeline,=20etc...)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProcédureGit.md | 32 ++++++ docker/docker-compose-db.yml | 6 +- docker/docker-compose-elk.yml | 16 ++- docker/docker-compose-gitea.yml | 6 +- docker/docker-compose-nginx.yml | 6 +- docker/docker-compose.yml | 6 +- gitea/gitea-data/gitea/gitea.db | Bin 2445312 -> 2445312 bytes .../indexers/issues.bleve/store/root.bolt | Bin 65536 -> 65536 bytes .../queues/common/{000023.log => 000047.log} | 0 gitea/gitea-data/gitea/queues/common/CURRENT | 2 +- .../gitea/queues/common/CURRENT.bak | 2 +- gitea/gitea-data/gitea/queues/common/LOG | 108 ++++++++++++++++++ .../{MANIFEST-000024 => MANIFEST-000048} | Bin 159 -> 159 bytes .../gitea/sessions/3/f/3fb760b8668882c2 | Bin 148 -> 0 bytes monitoring/elklogs/kibana/config/kibana.yml | 31 +++++ .../elklogs/logstash/config/jvm.options | 12 +- .../elklogs/logstash/config/pipelines.yml | 14 +++ .../elklogs/logstash/pipeline/logstash.conf | 92 +++++++++++++++ scripts/start_other_ctnrs.ps1 | 22 ++-- 19 files changed, 323 insertions(+), 32 deletions(-) create mode 100644 ProcédureGit.md rename gitea/gitea-data/gitea/queues/common/{000023.log => 000047.log} (100%) rename gitea/gitea-data/gitea/queues/common/{MANIFEST-000024 => MANIFEST-000048} (59%) delete mode 100644 gitea/gitea-data/gitea/sessions/3/f/3fb760b8668882c2 create mode 100644 monitoring/elklogs/kibana/config/kibana.yml create mode 100644 monitoring/elklogs/logstash/config/pipelines.yml create mode 100644 monitoring/elklogs/logstash/pipeline/logstash.conf diff --git a/ProcédureGit.md b/ProcédureGit.md new file mode 100644 index 0000000..7f1a789 --- /dev/null +++ b/ProcédureGit.md @@ -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" + + diff --git a/docker/docker-compose-db.yml b/docker/docker-compose-db.yml index a2159dd..9e76bd4 100644 --- a/docker/docker-compose-db.yml +++ b/docker/docker-compose-db.yml @@ -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: diff --git a/docker/docker-compose-elk.yml b/docker/docker-compose-elk.yml index 7fdf937..c1ff276 100644 --- a/docker/docker-compose-elk.yml +++ b/docker/docker-compose-elk.yml @@ -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 diff --git a/docker/docker-compose-gitea.yml b/docker/docker-compose-gitea.yml index 7696b6a..7997c41 100644 --- a/docker/docker-compose-gitea.yml +++ b/docker/docker-compose-gitea.yml @@ -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: diff --git a/docker/docker-compose-nginx.yml b/docker/docker-compose-nginx.yml index 7cfd89b..0b612c5 100644 --- a/docker/docker-compose-nginx.yml +++ b/docker/docker-compose-nginx.yml @@ -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: diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index c583741..e4704b4 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -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: diff --git a/gitea/gitea-data/gitea/gitea.db b/gitea/gitea-data/gitea/gitea.db index 7f5406ce9949fe795983241dfc986cdfc5764702..1b24f5741345778909643b8d02d8d2a8ddfb9d5e 100644 GIT binary patch delta 1290 zcmb`GU1%It6oBW>&(7?0?md&)xl?0Ock6B>)XlPM6(K$((G*`?lTuRzyGf*0vrtSd zh#(0zR5q4Snoz{Aq_d%E>WQa(R;wT<{E+A|aF8G@*YhUkcaL=Y3P zkf?0W*qJV(O%#W1WC!BN;xL_a?FGd?U>%OA+QL^2Q`4IE@j+b}CE6xePtaCXZ0}AP zIwtOsYKgARikr(cB5%dn*FAi6DX=X~Cq>*uYa1>v4Ku5kYPO*fqD3omVs)7zfVfBl z;vq4_m#fQsPnH?@Uj(*Ls{3I}uyx+7lZl4y>VH3%t?h+4@X^{c8;Q)5+Cuc=;D)vBu8bONTO zeK@7S9oT>$;d9u8HTVHOfgA8W%)>SK7G~ipEW#Q16~2U1n6dy~Sht8DN+T9Z-IMe2 z;E1dFFe%Jzkc@zUX_!Rom#Wrk#agXctDcza2wro2XH22}G)HykigVT(ldLl+I-=to zOA}w@@3&hQzY$L$?^Xp9%t2dD+ zhK7Up|Ff4IdM7Yk5|OW;4(43B<2&m&K<$q&f=kSN_2uHxH;)|=<0Kgf_b#U*UgqY+ z^@{L>@$%kY;2T@{qiKF`in`V#*<5uJh#o*_VWsMiQlw-KCL-7e|uj&&D&@ zrU!)6nc8mX#_i+C3*jrITQ+y4e*a)bOyV=y=jA?q<|`D)!J@odYS{>Xhc?>%MJqH^nW Rmh*o_HJ@u)*XX?-{2v;udDs8| delta 3608 zcmZ`+YitzP72es0cXsj2c!PI|6B5t9upzLX_rp?)oe)~7p zO2Gx;pa@|%qPIjPK$?=Okn`q0^v+#%Tb)54uVAh;R!VjvJ$JJD`)cP6)gv5HF^?ktRT7C2ZC z7J`Lg5m*B(3gcn1T4y0%=;nfBKWNQwtsyZlB^JwL7iirS-}EM}8dVLt(Cr zhnW9Ro34ob1|b@cgg7o5qkkh~*Di}N3DyKlz@C6DhBeo&T~4l0el{MCC%6XzX{~rv zxJbm=67ye?c6KM;z9qZ65+V5TqsCx9v0ebUpA)1(6WSdCLsM!nv?!2y)S(!-Io3${aU&ueIlKa zu1g?PN;^n&J6q}761jUd9wn7Z>g3n>Yn6kk`w|zb?KzP;-4yw^^k3<2Epb-( zC(MG6Jr0Sif)u|c< z-B5JHwzkOqMNKz)i<+yHO6~hfgG1%Yp3Z$rK`W^Ga(S@SS1Ru-^~=M>p$k@D{Tm2z)M9v&~$+$mQNjtuRHf5WP_ZP;7n{guI8uk5bu zm#c%NY7yz*6z({hvIT{UyGM${U`a0h5Gg}+mvYb>o71T~1=}RTCB%){pVTh+8RhfKu$x4^na64~@(awDH_jk*QRG!&Ec zB-0%{mSULP+>lFpTX74zY1jri_aC_<%HHcHnYxonvGfMFV3?*()RpOGKb|^Va`TNW z+Z|4dgQTxz=hveio6POU4%lJcf@PYvO-B1XIv93TGPy0MhOr-;Otj^f__4NW7zUZS z?4QRm4NWK9rW{+1BAaxt$ZI&5Yg&#&dj2Rg4jFdI+^)0&(hUW?8Hz?|E zbf4+av(%+xDUD3d<`$D`{-MhvqlpDknrVZ8x%>5~C=%g9P}*NeM=urcz_bpHpe{0b zG1EN1m|KThz!Z6H_ue|_fkH-4=BSLYAjSHlM}_WelZ>A6_ein3Fhr%KLa6B%=^6~t4!C)S zAU##3DyRLxTZ+l_AF`|;D%BxWy`Tf0%VEupA|682NY??mxy}Id=nAX2h*gC2EJG!u zyK@RnppeWQgET$fRj>&0RD3f;NA`?gQ92V)m ziXHhes-?Ip=~?2n0V5vRAQQ(a=Nf2a6r6+}X+pH_A~Q>~J`WnD5?A_Gra9Et-+O*G z*R%)|Ydu!f&4NnC^SEzpI+!SjdgyVcgPiEdN5T}7bDvP<((z%^QmREJ-p_gg5!xk% zBu?e(*Z^M&nOR@QVT$pUd{}_a1D9}yKMzc*bwwxL<*XXTek{{c$fv9FIu@hP4(UDs zHt6h#m~@nq(QO&k+nsG%(Clw>7?URLgpQpZ2NP`2Fpq&=zD`GziALy-!MG;X@8`lO zPdzr7zV1y7i>g^AT`%SIhWhi~e1@u3w;*0RTy9QzGmBxje!1|LY8kWUGjDt|jJh3A zB4f>>0{~-~vPS2-he`S?HZlM~(jzmHdFcJG`s-08TMJmTn6_Oq(+8EI0+j5K?PIts zj40+HGsiPYe+SU9>(D`3XUC#cDrohq{u1C1OH7;j`3UO4XrDi{i%~y65U?o4Xb;A3 zgUv<(*?XQ{Z{36Jn^$k04GK-tC8WI%4HAISoEBdhHf0eFs?R`_pcr2cZ$<*^bOJJM z(w=x2tnZ`@*mQ!bWa>y(s{?#a-@z4N4X`O&$W6RgR}#-W7GyWEIj8VQ2Z5ND{ukK8 zq`N)D%0Xvn#@k?*mc!neWBND#SJ0;7!?fbse0n_(lcU;z@|Xf-?v^}%csff-_bz{f z4(Ky+_=!Qe{u_Z}n|`je1_x9jdae!8w7b0La8aN=ui`bkq&=JKyYU<@IrpZoKZo90 zT_=+n`V+!K{*a-!+M%Np-!S=woaO-sU&`0$45G(%D0?p1`%zt8zGLRO5W5`?B@b6` z`WNZ?&lifxc&y%9#6xQaQTJuD7n<@Bg%1V-i>@?W58`L~J+9^0%kky_$HlhtE&Rle zmR6PLcs?8s*Z;XNpUXfAjx% G#svUW1 delta 117 zcmZo@U}TFqxTfsL>2{ReP+Xn>JTl<#I{QL>2{Rac0Sh>JnnweK(X2Qb6zytuG?kYY2 diff --git a/monitoring/elklogs/kibana/config/kibana.yml b/monitoring/elklogs/kibana/config/kibana.yml new file mode 100644 index 0000000..c5eec7e --- /dev/null +++ b/monitoring/elklogs/kibana/config/kibana.yml @@ -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 \ No newline at end of file diff --git a/monitoring/elklogs/logstash/config/jvm.options b/monitoring/elklogs/logstash/config/jvm.options index 9c56234..5233ca1 100644 --- a/monitoring/elklogs/logstash/config/jvm.options +++ b/monitoring/elklogs/logstash/config/jvm.options @@ -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 \ No newline at end of file diff --git a/monitoring/elklogs/logstash/config/pipelines.yml b/monitoring/elklogs/logstash/config/pipelines.yml new file mode 100644 index 0000000..2d5e5b5 --- /dev/null +++ b/monitoring/elklogs/logstash/config/pipelines.yml @@ -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) \ No newline at end of file diff --git a/monitoring/elklogs/logstash/pipeline/logstash.conf b/monitoring/elklogs/logstash/pipeline/logstash.conf new file mode 100644 index 0000000..02a3389 --- /dev/null +++ b/monitoring/elklogs/logstash/pipeline/logstash.conf @@ -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 qu’Elasticsearch est prêt avant Logstash +# - Utilisez `depends_on` avec condition de santé dans docker-compose.yml \ No newline at end of file diff --git a/scripts/start_other_ctnrs.ps1 b/scripts/start_other_ctnrs.ps1 index 44db06a..1034f9c 100644 --- a/scripts/start_other_ctnrs.ps1 +++ b/scripts/start_other_ctnrs.ps1 @@ -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." \ No newline at end of file + 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 \ No newline at end of file