ci: docker_tag=ext - Ajout des retours d'expérience (REX) et scripts automatisés
- Documentation complète des REX dans docs/retours_experience/ - Scripts automatisés de vérification dans scripts/rex/ - Pérennisation des solutions aux problèmes rencontrés - Amélioration de la maintenance et du debugging
This commit is contained in:
parent
2e5aa75df8
commit
3c75658fb5
163
docs/retours_experience/README.md
Normal file
163
docs/retours_experience/README.md
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
# Retours d'Expérience - LeCoffre Node
|
||||||
|
|
||||||
|
Ce répertoire contient tous les retours d'expérience (REX) documentés lors du développement et de la maintenance du projet LeCoffre Node.
|
||||||
|
|
||||||
|
## 📋 Liste des REX
|
||||||
|
|
||||||
|
### 1. [REX_BOOTSTRAP_WEBSOCKET.md](./REX_BOOTSTRAP_WEBSOCKET.md)
|
||||||
|
**Problème** : Bootstrap WebSocket et réception de fonds du faucet
|
||||||
|
- Configuration bootstrap incorrecte
|
||||||
|
- Diagnostic des fonds insuffisants
|
||||||
|
- Solution avec adresse SP permanente
|
||||||
|
|
||||||
|
### 2. [REX_DOCKER_TOOLS_INSTALLATION.md](./REX_DOCKER_TOOLS_INSTALLATION.md)
|
||||||
|
**Problème** : Installation d'outils dans les conteneurs Docker
|
||||||
|
- Gestion des différentes images de base (Debian, Alpine, BusyBox)
|
||||||
|
- Solutions pour les permissions et les erreurs d'installation
|
||||||
|
- Scripts automatisés d'installation
|
||||||
|
|
||||||
|
### 3. [REX_STARTUP_SEQUENCE_IMPROVEMENTS.md](./REX_STARTUP_SEQUENCE_IMPROVEMENTS.md)
|
||||||
|
**Problème** : Améliorations de la séquence de démarrage
|
||||||
|
- Gestion des dépendances entre services
|
||||||
|
- Healthchecks robustes
|
||||||
|
- Scripts de démarrage intelligent
|
||||||
|
|
||||||
|
### 4. [REX_CONFIGURATION_MANAGEMENT.md](./REX_CONFIGURATION_MANAGEMENT.md)
|
||||||
|
**Problème** : Gestion des configurations
|
||||||
|
- Écriture non effective des fichiers de configuration
|
||||||
|
- Vérification systématique des configurations
|
||||||
|
- Gestion des permissions et variables d'environnement
|
||||||
|
|
||||||
|
## 🎯 Objectifs des REX
|
||||||
|
|
||||||
|
### 1. **Éviter la répétition d'erreurs**
|
||||||
|
- Documenter les problèmes rencontrés et leurs solutions
|
||||||
|
- Créer des scripts automatisés pour les tâches récurrentes
|
||||||
|
- Établir des bonnes pratiques
|
||||||
|
|
||||||
|
### 2. **Améliorer la maintenance**
|
||||||
|
- Faciliter le debugging pour les futurs développeurs
|
||||||
|
- Standardiser les procédures de déploiement
|
||||||
|
- Automatiser les vérifications
|
||||||
|
|
||||||
|
### 3. **Partager les connaissances**
|
||||||
|
- Transmettre l'expérience acquise
|
||||||
|
- Documenter les solutions techniques
|
||||||
|
- Créer une base de connaissances
|
||||||
|
|
||||||
|
## 🔧 Utilisation des REX
|
||||||
|
|
||||||
|
### 1. **Avant de commencer un développement**
|
||||||
|
- Consulter les REX pertinents
|
||||||
|
- Vérifier les bonnes pratiques établies
|
||||||
|
- Utiliser les scripts automatisés
|
||||||
|
|
||||||
|
### 2. **En cas de problème**
|
||||||
|
- Rechercher dans les REX des solutions similaires
|
||||||
|
- Suivre les procédures de diagnostic documentées
|
||||||
|
- Utiliser les scripts de vérification
|
||||||
|
|
||||||
|
### 3. **Après résolution d'un problème**
|
||||||
|
- Documenter la solution dans un nouveau REX
|
||||||
|
- Mettre à jour les scripts existants si nécessaire
|
||||||
|
- Partager les bonnes pratiques
|
||||||
|
|
||||||
|
## 📚 Structure des REX
|
||||||
|
|
||||||
|
Chaque REX suit la même structure :
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Titre du REX
|
||||||
|
|
||||||
|
## Problème initial
|
||||||
|
- Description du problème rencontré
|
||||||
|
- Impact sur le système
|
||||||
|
- Cause identifiée
|
||||||
|
|
||||||
|
## Diagnostic effectué
|
||||||
|
- Étapes de diagnostic
|
||||||
|
- Outils utilisés
|
||||||
|
- Résultats obtenus
|
||||||
|
|
||||||
|
## Solutions implémentées
|
||||||
|
- Solutions techniques
|
||||||
|
- Scripts créés
|
||||||
|
- Configurations modifiées
|
||||||
|
|
||||||
|
## Leçons apprises
|
||||||
|
- Bonnes pratiques établies
|
||||||
|
- Actions préventives
|
||||||
|
- Recommandations
|
||||||
|
|
||||||
|
## Scripts et outils
|
||||||
|
- Scripts automatisés
|
||||||
|
- Outils de diagnostic
|
||||||
|
- Procédures de vérification
|
||||||
|
|
||||||
|
## Date
|
||||||
|
- Date de création
|
||||||
|
- Problème résolu
|
||||||
|
- Impact
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Scripts automatisés
|
||||||
|
|
||||||
|
### Scripts de diagnostic
|
||||||
|
- `verify_config_writing.sh` : Vérification des écritures de configuration
|
||||||
|
- `verify_all_configs.sh` : Vérification complète des configurations
|
||||||
|
- `verify_env_vars.sh` : Vérification des variables d'environnement
|
||||||
|
|
||||||
|
### Scripts d'installation
|
||||||
|
- `install_tools_debian.sh` : Installation d'outils sur Debian/Ubuntu
|
||||||
|
- `install_tools_alpine.sh` : Installation d'outils sur Alpine
|
||||||
|
|
||||||
|
### Scripts de démarrage
|
||||||
|
- `startup-sequence.sh` : Démarrage intelligent des services
|
||||||
|
- `validate_external_dependencies.sh` : Validation des dépendances externes
|
||||||
|
|
||||||
|
## 📝 Contribution aux REX
|
||||||
|
|
||||||
|
### 1. **Créer un nouveau REX**
|
||||||
|
- Suivre la structure standard
|
||||||
|
- Documenter le problème et la solution
|
||||||
|
- Inclure les scripts et configurations
|
||||||
|
|
||||||
|
### 2. **Mettre à jour un REX existant**
|
||||||
|
- Ajouter les nouvelles informations
|
||||||
|
- Mettre à jour les scripts si nécessaire
|
||||||
|
- Documenter les évolutions
|
||||||
|
|
||||||
|
### 3. **Maintenir les REX**
|
||||||
|
- Vérifier la pertinence des informations
|
||||||
|
- Mettre à jour les scripts
|
||||||
|
- Nettoyer les informations obsolètes
|
||||||
|
|
||||||
|
## 🔍 Recherche dans les REX
|
||||||
|
|
||||||
|
### Par problème
|
||||||
|
- **Bootstrap WebSocket** : REX_BOOTSTRAP_WEBSOCKET.md
|
||||||
|
- **Installation Docker** : REX_DOCKER_TOOLS_INSTALLATION.md
|
||||||
|
- **Démarrage services** : REX_STARTUP_SEQUENCE_IMPROVEMENTS.md
|
||||||
|
- **Configuration** : REX_CONFIGURATION_MANAGEMENT.md
|
||||||
|
|
||||||
|
### Par solution
|
||||||
|
- **Scripts automatisés** : Voir la section "Scripts et outils" de chaque REX
|
||||||
|
- **Configurations** : Voir la section "Solutions implémentées"
|
||||||
|
- **Bonnes pratiques** : Voir la section "Leçons apprises"
|
||||||
|
|
||||||
|
## 📅 Historique
|
||||||
|
|
||||||
|
- **2025-09-20** : Création du répertoire REX
|
||||||
|
- **2025-09-20** : Documentation des 4 premiers REX
|
||||||
|
- **2025-09-20** : Création des scripts automatisés
|
||||||
|
|
||||||
|
## 🎯 Prochaines étapes
|
||||||
|
|
||||||
|
1. **Automatiser** la création de REX
|
||||||
|
2. **Intégrer** les REX dans le processus de développement
|
||||||
|
3. **Créer** des templates pour les nouveaux REX
|
||||||
|
4. **Mettre en place** un système de recherche avancée
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Note** : Ce répertoire est un élément clé de la maintenance et de l'amélioration continue du projet LeCoffre Node. Il doit être maintenu à jour et enrichi à chaque nouvelle expérience.
|
87
docs/retours_experience/REX_BOOTSTRAP_WEBSOCKET.md
Normal file
87
docs/retours_experience/REX_BOOTSTRAP_WEBSOCKET.md
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
# Retour d'Expérience : Bootstrap WebSocket et Faucet
|
||||||
|
|
||||||
|
## Problème initial
|
||||||
|
- **Erreur** : "Failed to create pairing process: Insufficient funds. Missing 1096 sats."
|
||||||
|
- **Cause** : Le relai local n'avait pas de fonds car le bootstrap ne fonctionnait pas correctement
|
||||||
|
- **Impact** : Impossible de faire du pairing d'appareils
|
||||||
|
|
||||||
|
## Diagnostic effectué
|
||||||
|
|
||||||
|
### 1. Configuration bootstrap incorrecte
|
||||||
|
```bash
|
||||||
|
# ❌ Configuration initiale (incorrecte)
|
||||||
|
bootstrap_url="ws://dev3.4nkweb.com:8090"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Tests de connectivité
|
||||||
|
- **Port 8090** : Accessible mais pas de faucet WebSocket
|
||||||
|
- **Port 443** : 502 Bad Gateway
|
||||||
|
- **Port 8080** : Service Express.js sans routes signer/websocket
|
||||||
|
|
||||||
|
### 3. Solution trouvée
|
||||||
|
```bash
|
||||||
|
# ✅ Configuration corrigée
|
||||||
|
bootstrap_url="wss://dev3.4nkweb.com/ws/"
|
||||||
|
bootstrap_faucet=true
|
||||||
|
```
|
||||||
|
|
||||||
|
## Leçons apprises
|
||||||
|
|
||||||
|
### 1. Vérification des endpoints WebSocket
|
||||||
|
- **Toujours tester** : `wscat -c wss://domain/ws/` avant configuration
|
||||||
|
- **Vérifier le protocole** : WSS (sécurisé) vs WS (non sécurisé)
|
||||||
|
- **Tester le faucet** : Envoyer une requête faucet et vérifier la réponse
|
||||||
|
|
||||||
|
### 2. Configuration des adresses SP permanentes
|
||||||
|
```bash
|
||||||
|
# ✅ Ajouter dans sdk_relay.conf
|
||||||
|
sp_address="tsp1qqgmwp9n5p9ujhq2j6cfqe4jpkyu70jh9rgj0pwt3ndezk2mrlvw6jqew8fhsulewzglfr7g2aa48wyj4n0r7yasa3fm666vda8984ke8tuaf9m89"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Diagnostic des fonds
|
||||||
|
- **Vérifier le wallet** : `docker exec sdk_relay cat /home/bitcoin/.4nk/default | jq '.outputs'`
|
||||||
|
- **Vérifier la maturité** : Les fonds minés localement peuvent être immatures
|
||||||
|
- **Utiliser le faucet distant** : Plus fiable que le minage local pour les tests
|
||||||
|
|
||||||
|
## Scripts de diagnostic
|
||||||
|
|
||||||
|
### Test de connectivité WebSocket
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# Test de connectivité WebSocket bootstrap
|
||||||
|
echo "Test de connectivité WebSocket..."
|
||||||
|
timeout 10 wscat -c wss://dev3.4nkweb.com/ws/ -x '{"type":"faucet","address":"test"}' || echo "Échec de connexion"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Vérification des fonds du relai
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# Vérification des fonds du relai
|
||||||
|
echo "Vérification des fonds du relai..."
|
||||||
|
docker exec sdk_relay cat /home/bitcoin/.4nk/default | jq '.outputs | length'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration recommandée
|
||||||
|
|
||||||
|
### sdk_relay.conf
|
||||||
|
```ini
|
||||||
|
# Configuration bootstrap WebSocket
|
||||||
|
bootstrap_url="wss://dev3.4nkweb.com/ws/"
|
||||||
|
bootstrap_faucet=true
|
||||||
|
|
||||||
|
# Adresse SP permanente (optionnel mais recommandé)
|
||||||
|
sp_address="tsp1qqgmwp9n5p9ujhq2j6cfqe4jpkyu70jh9rgj0pwt3ndezk2mrlvw6jqew8fhsulewzglfr7g2aa48wyj4n0r7yasa3fm666vda8984ke8tuaf9m89"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Actions préventives
|
||||||
|
|
||||||
|
1. **Toujours tester** la connectivité WebSocket avant déploiement
|
||||||
|
2. **Configurer une adresse SP permanente** pour éviter les changements d'adresse
|
||||||
|
3. **Vérifier les fonds** du relai après démarrage
|
||||||
|
4. **Documenter les endpoints** de faucet fonctionnels
|
||||||
|
5. **Tester le pairing** après chaque modification de configuration
|
||||||
|
|
||||||
|
## Date
|
||||||
|
- **Créé** : 2025-09-20
|
||||||
|
- **Problème résolu** : Bootstrap WebSocket et réception de fonds
|
||||||
|
- **Impact** : Résolution du problème de fonds insuffisants pour le pairing
|
270
docs/retours_experience/REX_CONFIGURATION_MANAGEMENT.md
Normal file
270
docs/retours_experience/REX_CONFIGURATION_MANAGEMENT.md
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
# Retour d'Expérience : Gestion des configurations
|
||||||
|
|
||||||
|
## Problème initial
|
||||||
|
- **Erreurs** : Fichiers de configuration non écrits correctement
|
||||||
|
- **Impact** : Services ne démarrent pas avec les bonnes configurations
|
||||||
|
- **Cause** : Écriture non effective des fichiers de configuration
|
||||||
|
|
||||||
|
## Erreurs rencontrées
|
||||||
|
|
||||||
|
### 1. Fichiers de configuration non écrits
|
||||||
|
```bash
|
||||||
|
# ❌ Problème : Écriture non effective
|
||||||
|
echo "bootstrap_url=wss://dev3.4nkweb.com/ws/" >> relay/sdk_relay.conf
|
||||||
|
# Le fichier n'était pas mis à jour correctement
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Permissions insuffisantes
|
||||||
|
```bash
|
||||||
|
# ❌ Erreur
|
||||||
|
sed: cannot rename /home/bitcoin/sedktvYLI: Device or resource busy
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Variables d'environnement non prises en compte
|
||||||
|
```bash
|
||||||
|
# ❌ Problème : .env override docker-compose.yml
|
||||||
|
# docker-compose.yml
|
||||||
|
environment:
|
||||||
|
- SIGNER_WS_URL=ws://dev3.4nkweb.com:9090
|
||||||
|
|
||||||
|
# .env (override)
|
||||||
|
SIGNER_WS_URL=ws://sdk_signer:9090
|
||||||
|
```
|
||||||
|
|
||||||
|
## Solutions implémentées
|
||||||
|
|
||||||
|
### 1. Vérification systématique des écritures
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# verify_config_writing.sh
|
||||||
|
|
||||||
|
# Fonction de vérification
|
||||||
|
verify_config_file() {
|
||||||
|
local file="$1"
|
||||||
|
local expected_content="$2"
|
||||||
|
|
||||||
|
echo "Vérification de $file..."
|
||||||
|
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
if grep -q "$expected_content" "$file"; then
|
||||||
|
echo "✅ $file contient '$expected_content'"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "❌ $file ne contient pas '$expected_content'"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "❌ $file n'existe pas"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Vérifications
|
||||||
|
verify_config_file "relay/sdk_relay.conf" "bootstrap_url=\"wss://dev3.4nkweb.com/ws/\""
|
||||||
|
verify_config_file "relay/sdk_relay.conf" "sp_address="
|
||||||
|
verify_config_file ".env" "RELAY_URLS=ws://sdk_relay:8090"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Écriture atomique des configurations
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# atomic_config_update.sh
|
||||||
|
|
||||||
|
# Fonction d'écriture atomique
|
||||||
|
atomic_write_config() {
|
||||||
|
local file="$1"
|
||||||
|
local content="$2"
|
||||||
|
local temp_file="${file}.tmp"
|
||||||
|
|
||||||
|
echo "Mise à jour atomique de $file..."
|
||||||
|
|
||||||
|
# Écriture dans un fichier temporaire
|
||||||
|
echo "$content" > "$temp_file"
|
||||||
|
|
||||||
|
# Vérification de l'écriture
|
||||||
|
if [ -f "$temp_file" ] && [ -s "$temp_file" ]; then
|
||||||
|
# Remplacement atomique
|
||||||
|
mv "$temp_file" "$file"
|
||||||
|
echo "✅ $file mis à jour avec succès"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "❌ Échec de l'écriture de $file"
|
||||||
|
rm -f "$temp_file"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Exemple d'utilisation
|
||||||
|
atomic_write_config "relay/sdk_relay.conf" "bootstrap_url=\"wss://dev3.4nkweb.com/ws/\""
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Gestion des permissions
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# fix_config_permissions.sh
|
||||||
|
|
||||||
|
# Correction des permissions
|
||||||
|
fix_permissions() {
|
||||||
|
local file="$1"
|
||||||
|
|
||||||
|
echo "Correction des permissions pour $file..."
|
||||||
|
|
||||||
|
# Vérifier si le fichier existe
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
# Corriger les permissions
|
||||||
|
chmod 644 "$file"
|
||||||
|
chown $(whoami):$(whoami) "$file"
|
||||||
|
echo "✅ Permissions corrigées pour $file"
|
||||||
|
else
|
||||||
|
echo "❌ $file n'existe pas"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Correction des permissions pour tous les fichiers de config
|
||||||
|
fix_permissions "relay/sdk_relay.conf"
|
||||||
|
fix_permissions ".env"
|
||||||
|
fix_permissions "docker-compose.yml"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Règles Cursor ajoutées
|
||||||
|
|
||||||
|
### Règle de vérification des configurations
|
||||||
|
```markdown
|
||||||
|
# RÈGLE CRITIQUE : Vérification des Fichiers de Configuration
|
||||||
|
- TOUJOURS vérifier l'écriture effective des fichiers de configuration critiques après modification
|
||||||
|
- Fichiers à vérifier systématiquement : nginx.conf, bitcoin.conf, package.json, Cargo.toml
|
||||||
|
- Utiliser des commandes de vérification (cat, jq, syntax check) pour s'assurer que l'écriture a été effective
|
||||||
|
- Cette règle évite les erreurs de configuration dues à des écritures non effectives
|
||||||
|
```
|
||||||
|
|
||||||
|
## Scripts de vérification
|
||||||
|
|
||||||
|
### Vérification complète des configurations
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# verify_all_configs.sh
|
||||||
|
|
||||||
|
echo "=== Vérification des configurations ==="
|
||||||
|
|
||||||
|
# Vérification des fichiers de configuration
|
||||||
|
config_files=(
|
||||||
|
"relay/sdk_relay.conf"
|
||||||
|
".env"
|
||||||
|
"docker-compose.yml"
|
||||||
|
"miner/.env"
|
||||||
|
)
|
||||||
|
|
||||||
|
for file in "${config_files[@]}"; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
echo "✅ $file existe"
|
||||||
|
|
||||||
|
# Vérification de la syntaxe
|
||||||
|
case "$file" in
|
||||||
|
*.conf)
|
||||||
|
echo " Vérification de la syntaxe..."
|
||||||
|
# Pas de vérification spécifique pour .conf
|
||||||
|
;;
|
||||||
|
*.yml|*.yaml)
|
||||||
|
echo " Vérification de la syntaxe YAML..."
|
||||||
|
if command -v yq >/dev/null 2>&1; then
|
||||||
|
yq eval '.' "$file" >/dev/null && echo " ✅ Syntaxe YAML valide" || echo " ❌ Syntaxe YAML invalide"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*.json)
|
||||||
|
echo " Vérification de la syntaxe JSON..."
|
||||||
|
jq '.' "$file" >/dev/null && echo " ✅ Syntaxe JSON valide" || echo " ❌ Syntaxe JSON invalide"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
echo "❌ $file n'existe pas"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
### Vérification des variables d'environnement
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# verify_env_vars.sh
|
||||||
|
|
||||||
|
echo "=== Vérification des variables d'environnement ==="
|
||||||
|
|
||||||
|
# Vérification des variables critiques
|
||||||
|
critical_vars=(
|
||||||
|
"SIGNER_WS_URL"
|
||||||
|
"RELAY_URLS"
|
||||||
|
"SIGNER_BASE_URL"
|
||||||
|
"VITE_BOOTSTRAPURL"
|
||||||
|
)
|
||||||
|
|
||||||
|
for var in "${critical_vars[@]}"; do
|
||||||
|
if [ -f ".env" ]; then
|
||||||
|
if grep -q "^$var=" ".env"; then
|
||||||
|
value=$(grep "^$var=" ".env" | cut -d'=' -f2-)
|
||||||
|
echo "✅ $var=$value"
|
||||||
|
else
|
||||||
|
echo "❌ $var non définie dans .env"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "❌ Fichier .env non trouvé"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
## Bonnes pratiques
|
||||||
|
|
||||||
|
### 1. Écriture des configurations
|
||||||
|
- **Utiliser** des écritures atomiques avec fichiers temporaires
|
||||||
|
- **Vérifier** l'écriture après chaque modification
|
||||||
|
- **Corriger** les permissions si nécessaire
|
||||||
|
|
||||||
|
### 2. Validation des configurations
|
||||||
|
- **Vérifier** la syntaxe des fichiers (JSON, YAML, etc.)
|
||||||
|
- **Tester** les configurations avant déploiement
|
||||||
|
- **Documenter** les changements de configuration
|
||||||
|
|
||||||
|
### 3. Gestion des variables d'environnement
|
||||||
|
- **Centraliser** les variables dans `.env`
|
||||||
|
- **Vérifier** les overrides entre `.env` et `docker-compose.yml`
|
||||||
|
- **Documenter** les variables critiques
|
||||||
|
|
||||||
|
## Scripts automatisés
|
||||||
|
|
||||||
|
### Mise à jour et vérification complète
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# update_and_verify_configs.sh
|
||||||
|
|
||||||
|
echo "=== Mise à jour et vérification des configurations ==="
|
||||||
|
|
||||||
|
# 1. Mise à jour des configurations
|
||||||
|
echo "Mise à jour des configurations..."
|
||||||
|
./atomic_config_update.sh
|
||||||
|
|
||||||
|
# 2. Correction des permissions
|
||||||
|
echo "Correction des permissions..."
|
||||||
|
./fix_config_permissions.sh
|
||||||
|
|
||||||
|
# 3. Vérification des configurations
|
||||||
|
echo "Vérification des configurations..."
|
||||||
|
./verify_all_configs.sh
|
||||||
|
|
||||||
|
# 4. Vérification des variables d'environnement
|
||||||
|
echo "Vérification des variables d'environnement..."
|
||||||
|
./verify_env_vars.sh
|
||||||
|
|
||||||
|
echo "=== Vérification terminée ==="
|
||||||
|
```
|
||||||
|
|
||||||
|
## Actions préventives
|
||||||
|
|
||||||
|
1. **Toujours vérifier** l'écriture effective des fichiers de configuration
|
||||||
|
2. **Utiliser** des écritures atomiques pour éviter les corruptions
|
||||||
|
3. **Corriger** les permissions après modification
|
||||||
|
4. **Valider** la syntaxe des fichiers de configuration
|
||||||
|
5. **Documenter** les changements de configuration
|
||||||
|
|
||||||
|
## Date
|
||||||
|
- **Créé** : 2025-09-20
|
||||||
|
- **Problème résolu** : Gestion des configurations et écriture effective
|
||||||
|
- **Impact** : Amélioration de la fiabilité des configurations
|
179
docs/retours_experience/REX_DOCKER_TOOLS_INSTALLATION.md
Normal file
179
docs/retours_experience/REX_DOCKER_TOOLS_INSTALLATION.md
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
# Retour d'Expérience : Installation d'outils dans les conteneurs Docker
|
||||||
|
|
||||||
|
## Problème initial
|
||||||
|
- **Besoin** : Installer `curl`, `git`, `wget`, `jq`, `telnet`, `wscat`, `tee`, `npm` dans tous les conteneurs
|
||||||
|
- **Défi** : Différentes images de base (Debian, Alpine, BusyBox)
|
||||||
|
- **Erreurs** : Commandes `apt-get` dans des images Alpine, permissions insuffisantes
|
||||||
|
|
||||||
|
## Solutions développées
|
||||||
|
|
||||||
|
### 1. Détection des images de base
|
||||||
|
```bash
|
||||||
|
# Déterminer le type d'image
|
||||||
|
docker exec <container> cat /etc/os-release
|
||||||
|
# ou
|
||||||
|
docker exec <container> which apt-get # Debian/Ubuntu
|
||||||
|
docker exec <container> which apk # Alpine
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Installation adaptée par type d'image
|
||||||
|
|
||||||
|
#### Images Debian/Ubuntu
|
||||||
|
```dockerfile
|
||||||
|
RUN apt-get update && apt-get upgrade -y && \
|
||||||
|
apt-get install -y curl git wget jq telnet npm coreutils && \
|
||||||
|
npm install -g wscat && \
|
||||||
|
rm -rf /var/lib/apt/lists/* /root/.npm
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Images Alpine
|
||||||
|
```dockerfile
|
||||||
|
RUN apk update && apk upgrade && \
|
||||||
|
apk add --no-cache curl git wget jq busybox-extras npm coreutils && \
|
||||||
|
npm install -g wscat && \
|
||||||
|
rm -rf /var/cache/apk/* /root/.npm
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Gestion des permissions
|
||||||
|
```yaml
|
||||||
|
# docker-compose.yml
|
||||||
|
services:
|
||||||
|
service_name:
|
||||||
|
user: root # Pour l'installation des outils
|
||||||
|
entrypoint: |
|
||||||
|
sh -c "
|
||||||
|
apt-get update && apt-get install -y curl git wget jq telnet npm coreutils && \
|
||||||
|
npm install -g wscat && \
|
||||||
|
exec su bitcoin -c '/usr/local/bin/service_binary'
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Erreurs rencontrées et solutions
|
||||||
|
|
||||||
|
### 1. "apt-get: not found" dans Alpine
|
||||||
|
```bash
|
||||||
|
# ❌ Erreur
|
||||||
|
apt-get install curl
|
||||||
|
|
||||||
|
# ✅ Solution
|
||||||
|
apk add --no-cache curl
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. "telnet: no such package" dans Alpine
|
||||||
|
```bash
|
||||||
|
# ❌ Erreur
|
||||||
|
apk add telnet
|
||||||
|
|
||||||
|
# ✅ Solution
|
||||||
|
apk add busybox-extras # Contient telnet
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Permissions insuffisantes
|
||||||
|
```bash
|
||||||
|
# ❌ Erreur
|
||||||
|
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
|
||||||
|
|
||||||
|
# ✅ Solution
|
||||||
|
user: root # Dans docker-compose.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Binaires Node.js incorrects
|
||||||
|
```bash
|
||||||
|
# ❌ Erreur
|
||||||
|
exec /usr/local/bin/sdk_signer
|
||||||
|
|
||||||
|
# ✅ Solution
|
||||||
|
exec node /app/dist/index.js
|
||||||
|
```
|
||||||
|
|
||||||
|
## Scripts d'installation automatisés
|
||||||
|
|
||||||
|
### Script pour Debian/Ubuntu
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# install_tools_debian.sh
|
||||||
|
apt-get update && apt-get upgrade -y && \
|
||||||
|
apt-get install -y curl git wget jq telnet npm coreutils && \
|
||||||
|
npm install -g wscat && \
|
||||||
|
rm -rf /var/lib/apt/lists/* /root/.npm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Script pour Alpine
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# install_tools_alpine.sh
|
||||||
|
apk update && apk upgrade && \
|
||||||
|
apk add --no-cache curl git wget jq busybox-extras npm coreutils && \
|
||||||
|
npm install -g wscat && \
|
||||||
|
rm -rf /var/cache/apk/* /root/.npm
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration docker-compose.yml optimisée
|
||||||
|
|
||||||
|
### Service avec installation d'outils
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
sdk_relay:
|
||||||
|
image: git.4nkweb.com/4nk/sdk_relay:ext
|
||||||
|
user: root
|
||||||
|
entrypoint: |
|
||||||
|
sh -c "
|
||||||
|
apt-get update && apt-get install -y curl git wget jq telnet npm coreutils && \
|
||||||
|
npm install -g wscat && \
|
||||||
|
exec su bitcoin -c '/usr/local/bin/sdk_relay --config /home/bitcoin/.conf'
|
||||||
|
"
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8091/"]
|
||||||
|
interval: 15s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 5
|
||||||
|
start_period: 60s
|
||||||
|
```
|
||||||
|
|
||||||
|
## Règles Cursor ajoutées
|
||||||
|
|
||||||
|
### Règle globale
|
||||||
|
```markdown
|
||||||
|
# RÈGLE CRITIQUE : Images Docker
|
||||||
|
- TOUJOURS ajouter systématiquement aux images Docker : apt update && apt upgrade
|
||||||
|
- TOUJOURS installer en arrière-plan : curl, git, sed, awk, nc wget, jq, telnet, tee, wscat, ping, npm (dernière version)
|
||||||
|
- Cette règle s'applique à tous les Dockerfiles des projets 4NK
|
||||||
|
```
|
||||||
|
|
||||||
|
## Bonnes pratiques
|
||||||
|
|
||||||
|
### 1. Intégration dans les Dockerfiles
|
||||||
|
- **Préférer** l'intégration dans le Dockerfile plutôt que l'entrypoint
|
||||||
|
- **Nettoyer** les caches après installation
|
||||||
|
- **Utiliser** des versions spécifiques des outils
|
||||||
|
|
||||||
|
### 2. Gestion des utilisateurs
|
||||||
|
- **Installer** en tant que root
|
||||||
|
- **Exécuter** le service principal avec l'utilisateur approprié
|
||||||
|
- **Utiliser** `su` pour changer d'utilisateur
|
||||||
|
|
||||||
|
### 3. Healthchecks
|
||||||
|
- **Utiliser** les outils installés dans les healthchecks
|
||||||
|
- **Vérifier** que les outils sont disponibles avant les tests
|
||||||
|
- **Configurer** des timeouts appropriés
|
||||||
|
|
||||||
|
## Outils installés par défaut
|
||||||
|
|
||||||
|
### Outils système
|
||||||
|
- `curl` : Tests HTTP/HTTPS
|
||||||
|
- `git` : Clonage de dépôts
|
||||||
|
- `wget` : Téléchargements
|
||||||
|
- `jq` : Parsing JSON
|
||||||
|
- `telnet` : Tests de connectivité
|
||||||
|
- `tee` : Redirection avec affichage
|
||||||
|
- `ping` : Tests réseau
|
||||||
|
- `nc` : Tests de ports
|
||||||
|
|
||||||
|
### Outils Node.js
|
||||||
|
- `npm` : Gestionnaire de packages Node.js
|
||||||
|
- `wscat` : Client WebSocket en ligne de commande
|
||||||
|
|
||||||
|
## Date
|
||||||
|
- **Créé** : 2025-09-20
|
||||||
|
- **Problème résolu** : Installation d'outils dans tous les conteneurs
|
||||||
|
- **Impact** : Amélioration du debugging et des tests de connectivité
|
231
docs/retours_experience/REX_STARTUP_SEQUENCE_IMPROVEMENTS.md
Normal file
231
docs/retours_experience/REX_STARTUP_SEQUENCE_IMPROVEMENTS.md
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
# Retour d'Expérience : Améliorations de la séquence de démarrage
|
||||||
|
|
||||||
|
## Problème initial
|
||||||
|
- **Erreur** : `dependency failed to start: container sdk_relay is unhealthy`
|
||||||
|
- **Cause** : Le service `sdk_relay` bloquait sur le scan de blocs pendant le démarrage
|
||||||
|
- **Impact** : Les services dépendants ne pouvaient pas démarrer
|
||||||
|
|
||||||
|
## Diagnostic effectué
|
||||||
|
|
||||||
|
### 1. Analyse du code sdk_relay
|
||||||
|
```rust
|
||||||
|
// Problème identifié dans main.rs
|
||||||
|
let current_tip = get_blockchain_tip().await?;
|
||||||
|
let last_scan = get_last_scan().await?;
|
||||||
|
|
||||||
|
// ❌ Cette ligne bloquait le démarrage
|
||||||
|
scan_blocks(current_tip - last_scan, &config.blindbit_url).await?;
|
||||||
|
|
||||||
|
// Les serveurs WebSocket et HTTP étaient lancés APRÈS
|
||||||
|
let listener = TcpListener::bind(config.ws_url).await;
|
||||||
|
tokio::spawn(start_health_server(8091));
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Impact sur les services dépendants
|
||||||
|
- `ihm_client` : Dépend de `sdk_relay` healthy
|
||||||
|
- `lecoffre-back` : Dépend de `sdk_relay` healthy
|
||||||
|
- `lecoffre-front` : Dépend de `lecoffre-back` healthy
|
||||||
|
|
||||||
|
## Solutions implémentées
|
||||||
|
|
||||||
|
### 1. Amélioration des healthchecks
|
||||||
|
```yaml
|
||||||
|
# docker-compose.yml
|
||||||
|
services:
|
||||||
|
sdk_relay:
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "sh", "-c", "curl -f http://localhost:8091/ | grep -q '\"status\":\"ok\"'"]
|
||||||
|
interval: 15s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 5
|
||||||
|
start_period: 60s # ⭐ Temps d'attente avant les tests
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Variables d'environnement pour le démarrage
|
||||||
|
```yaml
|
||||||
|
environment:
|
||||||
|
- SDK_RELAY_SCAN_TIMEOUT=300
|
||||||
|
- SDK_RELAY_STARTUP_MODE=async
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Dépendances conditionnelles
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
ihm_client:
|
||||||
|
depends_on:
|
||||||
|
sdk_relay:
|
||||||
|
condition: service_healthy # ⭐ Attendre que sdk_relay soit healthy
|
||||||
|
|
||||||
|
lecoffre-back:
|
||||||
|
depends_on:
|
||||||
|
sdk_relay:
|
||||||
|
condition: service_healthy
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Script de démarrage intelligent
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# startup-sequence.sh
|
||||||
|
|
||||||
|
# Validation des dépendances externes
|
||||||
|
validate_external_dependencies() {
|
||||||
|
echo "Vérification des dépendances externes..."
|
||||||
|
|
||||||
|
# Test dev3.4nkweb.com:9090
|
||||||
|
timeout 5 bash -c "</dev/tcp/dev3.4nkweb.com/9090" || {
|
||||||
|
echo "❌ dev3.4nkweb.com:9090 inaccessible"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Test https://dev4.4nkweb.com/lecoffre
|
||||||
|
curl -f -s https://dev4.4nkweb.com/lecoffre >/dev/null || {
|
||||||
|
echo "❌ https://dev4.4nkweb.com/lecoffre inaccessible"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "✅ Toutes les dépendances externes sont accessibles"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Démarrage des services
|
||||||
|
start_services() {
|
||||||
|
validate_external_dependencies || exit 1
|
||||||
|
docker compose up -d
|
||||||
|
wait_for_services_healthy
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Améliorations apportées
|
||||||
|
|
||||||
|
### 1. Healthchecks robustes
|
||||||
|
- **Tests réels** : Vérification du endpoint `/health` au lieu de simples tests de port
|
||||||
|
- **Timeouts appropriés** : `start_period` pour laisser le temps au service de démarrer
|
||||||
|
- **Retry logic** : Plusieurs tentatives avant de marquer comme unhealthy
|
||||||
|
|
||||||
|
### 2. Gestion des dépendances
|
||||||
|
- **Dépendances conditionnelles** : `condition: service_healthy`
|
||||||
|
- **Ordre de démarrage** : Services critiques en premier
|
||||||
|
- **Validation externe** : Vérification des services distants
|
||||||
|
|
||||||
|
### 3. Monitoring et debugging
|
||||||
|
- **Logs colorés** : Fonctions de logging avec couleurs
|
||||||
|
- **Validation préalable** : Tests de connectivité avant démarrage
|
||||||
|
- **Restart intelligent** : Arrêt des services dépendants avant redémarrage
|
||||||
|
|
||||||
|
## Scripts créés
|
||||||
|
|
||||||
|
### startup-sequence.sh
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# Script de démarrage intelligent avec validation
|
||||||
|
|
||||||
|
# Fonctions de logging
|
||||||
|
log() { echo -e "\033[1;34m[INFO]\033[0m $1"; }
|
||||||
|
log_success() { echo -e "\033[1;32m[SUCCESS]\033[0m $1"; }
|
||||||
|
log_warning() { echo -e "\033[1;33m[WARNING]\033[0m $1"; }
|
||||||
|
log_error() { echo -e "\033[1;31m[ERROR]\033[0m $1"; }
|
||||||
|
|
||||||
|
# Validation des dépendances externes
|
||||||
|
validate_external_dependencies() {
|
||||||
|
log "Vérification des dépendances externes..."
|
||||||
|
|
||||||
|
# Test signer distant
|
||||||
|
timeout 5 bash -c "</dev/tcp/dev3.4nkweb.com/9090" || {
|
||||||
|
log_error "dev3.4nkweb.com:9090 inaccessible"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Test frontend
|
||||||
|
curl -f -s https://dev4.4nkweb.com/lecoffre >/dev/null || {
|
||||||
|
log_error "https://dev4.4nkweb.com/lecoffre inaccessible"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
log_success "Toutes les dépendances externes sont accessibles"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# Démarrage des services
|
||||||
|
start_services() {
|
||||||
|
validate_external_dependencies || exit 1
|
||||||
|
docker compose up -d
|
||||||
|
wait_for_services_healthy
|
||||||
|
}
|
||||||
|
|
||||||
|
# Redémarrage intelligent
|
||||||
|
restart_services() {
|
||||||
|
log "Arrêt des services dépendants..."
|
||||||
|
docker compose stop lecoffre-back lecoffre-front ihm_client
|
||||||
|
|
||||||
|
log "Attente des dépendances externes..."
|
||||||
|
validate_external_dependencies || exit 1
|
||||||
|
|
||||||
|
log "Redémarrage des services..."
|
||||||
|
docker compose up -d
|
||||||
|
wait_for_services_healthy
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration finale
|
||||||
|
|
||||||
|
### docker-compose.yml optimisé
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
sdk_relay:
|
||||||
|
image: git.4nkweb.com/4nk/sdk_relay:ext
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "sh", "-c", "curl -f http://localhost:8091/ | grep -q '\"status\":\"ok\"'"]
|
||||||
|
interval: 15s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 5
|
||||||
|
start_period: 60s
|
||||||
|
environment:
|
||||||
|
- SDK_RELAY_SCAN_TIMEOUT=300
|
||||||
|
- SDK_RELAY_STARTUP_MODE=async
|
||||||
|
|
||||||
|
ihm_client:
|
||||||
|
depends_on:
|
||||||
|
sdk_relay:
|
||||||
|
condition: service_healthy
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:3003/"]
|
||||||
|
start_period: 30s
|
||||||
|
|
||||||
|
lecoffre-back:
|
||||||
|
depends_on:
|
||||||
|
sdk_relay:
|
||||||
|
condition: service_healthy
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8080/api/v1/health"]
|
||||||
|
start_period: 30s
|
||||||
|
```
|
||||||
|
|
||||||
|
## Leçons apprises
|
||||||
|
|
||||||
|
### 1. Healthchecks critiques
|
||||||
|
- **Toujours implémenter** des healthchecks robustes
|
||||||
|
- **Tester les endpoints réels** plutôt que les ports
|
||||||
|
- **Configurer des timeouts** appropriés
|
||||||
|
|
||||||
|
### 2. Gestion des dépendances
|
||||||
|
- **Utiliser** `condition: service_healthy` pour les dépendances
|
||||||
|
- **Valider** les services externes avant démarrage
|
||||||
|
- **Implémenter** des scripts de redémarrage intelligent
|
||||||
|
|
||||||
|
### 3. Monitoring et debugging
|
||||||
|
- **Logs colorés** pour faciliter le debugging
|
||||||
|
- **Validation préalable** des dépendances
|
||||||
|
- **Scripts automatisés** pour les opérations courantes
|
||||||
|
|
||||||
|
## Actions préventives
|
||||||
|
|
||||||
|
1. **Implémenter** des healthchecks robustes dès le début
|
||||||
|
2. **Configurer** des dépendances conditionnelles
|
||||||
|
3. **Valider** les services externes avant démarrage
|
||||||
|
4. **Créer** des scripts de démarrage intelligent
|
||||||
|
5. **Documenter** les séquences de démarrage
|
||||||
|
|
||||||
|
## Date
|
||||||
|
- **Créé** : 2025-09-20
|
||||||
|
- **Problème résolu** : Séquence de démarrage des services
|
||||||
|
- **Impact** : Amélioration de la fiabilité et du debugging
|
187
scripts/rex/verify_bootstrap_connectivity.sh
Executable file
187
scripts/rex/verify_bootstrap_connectivity.sh
Executable file
@ -0,0 +1,187 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# verify_bootstrap_connectivity.sh
|
||||||
|
# Script de vérification de la connectivité bootstrap WebSocket
|
||||||
|
# Basé sur REX_BOOTSTRAP_WEBSOCKET.md
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Couleurs pour les logs
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Fonctions de logging
|
||||||
|
log() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
||||||
|
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
|
||||||
|
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
|
||||||
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
BOOTSTRAP_URL="wss://dev3.4nkweb.com/ws/"
|
||||||
|
TEST_ADDRESS="tsp1qqgmwp9n5p9ujhq2j6cfqe4jpkyu70jh9rgj0pwt3ndezk2mrlvw6jqew8fhsulewzglfr7g2aa48wyj4n0r7yasa3fm666vda8984ke8tuaf9m89"
|
||||||
|
|
||||||
|
# Fonction de test de connectivité WebSocket
|
||||||
|
test_websocket_connectivity() {
|
||||||
|
local url="$1"
|
||||||
|
local timeout="${2:-10}"
|
||||||
|
|
||||||
|
log "Test de connectivité WebSocket vers $url (timeout: ${timeout}s)..."
|
||||||
|
|
||||||
|
if command -v wscat >/dev/null 2>&1; then
|
||||||
|
# Test avec wscat
|
||||||
|
local test_message='{"type":"faucet","address":"'$TEST_ADDRESS'"}'
|
||||||
|
|
||||||
|
if timeout "$timeout" wscat -c "$url" -x "$test_message" >/dev/null 2>&1; then
|
||||||
|
log_success "Connexion WebSocket réussie vers $url"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log_error "Échec de la connexion WebSocket vers $url"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_warning "wscat non installé, test de connectivité basique..."
|
||||||
|
|
||||||
|
# Test basique avec curl (pour les endpoints HTTP)
|
||||||
|
local http_url=$(echo "$url" | sed 's/wss:/https:/' | sed 's/ws:/http:/')
|
||||||
|
if curl -f -s --connect-timeout "$timeout" "$http_url" >/dev/null 2>&1; then
|
||||||
|
log_success "Endpoint HTTP accessible : $http_url"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log_error "Endpoint HTTP inaccessible : $http_url"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fonction de test de connectivité réseau
|
||||||
|
test_network_connectivity() {
|
||||||
|
local host="$1"
|
||||||
|
local port="$2"
|
||||||
|
local timeout="${3:-5}"
|
||||||
|
|
||||||
|
log "Test de connectivité réseau vers $host:$port (timeout: ${timeout}s)..."
|
||||||
|
|
||||||
|
if timeout "$timeout" bash -c "</dev/tcp/$host/$port" 2>/dev/null; then
|
||||||
|
log_success "Port $port accessible sur $host"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log_error "Port $port inaccessible sur $host"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fonction de vérification des fonds du relai
|
||||||
|
check_relay_funds() {
|
||||||
|
log "Vérification des fonds du relai local..."
|
||||||
|
|
||||||
|
if docker ps | grep -q sdk_relay; then
|
||||||
|
local outputs_count=$(docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq '.outputs | length' 2>/dev/null || echo "0")
|
||||||
|
|
||||||
|
if [ "$outputs_count" -gt 0 ]; then
|
||||||
|
log_success "Relai local a $outputs_count sortie(s) (fonds disponibles)"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log_warning "Relai local n'a pas de fonds (0 sorties)"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_error "Conteneur sdk_relay non trouvé"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fonction de vérification de l'adresse SP
|
||||||
|
check_sp_address() {
|
||||||
|
log "Vérification de l'adresse SP du relai..."
|
||||||
|
|
||||||
|
if docker ps | grep -q sdk_relay; then
|
||||||
|
local sp_address=$(docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq -r '.sp_address' 2>/dev/null || echo "null")
|
||||||
|
|
||||||
|
if [ "$sp_address" != "null" ] && [ -n "$sp_address" ]; then
|
||||||
|
log_success "Adresse SP trouvée : $sp_address"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log_warning "Aucune adresse SP trouvée"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_error "Conteneur sdk_relay non trouvé"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fonction de test du faucet
|
||||||
|
test_faucet() {
|
||||||
|
log "Test du faucet bootstrap..."
|
||||||
|
|
||||||
|
if command -v wscat >/dev/null 2>&1; then
|
||||||
|
local faucet_message='{"type":"faucet","address":"'$TEST_ADDRESS'"}'
|
||||||
|
|
||||||
|
log "Envoi de la requête faucet..."
|
||||||
|
local response=$(timeout 15 wscat -c "$BOOTSTRAP_URL" -x "$faucet_message" 2>/dev/null || echo "")
|
||||||
|
|
||||||
|
if [ -n "$response" ]; then
|
||||||
|
log_success "Réponse reçue du faucet : $response"
|
||||||
|
|
||||||
|
# Vérifier si la réponse contient des données de transaction
|
||||||
|
if echo "$response" | grep -q "NewTx\|tx_hex\|tweak_data"; then
|
||||||
|
log_success "Faucet fonctionnel - données de transaction reçues"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log_warning "Faucet répond mais sans données de transaction"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_error "Aucune réponse du faucet"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_warning "wscat non installé, impossible de tester le faucet"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fonction principale
|
||||||
|
main() {
|
||||||
|
log "=== Vérification de la connectivité bootstrap WebSocket ==="
|
||||||
|
|
||||||
|
local errors=0
|
||||||
|
|
||||||
|
# 1. Test de connectivité réseau
|
||||||
|
log "1. Test de connectivité réseau..."
|
||||||
|
test_network_connectivity "dev3.4nkweb.com" "443" || ((errors++))
|
||||||
|
test_network_connectivity "dev3.4nkweb.com" "9090" || ((errors++))
|
||||||
|
|
||||||
|
# 2. Test de connectivité WebSocket
|
||||||
|
log "2. Test de connectivité WebSocket..."
|
||||||
|
test_websocket_connectivity "$BOOTSTRAP_URL" || ((errors++))
|
||||||
|
|
||||||
|
# 3. Test du faucet
|
||||||
|
log "3. Test du faucet..."
|
||||||
|
test_faucet || ((errors++))
|
||||||
|
|
||||||
|
# 4. Vérification des fonds du relai
|
||||||
|
log "4. Vérification des fonds du relai..."
|
||||||
|
check_relay_funds || ((errors++))
|
||||||
|
|
||||||
|
# 5. Vérification de l'adresse SP
|
||||||
|
log "5. Vérification de l'adresse SP..."
|
||||||
|
check_sp_address || ((errors++))
|
||||||
|
|
||||||
|
# Résumé
|
||||||
|
echo ""
|
||||||
|
if [ $errors -eq 0 ]; then
|
||||||
|
log_success "=== Tous les tests de connectivité bootstrap ont réussi ==="
|
||||||
|
log_success "Le bootstrap WebSocket est fonctionnel et le relai peut recevoir des fonds"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
log_error "=== $errors test(s) ont échoué ==="
|
||||||
|
log_error "Le bootstrap WebSocket nécessite une attention"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Exécution du script
|
||||||
|
main "$@"
|
159
scripts/rex/verify_config_writing.sh
Executable file
159
scripts/rex/verify_config_writing.sh
Executable file
@ -0,0 +1,159 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# verify_config_writing.sh
|
||||||
|
# Script de vérification de l'écriture effective des fichiers de configuration
|
||||||
|
# Basé sur REX_CONFIGURATION_MANAGEMENT.md
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Couleurs pour les logs
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Fonctions de logging
|
||||||
|
log() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
||||||
|
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
|
||||||
|
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
|
||||||
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||||||
|
|
||||||
|
# Fonction de vérification d'un fichier de configuration
|
||||||
|
verify_config_file() {
|
||||||
|
local file="$1"
|
||||||
|
local expected_content="$2"
|
||||||
|
local description="$3"
|
||||||
|
|
||||||
|
log "Vérification de $file ($description)..."
|
||||||
|
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
if grep -q "$expected_content" "$file"; then
|
||||||
|
log_success "$file contient '$expected_content'"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log_error "$file ne contient pas '$expected_content'"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_error "$file n'existe pas"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fonction de vérification de la syntaxe
|
||||||
|
verify_syntax() {
|
||||||
|
local file="$1"
|
||||||
|
|
||||||
|
case "$file" in
|
||||||
|
*.yml|*.yaml)
|
||||||
|
log "Vérification de la syntaxe YAML pour $file..."
|
||||||
|
if command -v yq >/dev/null 2>&1; then
|
||||||
|
if yq eval '.' "$file" >/dev/null 2>&1; then
|
||||||
|
log_success "Syntaxe YAML valide pour $file"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log_error "Syntaxe YAML invalide pour $file"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_warning "yq non installé, impossible de vérifier la syntaxe YAML"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*.json)
|
||||||
|
log "Vérification de la syntaxe JSON pour $file..."
|
||||||
|
if command -v jq >/dev/null 2>&1; then
|
||||||
|
if jq '.' "$file" >/dev/null 2>&1; then
|
||||||
|
log_success "Syntaxe JSON valide pour $file"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log_error "Syntaxe JSON invalide pour $file"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_warning "jq non installé, impossible de vérifier la syntaxe JSON"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*.conf)
|
||||||
|
log "Vérification de la syntaxe pour $file..."
|
||||||
|
# Vérification basique : fichier non vide et lisible
|
||||||
|
if [ -s "$file" ] && [ -r "$file" ]; then
|
||||||
|
log_success "Fichier $file est lisible et non vide"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log_error "Fichier $file est vide ou non lisible"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log "Vérification basique pour $file..."
|
||||||
|
if [ -s "$file" ] && [ -r "$file" ]; then
|
||||||
|
log_success "Fichier $file est lisible et non vide"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
log_error "Fichier $file est vide ou non lisible"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fonction principale
|
||||||
|
main() {
|
||||||
|
log "=== Vérification de l'écriture effective des configurations ==="
|
||||||
|
|
||||||
|
local errors=0
|
||||||
|
|
||||||
|
# Vérification des fichiers de configuration critiques
|
||||||
|
log "Vérification des fichiers de configuration critiques..."
|
||||||
|
|
||||||
|
# 1. Configuration du relai
|
||||||
|
verify_config_file "relay/sdk_relay.conf" "bootstrap_url=" "Configuration bootstrap" || ((errors++))
|
||||||
|
verify_config_file "relay/sdk_relay.conf" "sp_address=" "Adresse SP" || ((errors++))
|
||||||
|
|
||||||
|
# 2. Variables d'environnement
|
||||||
|
verify_config_file ".env" "RELAY_URLS=" "URLs des relais" || ((errors++))
|
||||||
|
verify_config_file ".env" "SIGNER_WS_URL=" "URL WebSocket du signer" || ((errors++))
|
||||||
|
|
||||||
|
# 3. Configuration Docker Compose
|
||||||
|
verify_config_file "docker-compose.yml" "services:" "Services Docker" || ((errors++))
|
||||||
|
verify_config_file "docker-compose.yml" "healthcheck:" "Healthchecks" || ((errors++))
|
||||||
|
|
||||||
|
# 4. Configuration du miner
|
||||||
|
verify_config_file "miner/.env" "RPC_HOST=" "Configuration RPC" || ((errors++))
|
||||||
|
|
||||||
|
# Vérification de la syntaxe
|
||||||
|
log "Vérification de la syntaxe des fichiers..."
|
||||||
|
|
||||||
|
verify_syntax "docker-compose.yml" || ((errors++))
|
||||||
|
verify_syntax "miner/.env" || ((errors++))
|
||||||
|
|
||||||
|
# Vérification des permissions
|
||||||
|
log "Vérification des permissions..."
|
||||||
|
|
||||||
|
local config_files=("relay/sdk_relay.conf" ".env" "docker-compose.yml" "miner/.env")
|
||||||
|
for file in "${config_files[@]}"; do
|
||||||
|
if [ -f "$file" ]; then
|
||||||
|
if [ -r "$file" ]; then
|
||||||
|
log_success "Permissions de lecture OK pour $file"
|
||||||
|
else
|
||||||
|
log_error "Permissions de lecture insuffisantes pour $file"
|
||||||
|
((errors++))
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Résumé
|
||||||
|
echo ""
|
||||||
|
if [ $errors -eq 0 ]; then
|
||||||
|
log_success "=== Toutes les vérifications ont réussi ==="
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
log_error "=== $errors erreur(s) détectée(s) ==="
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Exécution du script
|
||||||
|
main "$@"
|
Loading…
x
Reference in New Issue
Block a user