Mise en place du logging centralisé : ELK Stack (augmentation RAM 8go, clé cryptage kibana, logging, pipeline, etc...)
This commit is contained in:
32
ProcédureGit.md
Normal file
32
ProcédureGit.md
Normal 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"
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000024
|
||||
MANIFEST-000048
|
||||
|
||||
@@ -1 +1 @@
|
||||
MANIFEST-000022
|
||||
MANIFEST-000046
|
||||
|
||||
@@ -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
|
||||
|
||||
Binary file not shown.
Binary file not shown.
31
monitoring/elklogs/kibana/config/kibana.yml
Normal file
31
monitoring/elklogs/kibana/config/kibana.yml
Normal 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
|
||||
@@ -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
|
||||
14
monitoring/elklogs/logstash/config/pipelines.yml
Normal file
14
monitoring/elklogs/logstash/config/pipelines.yml
Normal 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)
|
||||
92
monitoring/elklogs/logstash/pipeline/logstash.conf
Normal file
92
monitoring/elklogs/logstash/pipeline/logstash.conf
Normal 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 qu’Elasticsearch est prêt avant Logstash
|
||||
# - Utilisez `depends_on` avec condition de santé dans docker-compose.yml
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user