auto_clea

This commit is contained in:
LeCoffre Deployment 2025-09-25 17:34:43 +00:00
parent cddb14c39d
commit 75df8cb3de
18 changed files with 1147 additions and 14 deletions

View File

@ -21,6 +21,7 @@
- `nginx_redirects_summary.txt`
- `compose_services.txt`
- `data/` (copie à linstant T)
- Ne fait de backups en dehors de 4NK_env/backups/
### Utilisation
```bash

View File

@ -11,6 +11,7 @@ Centraliser toute la documentation des projets dans `4NK_env/docs/<projet>/` et
- Emplacement unique: `4NK_env/docs/<projet>/`.
- Pas de duplication ni de divergence documentaire dans les sousprojets.
- Les références dans README, CI et scripts doivent pointer vers le chemin centralisé.
- Ne faite pas de nouveaux fichier md mais complete les fichiers existants
### Actions (TODO)
- Vérifier quaucun `docs/` résiduel nexiste dans les sousprojets.

View File

@ -68,6 +68,8 @@ Tous les documents des projets doivent être dans un dossier `docs/`
- Tu dois bien gérer les branche "ext" et les tags "ext" en évitant les conflit
- Ne créer pas de liens symboliques mais pointe directement sur les fichiers
---
**Note** : Ce prompt est basé sur `4NK_env/IA_agents/prompts/prompt-global.md`.

View File

@ -15,6 +15,7 @@ Uniformiser lemplacement et lusage des scripts dexploitation pour tous
- Documentation: référencer préférentiellement `4NK_env/scripts/<projet>/...`.
- CI/Docker: aucune modification nécessaire si les chemins relatifs à `./scripts/` étaient utilisés (les liens absorbent le changement).
- Gouvernance: éviter de recréer des variantes de scripts; améliorer lexistant.
- Ne faite pas de nouveaux fichiers de scripts mais complete les fichiers existants
### Vérification postmigration
1. Rechercher des références à `scripts/` et valider quelles pointent sur le lien:

135
docs/README-URL-TESTS.md Normal file
View File

@ -0,0 +1,135 @@
# Tests de Santé des URLs - LeCoffre Node
## 🎯 Objectif
Ce répertoire contient les scripts de vérification de santé des URLs pour LeCoffre Node, intégrés dans les processus de backup et de production.
## 📁 Fichiers Créés
### Scripts Principaux
- **`url-health-check.sh`** : Script principal de test d'URLs (toutes les URLs internes et externes)
- **`production-health-check.sh`** : Script de vérification complète pour la production (avec rapport Markdown)
- **`backup-data.sh`** : Script de backup modifié (intègre les tests d'URLs avant/après)
### Documentation
- **`URL-HEALTH-CHECKING.md`** : Documentation complète des tests d'URLs
- **`README-URL-TESTS.md`** : Ce fichier (synthèse)
## 🚀 Utilisation Rapide
### Test des URLs
```bash
cd /home/debian/4NK_env/scripts/lecoffre_node
./url-health-check.sh
```
### Rapport de Production
```bash
cd /home/debian/4NK_env/scripts/lecoffre_node
./production-health-check.sh
```
### Backup avec Tests
```bash
cd /home/debian/4NK_env/scripts/lecoffre_node
./backup-data.sh
```
## 📊 URLs Testées
### ✅ URLs Interne (Services Docker)
- BlindBit Oracle API (`http://localhost:8000/tweaks/1`)
- SDK Storage Health (`http://localhost:8081/health`)
- SDK Relay WebSocket (`http://localhost:8091/`)
- SDK Relay HTTP (`http://localhost:8090/`)
- LeCoffre Frontend (`http://localhost:3004/`)
- IHM Client (`http://localhost:3003/`)
- Grafana (`http://localhost:3005/`)
- Loki (`http://localhost:3100/ready`)
- Status API (`http://localhost:3006/api`)
### ✅ URLs Externes (Domaine Public)
- Site Principal (`https://dev4.4nkweb.com/`)
- Page de Statut (`https://dev4.4nkweb.com/status/`)
- Dashboard Grafana (`https://dev4.4nkweb.com/grafana/`)
- Application LeCoffre (`https://dev4.4nkweb.com/lecoffre/`)
- Login LeCoffre (`https://dev4.4nkweb.com/lecoffre/login`)
- Callback Auth (`https://dev4.4nkweb.com/lecoffre/authorized-client`)
### ✅ APIs Externes (Backend Services)
- API Backend Health (`https://dev3.4nkweb.com/api/v1/health`)
- API Backend Status (`https://dev3.4nkweb.com/api/v1/status`)
- IdNot State Endpoint (`https://dev3.4nkweb.com/api/v1/idnot/state`)
### ✅ WebSockets Externes
- Bootstrap Relay (`wss://dev3.4nkweb.com/ws/`)
### ✅ Services Externes (Dépendances)
- Mempool Signet (`https://mempool2.4nkweb.com/`)
- Service IdNot (`https://qual-connexion.idnot.fr/`)
- IdNot Authorization (`https://qual-connexion.idnot.fr/IdPOAuth2/authorize/idnot_idp_v1`)
## 📈 Intégration dans les Processus
### Backup
- **Avant** : Test de l'état des URLs
- **Après** : Vérification de la cohérence
- **Logs** : Sauvegardés avec le backup
### Production
- **État complet** : Services, disque, mémoire, volumes
- **Rapport Markdown** : Généré automatiquement
- **Recommandations** : Actions suggérées
## 🔍 Codes de Retour
- **0** : Toutes les URLs sont accessibles
- **1** : Certaines URLs ne sont pas accessibles (majorité fonctionne)
- **2** : Trop d'URLs ne sont pas accessibles
## 📝 Fichiers Générés
### Backup
```
./backups/
├── lecoffre_backup_YYYYMMDD_HHMMSS.tar.gz
├── url-health-check-pre-backup-YYYYMMDD_HHMMSS.log
└── url-health-check-post-backup-YYYYMMDD_HHMMSS.log
```
### Production
```
./reports/
├── production-health-report-YYYYMMDD_HHMMSS.md
└── url-tests-production-YYYYMMDD_HHMMSS.log
```
## 🚨 Dépannage
### URLs Internes Non Accessibles
- Vérifier les services Docker : `docker ps`
- Consulter les logs : `docker logs <service_name>`
- Vérifier les ports et la configuration réseau
### URLs Externes Non Accessibles
- Vérifier la configuration nginx
- Vérifier les certificats SSL
- Vérifier la connectivité réseau externe
### APIs Non Accessibles
- Vérifier la configuration CORS
- Vérifier la connectivité vers dev3.4nkweb.com
- Consulter les logs du backend
## 📚 Documentation Complète
Pour plus de détails, consultez :
- **`docs/scripts/URL-HEALTH-CHECKING.md`** : Documentation complète
- **`scripts/url-health-check.sh`** : Code source du script principal
- **`scripts/production-health-check.sh`** : Code source du script de production
---
**Créé le 2025-09-25**
**Version** : 1.0
**Usage** : Tests de santé LeCoffre Node

