diff --git a/.cursorrules b/.cursorrules
index 12756f2..4509fc1 100644
--- a/.cursorrules
+++ b/.cursorrules
@@ -163,3 +163,72 @@ Chaque projet doit être prêt pour un dépôt sur `git.4nkweb.com` :
- Ne jamais partager le contenu du terminal ou des fichiers sensibles via Cursor en dehors du périmètre du projet.
- Vérifier et tenir à jour les .cursorrules.
- Vérifier et tenir à jour les .cursorignore.
+
+# Déploiement
+
+Dans lecoffre_node en utilisant les scripts de scripts/ :
+Il y a des branches git "ext", des images docker avec le tag "ext", pas de tag git "ext"
+
+pour tous les projets avec des Dockerfile:
+vérifie que le repos distant est public (si possible, non bloquant, pour info)
+vérifie que tu peux utiliser tes clés ssh pour le déploiement sur git
+vérifie que tu es sur la branche ext
+met à jour les dépendances
+vérifie les variables d'environnement
+met à jour le Dockerfle pour une bonne maîtrise des pré-requis (intégre l'installation et la mise à jour avec un sudo apt udpate && sudo apt upgrade et jq curl sed awk telnet ping npm (dernière version) et wscat)
+build le projet
+met à jour la documentation
+met à jour les tests
+met à jour les scripts
+vérifie .gitignore
+vérifie .dockerignore
+vérifie .cursorignore
+synchronise les confs sur lecoffre_node/conf
+synchronise les logs sur lecoffre_node/logs
+pousse toutes les modifications sur la branche git "ext"
+supprimer les fichiers distants non suivis sur le git
+pousse sur la tag docker "ext" via la CI
+analyse les logs
+corrige les erreurs petites et grosses sans déscactivation, sans simplification, sans contournement
+teste
+analyse les logs
+corrige les erreurs petites et grosses sans déscactivation, sans simplification, sans contournement
+ne fait pas d'autres versions des scripts mais améliore ceux existant et teste les
+met à jour avec ce retour d'expérience
+recommence si besoin pour valider un déploiement parfait et fluide
+si tu as appres quelque chose techniquement ou fonctionnement écris le dans les docs
+synchronise les confs sur lecoffre_node/conf
+synchronise les logs sur lecoffre_node/logs
+pousse toutes les modifications sur la branche git "ext"
+
+
+pour tous les projets avec des sans Dockerfile avec sur git:
+vérifie que le repos distant est public (si possible, non bloquant, pour info)
+vérifie que tu peux utiliser tes clés ssh pour le déploiement sur git
+vérifie que tu es sur la branche ext
+met à jour les dépendances
+vérifie les variables d'environnement
+met à jour le Dockerfle pour une bonne maîtrise des pré-requis (intégre l'installation et la mise à jour avec un sudo apt udpate && sudo apt upgrade et jq curl sed awk telnet ping npm (dernière version) et wscat)
+build le projet
+met à jour la documentation
+met à jour les tests
+met à jour les scripts
+vérifie .gitignore
+vérifie .dockerignore
+vérifie .cursorignore
+synchronise les confs sur lecoffre_node/conf
+synchronise les logs sur lecoffre_node/logs
+pousse toutes les modifications sur la branche git "ext"
+supprimer les fichiers distants non suivis sur le git
+analyse les logs
+corrige les erreurs petites et grosses sans déscactivation, sans simplification, sans contournement
+teste
+analyse les logs
+corrige les erreurs petites et grosses sans déscactivation, sans simplification, sans contournement
+ne fait pas d'autres versions des scripts mais améliore ceux existant et teste les
+met à jour avec ce retour d'expérience
+recommence si besoin pour valider un déploiement parfait et fluide
+si tu as appres quelque chose techniquement ou fonctionnement écris le dans les docs
+synchronise les confs sur lecoffre_node/conf
+synchronise les logs sur lecoffre_node/logs
+pousse toutes les modifications sur la branche git "ext"
diff --git a/IA_agents/deploy.md b/IA_agents/deploy.md
new file mode 100644
index 0000000..02abf11
--- /dev/null
+++ b/IA_agents/deploy.md
@@ -0,0 +1,113 @@
+# agent_deploy.md
+
+## Contexte
+
+Le site est sur @https://dev4.4nkweb.com/lecoffre (`lecoffre_front`).
+Il sera redirigé au login des notaires vers un site qui redirige vers local.4nkdev.com qui sera redirigé vers @https://dev4.4nkweb.com/lecoffre avec l'ouverture de l'iframe @https://dev4.4nkweb.com/ (`ihm_client`).
+
+Analyse le contenu de `lecoffre_node/IA_agents/flux.md` pour comprendre les flux.
+Met à jour ce flux si tu détecte des incohérences ou pose des questions pour confirmer.
+
+Le déploiement se fait depuis le répertoire **`lecoffre_node/`**, en utilisant les scripts présents dans **`scripts/`**.
+Ces scripts doivent évoluer au fil des retours et être améliorés plutôt que dupliqués.
+
+Dans **tous les projets** :
+
+- Une branche Git dédiée `ext` existe.
+- Aucun tag Git nommé `ext` n’existe.
+- Des images Docker avec le tag `ext` existent.
+- Les images Docker ne sont build que via CI qui est la seule à pousser sur le registry ou pour test localement
+
+Projets locaux avec Dockerfile à déployer par **`lecoffre_node/`** (d'autres projets externes sont ne dépendance dans le `lecoffre_node/docker-compose.yml`):
+
+- **`sdk_relay/`** (relai des transations et messages et oracle)
+- **`sdk_signer/`** (signature des processus métier et des identités/profils)
+- **`sdk_storage/`** (stockage temporaire)
+- **`ihm_client/`** (iframe dans les frontend des projets pour interactions avec les clés privés Bitcoin Silent Payment)
+- **`lecoffre-back-mini/`** (backend pour les API tierces du projet lecoffre)
+- **`lecoffre-front/`** (frontend du projet lecoffre)
+
+Projets locaux sans Dockerfile à vérifier **`lecoffre_node/`**:
+
+- **`sdk_common/`**
+- **`sdk_client/`**
+- **`sdk-signer-client/`**
+
+---
+
+## Procédure générale
+
+### Vérifications initiales
+
+1. Vérifier que le dépôt distant est **public** (si possible).
+2. Vérifier l’utilisation des **clés SSH** pour le déploiement Git.
+3. Vérifier que la branche courante est bien **`ext`**.
+4. Mettre à jour les dépendances.
+5. Vérifier les **variables d’environnement**.
+
+### Mise à jour et construction
+
+6. Construire le projet.
+7. Mettre à jour la **documentation**.
+8. Mettre à jour les **tests**.
+9. Mettre à jour les **scripts**.
+10. Vérifier que la présence et le contenu exhaustif et spécifique de :
+ - `.gitignore`
+ - `.dockerignore`
+ - `.cursorignore`
+
+### Synchronisations
+
+11. Synchroniser les configurations dans `lecoffre_node/conf`.
+12. Synchroniser les logs dans `lecoffre_node/logs`.
+
+### Sécurité et conformité
+
+13. Vérifier que le code ne fournit pas :
+ - de **données personnelles**,
+ - de **données sensibles exploitables**,
+ - de **failles de sécurité**.
+
+### Gestion Git
+
+14. Pousser toutes les modifications sur la branche Git `ext`.
+15. Supprimer les fichiers distants non suivis par Git.
+
+### Analyse et correction
+
+16. Analyser les logs.
+17. Corriger toutes les erreurs, petites et grosses, **sans désactivation**, **sans simplification**, **sans contournement**.
+18. Tester.
+19. Analyser de nouveau les logs.
+20. Vérifier que les logs ne contiennent pas de données personnelles ou sensibles.
+21. Corriger à nouveau si nécessaire (jusqu'à l'absence totale d'erreurs)
+
+### Boucle d’amélioration
+
+22. Ne pas créer de nouvelles versions de scripts : **améliorer et tester ceux existants**.
+23. Mettre à jour la documentation avec le **retour d’expérience** à chaque fois par une mise à jour de `docs/REX.md`.
+24. Recommencer si nécessaire pour obtenir un déploiement fluide et parfait.
+25. Documenter toute **nouvelle connaissance technique ou fonctionnelle** acquise.
+26. Répéter la synchronisation des confs et logs.
+27. Pousser toutes les modifications sur la branche `ext`.
+28. Supprimer à nouveau les fichiers distants non suivis.
+29. Répéter analyse des logs, corrections, tests jusqu'à un déploiement parfait.
+
+---
+
+## Spécificités Dockerfile
+
+Pour tous les projets contenant un **Dockerfile**, avant de pousser sur la branche `ext` :
+
+- Mettre à jour le Dockerfile pour maîtriser les prérequis :
+ - inclure `sudo apt update && sudo apt upgrade`,
+ - installer `jq`, `curl`, `sed`, `awk`, `telnet`, `ping`, `npm` (dernière version), `wscat`.
+- Construire l’image pour test.
+- Vérifier `.dockerignore`.
+- Vérifier à l'absence de dépendances croisées ou dupliquée entre les projets, sinon mutualiser via d'autres projets/docker
+
+Après le push sur la branche Git `ext` :
+
+- Pousser l’image sur le **tag Docker `ext`** via la CI.
+
+---
\ No newline at end of file
diff --git a/IA_agents/flux.md b/IA_agents/flux.md
new file mode 100644
index 0000000..7e7d0e8
--- /dev/null
+++ b/IA_agents/flux.md
@@ -0,0 +1,123 @@
+# Architecture des Flux et Services - LeCoffre Node
+
+## Tableau des Services - IP/Domaines et Ports
+
+### 🏠 **Services Locaux (Docker Compose)**
+
+| Service | Container | Port Local | Port Interne | Protocole | URL d'accès |
+|---------|-----------|------------|--------------|-----------|-------------|
+| **tor** | tor-proxy | - | 9050 | TCP | Réseau interne uniquement |
+| **bitcoin** | bitcoin-signet | - | 38332 (RPC)
38333 (P2P)
29000 (ZMQ hash)
29001 (ZMQ rawtx) | TCP | Réseau interne uniquement |
+| **blindbit** | blindbit-oracle | 0.0.0.0:8000 | 8000 | HTTP | http://0.0.0.0:8000 |
+| **sdk_relay** | sdk_relay | 0.0.0.0:8090
0.0.0.0:8091 | 8090 (WS)
8091 (HTTP) | WebSocket/HTTP | ws://0.0.0.0:8090
http://0.0.0.0:8091 |
+| **lecoffre-back** | lecoffre-back | 0.0.0.0:8080 | 8080 | HTTP | http://0.0.0.0:8080 |
+| **lecoffre-front** | lecoffre-front | 127.0.0.2:3004 | 3000 | HTTP | http://127.0.0.2:3004 |
+| **ihm_client** | ihm_client | 0.0.0.0:3003 | 3003 | HTTP | http://0.0.0.0:3003 |
+| **sdk_signer** | sdk_signer | 0.0.0.0:3001 | 3001 | HTTP/WebSocket | http://0.0.0.0:3001 |
+| **sdk_storage** | sdk_storage | 0.0.0.0:8081 | 8080 | HTTP | http://0.0.0.0:8081 |
+
+### 🌐 **Services Externes**
+
+| Service | Domaine | Port | Protocole | URL d'accès | Statut |
+|---------|---------|------|-----------|-------------|--------|
+| **Bootstrap Relay** | dev3.4nkweb.com | 443 | WSS | wss://dev3.4nkweb.com/ws/ | ✅ Actif |
+| **Signer Externe** | dev3.4nkweb.com | 9090 | WS | ws://dev3.4nkweb.com:9090 | ❌ Inactif |
+| **Signer Base** | dev3.4nkweb.com | 443 | HTTPS | https://dev3.4nkweb.com | ⚠️ 502 Bad Gateway |
+| **Mempool** | mempool2.4nkweb.com | 443 | HTTPS | https://mempool2.4nkweb.com | ✅ Actif |
+| **Storage** | dev4.4nkweb.com | 443 | HTTPS | https://dev4.4nkweb.com/storage | ✅ Actif |
+
+### 🔄 **Proxy Nginx (dev4.4nkweb.com)**
+
+| Route | Destination | Port | Protocole | Description |
+|-------|-------------|------|-----------|-------------|
+| **/** | ihm_client | 3003 | HTTP | Interface principale |
+| **/lecoffre** | lecoffre-front | 3004 | HTTP | Application LeCoffre |
+| **/api/** | lecoffre-back | 8080 | HTTP | API Backend |
+| **/back/** | lecoffre-back | 8080 | HTTP | API Backend (alias) |
+| **/ws/** | sdk_relay | 8090 | WebSocket | Relay WebSocket |
+| **/signer/** | sdk_signer | 3001 | HTTP/WebSocket | Service Signer |
+| **/src/service-workers/** | ihm_client | 3003 | HTTP | Service Workers |
+
+### 🏠 **Proxy Nginx Local (local.4nkweb.com)**
+
+| Route | Destination | Port | Protocole | Description |
+|-------|-------------|------|-----------|-------------|
+| **/** | Redirection | 3000 | HTTP | Redirige vers port 3000 |
+| **/lecoffre/** | lecoffre-front | 3004 | HTTP | Application LeCoffre local |
+
+### 🔧 **Configuration Bitcoin Signet**
+
+| Service | Port | Protocole | Description |
+|---------|------|-----------|-------------|
+| **RPC** | 38332 | TCP | Interface RPC Bitcoin |
+| **P2P** | 38333 | TCP | Réseau peer-to-peer |
+| **ZMQ Hash** | 29000 | TCP | Notifications de blocs |
+| **ZMQ RawTx** | 29001 | TCP | Notifications de transactions |
+| **Tor** | 9050 | TCP | Proxy Tor |
+
+### 🌐 **Réseau Docker**
+
+| Réseau | Subnet | Driver | Services |
+|--------|--------|--------|----------|
+| **btcnet** | 172.20.0.0/16 | bridge | Tous les services |
+
+### 🔗 **Variables d'Environnement Clés**
+
+| Variable | Valeur | Service |
+|----------|--------|---------|
+| **VITE_BOOTSTRAPURL** | wss://dev4.4nkweb.com/ws/ | ihm_client |
+| **SIGNER_WS_URL** | ws://dev3.4nkweb.com:9090 | sdk_signer |
+| **SIGNER_BASE_URL** | https://dev3.4nkweb.com | sdk_signer |
+| **RELAY_URLS** | wss://dev4.4nkweb.com/ws/,wss://dev3.4nkweb.com/ws/ | sdk_signer |
+| **bootstrap_url** | wss://dev3.4nkweb.com/ws/ | sdk_relay |
+| **storage** | https://dev4.4nkweb.com/storage | sdk_relay |
+
+## Flux d'Architecture
+
+### 🔄 **Flux Principal**
+
+```
+Internet → dev4.4nkweb.com (Nginx) → Services Locaux
+```
+
+1. **Frontend** : `https://dev4.4nkweb.com/lecoffre` → lecoffre-front (127.0.0.2:3004)
+2. **API** : `https://dev4.4nkweb.com/api/` → lecoffre-back (0.0.0.0:8080)
+3. **IHM** : `https://dev4.4nkweb.com/` → ihm_client (0.0.0.0:3003)
+4. **WebSocket** : `https://dev4.4nkweb.com/ws/` → sdk_relay (0.0.0.0:8090)
+
+### 🔗 **Flux de Redirection**
+
+```
+local.4nkdev.com → local.4nkweb.com → https://dev4.4nkweb.com/lecoffre
+```
+
+### 🌐 **Flux Externes**
+
+- **Bootstrap** : `wss://dev3.4nkweb.com/ws/` (Relay externe)
+- **Signer** : `ws://dev3.4nkweb.com:9090` (Actuellement inactif)
+- **Mempool** : `https://mempool2.4nkweb.com` (Réseau Bitcoin Signet)
+
+## ⚠️ **Points d'Attention**
+
+1. **dev3.4nkweb.com:9090** - Service signer externe actuellement inactif
+2. **dev3.4nkweb.com** - Retourne 502 Bad Gateway (services backend indisponibles)
+3. **Ports 0.0.0.0** - Services locaux uniquement accessibles depuis la machine
+4. **Ports 127.0.0.2** - lecoffre-front sur interface séparée
+
+## 📋 **Ordre de Démarrage des Services**
+
+Selon les règles du projet, l'ordre de démarrage est :
+
+1. **tor** - Proxy anonyme
+2. **bitcoin** - Nœud Bitcoin Signet
+3. **blindbit** - Oracle Bitcoin
+4. **sdk_storage** - Stockage temporaire
+5. **sdk_relay** - Relais des transactions
+6. **sdk_signer** - Signature des processus
+7. **ihm_client** - Interface utilisateur
+
+## 🔧 **Configuration Critique**
+
+- **Mempool du réseau signet** : `https://mempool2.4nkweb.com/fr/docs/api/rest`
+- **Test de connectivité Bitcoin** : `docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile=/home/bitcoin/.bitcoin/signet/.cookie getblockchaininfo`
+- **Test WebSocket Bootstrap** : `wss://dev3.4nkweb.com/ws/`
diff --git a/conf/README.md b/conf/README.md
new file mode 100644
index 0000000..554d2ad
--- /dev/null
+++ b/conf/README.md
@@ -0,0 +1,96 @@
+# Configuration Centralisée - LeCoffre Node
+
+Ce dossier contient toutes les configurations centralisées pour les services du projet LeCoffre Node.
+
+## Structure
+
+```
+conf/
+├── bitcoin/ # Configuration Bitcoin Signet
+│ └── bitcoin.conf
+├── relay/ # Configuration SDK Relay
+│ └── sdk_relay.conf
+├── nginx/ # Configurations Nginx (déjà existantes)
+│ └── ...
+├── ihm_client/ # Configuration IHM Client
+│ └── nginx.dev.conf
+├── lecoffre-front/ # Configuration LeCoffre Frontend
+├── lecoffre-back/ # Configuration LeCoffre Backend
+└── miner/ # Configuration du mineur
+```
+
+## Scripts de Gestion
+
+Les configurations et le déploiement sont gérés via des scripts centralisés :
+
+- `scripts/sync-configs.sh` : Synchronise toutes les configurations
+- `scripts/startup-sequence.sh` : Script principal avec déploiement complet
+- `scripts/pre-build.sh` : Prépare l'environnement avant build Docker
+
+## Avantages
+
+1. **Centralisation** : Toutes les configurations au même endroit
+2. **Cohérence** : Gestion uniforme des paramètres
+3. **Maintenance** : Modifications centralisées
+4. **Versioning** : Suivi des changements de configuration
+5. **Backup** : Sauvegarde centralisée
+
+## Utilisation
+
+### Synchronisation manuelle
+```bash
+# Synchroniser tous les projets
+./scripts/sync-configs.sh
+
+# Synchroniser un projet spécifique
+./scripts/sync-configs.sh ihm_client
+```
+
+### Déploiement complet
+```bash
+# Déployer tous les projets
+./scripts/startup-sequence.sh deploy
+
+# Déployer un projet spécifique
+./scripts/startup-sequence.sh deploy-project ihm_client
+
+# Déployer avec push des images Docker
+PUSH_DOCKER_IMAGES=true ./scripts/startup-sequence.sh deploy
+```
+
+### Préparation avant build
+```bash
+# Préparer l'environnement avant build Docker
+./scripts/pre-build.sh
+```
+
+### Commandes de maintenance
+```bash
+# Mettre à jour toutes les dépendances
+./scripts/startup-sequence.sh update-deps
+
+# Vérifier les fichiers ignore
+./scripts/startup-sequence.sh check-ignore
+
+# Nettoyer les fichiers non suivis
+./scripts/startup-sequence.sh clean-untracked
+
+# Compiler tous les projets
+./scripts/startup-sequence.sh compile-all
+
+# Exécuter tous les tests
+./scripts/startup-sequence.sh test-all
+```
+
+### Modification d'une configuration
+1. Éditer le fichier dans `conf/[service]/`
+2. Synchroniser avec `./scripts/sync-configs.sh [service]`
+3. Redémarrer le service concerné
+
+## Services Concernés
+
+- **Bitcoin Signet** : Configuration du nœud Bitcoin
+- **SDK Relay** : Configuration du relais WebSocket
+- **IHM Client** : Configuration Nginx pour l'interface client
+- **LeCoffre Front/Back** : Configurations des services web
+- **Mineur** : Configuration du minage Bitcoin
diff --git a/conf/bitcoin/bitcoin.conf b/conf/bitcoin/bitcoin.conf
new file mode 100644
index 0000000..8bca714
--- /dev/null
+++ b/conf/bitcoin/bitcoin.conf
@@ -0,0 +1,45 @@
+# Configuration globale
+signet=1
+server=1
+datadir=/home/bitcoin/.bitcoin
+
+[signet]
+daemon=0
+txindex=1
+upnp=1
+#debug=1
+#loglevel=debug
+logthreadnames=1
+onion=tor:9050
+listenonion=1
+onlynet=onion
+
+# Paramètres RPC
+rpcauth=bitcoin:c8ea921c7357bd6a5a8a7c43a12350a7$955e25b17672987b17c5a12f12cd8b9c1d38f0f86201c8cd47fc431f2e1c7956
+rpcallowip=0.0.0.0/0
+rpcworkqueue=32
+rpcthreads=4
+rpcdoccheck=1
+
+# Paramètres ZMQ
+zmqpubhashblock=tcp://0.0.0.0:29000
+zmqpubrawtx=tcp://0.0.0.0:29001
+
+listen=1
+bind=0.0.0.0:38333
+rpcbind=0.0.0.0:38332
+rpcport=38332
+fallbackfee=0.0001
+blockfilterindex=1
+datacarriersize=205
+acceptnonstdtxn=1
+dustrelayfee=0.00000001
+minrelaytxfee=0.00000001
+prune=0
+signetchallenge=0020341c43803863c252df326e73574a27d7e19322992061017b0dc893e2eab90821
+wallet=mining
+wallet=watchonly
+maxtxfee=1
+addnode=tlv2yqamflv22vfdzy2hha2nwmt6zrwrhjjzz4lx7qyq7lyc6wfhabyd.onion
+addnode=6xi33lwwslsx3yi3f7c56wnqtdx4v73vj2up3prrwebpwbz6qisnqbyd.onion
+addnode=id7e3r3d2epen2v65jebjhmx77aimu7oyhcg45zadafypr4crqsytfid.onion
\ No newline at end of file
diff --git a/conf/ihm_client/nginx.dev.conf b/conf/ihm_client/nginx.dev.conf
new file mode 100644
index 0000000..802fef5
--- /dev/null
+++ b/conf/ihm_client/nginx.dev.conf
@@ -0,0 +1,48 @@
+server {
+ listen 80;
+ server_name localhost;
+
+ # Redirection des requêtes HTTP vers Vite
+ location / {
+ proxy_pass http://localhost:3003;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "Upgrade";
+ proxy_set_header Host $host;
+ }
+
+ location /ws/ {
+ proxy_pass http://dev4.4nkweb.com:8090;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "Upgrade";
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header X-NginX-Proxy true;
+ proxy_read_timeout 86400;
+ }
+
+ location /storage/ {
+ rewrite ^/storage(/.*)$ $1 break;
+ proxy_pass http://localhost:8080;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "Upgrade";
+ proxy_set_header Host $host;
+ }
+
+ location /api/ {
+ proxy_pass http://localhost:8091;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+
+ # CORS headers
+ add_header Access-Control-Allow-Origin "*" always;
+ add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE" always;
+ add_header Access-Control-Allow-Headers "Authorization,Content-Type,Accept,X-Requested-With" always;
+ }
+}
\ No newline at end of file
diff --git a/conf/relay/sdk_relay.conf b/conf/relay/sdk_relay.conf
new file mode 100644
index 0000000..c410248
--- /dev/null
+++ b/conf/relay/sdk_relay.conf
@@ -0,0 +1,11 @@
+core_url="http://bitcoin:38332"
+ws_url="0.0.0.0:8090"
+wallet_name="default"
+network="signet"
+blindbit_url="http://blindbit-oracle:8000"
+zmq_url="tcp://bitcoin:29000"
+storage="https://dev4.4nkweb.com/storage"
+data_dir="/home/bitcoin/.4nk"
+bitcoin_data_dir="/home/bitcoin/.bitcoin"
+bootstrap_url="wss://dev3.4nkweb.com/ws/"
+bootstrap_faucet=true
diff --git a/docker-compose.yml b/docker-compose.yml
index 8736653..4970570 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -15,7 +15,7 @@ services:
- tor
volumes:
- bitcoin_data:/home/bitcoin/.bitcoin
- - ./bitcoin/bitcoin.conf:/etc/bitcoin/bitcoin.conf:ro
+ - ./conf/bitcoin/bitcoin.conf:/etc/bitcoin/bitcoin.conf:ro
networks:
btcnet:
aliases:
@@ -65,7 +65,7 @@ services:
blindbit:
condition: service_healthy
volumes:
- - ./relay/sdk_relay.conf:/home/bitcoin/.conf:ro
+ - ./conf/relay/sdk_relay.conf:/home/bitcoin/.conf:ro
- sdk_data:/home/bitcoin/.4nk
- bitcoin_data:/home/bitcoin/.bitcoin
- ./scripts/funds:/scripts/funds:ro
@@ -213,7 +213,13 @@ services:
image: git.4nkweb.com/4nk/sdk_storage:ext
container_name: sdk_storage
ports:
- - "127.0.0.1:8081:8081"
+ - "127.0.0.1:8081:8080"
+ healthcheck:
+ test: ["CMD", "sh", "-c", "curl -f http://localhost:8080/health || exit 1"]
+ interval: 30s
+ timeout: 10s
+ retries: 3
+ start_period: 30s
networks:
btcnet:
aliases:
diff --git a/relay/sdk_relay.conf b/relay/sdk_relay.conf
index bfba3d6..c410248 100644
--- a/relay/sdk_relay.conf
+++ b/relay/sdk_relay.conf
@@ -9,4 +9,3 @@ data_dir="/home/bitcoin/.4nk"
bitcoin_data_dir="/home/bitcoin/.bitcoin"
bootstrap_url="wss://dev3.4nkweb.com/ws/"
bootstrap_faucet=true
-sp_address="tsp1qqgmwp9n5p9ujhq2j6cfqe4jpkyu70jh9rgj0pwt3ndezk2mrlvw6jqew8fhsulewzglfr7g2aa48wyj4n0r7yasa3fm666vda8984ke8tuaf9m89"
diff --git a/scripts/build-project.sh b/scripts/build-project.sh
new file mode 100755
index 0000000..299e71f
--- /dev/null
+++ b/scripts/build-project.sh
@@ -0,0 +1,104 @@
+#!/bin/bash
+
+# Script pour construire un projet spécifique avec synchronisation des configs
+# Usage: ./scripts/build-project.sh [docker_tag]
+
+set -euo pipefail
+
+# 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
+
+# Fonction de logging
+log() {
+ echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
+}
+
+log_success() {
+ echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] ✓${NC} $1"
+}
+
+log_warning() {
+ echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] ⚠${NC} $1"
+}
+
+log_error() {
+ echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ✗${NC} $1"
+}
+
+# Vérifier les arguments
+if [[ $# -lt 1 ]]; then
+ log_error "Usage: $0 [docker_tag]"
+ echo ""
+ echo "Projets disponibles:"
+ echo " - ihm_client"
+ echo " - lecoffre-front"
+ echo " - lecoffre-back-mini"
+ echo " - sdk_relay"
+ echo " - sdk_storage"
+ echo " - sdk_signer"
+ echo ""
+ echo "Exemples:"
+ echo " $0 ihm_client"
+ echo " $0 ihm_client ext"
+ exit 1
+fi
+
+PROJECT_NAME="$1"
+DOCKER_TAG="${2:-ext}"
+PROJECT_ROOT="/home/debian/lecoffre_node"
+PROJECT_PATH="/home/debian/$PROJECT_NAME"
+
+# Changer vers le répertoire du projet
+cd "$PROJECT_ROOT"
+
+log "Construction du projet: $PROJECT_NAME (tag: $DOCKER_TAG)"
+
+# 1. Synchroniser les configurations pour ce projet
+log "Synchronisation des configurations pour $PROJECT_NAME..."
+if ./scripts/sync-configs.sh "$PROJECT_NAME"; then
+ log_success "Configurations synchronisées"
+else
+ log_warning "Aucune configuration à synchroniser pour $PROJECT_NAME"
+fi
+
+# 2. Changer vers le répertoire du projet
+if [[ ! -d "$PROJECT_PATH" ]]; then
+ log_error "Projet non trouvé: $PROJECT_PATH"
+ exit 1
+fi
+
+cd "$PROJECT_PATH"
+
+# 3. Vérifier qu'un Dockerfile existe
+if [[ ! -f "Dockerfile" ]]; then
+ log_error "Dockerfile non trouvé dans $PROJECT_PATH"
+ exit 1
+fi
+
+# 4. Construire l'image Docker
+log "Construction de l'image Docker..."
+IMAGE_NAME="git.4nkweb.com/4nk/$PROJECT_NAME:$DOCKER_TAG"
+
+if docker build -t "$IMAGE_NAME" .; then
+ log_success "Image construite: $IMAGE_NAME"
+else
+ log_error "Échec de la construction de l'image"
+ exit 1
+fi
+
+# 5. Optionnel: pousser l'image
+if [[ "${PUSH_IMAGE:-false}" == "true" ]]; then
+ log "Poussée de l'image vers le registry..."
+ if docker push "$IMAGE_NAME"; then
+ log_success "Image poussée: $IMAGE_NAME"
+ else
+ log_error "Échec de la poussée de l'image"
+ exit 1
+ fi
+fi
+
+log_success "Construction terminée pour $PROJECT_NAME"
diff --git a/scripts/pre-build.sh b/scripts/pre-build.sh
new file mode 100755
index 0000000..ce711d3
--- /dev/null
+++ b/scripts/pre-build.sh
@@ -0,0 +1,100 @@
+#!/bin/bash
+
+# Script de préparation avant build Docker
+# Synchronise les configurations et prépare l'environnement
+
+set -euo pipefail
+
+# 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
+
+# Fonction de logging
+log() {
+ echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
+}
+
+log_success() {
+ echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] ✓${NC} $1"
+}
+
+log_warning() {
+ echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] ⚠${NC} $1"
+}
+
+log_error() {
+ echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ✗${NC} $1"
+}
+
+# Répertoire racine du projet
+PROJECT_ROOT="/home/debian/lecoffre_node"
+
+# Changer vers le répertoire du projet
+cd "$PROJECT_ROOT"
+
+log "Préparation avant build Docker..."
+
+# 1. Synchroniser toutes les configurations
+log "Synchronisation des configurations..."
+if ./scripts/sync-configs.sh; then
+ log_success "Configurations synchronisées"
+else
+ log_error "Échec de la synchronisation des configurations"
+ exit 1
+fi
+
+# 2. Mettre à jour les dépendances de tous les projets
+log "Mise à jour des dépendances..."
+if ./scripts/startup-sequence.sh update-deps; then
+ log_success "Dépendances mises à jour"
+else
+ log_warning "Échec de la mise à jour des dépendances"
+fi
+
+# 3. Vérifier les fichiers ignore
+log "Vérification des fichiers ignore..."
+if ./scripts/startup-sequence.sh check-ignore; then
+ log_success "Fichiers ignore vérifiés"
+else
+ log_warning "Problèmes détectés avec les fichiers ignore"
+fi
+
+# 4. Nettoyer les fichiers non suivis
+log "Nettoyage des fichiers non suivis..."
+if ./scripts/startup-sequence.sh clean-untracked; then
+ log_success "Fichiers non suivis nettoyés"
+else
+ log_warning "Échec du nettoyage des fichiers non suivis"
+fi
+
+# 5. Vérifier que les services nécessaires sont arrêtés
+log "Vérification des services Docker..."
+if docker compose ps --services --filter "status=running" | grep -q .; then
+ log_warning "Certains services sont en cours d'exécution"
+ log "Arrêt des services pour le build..."
+ docker compose down
+ log_success "Services arrêtés"
+else
+ log_success "Aucun service en cours d'exécution"
+fi
+
+# 6. Nettoyer les images Docker obsolètes (optionnel)
+if [[ "${CLEAN_DOCKER:-false}" == "true" ]]; then
+ log "Nettoyage des images Docker obsolètes..."
+ docker system prune -f
+ log_success "Nettoyage terminé"
+fi
+
+# 7. Vérifier l'espace disque
+log "Vérification de l'espace disque..."
+DISK_USAGE=$(df /home/debian | tail -1 | awk '{print $5}' | sed 's/%//')
+if [[ $DISK_USAGE -gt 90 ]]; then
+ log_warning "Espace disque faible: ${DISK_USAGE}% utilisé"
+else
+ log_success "Espace disque OK: ${DISK_USAGE}% utilisé"
+fi
+
+log_success "Préparation terminée - Prêt pour le build Docker"
diff --git a/scripts/startup-sequence.sh b/scripts/startup-sequence.sh
index 79266ea..04942ce 100755
--- a/scripts/startup-sequence.sh
+++ b/scripts/startup-sequence.sh
@@ -19,6 +19,12 @@ EXTERNAL_SIGNER_PORT="9090"
PUBLIC_FRONT_URL="https://dev4.4nkweb.com/lecoffre"
PUBLIC_IHM_URL="https://dev4.4nkweb.com"
+# Projets avec Docker (images à construire)
+DOCKER_PROJECTS=("sdk_relay" "sdk_storage" "sdk_signer" "ihm_client" "lecoffre-front" "lecoffre-back-mini")
+
+# Projets sans Docker (libraries/packages)
+LIBRARY_PROJECTS=("sdk_client" "sdk_common" "sdk-signer-client")
+
# Fonction de logging
log() {
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
@@ -39,9 +45,9 @@ log_error() {
# Fonction de validation des dépendances externes
validate_external_dependencies() {
log "Validation des dépendances externes..."
-
+
local all_ok=true
-
+
# Test du signer distant
log "Test de connectivité vers le signer distant ($EXTERNAL_SIGNER_HOST:$EXTERNAL_SIGNER_PORT)..."
if timeout 10 bash -c "/dev/null; then
@@ -50,7 +56,7 @@ validate_external_dependencies() {
log_error "Signer distant non accessible"
all_ok=false
fi
-
+
# Test des URLs publiques
log "Test de connectivité vers les URLs publiques..."
if curl -s --connect-timeout 10 --max-time 15 "$PUBLIC_FRONT_URL" >/dev/null 2>&1; then
@@ -58,13 +64,13 @@ validate_external_dependencies() {
else
log_warning "LeCoffre Front non accessible (peut être normal si pas encore démarré)"
fi
-
+
if curl -s --connect-timeout 10 --max-time 15 "$PUBLIC_IHM_URL" >/dev/null 2>&1; then
log_success "IHM Client accessible"
else
log_warning "IHM Client non accessible (peut être normal si pas encore démarré)"
fi
-
+
return $([ "$all_ok" = true ] && echo 0 || echo 1)
}
@@ -89,6 +95,324 @@ wait_for_service() {
return 1
}
+# Fonction pour synchroniser les configurations
+sync_configurations() {
+ log "Synchronisation des configurations centralisées..."
+
+ if [[ -f "./scripts/sync-configs.sh" ]]; then
+ if ./scripts/sync-configs.sh; then
+ log_success "Configurations synchronisées"
+ else
+ log_warning "Échec de la synchronisation des configurations"
+ fi
+ else
+ log_warning "Script de synchronisation non trouvé"
+ fi
+}
+
+# Fonction pour mettre à jour les dépendances d'un projet
+update_project_dependencies() {
+ local project="$1"
+ local project_path="/home/debian/$project"
+
+ log "Mise à jour des dépendances pour $project"
+
+ if [[ ! -d "$project_path" ]]; then
+ log_error "Projet non trouvé: $project_path"
+ return 1
+ fi
+
+ cd "$project_path"
+
+ # Rust projects
+ if [[ -f "Cargo.toml" ]]; then
+ log "Mise à jour des dépendances Rust..."
+ if cargo update; then
+ log_success "Dépendances Rust mises à jour"
+ else
+ log_warning "Échec de la mise à jour des dépendances Rust"
+ fi
+ fi
+
+ # Node.js projects
+ if [[ -f "package.json" ]]; then
+ log "Mise à jour des dépendances Node.js..."
+ if npm update; then
+ log_success "Dépendances Node.js mises à jour"
+ else
+ log_warning "Échec de la mise à jour des dépendances Node.js"
+ fi
+ fi
+}
+
+# Fonction pour vérifier les fichiers ignore d'un projet
+check_project_ignore_files() {
+ local project="$1"
+ local project_path="/home/debian/$project"
+
+ log "Vérification des fichiers ignore pour $project"
+
+ if [[ ! -d "$project_path" ]]; then
+ log_error "Projet non trouvé: $project_path"
+ return 1
+ fi
+
+ cd "$project_path"
+
+ # Vérifier .gitignore
+ if [[ ! -f ".gitignore" ]]; then
+ log_warning ".gitignore manquant pour $project"
+ else
+ log_success ".gitignore présent"
+ fi
+
+ # Vérifier .dockerignore (pour les projets avec Docker)
+ if [[ " ${DOCKER_PROJECTS[@]} " =~ " ${project} " ]]; then
+ if [[ ! -f ".dockerignore" ]]; then
+ log_warning ".dockerignore manquant pour $project"
+ else
+ log_success ".dockerignore présent"
+ fi
+ fi
+
+ # Vérifier .cursorignore
+ if [[ ! -f ".cursorignore" ]]; then
+ log_warning ".cursorignore manquant pour $project"
+ else
+ log_success ".cursorignore présent"
+ fi
+}
+
+# Fonction pour nettoyer les fichiers non suivis d'un projet
+clean_project_untracked() {
+ local project="$1"
+ local project_path="/home/debian/$project"
+
+ log "Nettoyage des fichiers non suivis pour $project"
+
+ if [[ ! -d "$project_path" ]]; then
+ log_error "Projet non trouvé: $project_path"
+ return 1
+ fi
+
+ cd "$project_path"
+
+ # Lister les fichiers non suivis
+ local untracked_files
+ untracked_files=$(git ls-files --others --exclude-standard 2>/dev/null || true)
+
+ if [[ -n "$untracked_files" ]]; then
+ log_info "Fichiers non suivis détectés:"
+ echo "$untracked_files" | while read -r file; do
+ echo " - $file"
+ done
+
+ # Supprimer les fichiers non suivis
+ if git clean -fd; then
+ log_success "Fichiers non suivis supprimés"
+ else
+ log_warning "Échec du nettoyage des fichiers non suivis"
+ fi
+ else
+ log_success "Aucun fichier non suivi"
+ fi
+}
+
+# Fonction pour compiler un projet
+compile_project() {
+ local project="$1"
+ local project_path="/home/debian/$project"
+
+ log "Compilation de $project"
+
+ if [[ ! -d "$project_path" ]]; then
+ log_error "Projet non trouvé: $project_path"
+ return 1
+ fi
+
+ cd "$project_path"
+
+ # Rust projects
+ if [[ -f "Cargo.toml" ]]; then
+ log "Compilation Rust..."
+ if cargo build --release; then
+ log_success "Compilation Rust réussie"
+ else
+ log_error "Échec de la compilation Rust"
+ return 1
+ fi
+
+ # WebAssembly pour sdk_client
+ if [[ "$project" == "sdk_client" ]]; then
+ log "Build WebAssembly..."
+ if wasm-pack build --target bundler --release; then
+ log_success "Build WebAssembly réussi"
+ else
+ log_error "Échec du build WebAssembly"
+ return 1
+ fi
+ fi
+ fi
+
+ # Node.js projects
+ if [[ -f "package.json" ]]; then
+ if grep -q '"build"' package.json; then
+ log "Build Node.js..."
+ if npm run build; then
+ log_success "Build Node.js réussi"
+ else
+ log_error "Échec du build Node.js"
+ return 1
+ fi
+ fi
+ fi
+
+ # TypeScript projects
+ if [[ -f "tsconfig.json" ]]; then
+ log "Vérification TypeScript..."
+ if npx tsc --noEmit; then
+ log_success "Vérification TypeScript réussie"
+ else
+ log_warning "Erreurs TypeScript détectées"
+ fi
+ fi
+}
+
+# Fonction pour exécuter les tests d'un projet
+test_project() {
+ local project="$1"
+ local project_path="/home/debian/$project"
+
+ log "Exécution des tests pour $project"
+
+ if [[ ! -d "$project_path" ]]; then
+ log_error "Projet non trouvé: $project_path"
+ return 1
+ fi
+
+ cd "$project_path"
+
+ # Rust projects
+ if [[ -f "Cargo.toml" ]]; then
+ log "Tests Rust..."
+ if cargo test; then
+ log_success "Tests Rust réussis"
+ else
+ log_warning "Certains tests Rust ont échoué"
+ fi
+ fi
+
+ # Node.js projects
+ if [[ -f "package.json" ]]; then
+ if grep -q '"test"' package.json; then
+ log "Tests Node.js..."
+ if npm test; then
+ log_success "Tests Node.js réussis"
+ else
+ log_warning "Certains tests Node.js ont échoué"
+ fi
+ fi
+ fi
+}
+
+# Fonction pour déployer un projet
+deploy_project() {
+ local project="$1"
+ local project_path="/home/debian/$project"
+
+ log "Déploiement de $project"
+
+ if [[ ! -d "$project_path" ]]; then
+ log_error "Projet non trouvé: $project_path"
+ return 1
+ fi
+
+ cd "$project_path"
+
+ # Synchroniser les configurations si c'est un projet Docker
+ if [[ " ${DOCKER_PROJECTS[@]} " =~ " ${project} " ]]; then
+ if [[ -f "/home/debian/lecoffre_node/scripts/sync-configs.sh" ]]; then
+ log "Synchronisation des configurations..."
+ if /home/debian/lecoffre_node/scripts/sync-configs.sh "$project"; then
+ log_success "Configurations synchronisées"
+ else
+ log_warning "Échec de la synchronisation des configurations"
+ fi
+ fi
+ fi
+
+ # Mettre à jour les dépendances
+ update_project_dependencies "$project"
+
+ # Vérifier les fichiers ignore
+ check_project_ignore_files "$project"
+
+ # Nettoyer les fichiers non suivis
+ clean_project_untracked "$project"
+
+ # Compiler le projet
+ if ! compile_project "$project"; then
+ log_error "Échec de la compilation de $project"
+ return 1
+ fi
+
+ # Exécuter les tests
+ test_project "$project"
+
+ # Push vers la branche ext
+ log "Push vers la branche ext..."
+ if git checkout ext; then
+ log_success "Basculement vers la branche ext"
+ else
+ log_error "Échec du basculement vers la branche ext"
+ return 1
+ fi
+
+ if git add .; then
+ log_success "Ajout des modifications"
+ else
+ log_error "Échec de l'ajout des modifications"
+ return 1
+ fi
+
+ if git commit -m "ci: docker_tag=ext - Mise à jour automatique des dépendances et compilation"; then
+ log_success "Commit des modifications"
+ else
+ log_warning "Aucune modification à committer"
+ fi
+
+ if git push origin ext; then
+ log_success "Push vers la branche ext réussi"
+ else
+ log_error "Échec du push vers la branche ext"
+ return 1
+ fi
+
+ # Construire et pousser l'image Docker si c'est un projet Docker
+ if [[ " ${DOCKER_PROJECTS[@]} " =~ " ${project} " ]]; then
+ log "Construction de l'image Docker..."
+ if docker build -t "git.4nkweb.com/4nk/$project:ext" .; then
+ log_success "Image Docker construite"
+
+ # Pousser l'image si demandé
+ if [[ "${PUSH_DOCKER_IMAGES:-false}" == "true" ]]; then
+ log "Push de l'image Docker..."
+ if docker push "git.4nkweb.com/4nk/$project:ext"; then
+ log_success "Image Docker poussée"
+ else
+ log_error "Échec du push de l'image Docker"
+ return 1
+ fi
+ fi
+ else
+ log_error "Échec de la construction de l'image Docker"
+ return 1
+ fi
+ fi
+
+ log_success "Déploiement de $project terminé"
+}
+
# Fonction pour vérifier l'état du scan
check_scan_status() {
local sdk_relay_url="http://127.0.0.1:8091"
@@ -112,7 +436,7 @@ check_scan_status() {
# Fonction principale de démarrage
start_services() {
log "🚀 Démarrage de lecoffre_node avec séquence optimisée"
-
+
# Validation des dépendances externes avant démarrage
if ! validate_external_dependencies; then
log_error "Dépendances externes non disponibles. Arrêt du démarrage."
@@ -120,6 +444,21 @@ start_services() {
exit 1
fi
+ # Préparation de l'environnement avant démarrage
+ log "🔧 Préparation de l'environnement..."
+
+ # Synchroniser les configurations centralisées
+ if [ -f "./scripts/sync-configs.sh" ]; then
+ log "📋 Synchronisation des configurations..."
+ ./scripts/sync-configs.sh
+ fi
+
+ # Préparation du build si nécessaire
+ if [ -f "./scripts/pre-build.sh" ]; then
+ log "🏗️ Préparation du build..."
+ ./scripts/pre-build.sh
+ fi
+
# Démarrage simplifié utilisant les healthchecks du docker-compose.yml
log "📦 Démarrage de tous les services avec healthchecks..."
docker compose up -d
@@ -180,40 +519,40 @@ start_services() {
# Fonction de redémarrage intelligent
restart_services() {
log "Redémarrage intelligent des services..."
-
+
# Arrêter les services qui dépendent d'externes
log "Arrêt des services dépendants..."
docker stop lecoffre-back lecoffre-front ihm_client 2>/dev/null || true
-
+
# Attendre que les dépendances externes soient disponibles
log "Attente de la disponibilité des dépendances externes..."
local max_attempts=30
local attempt=0
-
+
while [ $attempt -lt $max_attempts ]; do
if validate_external_dependencies; then
log_success "Dépendances externes disponibles"
break
fi
-
+
attempt=$((attempt + 1))
log "Tentative $attempt/$max_attempts - Attente 10s..."
sleep 10
done
-
+
if [ $attempt -eq $max_attempts ]; then
log_error "Dépendances externes non disponibles après $max_attempts tentatives"
return 1
fi
-
+
# Redémarrer les services
log "Redémarrage des services..."
docker start lecoffre-back lecoffre-front ihm_client
-
+
# Attendre que les services soient prêts
log "Attente de la disponibilité des services..."
sleep 15
-
+
log_success "Redémarrage terminé !"
}
@@ -236,12 +575,141 @@ case "${1:-start}" in
check_scan_status
done
;;
+ "deploy")
+ log "🚀 Déploiement de tous les projets..."
+
+ # Synchroniser les configurations centralisées
+ sync_configurations
+
+ success_count=0
+ total_count=0
+
+ # Déployer les projets sans Docker
+ log "📚 Déploiement des projets library..."
+ for project in "${LIBRARY_PROJECTS[@]}"; do
+ total_count=$((total_count + 1))
+ if deploy_project "$project"; then
+ success_count=$((success_count + 1))
+ fi
+ done
+
+ # Déployer les projets avec Docker
+ log "🐳 Déploiement des projets Docker..."
+ for project in "${DOCKER_PROJECTS[@]}"; do
+ total_count=$((total_count + 1))
+ if deploy_project "$project"; then
+ success_count=$((success_count + 1))
+ fi
+ done
+
+ # Déployer lecoffre_node
+ log "🏗️ Déploiement du projet principal..."
+ total_count=$((total_count + 1))
+ cd "/home/debian/lecoffre_node"
+ if git checkout ext && git add . && git commit -m "ci: docker_tag=ext - Mise à jour des configurations centralisées" && git push origin ext; then
+ success_count=$((success_count + 1))
+ log_success "Déploiement de lecoffre_node terminé"
+ else
+ log_error "Échec du déploiement de lecoffre_node"
+ fi
+
+ # Résumé
+ log "📊 Résumé du déploiement:"
+ log " Projets déployés avec succès: $success_count/$total_count"
+
+ if [[ $success_count -eq $total_count ]]; then
+ log_success "🎉 Tous les projets ont été déployés avec succès!"
+ else
+ log_error "❌ Certains projets ont échoué"
+ exit 1
+ fi
+ ;;
+ "deploy-project")
+ if [[ -z "${2:-}" ]]; then
+ log_error "Usage: $0 deploy-project "
+ echo "Projets disponibles:"
+ echo " Docker: ${DOCKER_PROJECTS[*]}"
+ echo " Library: ${LIBRARY_PROJECTS[*]}"
+ exit 1
+ fi
+
+ local project="$2"
+ log "🚀 Déploiement du projet: $project"
+
+ if deploy_project "$project"; then
+ log_success "Déploiement de $project terminé avec succès!"
+ else
+ log_error "Échec du déploiement de $project"
+ exit 1
+ fi
+ ;;
+ "update-deps")
+ log "📦 Mise à jour des dépendances de tous les projets..."
+
+ for project in "${DOCKER_PROJECTS[@]}" "${LIBRARY_PROJECTS[@]}"; do
+ update_project_dependencies "$project"
+ done
+
+ log_success "Mise à jour des dépendances terminée"
+ ;;
+ "check-ignore")
+ log "🔍 Vérification des fichiers ignore de tous les projets..."
+
+ for project in "${DOCKER_PROJECTS[@]}" "${LIBRARY_PROJECTS[@]}"; do
+ check_project_ignore_files "$project"
+ done
+
+ log_success "Vérification des fichiers ignore terminée"
+ ;;
+ "clean-untracked")
+ log "🧹 Nettoyage des fichiers non suivis de tous les projets..."
+
+ for project in "${DOCKER_PROJECTS[@]}" "${LIBRARY_PROJECTS[@]}"; do
+ clean_project_untracked "$project"
+ done
+
+ log_success "Nettoyage des fichiers non suivis terminé"
+ ;;
+ "compile-all")
+ log "🔨 Compilation de tous les projets..."
+
+ for project in "${DOCKER_PROJECTS[@]}" "${LIBRARY_PROJECTS[@]}"; do
+ compile_project "$project"
+ done
+
+ log_success "Compilation de tous les projets terminée"
+ ;;
+ "test-all")
+ log "🧪 Exécution des tests de tous les projets..."
+
+ for project in "${DOCKER_PROJECTS[@]}" "${LIBRARY_PROJECTS[@]}"; do
+ test_project "$project"
+ done
+
+ log_success "Tests de tous les projets terminés"
+ ;;
*)
- echo "Usage: $0 [start|restart|validate|monitor]"
- echo " start - Démarrage complet avec validation (défaut)"
- echo " restart - Redémarrage intelligent après réparation"
- echo " validate - Validation des dépendances externes uniquement"
- echo " monitor - Monitoring continu"
+ echo "Usage: $0 [COMMAND]"
+ echo ""
+ echo "COMMANDS:"
+ echo " start - Démarrage complet avec validation (défaut)"
+ echo " restart - Redémarrage intelligent après réparation"
+ echo " validate - Validation des dépendances externes uniquement"
+ echo " monitor - Monitoring continu"
+ echo ""
+ echo " deploy - Déploiement complet de tous les projets"
+ echo " deploy-project - Déploiement d'un projet spécifique"
+ echo " update-deps - Mise à jour des dépendances de tous les projets"
+ echo " check-ignore - Vérification des fichiers ignore"
+ echo " clean-untracked - Nettoyage des fichiers non suivis"
+ echo " compile-all - Compilation de tous les projets"
+ echo " test-all - Exécution des tests de tous les projets"
+ echo ""
+ echo "EXAMPLES:"
+ echo " $0 deploy # Déploie tous les projets"
+ echo " $0 deploy-project ihm_client # Déploie seulement ihm_client"
+ echo " $0 update-deps # Met à jour toutes les dépendances"
+ echo " PUSH_DOCKER_IMAGES=true $0 deploy # Déploie avec push des images Docker"
exit 1
;;
esac
diff --git a/scripts/sync-configs.sh b/scripts/sync-configs.sh
new file mode 100755
index 0000000..9e0a01d
--- /dev/null
+++ b/scripts/sync-configs.sh
@@ -0,0 +1,196 @@
+#!/bin/bash
+
+# Script de synchronisation des configurations centralisées
+# Usage: ./scripts/sync-configs.sh [project_name]
+# Si aucun projet n'est spécifié, synchronise tous les projets
+
+set -euo pipefail
+
+# 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
+
+# Fonction de logging
+log() {
+ echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
+}
+
+log_success() {
+ echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] ✓${NC} $1"
+}
+
+log_warning() {
+ echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] ⚠${NC} $1"
+}
+
+log_error() {
+ echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ✗${NC} $1"
+}
+
+# Répertoire racine du projet
+PROJECT_ROOT="/home/debian/lecoffre_node"
+CONF_DIR="$PROJECT_ROOT/conf"
+
+# Vérifier que nous sommes dans le bon répertoire
+if [[ ! -d "$CONF_DIR" ]]; then
+ log_error "Répertoire de configuration non trouvé: $CONF_DIR"
+ exit 1
+fi
+
+# Fonction pour synchroniser un projet
+sync_project() {
+ local project_name="$1"
+ local project_path="/home/debian/$project_name"
+
+ log "Synchronisation de $project_name..."
+
+ # Vérifier que le projet existe
+ if [[ ! -d "$project_path" ]]; then
+ log_warning "Projet $project_name non trouvé: $project_path"
+ return 1
+ fi
+
+ case "$project_name" in
+ "lecoffre_node")
+ # Bitcoin configuration
+ if [[ -f "$CONF_DIR/bitcoin/bitcoin.conf" ]]; then
+ cp "$CONF_DIR/bitcoin/bitcoin.conf" "$project_path/bitcoin/"
+ log_success "Bitcoin config copiée"
+ fi
+
+ # Relay configuration
+ if [[ -f "$CONF_DIR/relay/sdk_relay.conf" ]]; then
+ cp "$CONF_DIR/relay/sdk_relay.conf" "$project_path/relay/"
+ log_success "Relay config copiée"
+ fi
+ ;;
+
+ "ihm_client")
+ # Nginx configuration
+ if [[ -f "$CONF_DIR/ihm_client/nginx.dev.conf" ]]; then
+ cp "$CONF_DIR/ihm_client/nginx.dev.conf" "$project_path/"
+ log_success "Nginx config copiée vers ihm_client"
+ fi
+ ;;
+
+ "lecoffre-front")
+ # Frontend configuration (si nécessaire)
+ if [[ -d "$CONF_DIR/lecoffre-front" ]]; then
+ cp -r "$CONF_DIR/lecoffre-front/"* "$project_path/" 2>/dev/null || true
+ log_success "Frontend configs copiées"
+ fi
+ ;;
+
+ "lecoffre-back-mini")
+ # Backend configuration (si nécessaire)
+ if [[ -d "$CONF_DIR/lecoffre-back" ]]; then
+ cp -r "$CONF_DIR/lecoffre-back/"* "$project_path/" 2>/dev/null || true
+ log_success "Backend configs copiées"
+ fi
+ ;;
+
+ *)
+ log_warning "Projet $project_name non configuré pour la synchronisation"
+ return 1
+ ;;
+ esac
+
+ log_success "Synchronisation de $project_name terminée"
+}
+
+# Fonction pour synchroniser tous les projets
+sync_all() {
+ log "Synchronisation de tous les projets..."
+
+ local projects=("lecoffre_node" "ihm_client" "lecoffre-front" "lecoffre-back-mini")
+ local success_count=0
+ local total_count=${#projects[@]}
+
+ for project in "${projects[@]}"; do
+ if sync_project "$project"; then
+ ((success_count++))
+ fi
+ done
+
+ log "Synchronisation terminée: $success_count/$total_count projets synchronisés"
+
+ if [[ $success_count -eq $total_count ]]; then
+ log_success "Tous les projets ont été synchronisés avec succès"
+ return 0
+ else
+ log_warning "Certains projets n'ont pas pu être synchronisés"
+ return 1
+ fi
+}
+
+# Fonction pour afficher l'aide
+show_help() {
+ echo "Usage: $0 [OPTIONS] [PROJECT_NAME]"
+ echo ""
+ echo "Synchronise les configurations centralisées vers les projets"
+ echo ""
+ echo "OPTIONS:"
+ echo " -h, --help Affiche cette aide"
+ echo " -l, --list Liste les projets disponibles"
+ echo " -v, --verbose Mode verbeux"
+ echo ""
+ echo "PROJECT_NAME:"
+ echo " Nom du projet à synchroniser (optionnel)"
+ echo " Si non spécifié, synchronise tous les projets"
+ echo ""
+ echo "Exemples:"
+ echo " $0 # Synchronise tous les projets"
+ echo " $0 ihm_client # Synchronise seulement ihm_client"
+ echo " $0 lecoffre_node # Synchronise seulement lecoffre_node"
+}
+
+# Fonction pour lister les projets
+list_projects() {
+ echo "Projets disponibles pour la synchronisation:"
+ echo " - lecoffre_node (bitcoin.conf, sdk_relay.conf)"
+ echo " - ihm_client (nginx.dev.conf)"
+ echo " - lecoffre-front (configurations frontend)"
+ echo " - lecoffre-back-mini (configurations backend)"
+}
+
+# Parse des arguments
+VERBOSE=false
+while [[ $# -gt 0 ]]; do
+ case $1 in
+ -h|--help)
+ show_help
+ exit 0
+ ;;
+ -l|--list)
+ list_projects
+ exit 0
+ ;;
+ -v|--verbose)
+ VERBOSE=true
+ shift
+ ;;
+ -*)
+ log_error "Option inconnue: $1"
+ show_help
+ exit 1
+ ;;
+ *)
+ PROJECT_NAME="$1"
+ shift
+ ;;
+ esac
+done
+
+# Changer vers le répertoire du projet
+cd "$PROJECT_ROOT"
+
+# Exécuter la synchronisation
+if [[ -n "${PROJECT_NAME:-}" ]]; then
+ log "Synchronisation du projet: $PROJECT_NAME"
+ sync_project "$PROJECT_NAME"
+else
+ sync_all
+fi