From 4ec2546645c8dea8cf532730973e5554852b086d Mon Sep 17 00:00:00 2001 From: Nicolas Cantu Date: Sun, 21 Sep 2025 12:55:37 +0000 Subject: [PATCH] align docker images --- .cursorrules | 69 +++++ IA_agents/deploy.md | 113 ++++++++ IA_agents/flux.md | 123 ++++++++ conf/README.md | 96 +++++++ conf/bitcoin/bitcoin.conf | 45 +++ conf/ihm_client/nginx.dev.conf | 48 ++++ conf/relay/sdk_relay.conf | 11 + docker-compose.yml | 12 +- relay/sdk_relay.conf | 1 - scripts/build-project.sh | 104 +++++++ scripts/pre-build.sh | 100 +++++++ scripts/startup-sequence.sh | 506 +++++++++++++++++++++++++++++++-- scripts/sync-configs.sh | 196 +++++++++++++ 13 files changed, 1401 insertions(+), 23 deletions(-) create mode 100644 IA_agents/deploy.md create mode 100644 IA_agents/flux.md create mode 100644 conf/README.md create mode 100644 conf/bitcoin/bitcoin.conf create mode 100644 conf/ihm_client/nginx.dev.conf create mode 100644 conf/relay/sdk_relay.conf create mode 100755 scripts/build-project.sh create mode 100755 scripts/pre-build.sh create mode 100755 scripts/sync-configs.sh 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