View File

@ -0,0 +1,214 @@
# Documentation - Tests de Santé des URLs LeCoffre Node
## 📋 Vue d'ensemble
Ce document décrit les scripts de vérification de santé des URLs pour LeCoffre Node, intégrés dans les processus de backup et de production.
## 🔧 Scripts Disponibles
### 1. `url-health-check.sh`
**Script principal de test d'URLs**
**Usage :**
```bash
cd /home/debian/4NK_env/scripts/lecoffre_node
./url-health-check.sh
```
**Fonctionnalités :**
- Test de toutes les URLs internes (services Docker)
- Test de toutes les URLs externes (domaine public)
- Test des APIs externes (backend services)
- Test des WebSockets externes
- Test des services externes (dépendances)
- Rapport détaillé avec codes de retour
**Codes de retour :**
- `0` : Toutes les URLs sont accessibles
- `1` : Certaines URLs ne sont pas accessibles (majorité fonctionne)
- `2` : Trop d'URLs ne sont pas accessibles
### 2. `production-health-check.sh`
**Script de vérification complète pour la production**
**Usage :**
```bash
cd /home/debian/4NK_env/scripts/lecoffre_node
./production-health-check.sh
```
**Fonctionnalités :**
- État des services Docker
- Espace disque système
- Mémoire système
- Volumes Docker
- Tests d'URLs complets
- Génération d'un rapport Markdown détaillé
### 3. `backup-data.sh` (Modifié)
**Script de backup avec intégration des tests d'URLs**
**Usage :**
```bash
cd /home/debian/4NK_env/scripts/lecoffre_node
./backup-data.sh
```
**Nouvelles fonctionnalités :**
- Test des URLs avant la sauvegarde
- Test des URLs après la sauvegarde
- Logs des tests intégrés dans le backup
- Rapport de cohérence avant/après
## 📊 URLs Testées
### URLs Internes (Services Docker)
| Service | URL | Code Attendu | Description |
|---------|-----|--------------|-------------|
| BlindBit Oracle | `http://localhost:8000/tweaks/1` | 200 | API BlindBit |
| SDK Storage | `http://localhost:8081/health` | 200 | Health check SDK Storage |
| SDK Relay | `http://localhost:8091/` | 200 | Interface WebSocket SDK Relay |
| SDK Relay | `http://localhost:8090/` | 200 | Interface HTTP SDK Relay |
| LeCoffre Frontend | `http://localhost:3004/` | 200,301,302,307,308 | Frontend racine |
| LeCoffre Frontend | `http://localhost:3004/login` | 200,301,302,307,308 | Page de login |
| LeCoffre Frontend | `http://localhost:3004/lecoffre/` | 200,301,302,307,308 | Application LeCoffre |
| IHM Client | `http://localhost:3003/` | 200 | Interface IHM Client |
| Grafana | `http://localhost:3005/api/health` | 200 | Health check Grafana |
| Grafana | `http://localhost:3005/` | 200,301,302 | Dashboard Grafana |
| Loki | `http://localhost:3100/ready` | 200 | Health check Loki |
| Status API | `http://localhost:3006/api` | 200 | API de statut |
### URLs Externes (Domaine Public)
| Service | URL | Code Attendu | Description |
|---------|-----|--------------|-------------|
| Site Principal | `https://dev4.4nkweb.com/` | 200,301,302 | Site principal |
| Page de Statut | `https://dev4.4nkweb.com/status/` | 200 | Page de statut des services |
| Dashboard Grafana | `https://dev4.4nkweb.com/grafana/` | 200,301,302 | Dashboard Grafana public |
| Application LeCoffre | `https://dev4.4nkweb.com/lecoffre/` | 200,301,302 | Application LeCoffre publique |
| Login LeCoffre | `https://dev4.4nkweb.com/lecoffre/login` | 200,301,302 | Page de login publique |
| Callback Auth | `https://dev4.4nkweb.com/lecoffre/authorized-client` | 200,301,302 | Callback d'authentification |
### APIs Externes (Backend Services)
| Service | URL | Méthode | Code Attendu | Description |
|---------|-----|---------|--------------|-------------|
| API Backend | `https://dev3.4nkweb.com/api/v1/health` | GET | 200 | Health check API backend |
| API Backend | `https://dev3.4nkweb.com/api/v1/status` | GET | 200 | Status API backend |
| IdNot State | `https://dev3.4nkweb.com/api/v1/idnot/state` | POST | 200 | Endpoint d'état IdNot |
### WebSockets Externes
| Service | URL | Description |
|---------|-----|-------------|
| Bootstrap Relay | `wss://dev3.4nkweb.com/ws/` | WebSocket de relais bootstrap |
### Services Externes (Dépendances)
| Service | URL | Code Attendu | Description |
|---------|-----|--------------|-------------|
| Mempool Signet | `https://mempool2.4nkweb.com/` | 200,301,302 | Explorateur de blockchain |
| Service IdNot | `https://qual-connexion.idnot.fr/` | 200,301,302 | Service d'authentification IdNot |
| IdNot Auth | `https://qual-connexion.idnot.fr/IdPOAuth2/authorize/idnot_idp_v1` | 200,301,302 | Endpoint d'autorisation IdNot |
## 📁 Structure des Fichiers Générés
### Backup avec Tests d'URLs
```
./backups/
├── lecoffre_backup_YYYYMMDD_HHMMSS.tar.gz
├── url-health-check-pre-backup-YYYYMMDD_HHMMSS.log
└── url-health-check-post-backup-YYYYMMDD_HHMMSS.log
```
### Production Health Check
```
./reports/
├── production-health-report-YYYYMMDD_HHMMSS.md
└── url-tests-production-YYYYMMDD_HHMMSS.log
```
## 🔍 Interprétation des Résultats
### Codes de Statut HTTP
- **200** : OK - Service accessible et fonctionnel
- **301, 302, 307, 308** : Redirections - Acceptables pour certains services
- **404** : Not Found - Service non trouvé ou mal configuré
- **500** : Internal Server Error - Erreur serveur
- **000** : Connection Failed - Impossible de se connecter
### Codes de Retour des Scripts
- **0** : Succès complet
- **1** : Succès partiel (certaines URLs échouent)
- **2** : Échec (trop d'URLs échouent)
## 🚨 Dépannage
### URLs Internes Non Accessibles
1. Vérifier que les services Docker sont démarrés
2. Vérifier les ports et la configuration réseau
3. Consulter les logs des services : `docker logs <service_name>`
### URLs Externes Non Accessibles
1. Vérifier la configuration nginx
2. Vérifier les certificats SSL
3. Vérifier la connectivité réseau externe
4. Consulter les logs nginx
### APIs Non Accessibles
1. Vérifier la configuration CORS
2. Vérifier les headers d'authentification
3. Vérifier la connectivité vers dev3.4nkweb.com
4. Consulter les logs du backend
## 📝 Exemples d'Utilisation
### Test Rapide des URLs
```bash
cd /home/debian/4NK_env/scripts/lecoffre_node
./url-health-check.sh
```
### Rapport Complet de Production
```bash
cd /home/debian/4NK_env/scripts/lecoffre_node
./production-health-check.sh
cat ./reports/production-health-report-*.md
```
### Backup avec Tests d'URLs
```bash
cd /home/debian/4NK_env/scripts/lecoffre_node
./backup-data.sh
ls -la ./backups/
```
### Surveillance Continue
```bash
# Ajouter dans un cron pour surveillance automatique
0 */6 * * * cd /home/debian/4NK_env/scripts/lecoffre_node && ./url-health-check.sh > /var/log/url-health-check.log 2>&1
```
## 🔧 Maintenance
### Mise à Jour des URLs
Pour ajouter ou modifier des URLs testées :
1. Éditer `url-health-check.sh`
2. Ajouter/modifier les sections appropriées
3. Tester le script
4. Mettre à jour cette documentation
### Configuration des Timeouts
Les timeouts par défaut sont :
- URLs internes : 5-10 secondes
- URLs externes : 10-15 secondes
- WebSockets : 5 secondes
Pour modifier les timeouts, éditer les paramètres dans les fonctions `test_url()` et `test_websocket()`.
---
**Document créé le 2025-09-25**
**Version** : 1.0
**Usage** : Scripts de santé LeCoffre Node

@ -1 +1 @@
Subproject commit 516d38d7c587620856e226aab1a00a90a4841d1d
Subproject commit a6215adf3f7f180abed864276922d1c1a1458902

125
scripts/add-missing-env-vars.sh Executable file
View File

@ -0,0 +1,125 @@
#!/bin/bash
# Script pour ajouter les variables d'environnement manquantes au fichier .env.master
set -e
# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
ENV_FILE="/home/debian/4NK_env/.env.master"
BACKUP_FILE="${ENV_FILE}.backup.$(date +%Y%m%d_%H%M%S)"
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} Ajout des Variables d'Environnement Manquantes${NC}"
echo -e "${BLUE}========================================${NC}"
echo
# Fonction pour vérifier si une variable existe
check_var_exists() {
local var_name="$1"
grep -q "^${var_name}=" "$ENV_FILE" 2>/dev/null
}
# Fonction pour ajouter une variable si elle n'existe pas
add_var_if_missing() {
local var_name="$1"
local var_value="$2"
local description="$3"
if ! check_var_exists "$var_name"; then
echo -e "${YELLOW}Ajout de ${var_name}: ${description}${NC}"
echo "${var_name}=${var_value}" >> "$ENV_FILE"
return 0
else
echo -e "${GREEN}${var_name} existe déjà${NC}"
return 1
fi
}
# Créer une sauvegarde
echo -e "${BLUE}Création d'une sauvegarde: ${BACKUP_FILE}${NC}"
cp "$ENV_FILE" "$BACKUP_FILE"
echo -e "${BLUE}Ajout des variables manquantes...${NC}"
echo
# Variables Bitcoin
echo -e "${CYAN}=== Variables Bitcoin ===${NC}"
add_var_if_missing "BITCOIN_RPC_USER" "bitcoin_user" "Nom d'utilisateur RPC Bitcoin"
add_var_if_missing "BITCOIN_RPC_PASSWORD" "FAKE-DATA-IA-bitcoin_password_secure" "Mot de passe RPC Bitcoin"
add_var_if_missing "BITCOIN_RPC_PORT" "38332" "Port RPC Bitcoin"
echo
# Variables BlindBit
echo -e "${CYAN}=== Variables BlindBit ===${NC}"
add_var_if_missing "BLINDBIT_API_PORT" "8000" "Port de l'API BlindBit"
add_var_if_missing "BITCOIN_RPC_URL" "http://bitcoin:38332" "URL du RPC Bitcoin"
echo
# Variables SDK Relay
echo -e "${CYAN}=== Variables SDK Relay ===${NC}"
add_var_if_missing "RELAY_PORT" "8090" "Port du relay"
add_var_if_missing "RELAY_HTTP_PORT" "8091" "Port HTTP du relay"
add_var_if_missing "STORAGE_URL" "http://sdk_storage:8080" "URL du service de stockage"
echo
# Variables SDK Storage
echo -e "${CYAN}=== Variables SDK Storage ===${NC}"
add_var_if_missing "STORAGE_PORT" "8080" "Port du service de stockage"
add_var_if_missing "STORAGE_DATA_DIR" "/app/data" "Répertoire des données de stockage"
echo
# Variables IHM Client
echo -e "${CYAN}=== Variables IHM Client ===${NC}"
add_var_if_missing "VITE_API_URL" "https://dev4.4nkweb.com/api" "URL de l'API pour Vite"
add_var_if_missing "VITE_4NK_URL" "https://dev4.4nkweb.com" "URL 4NK pour Vite"
add_var_if_missing "VITE_RELAY_URL" "wss://dev4.4nkweb.com/ws" "URL du relay pour Vite"
echo
# Variables Grafana
echo -e "${CYAN}=== Variables Grafana ===${NC}"
add_var_if_missing "GF_SECURITY_ADMIN_PASSWORD" "FAKE-DATA-IA-admin123" "Mot de passe admin Grafana"
add_var_if_missing "GF_DATABASE_TYPE" "sqlite3" "Type de base de données Grafana"
echo
# Variables Loki
echo -e "${CYAN}=== Variables Loki ===${NC}"
add_var_if_missing "LOKI_CONFIG_FILE" "/etc/loki/loki-config.yaml" "Fichier de configuration Loki"
add_var_if_missing "LOKI_DATA_DIR" "/app/data" "Répertoire des données Loki"
echo
# Variables Status API
echo -e "${CYAN}=== Variables Status API ===${NC}"
add_var_if_missing "STATUS_API_PORT" "3006" "Port de l'API de statut"
add_var_if_missing "STATUS_API_HOST" "0.0.0.0" "Hôte de l'API de statut"
echo
# Variables Tor (pour compléter)
echo -e "${CYAN}=== Variables Tor ===${NC}"
add_var_if_missing "TOR_SOCKS_PORT" "9050" "Port SOCKS Tor"
add_var_if_missing "TOR_CONTROL_PORT" "9051" "Port de contrôle Tor"
echo
echo -e "${GREEN}✅ Variables ajoutées avec succès !${NC}"
echo
echo -e "${BLUE}Fichiers:${NC}"
echo -e "${YELLOW} - Fichier principal: ${ENV_FILE}${NC}"
echo -e "${YELLOW} - Sauvegarde: ${BACKUP_FILE}${NC}"
echo
echo -e "${BLUE}Pour tester:${NC}"
echo -e "${YELLOW} cd /home/debian/4NK_env/scripts/lecoffre_node${NC}"
echo -e "${YELLOW} ./start.sh${NC}"
echo

View File

@ -22,6 +22,16 @@ echo -e "${BLUE} LeCoffre Node - Data Backup${NC}"
echo -e "${BLUE}========================================${NC}"
echo
# Vérification de l'état des URLs avant la sauvegarde
echo -e "${YELLOW}=== Vérification de l'état des services avant sauvegarde ===${NC}"
if [ -f "./scripts/url-health-check.sh" ]; then
./scripts/url-health-check.sh > "$BACKUP_DIR/url-health-check-pre-backup-${TIMESTAMP}.log" 2>&1
echo -e "${GREEN}✓ État des URLs enregistré dans: $BACKUP_DIR/url-health-check-pre-backup-${TIMESTAMP}.log${NC}"
else
echo -e "${YELLOW}⚠ Script url-health-check.sh non trouvé${NC}"
fi
echo
# Créer le répertoire de sauvegarde
mkdir -p "$BACKUP_DIR"
@ -66,6 +76,16 @@ tar -czf "${BACKUP_NAME}.tar.gz" "$BACKUP_NAME" --ignore-failed-read 2>/dev/null
rm -rf "$BACKUP_NAME" || sudo rm -rf "$BACKUP_NAME" || true
cd ..
# Vérification de l'état des URLs après la sauvegarde
echo -e "${YELLOW}=== Vérification de l'état des services après sauvegarde ===${NC}"
if [ -f "./scripts/url-health-check.sh" ]; then
./scripts/url-health-check.sh > "$BACKUP_DIR/url-health-check-post-backup-${TIMESTAMP}.log" 2>&1
echo -e "${GREEN}✓ État des URLs enregistré dans: $BACKUP_DIR/url-health-check-post-backup-${TIMESTAMP}.log${NC}"
else
echo -e "${YELLOW}⚠ Script url-health-check.sh non trouvé${NC}"
fi
echo
# Afficher les informations de sauvegarde
BACKUP_SIZE=$(du -h "$BACKUP_DIR/${BACKUP_NAME}.tar.gz" | cut -f1)
echo
@ -73,6 +93,11 @@ echo -e "${GREEN}✅ Backup completed successfully!${NC}"
echo -e "${GREEN}Backup file: $BACKUP_DIR/${BACKUP_NAME}.tar.gz${NC}"
echo -e "${GREEN}Backup size: $BACKUP_SIZE${NC}"
echo
echo -e "${BLUE}Files created:${NC}"
echo -e "${YELLOW} - ${BACKUP_NAME}.tar.gz (backup data)${NC}"
echo -e "${YELLOW} - url-health-check-pre-backup-${TIMESTAMP}.log (état avant)${NC}"
echo -e "${YELLOW} - url-health-check-post-backup-${TIMESTAMP}.log (état après)${NC}"
echo
echo -e "${BLUE}To restore this backup:${NC}"
echo -e "${YELLOW} ./scripts/restore-data.sh $BACKUP_NAME${NC}"
echo

View File

@ -62,7 +62,7 @@ docker run -d \
-v /home/debian/4NK_env/lecoffre_node/logs:/app/logs \
-v /home/debian/4NK_env/lecoffre_node/conf:/app/conf \
-v /home/debian/4NK_env/lecoffre_node/backup:/app/backup \
-v /home/debian/4NK_env/lecoffre_node/.env.master:/app/.env \
-v /home/debian/4NK_env/.env.master:/app/.env \
${MASTER_IMAGE_NAME}:${MASTER_IMAGE_TAG}
log "⏳ Attente du démarrage du conteneur master..."

View File

@ -102,7 +102,7 @@ restart_services() {
print_message "Redémarrage des services..."
echo -e "${YELLOW}Arrêt des services...${NC}"
docker compose --env-file .env.master down
docker compose --env-file /home/debian/4NK_env/.env.master down
echo -e "${YELLOW}Démarrage des services...${NC}"
./scripts/start.sh
@ -125,7 +125,7 @@ check_health() {
print_message "Vérification de la santé des services..."
echo -e "${CYAN}Statut des conteneurs:${NC}"
docker compose --env-file .env.master ps
docker compose --env-file /home/debian/4NK_env/.env.master ps
echo
echo -e "${CYAN}Utilisation des ressources:${NC}"

View File

@ -0,0 +1,308 @@
#!/bin/bash
# LeCoffre Node - Script de vérification de santé pour la production
# Vérifie l'état complet du système et génère un rapport détaillé
# Utilisé pour les déploiements en production et la maintenance
set -e
# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Configuration
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
REPORT_DIR="./reports"
REPORT_FILE="$REPORT_DIR/production-health-report-${TIMESTAMP}.md"
# Fonction pour afficher un message avec timestamp
print_message() {
echo -e "${BLUE}[$(date '+%H:%M:%S')]${NC} $1"
}
# Fonction pour initialiser le rapport
init_report() {
mkdir -p "$REPORT_DIR"
cat > "$REPORT_FILE" << EOF
# Rapport de Santé Production - LeCoffre Node
**Date**: $(date '+%Y-%m-%d %H:%M:%S')
**Timestamp**: $TIMESTAMP
**Environnement**: Production
**Serveur**: $(hostname)
---
## Résumé Exécutif
EOF
}
# Fonction pour ajouter une section au rapport
add_section() {
local section_title="$1"
echo "" >> "$REPORT_FILE"
echo "## $section_title" >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
}
# Fonction pour ajouter du contenu au rapport
add_content() {
echo "$1" >> "$REPORT_FILE"
}
# Fonction pour exécuter le test d'URLs et capturer les résultats
run_url_tests() {
local test_type="$1"
local output_file="$REPORT_DIR/url-tests-${test_type}-${TIMESTAMP}.log"
print_message "Exécution des tests d'URLs ($test_type)..."
if [ -f "./scripts/url-health-check.sh" ]; then
./scripts/url-health-check.sh > "$output_file" 2>&1
local exit_code=$?
# Extraire les statistiques du log
local total_urls=$(grep "Total URLs testées:" "$output_file" | grep -o '[0-9]\+' || echo "0")
local accessible_urls=$(grep "URLs accessibles:" "$output_file" | grep -o '[0-9]\+' || echo "0")
local failed_urls=$(grep "URLs échouées:" "$output_file" | grep -o '[0-9]\+' || echo "0")
add_content "### Tests d'URLs ($test_type)"
add_content ""
add_content "| Métrique | Valeur |"
add_content "|----------|--------|"
add_content "| Total URLs testées | $total_urls |"
add_content "| URLs accessibles | $accessible_urls |"
add_content "| URLs échouées | $failed_urls |"
add_content "| Taux de réussite | $(( accessible_urls * 100 / (total_urls > 0 ? total_urls : 1) ))% |"
add_content ""
if [ $exit_code -eq 0 ]; then
add_content "✅ **Statut**: Toutes les URLs sont accessibles"
elif [ $exit_code -eq 1 ]; then
add_content "⚠️ **Statut**: Certaines URLs ne sont pas accessibles"
else
add_content "❌ **Statut**: Trop d'URLs ne sont pas accessibles"
fi
add_content ""
add_content "**Log détaillé**: \`$output_file\`"
add_content ""
return $exit_code
else
add_content "### Tests d'URLs ($test_type)"
add_content ""
add_content "❌ **Erreur**: Script url-health-check.sh non trouvé"
add_content ""
return 1
fi
}
# Fonction pour vérifier l'état des services Docker
check_docker_services() {
add_section "État des Services Docker"
print_message "Vérification des services Docker..."
# Liste des services à vérifier
local services=(
"tor-proxy:Tor Proxy"
"bitcoin-signet:Bitcoin Signet"
"blindbit-oracle:BlindBit Oracle"
"sdk_storage:SDK Storage"
"sdk_relay:SDK Relay"
"lecoffre-front:LeCoffre Frontend"
"ihm_client:IHM Client"
"grafana:Grafana"
"loki:Loki"
"promtail:Promtail"
"status-api:Status API"
"watchtower:Watchtower"
)
add_content "| Service | Container | Statut | Santé | Uptime |"
add_content "|---------|-----------|--------|-------|--------|"
for service_entry in "${services[@]}"; do
local service_name="${service_entry%%:*}"
local display_name="${service_entry##*:}"
if docker ps --format '{{.Names}}' | grep -q "^${service_name}$"; then
local running=$(docker inspect --format='{{.State.Running}}' "$service_name" 2>/dev/null || echo "false")
local health=$(docker inspect --format='{{.State.Health.Status}}' "$service_name" 2>/dev/null || echo "no-healthcheck")
local uptime=$(docker inspect --format='{{.State.StartedAt}}' "$service_name" 2>/dev/null || echo "unknown")
if [ "$running" = "true" ]; then
if [ "$health" = "healthy" ]; then
add_content "| $display_name | $service_name | 🟢 Running | ✅ Healthy | $uptime |"
else
add_content "| $display_name | $service_name | 🟢 Running | ⚠️ $health | $uptime |"
fi
else
add_content "| $display_name | $service_name | 🔴 Stopped | ❌ Unhealthy | $uptime |"
fi
else
add_content "| $display_name | $service_name | ❌ Not Found | ❌ N/A | N/A |"
fi
done
add_content ""
}
# Fonction pour vérifier l'espace disque
check_disk_space() {
add_section "Espace Disque"
print_message "Vérification de l'espace disque..."
add_content "| Partition | Taille | Utilisé | Disponible | Usage |"
add_content "|-----------|--------|---------|------------|-------|"
df -h | tail -n +2 | while read -r line; do
local partition=$(echo "$line" | awk '{print $1}')
local size=$(echo "$line" | awk '{print $2}')
local used=$(echo "$line" | awk '{print $3}')
local available=$(echo "$line" | awk '{print $4}')
local usage=$(echo "$line" | awk '{print $5}')
# Déterminer la couleur basée sur l'usage
local usage_num=$(echo "$usage" | sed 's/%//')
if [ "$usage_num" -gt 90 ]; then
local status="🔴"
elif [ "$usage_num" -gt 80 ]; then
local status="🟡"
else
local status="🟢"
fi
add_content "| $partition | $size | $used | $available | $status $usage |"
done
add_content ""
}
# Fonction pour vérifier la mémoire
check_memory() {
add_section "Mémoire Système"
print_message "Vérification de la mémoire..."
local mem_info=$(free -h)
local total=$(echo "$mem_info" | grep "Mem:" | awk '{print $2}')
local used=$(echo "$mem_info" | grep "Mem:" | awk '{print $3}')
local free=$(echo "$mem_info" | grep "Mem:" | awk '{print $4}')
local available=$(echo "$mem_info" | grep "Mem:" | awk '{print $7}')
add_content "| Type | Taille |"
add_content "|------|--------|"
add_content "| Total | $total |"
add_content "| Utilisé | $used |"
add_content "| Libre | $free |"
add_content "| Disponible | $available |"
add_content ""
}
# Fonction pour vérifier les volumes Docker
check_docker_volumes() {
add_section "Volumes Docker"
print_message "Vérification des volumes Docker..."
add_content "| Volume | Driver | Taille |"
add_content "|--------|--------|--------|"
docker volume ls --format "table {{.Name}}\t{{.Driver}}" | tail -n +2 | while read -r volume_name driver; do
if [[ "$volume_name" == *"4nk_node"* ]]; then
local size=$(docker system df -v 2>/dev/null | grep "$volume_name" | awk '{print $3}' || echo "N/A")
add_content "| $volume_name | $driver | $size |"
fi
done
add_content ""
}
# Fonction pour générer le résumé final
generate_summary() {
add_section "Résumé et Recommandations"
add_content "### Points d'Attention"
add_content ""
add_content "- Vérifiez les URLs échouées dans les logs détaillés"
add_content "- Surveillez l'espace disque des partitions critiques"
add_content "- Vérifiez l'état de santé des services Docker"
add_content "- Consultez les logs des services pour les erreurs"
add_content ""
add_content "### Actions Recommandées"
add_content ""
add_content "1. **Maintenance Préventive**"
add_content " - Nettoyer les logs anciens"
add_content " - Vérifier les certificats SSL"
add_content " - Mettre à jour les images Docker"
add_content ""
add_content "2. **Surveillance Continue**"
add_content " - Monitorer les métriques Grafana"
add_content " - Surveiller les alertes Loki"
add_content " - Vérifier les backups automatiques"
add_content ""
add_content "3. **Sécurité**"
add_content " - Vérifier les accès SSH"
add_content " - Contrôler les certificats SSL"
add_content " - Auditer les logs de sécurité"
add_content ""
add_content "---"
add_content ""
add_content "*Rapport généré automatiquement par LeCoffre Node Production Health Check*"
add_content "*Timestamp: $TIMESTAMP*"
}
# Fonction principale
main() {
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} LeCoffre Node - Production Health Check${NC}"
echo -e "${BLUE}========================================${NC}"
echo
print_message "Initialisation du rapport..."
init_report
print_message "Vérification des services Docker..."
check_docker_services
print_message "Vérification de l'espace disque..."
check_disk_space
print_message "Vérification de la mémoire..."
check_memory
print_message "Vérification des volumes Docker..."
check_docker_volumes
print_message "Exécution des tests d'URLs..."
run_url_tests "production"
print_message "Génération du résumé..."
generate_summary
echo
echo -e "${GREEN}✅ Rapport de santé généré avec succès !${NC}"
echo -e "${GREEN}Rapport: $REPORT_FILE${NC}"
echo
echo -e "${BLUE}Fichiers générés:${NC}"
echo -e "${YELLOW} - $REPORT_FILE (rapport principal)${NC}"
echo -e "${YELLOW} - $REPORT_DIR/url-tests-production-${TIMESTAMP}.log (tests détaillés)${NC}"
echo
echo -e "${BLUE}Pour consulter le rapport:${NC}"
echo -e "${YELLOW} cat $REPORT_FILE${NC}"
echo -e "${YELLOW} less $REPORT_FILE${NC}"
echo
}
# Exécuter le script principal
main "$@"

View File

@ -45,7 +45,7 @@ fi
# Arrêter les services
echo -e "${BLUE}Stopping services...${NC}"
docker compose --env-file .env.master down >/dev/null 2>&1 || true
docker compose --env-file /home/debian/4NK_env/.env.master down >/dev/null 2>&1 || true
# Extraire la sauvegarde
echo -e "${BLUE}Extracting backup...${NC}"

View File

@ -174,13 +174,92 @@ wait_for_healthy() {
return 1
}
# Fonction pour vérifier les variables d'environnement d'un service
check_service_env() {
local service_name=$1
local display_name=$2
print_message "Checking environment variables for $display_name..."
# Vérifier que le fichier .env.master existe
if [ ! -f "/home/debian/4NK_env/.env.master" ]; then
echo -e "${RED}✗ Error: .env.master file not found${NC}"
return 1
fi
# Variables critiques par service
case "$service_name" in
"bitcoin")
local critical_vars=("BITCOIN_RPC_USER" "BITCOIN_RPC_PASSWORD" "BITCOIN_RPC_PORT")
;;
"blindbit")
local critical_vars=("BLINDBIT_API_PORT" "BITCOIN_RPC_URL")
;;
"sdk_relay")
local critical_vars=("RELAY_PORT" "RELAY_HTTP_PORT" "STORAGE_URL")
;;
"sdk_storage")
local critical_vars=("STORAGE_PORT" "STORAGE_DATA_DIR")
;;
"lecoffre-front")
local critical_vars=("NEXT_PUBLIC_API_URL" "NEXT_PUBLIC_4NK_URL" "NEXT_PUBLIC_IDNOT_BASE_URL")
;;
"ihm_client")
local critical_vars=("VITE_API_URL" "VITE_4NK_URL" "VITE_RELAY_URL")
;;
"grafana")
local critical_vars=("GF_SECURITY_ADMIN_PASSWORD" "GF_DATABASE_TYPE")
;;
"loki")
local critical_vars=("LOKI_CONFIG_FILE" "LOKI_DATA_DIR")
;;
"promtail")
local critical_vars=("PROMTAIL_CONFIG_FILE" "LOKI_URL")
;;
"status-api")
local critical_vars=("STATUS_API_PORT" "STATUS_API_HOST")
;;
*)
echo -e "${YELLOW}⚠ No specific environment variables defined for $service_name${NC}"
return 0
;;
esac
# Vérifier chaque variable critique
local missing_vars=()
for var in "${critical_vars[@]}"; do
if ! grep -q "^${var}=" /home/debian/4NK_env/.env.master; then
missing_vars+=("$var")
fi
done
if [ ${#missing_vars[@]} -eq 0 ]; then
echo -e "${GREEN}✓ All critical environment variables present for $display_name${NC}"
return 0
else
echo -e "${RED}✗ Missing critical environment variables for $display_name:${NC}"
for var in "${missing_vars[@]}"; do
echo -e "${RED} - $var${NC}"
done
return 1
fi
}
# Fonction pour démarrer un service
start_service() {
local service_name=$1
local display_name=$2
# Vérifier les variables d'environnement avant de démarrer
if ! check_service_env "$service_name" "$display_name"; then
echo -e "${RED}✗ Environment check failed for $display_name. Continuing anyway...${NC}"
fi
print_message "Starting $display_name..."
docker compose --env-file .env.master up -d "$service_name"
if ! docker compose --env-file /home/debian/4NK_env/.env.master up -d "$service_name"; then
echo -e "${YELLOW}⚠ Failed to start $display_name, continuing with next service...${NC}"
return 0
fi
# Attendre que le conteneur soit créé
sleep 2
@ -212,7 +291,7 @@ echo
# Arrêter les services existants
print_message "Stopping existing services..."
docker compose --env-file .env.master down --remove-orphans >/dev/null 2>&1 || true
docker compose --env-file /home/debian/4NK_env/.env.master down --remove-orphans >/dev/null 2>&1 || true
# Ordre de démarrage logique
services=(
@ -245,7 +324,7 @@ done
echo -e "${GREEN}🎉 All services started successfully!${NC}"
echo
echo -e "${BLUE}Final status:${NC}"
docker compose --env-file .env.master ps
docker compose --env-file /home/debian/4NK_env/.env.master ps
# Calculer le temps total
end_time=$(date +%s)
@ -257,7 +336,7 @@ echo
echo -e "${GREEN}Total startup time: ${minutes}m ${seconds}s${NC}"
echo
echo -e "${BLUE}Useful commands:${NC}"
echo -e " ${YELLOW}docker compose --env-file .env.master logs -f${NC} # Voir les logs"
echo -e " ${YELLOW}docker compose --env-file .env.master down${NC} # Arrêter les services"
echo -e " ${YELLOW}docker compose --env-file .env.master ps${NC} # Voir le statut"
echo -e " ${YELLOW}docker compose --env-file /home/debian/4NK_env/.env.master logs -f${NC} # Voir les logs"
echo -e " ${YELLOW}docker compose --env-file /home/debian/4NK_env/.env.master down${NC} # Arrêter les services"
echo -e " ${YELLOW}docker compose --env-file /home/debian/4NK_env/.env.master ps${NC} # Voir le statut"
echo

View File

@ -24,7 +24,7 @@ echo
echo -e "${YELLOW}Updating Docker images...${NC}"
# Mettre à jour les images
docker compose --env-file .env.master pull
docker compose --env-file /home/debian/4NK_env/.env.master pull
echo -e "${GREEN}✅ Images updated successfully!${NC}"
echo

View File

@ -0,0 +1,242 @@
#!/bin/bash
# LeCoffre Node - Script de vérification des URLs de santé
# Vérifie tous les endpoints internes et externes du système
# Utilisé par les scripts de backup et de production
set -e
# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Compteurs
TOTAL_URLS=0
ACCESSIBLE_URLS=0
FAILED_URLS=0
# Fonction pour afficher un message avec timestamp
print_message() {
echo -e "${BLUE}[$(date '+%H:%M:%S')]${NC} $1"
}
# Fonction pour tester une URL
test_url() {
local url="$1"
local description="$2"
local expected_codes_csv="${3:-200}"
local timeout="${4:-10}"
TOTAL_URLS=$((TOTAL_URLS + 1))
print_message "Testing: $description"
echo -e " ${CYAN}URL: $url${NC}"
# Test de connectivité
local response=$(curl -s -o /dev/null -w '%{http_code}' --max-time "$timeout" "$url" 2>/dev/null || echo "000")
local curl_exit_code=$?
# Support multiple acceptable codes, comma-separated
local ok=false
IFS=',' read -r -a expected_array <<< "$expected_codes_csv"
for code in "${expected_array[@]}"; do
if [ "$response" = "$code" ]; then
ok=true
break
fi
done
if [ "$ok" = true ]; then
echo -e " ${GREEN}${NC} Status: HTTP $response - Accessible"
ACCESSIBLE_URLS=$((ACCESSIBLE_URLS + 1))
return 0
else
echo -e " ${RED}${NC} Status: HTTP $response - Not accessible"
if [ $curl_exit_code -ne 0 ]; then
echo -e " ${RED} Curl exit code: $curl_exit_code${NC}"
fi
FAILED_URLS=$((FAILED_URLS + 1))
return 1
fi
}
# Fonction pour tester un WebSocket
test_websocket() {
local ws_url="$1"
local description="$2"
local timeout="${3:-5}"
TOTAL_URLS=$((TOTAL_URLS + 1))
print_message "Testing WebSocket: $description"
echo -e " ${CYAN}URL: $ws_url${NC}"
# Test WebSocket avec wscat
local ws_test=$(timeout "$timeout" wscat -c "$ws_url" --no-color 2>/dev/null && echo "connected" || echo "failed")
if [ "$ws_test" = "connected" ]; then
echo -e " ${GREEN}${NC} Status: Connected"
ACCESSIBLE_URLS=$((ACCESSIBLE_URLS + 1))
return 0
else
echo -e " ${RED}${NC} Status: Not connected"
FAILED_URLS=$((FAILED_URLS + 1))
return 1
fi
}
# Fonction pour tester un endpoint API avec POST
test_api_post() {
local url="$1"
local description="$2"
local post_data="$3"
local expected_codes_csv="${4:-200}"
local timeout="${5:-10}"
TOTAL_URLS=$((TOTAL_URLS + 1))
print_message "Testing API POST: $description"
echo -e " ${CYAN}URL: $url${NC}"
echo -e " ${CYAN}Data: $post_data${NC}"
# Test de l'endpoint avec POST
local response=$(curl -s -o /dev/null -w '%{http_code}' --max-time "$timeout" -X POST \
-H "Content-Type: application/json" \
-d "$post_data" \
"$url" 2>/dev/null || echo "000")
local curl_exit_code=$?
# Support multiple acceptable codes, comma-separated
local ok=false
IFS=',' read -r -a expected_array <<< "$expected_codes_csv"
for code in "${expected_array[@]}"; do
if [ "$response" = "$code" ]; then
ok=true
break
fi
done
if [ "$ok" = true ]; then
echo -e " ${GREEN}${NC} Status: HTTP $response - API accessible"
ACCESSIBLE_URLS=$((ACCESSIBLE_URLS + 1))
return 0
else
echo -e " ${RED}${NC} Status: HTTP $response - API not accessible"
if [ $curl_exit_code -ne 0 ]; then
echo -e " ${RED} Curl exit code: $curl_exit_code${NC}"
fi
FAILED_URLS=$((FAILED_URLS + 1))
return 1
fi
}
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} LeCoffre Node - URL Health Check${NC}"
echo -e "${BLUE}========================================${NC}"
echo
print_message "Starting URL health check..."
# ========================================
# URLs INTERNES (Services Docker)
# ========================================
echo -e "${CYAN}=== URLs INTERNES (Services Docker) ===${NC}"
# Services de base
test_url "http://localhost:8000/tweaks/1" "BlindBit Oracle API" "200" 5
test_url "http://localhost:8081/health" "SDK Storage Health" "200" 5
test_url "http://localhost:8091/" "SDK Relay WebSocket Interface" "200" 5
test_url "http://localhost:8090/" "SDK Relay HTTP Interface" "200" 5
# Services applicatifs
test_url "http://localhost:3004/" "LeCoffre Frontend (Root)" "200,301,302,307,308" 10
test_url "http://localhost:3004/login" "LeCoffre Frontend Login" "200,301,302,307,308" 10
test_url "http://localhost:3004/lecoffre/" "LeCoffre Frontend App" "200,301,302,307,308" 10
test_url "http://localhost:3003/" "IHM Client Interface" "200" 10
# Services de monitoring
test_url "http://localhost:3005/api/health" "Grafana Health Check" "200" 5
test_url "http://localhost:3005/" "Grafana Dashboard" "200,301,302" 10
test_url "http://localhost:3100/ready" "Loki Health Check" "200" 5
test_url "http://localhost:3006/api" "Status API" "200" 5
echo
# ========================================
# URLs EXTERNES (Domaine Public)
# ========================================
echo -e "${CYAN}=== URLs EXTERNES (Domaine Public) ===${NC}"
# URLs principales
test_url "https://dev4.4nkweb.com/" "Site Principal" "200,301,302" 15
test_url "https://dev4.4nkweb.com/status/" "Page de Statut" "200" 15
test_url "https://dev4.4nkweb.com/grafana/" "Dashboard Grafana" "200,301,302" 15
test_url "https://dev4.4nkweb.com/lecoffre/" "Application LeCoffre" "200,301,302" 15
# URLs d'authentification
test_url "https://dev4.4nkweb.com/lecoffre/login" "Page de Login LeCoffre" "200,301,302" 15
test_url "https://dev4.4nkweb.com/lecoffre/authorized-client" "Callback d'authentification" "200,301,302" 15
echo
# ========================================
# APIs EXTERNES (Backend Services)
# ========================================
echo -e "${CYAN}=== APIs EXTERNES (Backend Services) ===${NC}"
# API Backend principal
test_url "https://dev3.4nkweb.com/api/v1/health" "API Backend Health" "200" 10
test_url "https://dev3.4nkweb.com/api/v1/status" "API Backend Status" "200" 10
# API IdNot (authentification)
test_api_post "https://dev3.4nkweb.com/api/v1/idnot/state" \
"IdNot State Endpoint" \
'{"next_url":"https://dev4.4nkweb.com/authorized-client"}' \
"200" 10
echo
# ========================================
# WebSockets EXTERNES
# ========================================
echo -e "${CYAN}=== WebSockets EXTERNES ===${NC}"
test_websocket "wss://dev3.4nkweb.com/ws/" "Bootstrap Relay WebSocket" 5
echo
# ========================================
# SERVICES EXTERNES (Dépendances)
# ========================================
echo -e "${CYAN}=== SERVICES EXTERNES (Dépendances) ===${NC}"
# Mempool externe
test_url "https://mempool2.4nkweb.com/" "Mempool Signet Explorer" "200,301,302" 10
# IdNot Service (authentification)
test_url "https://qual-connexion.idnot.fr/" "Service IdNot" "200,301,302" 10
test_url "https://qual-connexion.idnot.fr/IdPOAuth2/authorize/idnot_idp_v1" "IdNot Authorization Endpoint" "200,301,302" 10
echo
# ========================================
# RÉSUMÉ FINAL
# ========================================
echo -e "${CYAN}=== RÉSUMÉ FINAL ===${NC}"
echo -e "${BLUE}Total URLs testées: $TOTAL_URLS${NC}"
echo -e "${GREEN}URLs accessibles: $ACCESSIBLE_URLS${NC}"
echo -e "${RED}URLs échouées: $FAILED_URLS${NC}"
if [ $FAILED_URLS -eq 0 ]; then
echo -e "${GREEN}🎉 Toutes les URLs sont accessibles !${NC}"
exit 0
elif [ $FAILED_URLS -lt $((TOTAL_URLS / 2)) ]; then
echo -e "${YELLOW}⚠️ Certaines URLs ne sont pas accessibles, mais la majorité fonctionne.${NC}"
exit 1
else
echo -e "${RED}❌ Trop d'URLs ne sont pas accessibles. Vérifiez la configuration.${NC}"
exit 2
fi

@ -1 +1 @@
Subproject commit 0133e31bc4ebb0faf5536a388d25f7ba0c85c1c3
Subproject commit 51e9b6017310f91a345f5d4f9f850ef694478e98

@ -1 +1 @@
Subproject commit 4dad51241c559f9895f3f986b5deea7484189e88
Subproject commit 06879e4fed871b589814a1fc424c87054950c202