diff --git a/.env.master b/.env.master index 91257b6..fff7e48 100644 --- a/.env.master +++ b/.env.master @@ -1,24 +1,25 @@ -# =========================================== -# VARIABLES D'ENVIRONNEMENT MASTER LECOFFRE -# =========================================== - # Variables d'environnement pour l'application back-end NODE_OPTIONS=--max-old-space-size=2048 NODE_ENV=production # Configuration IDNOT IDNOT_ANNUARY_BASE_URL=https://qual-api.notaires.fr/annuaire +# IDNOT_REDIRECT_URI=http://local.4nkweb.com:3004/authorized-client IDNOT_REDIRECT_URI=http://local.4nkweb.com:3000/authorized-client IDNOT_TOKEN_URL=https://qual-connexion.idnot.fr/user/IdPOAuth2/token/idnot_idp_v1 IDNOT_API_BASE_URL=https://qual-api.notaires.fr # Configuration serveur APP_HOST=dev4.4nkweb.com +# API_BASE_URL=https://demo.4nkweb.com/back API_BASE_URL=https://dev4.4nkweb.com/back +# DEFAULT_STORAGE=https://demo.4nkweb.com/storage DEFAULT_STORAGE=https://dev4.4nkweb.com/storage # Variables d'environnement pour l'application front-end +# NEXT_PUBLIC_4NK_URL=http://demo.4nkweb.com/ NEXT_PUBLIC_4NK_URL=https://dev4.4nkweb.com +# NEXT_PUBLIC_FRONT_APP_HOST=https://demo.4nkweb.com NEXT_PUBLIC_FRONT_APP_HOST=https://dev4.4nkweb.com/lecoffre NEXT_PUBLIC_IDNOT_BASE_URL=https://qual-connexion.idnot.fr NEXT_PUBLIC_IDNOT_AUTHORIZE_ENDPOINT=/IdPOAuth2/authorize/idnot_idp_v1 @@ -27,83 +28,125 @@ NEXT_PUBLIC_BACK_API_HOST=dev4.4nkweb.com NEXT_PUBLIC_BACK_API_PORT=443 NEXT_PUBLIC_BACK_API_ROOT_URL=/api NEXT_PUBLIC_BACK_API_VERSION=v1 +# NEXT_PUBLIC_ANK_BASE_REDIRECT_URI='http://local.4nkweb.com:3004/authorized-client' +NEXT_PUBLIC_ANK_BASE_REDIRECT_URI=https://dev4.4nkweb.com/lecoffre/authorized-client +NEXT_PUBLIC_TARGET_ORIGIN=https://dev4.4nkweb.com/lecoffre +NEXT_PUBLIC_4NK_IFRAME_URL=https://dev4.4nkweb.com +NEXT_PUBLIC_IDNOT_REDIRECT_URI=https://dev4.4nkweb.com/lecoffre/authorized-client -# =========================================== -# VARIABLES SDK_RELAY -# =========================================== -SDK_RELAY_CORE_URL=http://bitcoin:38332 -SDK_RELAY_WS_URL=0.0.0.0:8090 -SDK_RELAY_WALLET_NAME=default -SDK_RELAY_NETWORK=signet -SDK_RELAY_BLINDBIT_URL=http://blindbit-proxy:8000 -SDK_RELAY_ZMQ_URL=tcp://bitcoin:29000 -SDK_RELAY_STORAGE=https://dev4.4nkweb.com/storage -SDK_RELAY_DATA_DIR=/home/bitcoin/.4nk -SDK_RELAY_BITCOIN_DATA_DIR=/home/bitcoin/.bitcoin -SDK_RELAY_BOOTSTRAP_URL=ws://dev3.4nkweb.com:8090 -SDK_RELAY_BOOTSTRAP_FAUCET=true -SDK_RELAY_RUST_LOG=DEBUG,reqwest=DEBUG,tokio_tungstenite=DEBUG +NEXT_PUBLIC_DOCAPOSTE_API_URL= +NEXT_PUBLIC_API_URL=https://dev4.4nkweb.com/api +NEXT_PUBLIC_DEFAULT_VALIDATOR_ID=28c9a3a8151bef545ebf700ca5222c63d0031ad593097e95c1de202464304a99 +NEXT_PUBLIC_DEFAULT_STORAGE_URLS=https://dev4.4nkweb.com/storage + +# WS +# RELAY_URLS=wss://demo.4nkweb.com/ws +RELAY_URLS=wss://dev4.4nkweb.com/ws/,wss://dev3.4nkweb.com/ws/ + +# SIGNER_WS_URL=ws://dev4.4nkweb.com/signer/ +SIGNER_WS_URL=ws://dev3.4nkweb.com:9090 +SIGNER_BASE_URL=https://dev3.4nkweb.com + +# IHM URLS +# VITE_BOOTSTRAPURL=http://sdk_relay:8090/ +VITE_BOOTSTRAPURL=wss://dev3.4nkweb.com/ws/ + +# Cartes de test Stripe +SUCCES='4242 4242 4242 4242' +DECLINED='4000 0025 0000 3155' +ENABLE_SUBSCRIPTION_STUB=true +CORS_ALLOWED_ORIGINS=http://local.4nkweb.com:3000,https://dev4.4nkweb.com + +core_url=http://bitcoin:38332 +ws_url=0.0.0.0:8090 +wallet_name=default +network=signet +blindbit_url=http://blindbit: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 + +RUST_LOG=DEBUG, +NODE_OPTIONS=--max-old-space-size=2048 + + +# ================== /!\ sensible ========================= + +# Configuration IDNOT +IDNOT_API_KEY=ba557f84-0bf6-4dbf-844f-df2767555e3e +IDNOT_CLIENT_ID=B3CE56353EDB15A9 +IDNOT_CLIENT_SECRET=3F733549E879878344B6C949B366BB5CDBB2DB5B7F7AB7EBBEBB0F0DD0776D1C +NEXT_PUBLIC_IDNOT_CLIENT_ID=B3CE56353EDB15A9 + +# Configuration OVH +OVH_APP_KEY=5ab0709bbb65ef26 +OVH_APP_SECRET=de1fac1779d707d263a611a557cd5766 +OVH_CONSUMER_KEY=5fe817829b8a9c780cfa2354f8312ece +OVH_SMS_SERVICE_NAME=sms-tt802880-1 +OVH_APPLICATION_KEY=5ab0709bbb65ef26 +OVH_APPLICATION_SECRET=de1fac1779d707d263a611a557cd5766 +OVH_SERVICE_NAME=sms-tt802880-1 + +# Configuration SMS Factor +SMS_FACTOR_TOKEN=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI4NzgzNiIsImlhdCI6MTcwMTMzOTY1Mi45NDUzOH0.GNoqLb5MDBWuniNlQjbr1PKolwxGqBZe_tf4IMObvHw + +# Configuration Mailchimp +MAILCHIMP_API_KEY=md-VVfaml-ApIV4nsGgaJKl0A +MAILCHIMP_KEY=3fa54304bc766dfd0b8043a827b28a3a-us17 +MAILCHIMP_LIST_ID=a48d9ad852 + +# Configuration Stripe +STRIPE_SECRET_KEY=sk_test_51OwKmMP5xh1u9BqSeFpqw0Yr15hHtFsh0pvRGaE0VERhlYtvw33ND1qiGA6Dy1DPmmV61B6BqIimlhuv7bwElhjF00PLQwD60n +STRIPE_PUBLISHABLE_KEY=pk_test_51OwKmMP5xh1u9BqSeFpqw0Yr15hHtFsh0pvRGaE0VERhlYtvw33ND1qiGA6Dy1DPmmV61B6BqIimlhuv7bwElhjF00PLQwD60n +STRIPE_WEBHOOK_SECRET= +STRIPE_STANDARD_SUBSCRIPTION_PRICE_ID=price_1P66fuP5xh1u9BqSHj0O6Uy3 +STRIPE_STANDARD_ANNUAL_SUBSCRIPTION_PRICE_ID=price_1P9NsRP5xh1u9BqSFgkUDbQY +STRIPE_UNLIMITED_SUBSCRIPTION_PRICE_ID=price_1P66RqP5xh1u9BqSuUzkQNac +STRIPE_UNLIMITED_ANNUAL_SUBSCRIPTION_PRICE_ID=price_1P9NpKP5xh1u9BqSApFogvUB -# =========================================== -# VARIABLES SDK_SIGNER -# =========================================== SIGNER_API_KEY=your-api-key-change-this +VITE_JWT_SECRET_KEY=52b3d77617bb00982dfee15b08effd52cfe5b2e69b2f61cc4848cfe1e98c0bc9 + +# Configuration pour réduire les traces Docker +DOCKER_LOG_LEVEL=info +COMPOSE_LOG_LEVEL=WARNING + +# =========================================== +# VARIABLES SDK_SIGNER (manquantes) +# =========================================== SIGNER_PORT=9090 SIGNER_DATABASE_PATH=./data/server.db -SIGNER_RELAY_URLS=http://localhost:8090 +SIGNER_RELAY_URLS=wss://dev4.4nkweb.com/ws/,wss://dev3.4nkweb.com/ws/ SIGNER_AUTO_RESTART=true SIGNER_MAX_RESTARTS=3 SIGNER_LOG_LEVEL=info # =========================================== -# VARIABLES IHM_CLIENT +# VARIABLES SDK_RELAY (formatées pour docker-compose) +# =========================================== +SDK_RELAY_CORE_URL=http://bitcoin:38332 +SDK_RELAY_WS_URL=0.0.0.0:8090 +SDK_RELAY_WALLET_NAME=default +SDK_RELAY_NETWORK=signet +SDK_RELAY_BLINDBIT_URL=http://blindbit:8000 +SDK_RELAY_ZMQ_URL=tcp://bitcoin:29000 +SDK_RELAY_STORAGE=https://dev4.4nkweb.com/storage +SDK_RELAY_DATA_DIR=/app/.4nk +SDK_RELAY_BITCOIN_DATA_DIR=/app/.bitcoin +SDK_RELAY_BOOTSTRAP_URL=wss://dev3.4nkweb.com/ws/ +SDK_RELAY_BOOTSTRAP_FAUCET=true + +# =========================================== +# VARIABLES IHM_CLIENT (formatées pour docker-compose) # =========================================== -VITE_JWT_SECRET_KEY=52b3d77617bb00982dfee15b08effd52cfe5b2e69b2f61cc4848cfe1e98c0bc9 VITE_API_BASE_URL=https://dev4.4nkweb.com/back/api/v1 VITE_WS_URL=wss://dev4.4nkweb.com/ws/ VITE_STORAGE_URL=https://dev4.4nkweb.com/storage VITE_SIGNER_URL=https://dev4.4nkweb.com/signer -# =========================================== -# VARIABLES STRIPE (si nécessaire) -# =========================================== -STRIPE_SECRET_KEY=sk_test_your_stripe_secret_key -STRIPE_PUBLISHABLE_KEY=pk_test_your_stripe_publishable_key -STRIPE_WEBHOOK_SECRET=whsec_your_webhook_secret - -# =========================================== -# VARIABLES MAILCHIMP (si nécessaire) -# =========================================== -MAILCHIMP_API_KEY=your_mailchimp_api_key -MAILCHIMP_SERVER_PREFIX=us1 -MAILCHIMP_LIST_ID=your_list_id - -# =========================================== -# VARIABLES OVH SMS (si nécessaire) -# =========================================== -OVH_APPLICATION_KEY=your_ovh_app_key -OVH_APPLICATION_SECRET=your_ovh_app_secret -OVH_CONSUMER_KEY=your_ovh_consumer_key -OVH_SERVICE_NAME=your_ovh_service - -# =========================================== -# VARIABLES BASE DE DONNÉES (si nécessaire) -# =========================================== -DATABASE_URL=postgresql://user:password@localhost:5432/lecoffre -DATABASE_HOST=localhost -DATABASE_PORT=5432 -DATABASE_NAME=lecoffre -DATABASE_USER=lecoffre_user -DATABASE_PASSWORD=lecoffre_password - -# =========================================== -# VARIABLES REDIS (si nécessaire) -# =========================================== -REDIS_URL=redis://localhost:6379 -REDIS_HOST=localhost -REDIS_PORT=6379 -REDIS_PASSWORD= - # =========================================== # VARIABLES MONITORING # =========================================== @@ -111,3 +154,9 @@ GRAFANA_ADMIN_USER=admin GRAFANA_ADMIN_PASSWORD=admin123 LOKI_URL=http://loki:3100 PROMTAIL_CONFIG_FILE=/etc/promtail/config.yml + +# =========================================== +# VARIABLES MANQUANTES POUR DOCKER-COMPOSE +# =========================================== +# Mailchimp +MAILCHIMP_SERVER_PREFIX=us17 diff --git a/.gitignore b/.gitignore index df42861..d63db27 100644 --- a/.gitignore +++ b/.gitignore @@ -1,82 +1,14 @@ -# Secrets et fichiers sensibles .env -.env.* -!.env.example -!.env.exemple -env.master -*.key -*.pem -*.p12 -*.pfx -secrets/ -keys/ +!.env.master +miner/.env +miner/signet/priv_key.json -# Logs -logs/ -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Données et volumes -data/ -volumes/ -bitcoin_data/ -sdk_data/ -grafana_data/ -loki_data/ -blindbit_data/ - -# Backups -backup/ -*.backup -*.bak - -# Docker -.dockerignore -docker-compose.override.yml - -# Node.js -node_modules/ -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.npm -.yarn-integrity - -# Next.js -.next/ -out/ -build/ -dist/ - -# Rust -target/ -Cargo.lock - -# IDE -.vscode/ -.idea/ -*.swp -*.swo -*~ - -# OS -.DS_Store -Thumbs.db - -# Temporary files -tmp/ -temp/ -*.tmp -*.temp - -# SSL certificates -*.crt -*.csr -ssl/ - -# Configuration locale -local.conf -local.yml -local.json \ No newline at end of file +# Sensibles et générés +.cursor/ +log/*.log +miner/.env.signet +miner/tools/*.json +conf/nginx/*bak* +conf/nginx/*.tmp +conf/nginx/*.clean +.env.bak diff --git a/conf/relay/sdk_relay.conf b/conf/relay/sdk_relay.conf index c410248..5f37189 100644 --- a/conf/relay/sdk_relay.conf +++ b/conf/relay/sdk_relay.conf @@ -1,11 +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/" +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=/app/.4nk +bitcoin_data_dir=/app/.bitcoin +bootstrap_url=wss://dev3.4nkweb.com/ws/ bootstrap_faucet=true diff --git a/docker-compose.yml b/docker-compose.yml index 948c0b2..dbf7593 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,6 +6,11 @@ services: btcnet: aliases: - tor + healthcheck: + test: ["CMD", "sh", "-c", "if nc -z localhost 9050; then echo 'Tor ready: SOCKS proxy listening on port 9050'; exit 0; else echo 'Tor starting: SOCKS proxy not yet ready'; exit 1; fi"] + interval: 10s + timeout: 5s + retries: 5 restart: unless-stopped bitcoin: @@ -27,7 +32,7 @@ services: chown -R bitcoin:bitcoin /home/bitcoin/.bitcoin || echo 'warn: chown partiel (fichiers bind-mount Windows)'; exec su-exec bitcoin bitcoind -conf=/etc/bitcoin/bitcoin.conf -signet" healthcheck: - test: ["CMD", "bitcoin-cli", "-conf=/etc/bitcoin/bitcoin.conf", "getblockchaininfo"] + test: ["CMD", "sh", "-c", "info=$(bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo 2>/dev/null || echo '{}'); blocks=$(echo \"$info\" | jq -r '.blocks // 0'); headers=$(echo \"$info\" | jq -r '.headers // 0'); if [ \"$blocks\" -eq \"$headers\" ] && [ \"$blocks\" -gt 0 ]; then echo \"Bitcoin sync complete: $blocks blocks\"; exit 0; else echo \"Bitcoin IBD: $blocks/$headers blocks ($(($headers - $blocks)) remaining)\"; exit 1; fi"] interval: 30s timeout: 10s retries: 3 @@ -54,7 +59,7 @@ services: ports: - "0.0.0.0:8000:8000" healthcheck: - test: ["CMD-SHELL", "code=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8000/tweaks/1); [ \"$$code\" != \"000\" ]"] + test: ["CMD", "sh", "-c", "code=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8000/tweaks/1); if [ \"$code\" = \"200\" ]; then echo \"BlindBit ready: Oracle service responding\"; exit 0; elif [ \"$code\" = \"000\" ]; then echo \"BlindBit starting: Oracle service not yet ready\"; exit 1; else echo \"BlindBit scanning: Oracle responding with code $code\"; exit 1; fi"] interval: 15s timeout: 5s retries: 10 @@ -67,9 +72,9 @@ services: blindbit: condition: service_healthy volumes: - - ./conf/relay/sdk_relay.conf:/home/bitcoin/.conf:ro - - sdk_data:/home/bitcoin/.4nk - - bitcoin_data:/home/bitcoin/.bitcoin + - ./conf/relay/sdk_relay.conf:/app/.conf:ro + - sdk_data:/app/.4nk + - bitcoin_data:/app/.bitcoin - ./scripts/funds:/scripts/funds:ro - ./logs/sdk_relay:/var/log/sdk_relay ports: @@ -85,8 +90,7 @@ services: max-size: "10m" max-file: "3" environment: - - NODE_OPTIONS=${NODE_OPTIONS} - - HOME=/home/bitcoin + - HOME=/app - CORE_URL=${SDK_RELAY_CORE_URL} - WS_URL=${SDK_RELAY_WS_URL} - WALLET_NAME=${SDK_RELAY_WALLET_NAME} @@ -98,10 +102,9 @@ services: - BITCOIN_DATA_DIR=${SDK_RELAY_BITCOIN_DATA_DIR} - BOOTSTRAP_URL=${SDK_RELAY_BOOTSTRAP_URL} - BOOTSTRAP_FAUCET=${SDK_RELAY_BOOTSTRAP_FAUCET} - - RUST_LOG=${SDK_RELAY_RUST_LOG} - RUST_LOG=INFO healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8091/"] + test: ["CMD", "sh", "-c", "if curl -f http://localhost:8091/ >/dev/null 2>&1; then echo 'SDK Relay ready: WebSocket server responding'; exit 0; else echo 'SDK Relay IBD: Waiting for Bitcoin sync to complete'; exit 1; fi"] interval: 30s timeout: 10s retries: 3 @@ -145,7 +148,7 @@ services: user: appuser command: ["node", "dist/server.js"] healthcheck: - test: ["CMD", "sh", "-c", "curl -f http://localhost:8080/api/v1/health || exit 1"] + test: ["CMD", "sh", "-c", "if curl -f http://localhost:8080/api/v1/health >/dev/null 2>&1; then echo 'LeCoffre Backend ready: API responding'; exit 0; else echo 'LeCoffre Backend starting: API not yet ready'; exit 1; fi"] interval: 30s timeout: 10s retries: 5 @@ -184,7 +187,7 @@ services: user: lecoffreuser command: ["node", "server.js"] healthcheck: - test: ["CMD", "sh", "-c", "ps aux | grep -v grep | grep next-server || exit 1"] + test: ["CMD", "sh", "-c", "if ps aux | grep -v grep | grep next-server >/dev/null 2>&1; then echo 'LeCoffre Frontend ready: Next.js server running'; exit 0; else echo 'LeCoffre Frontend starting: Next.js server not yet ready'; exit 1; fi"] interval: 30s timeout: 10s retries: 3 @@ -217,7 +220,7 @@ services: user: root command: ["npm", "start"] healthcheck: - test: ["CMD", "sh", "-c", "curl -f http://localhost:3003/ || exit 1"] + test: ["CMD", "sh", "-c", "if curl -f http://localhost:3003/ >/dev/null 2>&1; then echo 'IHM Client ready: Vite dev server responding'; exit 0; else echo 'IHM Client starting: Vite dev server not yet ready'; exit 1; fi"] interval: 30s timeout: 10s retries: 3 @@ -239,6 +242,12 @@ services: - sdk_signer user: appuser command: ["node", "/app/dist/index.js"] + healthcheck: + test: ["CMD", "sh", "-c", "if curl -f http://localhost:9090/ >/dev/null 2>&1; then echo 'SDK Signer ready: WebSocket server responding'; exit 0; else echo 'SDK Signer starting: WebSocket server not yet ready'; exit 1; fi"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s labels: - "com.centurylinklabs.watchtower.enable=true" restart: unless-stopped @@ -261,7 +270,7 @@ services: volumes: - ./logs/sdk_storage:/var/log/sdk_storage healthcheck: - test: ["CMD", "sh", "-c", "curl -f http://localhost:8080/health || exit 1"] + test: ["CMD", "sh", "-c", "if curl -f http://localhost:8080/health >/dev/null 2>&1; then echo 'SDK Storage ready: API responding'; exit 0; else echo 'SDK Storage starting: API not yet ready'; exit 1; fi"] interval: 30s timeout: 10s retries: 3 @@ -323,6 +332,12 @@ services: btcnet: aliases: - grafana + healthcheck: + test: ["CMD", "sh", "-c", "if curl -f http://localhost:3000/api/health >/dev/null 2>&1; then echo 'Grafana ready: Dashboard service responding'; exit 0; else echo 'Grafana starting: Dashboard service not yet ready'; exit 1; fi"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s labels: - "com.centurylinklabs.watchtower.enable=true" restart: unless-stopped @@ -339,6 +354,12 @@ services: btcnet: aliases: - loki + healthcheck: + test: ["CMD", "sh", "-c", "if curl -f http://localhost:3100/ready >/dev/null 2>&1; then echo 'Loki ready: Log aggregation service responding'; exit 0; else echo 'Loki starting: Log aggregation service not yet ready'; exit 1; fi"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s restart: unless-stopped promtail: @@ -353,6 +374,12 @@ services: btcnet: aliases: - promtail + healthcheck: + test: ["CMD", "sh", "-c", "if curl -f http://localhost:9080/ready >/dev/null 2>&1; then echo 'Promtail ready: Log collection service responding'; exit 0; else echo 'Promtail starting: Log collection service not yet ready'; exit 1; fi"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s restart: unless-stopped # Service de statut des services @@ -369,6 +396,12 @@ services: btcnet: aliases: - status-api + healthcheck: + test: ["CMD", "sh", "-c", "if curl -f http://localhost:3006/api >/dev/null 2>&1; then echo 'Status API ready: Service monitoring API responding'; exit 0; else echo 'Status API starting: Service monitoring API not yet ready'; exit 1; fi"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s labels: - "com.centurylinklabs.watchtower.enable=true" restart: unless-stopped diff --git a/docs/ACCES_GRAFANA.md b/docs/ACCES_GRAFANA.md deleted file mode 100644 index 400ac1e..0000000 --- a/docs/ACCES_GRAFANA.md +++ /dev/null @@ -1,92 +0,0 @@ -# Accès Grafana - LeCoffre Node - -## Informations de Connexion - -### 🔐 **Identifiants d'Accès** -- **URL**: `https://dev4.4nkweb.com/grafana/` -- **Utilisateur**: `admin` -- **Mot de passe**: `Fuy8ZfxQI2xdSdoB8wsGxNjyU` - -### 📊 **Dashboards Disponibles** -1. **Bitcoin & Miner Monitoring** (UID: `bitcoin-miner`) -2. **Bitcoin Miner - Détails** (UID: `bitcoin-miner-detailed`) -3. **Bitcoin Services - Monitoring** (UID: `bitcoin-services`) -4. **Frontend Services - Monitoring** (UID: `frontend-services`) -5. **LeCoffre Backend - Monitoring** (UID: `lecoffre-backend`) -6. **LeCoffre Node - Vue d'ensemble** (UID: `lecoffre-overview`) -7. **SDK Services - Monitoring** (UID: `sdk-services`) -8. **Services Applications - Monitoring** (UID: `services-overview`) - -### 🔗 **Liens Directs** -- Vue d'ensemble: `https://dev4.4nkweb.com/grafana/d/lecoffre-overview` -- Bitcoin Miner: `https://dev4.4nkweb.com/grafana/d/bitcoin-miner-detailed` -- Backend LeCoffre: `https://dev4.4nkweb.com/grafana/d/lecoffre-backend` -- Services SDK: `https://dev4.4nkweb.com/grafana/d/sdk-services` -- Services Frontend: `https://dev4.4nkweb.com/grafana/d/frontend-services` -- Services Bitcoin: `https://dev4.4nkweb.com/grafana/d/bitcoin-services` - -## Configuration - -### 📁 **Emplacement de Configuration** -- **Fichier principal**: `/home/debian/lecoffre_node/docker-compose.yml` -- **Ligne**: 284 -- **Variable**: `GF_SECURITY_ADMIN_PASSWORD` - -### 🔄 **Historique des Mots de Passe** -- **Ancien**: `admin123` (faible) -- **Nouveau**: `Fuy8ZfxQI2xdSdoB8wsGxNjyU` (fort - 25 caractères) - -### 🛡️ **Sécurité** -- **Longueur**: 25 caractères -- **Complexité**: Alphanumérique + caractères spéciaux -- **Génération**: OpenSSL random base64 -- **Renouvellement**: Automatique lors du déploiement - -## Déploiement - -### 📋 **Commandes de Déploiement** -```bash -# Redémarrage avec nouveau mot de passe -cd /home/debian/lecoffre_node -docker compose restart grafana - -# Redémarrage complet (si nécessaire) -docker compose stop grafana -docker compose rm -f grafana -docker volume rm lecoffre_node_grafana_data -docker compose up -d grafana -``` - -### ✅ **Validation du Déploiement** -```bash -# Test de connectivité -curl -s -u admin:Fuy8ZfxQI2xdSdoB8wsGxNjyU \ - https://dev4.4nkweb.com/grafana/api/search?type=dash-db | \ - jq '.[].title' -``` - -## Notes Importantes - -### 🔒 **Sécurité** -- Le mot de passe est stocké dans le docker-compose.yml -- **Ne pas committer** le fichier .env avec le mot de passe -- Utiliser des variables d'environnement pour la production -- Renouveler régulièrement les mots de passe - -### 📝 **Maintenance** -- Les dashboards sont provisionnés automatiquement -- Les volumes Docker persistent les données -- Redémarrer Grafana après modification du mot de passe -- Vérifier les logs en cas de problème - -### 🚨 **En Cas de Problème** -1. Vérifier les logs: `docker compose logs grafana` -2. Redémarrer le service: `docker compose restart grafana` -3. Réinitialiser si nécessaire (supprimer le volume) -4. Tester la connectivité avec curl - ---- -**Date de mise à jour**: 21 Septembre 2025 -**Version**: 1.0 -**Responsable**: Déploiement LeCoffre Node - diff --git a/docs/REX_Dashboards_Grafana.md b/docs/REX_Dashboards_Grafana.md deleted file mode 100644 index b3f06ad..0000000 --- a/docs/REX_Dashboards_Grafana.md +++ /dev/null @@ -1,144 +0,0 @@ -# REX - Implémentation des Dashboards Grafana - -## Résumé - -Implémentation réussie de dashboards Grafana spécialisés pour le monitoring des services LeCoffre Node. - -## Dashboards Implémentés - -### 1. **Bitcoin Miner - Détails** (UID: `bitcoin-miner-detailed`) -- **Objectif**: Monitoring détaillé du mineur Bitcoin Signet -- **Métriques**: - - Blocs minés par minute - - Hashrate du mineur - - Erreurs du mineur (1h) - - Distribution des niveaux de log - - Historique des blocs minés -- **Panneaux**: 5 panneaux spécialisés - -### 2. **LeCoffre Backend - Monitoring** (UID: `lecoffre-backend`) -- **Objectif**: Monitoring de l'API backend LeCoffre -- **Métriques**: - - Requêtes HTTP par status code - - Endpoints les plus utilisés - - Temps de réponse moyen - - Erreurs et succès (1h) - - Distribution des méthodes HTTP - - Erreurs récentes -- **Panneaux**: 8 panneaux complets - -### 3. **SDK Services - Monitoring** (UID: `sdk-services`) -- **Objectif**: Monitoring des services SDK (relay, signer, storage) -- **Métriques**: - - Messages par service SDK - - Transactions relay - - Signatures signer - - Erreurs par service (1h) - - Total logs SDK - - Erreurs récentes SDK -- **Panneaux**: 8 panneaux spécialisés - -### 4. **Frontend Services - Monitoring** (UID: `frontend-services`) -- **Objectif**: Monitoring des services frontend (lecoffre-front, ihm_client) -- **Métriques**: - - Requêtes HTTP par frontend - - Activité Vite (IHM Client) - - Erreurs par service (1h) - - Total logs frontend - - Erreurs Vite - - Erreurs récentes frontend -- **Panneaux**: 7 panneaux dédiés - -### 5. **Bitcoin Services - Monitoring** (UID: `bitcoin-services`) -- **Objectif**: Monitoring des services Bitcoin (bitcoin-signet, blindbit-oracle) -- **Métriques**: - - Mises à jour de la chaîne Bitcoin - - Détection de tweak (BlindBit) - - Erreurs Bitcoin et BlindBit (1h) - - Nouveaux blocs et silent payments - - Erreurs Bitcoin services -- **Panneaux**: 7 panneaux spécialisés - -## Configuration Technique - -### Datasource Loki -- **URL**: `http://loki:3100` -- **Type**: `loki` -- **Accès**: `proxy` -- **UID**: `loki` -- **Configuration simplifiée** pour éviter les erreurs de provisioning - -### Scripts Améliorés -- **`test-dashboards.sh`**: Script de test complet avec headers Loki -- **Headers ajoutés**: `X-Scope-OrgID: anonymous` pour l'accès Loki -- **Tests inclus**: API Loki, logs des services, rapport de santé - -## Résolution des Problèmes - -### Problème 1: Configuration Loki Complexe -- **Symptôme**: Erreur "Datasource provisioning error: data source not found" -- **Cause**: Configuration JSON complexe avec derivedFields -- **Solution**: Simplification de la configuration Loki - -### Problème 2: Access Proxy vs Server -- **Symptôme**: Erreurs 502 Bad Gateway via nginx -- **Cause**: Tentative d'accès direct via URL externe -- **Solution**: Utilisation de `access: proxy` avec URL interne Docker - -### Problème 3: Headers Loki Manquants -- **Symptôme**: Erreurs d'authentification Loki -- **Cause**: Headers X-Scope-OrgID manquants -- **Solution**: Ajout des headers dans les requêtes API - -## Accès et Utilisation - -### URL d'Accès -- **Grafana**: `https://dev4.4nkweb.com/grafana/` -- **Identifiants**: `admin` / `admin123` - -### Liens Directs -- Vue d'ensemble: `https://dev4.4nkweb.com/grafana/d/lecoffre-overview` -- Bitcoin Miner: `https://dev4.4nkweb.com/grafana/d/bitcoin-miner-detailed` -- Backend LeCoffre: `https://dev4.4nkweb.com/grafana/d/lecoffre-backend` -- Services SDK: `https://dev4.4nkweb.com/grafana/d/sdk-services` -- Services Frontend: `https://dev4.4nkweb.com/grafana/d/frontend-services` -- Services Bitcoin: `https://dev4.4nkweb.com/grafana/d/bitcoin-services` - -## Validation - -### Tests Réussis -- ✅ **8 dashboards** accessibles et fonctionnels -- ✅ **Configuration Loki** opérationnelle -- ✅ **Scripts de test** améliorés et fonctionnels -- ✅ **Accès externe** via nginx HTTPS -- ✅ **Monitoring temps réel** des services - -### Métriques Disponibles -- **Temps réel**: Refresh 5s sur tous les dashboards -- **Historique**: 1h par défaut, configurable -- **Logs centralisés**: Via Loki + Promtail -- **Erreurs**: Détection et affichage en temps réel - -## Améliorations Futures - -### Dashboards Avancés -1. **Alertes automatiques** sur erreurs critiques -2. **Métriques personnalisées** par service -3. **Corrélations** entre services -4. **Rapports automatiques** de performance - -### Configuration -1. **Variables de template** pour filtrage dynamique -2. **Annotations** sur événements importants -3. **Drill-down** entre dashboards -4. **Export** de rapports PDF - -## Conclusion - -✅ **Mission accomplie**: Tous les dashboards sont implémentés, fonctionnels et accessibles -✅ **Monitoring complet**: Couverture de tous les services critiques -✅ **Accès externe**: Disponible via HTTPS avec authentification -✅ **Scripts améliorés**: Tests et validation automatisés - -Le système de monitoring Grafana est maintenant opérationnel et prêt pour la production. - diff --git a/docs/REX_Optimisation_Docker_Debian.md b/docs/REX_Optimisation_Docker_Debian.md deleted file mode 100644 index dd1c2a7..0000000 --- a/docs/REX_Optimisation_Docker_Debian.md +++ /dev/null @@ -1,184 +0,0 @@ -# REX - Optimisation Docker avec Migration vers Debian - -## 📅 Date -**2024-12-19** - -## 🎯 Objectif -Optimiser tous les Dockerfiles du projet LeCoffre en migrant vers une base Debian standardisée et en réduisant drastiquement la taille des images. - -## 🔧 Problèmes identifiés - -### 1. Images Docker trop volumineuses -- **Erreur** : `413 Request Entity Too Large` lors du push des images -- **Cause** : Installation de nombreux outils de développement inutiles -- **Impact** : Échec des builds CI pour `sdk_relay` - -### 2. Incohérence des bases d'images -- **Problème** : Mélange d'Alpine et Debian -- **Impact** : Difficultés de maintenance et packages manquants (`cscope` non disponible sur Alpine) - -### 3. Packages inutiles en production -- **Problème** : Installation de `build-essential`, `clang`, `vim`, `emacs`, etc. -- **Impact** : Images très lourdes sans valeur ajoutée en runtime - -## ✅ Solutions appliquées - -### 1. Standardisation sur Debian bookworm-slim -```dockerfile -FROM debian:bookworm-slim -``` - -**Avantages :** -- Base légère mais complète -- Compatibilité avec tous les packages nécessaires -- Possibilité d'ajouter des packages au besoin -- Standardisation de l'architecture - -### 2. Packages minimaux optimisés -```dockerfile -RUN apt-get update && apt-get upgrade -y && \ - apt-get install -y --fix-missing \ - ca-certificates curl jq git && \ - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* -``` - -**Packages installés :** -- `ca-certificates` : Certificats SSL/TLS -- `curl` : Requêtes HTTP -- `jq` : Traitement JSON -- `git` : Clonage de dépôts (si nécessaire) - -### 3. Installation Node.js via NodeSource -```dockerfile -RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \ - apt-get install -y nodejs && \ - rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* -``` - -**Avantages :** -- Version officielle et à jour -- Installation propre et sécurisée -- Nettoyage automatique des caches - -### 4. Utilisateurs non-root standardisés -```dockerfile -RUN useradd -m -u 1000 appuser && \ - mkdir -p /app && chown -R appuser:appuser /app -``` - -**Sécurité :** -- UID standardisé (1000) -- Utilisateur dédié pour chaque service -- Permissions appropriées - -### 5. Image de base réutilisable -Création de `/home/debian/lecoffre_node/base-image/` : -- Dockerfile de base Debian optimisé -- Script `install-packages.sh` pour ajouter des packages au besoin -- Réutilisable pour de futurs services - -## 📊 Résultats - -### Images optimisées (7/7) -| Service | Base | Commit | Taille estimée | -|---------|------|--------|----------------| -| sdk_relay | Debian bookworm-slim | 96d131a | ~150MB | -| sdk_signer | Debian bookworm-slim | 2355aeb | ~200MB | -| sdk_storage | Debian bookworm-slim | d15c995 | ~120MB | -| lecoffre-back-mini | Debian bookworm-slim | 65b2da6 | ~180MB | -| lecoffre-front | Debian bookworm-slim | baa4e194 | ~220MB | -| ihm_client | Debian bookworm-slim | 34d57c9 | ~190MB | -| miner | Debian bookworm-slim | bc20b99 | ~250MB | - -### Réduction de taille estimée -- **Avant** : ~800MB-1.2GB par image -- **Après** : ~120MB-250MB par image -- **Réduction** : ~70-80% de la taille - -### Builds CI -- ✅ Tous les tags `ext` créés et poussés -- ✅ Tous les builds CI déclenchés -- ✅ Plus d'erreurs 413 Request Entity Too Large - -## 🔄 Processus de migration - -### Étapes réalisées -1. **Analyse** des Dockerfiles existants -2. **Création** de l'image de base réutilisable -3. **Migration** progressive de chaque service -4. **Optimisation** des packages et utilisateurs -5. **Tests** et validation -6. **Commit** et push sur la branche `ext` -7. **Déclenchement** des builds CI - -### Scripts utilisés -```bash -# Pour chaque service -git add Dockerfile -git commit -m "ci: docker_tag=ext - Migrate to Debian base with minimal packages" -git tag -d ext -git push origin :refs/tags/ext -git push origin ext -git tag ext -git push origin refs/tags/ext:refs/tags/ext -``` - -## 📝 Leçons apprises - -### 1. Importance de la standardisation -- Une base commune simplifie la maintenance -- Réduction des erreurs de compatibilité -- Facilite les mises à jour - -### 2. Optimisation des packages -- Seulement les packages nécessaires en runtime -- Nettoyage systématique des caches -- Installation propre de Node.js - -### 3. Gestion des utilisateurs -- Utilisateurs non-root pour la sécurité -- UID standardisés pour la cohérence -- Permissions appropriées - -### 4. Stratégie de déploiement -- Tags Docker pour déclencher les CI -- Branche `ext` pour le déploiement -- Builds automatisés via Gitea - -## 🚀 Recommandations futures - -### 1. Monitoring des tailles d'images -- Surveiller la taille des images après chaque build -- Alertes si dépassement de seuils -- Optimisation continue - -### 2. Mise à jour de la base -- Mise à jour régulière de Debian bookworm-slim -- Mise à jour des versions Node.js -- Tests de régression - -### 3. Documentation -- Mise à jour des README avec les nouvelles bases -- Documentation des packages disponibles -- Guide de contribution - -## ✅ Validation - -### Tests réalisés -- ✅ Build local de tous les Dockerfiles -- ✅ Push des images vers le registry -- ✅ Déclenchement des builds CI -- ✅ Vérification des tags Docker - -### Prochaines étapes -- [ ] Vérifier le succès des builds CI -- [ ] Tester le déploiement des nouvelles images -- [ ] Valider le fonctionnement des services -- [ ] Mettre à jour la documentation utilisateur - ---- - -**Auteur** : Assistant IA -**Validation** : En attente des tests de déploiement -**Statut** : ✅ Optimisation terminée, builds CI en cours - diff --git a/docs/REX_Redemarrage_Services_Dashboards.md b/docs/REX_Redemarrage_Services_Dashboards.md deleted file mode 100644 index ebca080..0000000 --- a/docs/REX_Redemarrage_Services_Dashboards.md +++ /dev/null @@ -1,162 +0,0 @@ -# REX - Redémarrage des Services et Alimentation des Dashboards - -## Résumé - -Redémarrage complet de tous les services LeCoffre Node pour alimenter les dashboards Grafana avec des données en temps réel. - -## Actions Réalisées - -### 🔄 **Redémarrage des Services** -- **Arrêt complet**: `docker compose down` pour nettoyer l'environnement -- **Redémarrage**: `docker compose up -d` pour lancer tous les services -- **Ordre de démarrage**: Respect de l'ordre critique (tor → bitcoin → blindbit → sdk_* → applications → monitoring) - -### 📊 **Services Redémarrés** (15 services) -1. **tor-proxy** - Proxy anonyme ✅ -2. **bitcoin-signet** - Nœud Bitcoin Signet ✅ -3. **blindbit-oracle** - Oracle Bitcoin ✅ -4. **sdk_storage** - Stockage temporaire ✅ -5. **sdk_relay** - Relais des transactions ✅ -6. **sdk_signer** - Signature des processus ✅ -7. **lecoffre-back** - Backend API ✅ -8. **lecoffre-front** - Frontend application ✅ -9. **ihm_client** - Interface utilisateur ✅ -10. **status-api** - API de statut ✅ -11. **loki** - Base de données de logs ✅ -12. **promtail** - Agent de collecte des logs ✅ -13. **grafana** - Interface de visualisation ✅ -14. **signet_miner** - Mineur Bitcoin (déjà en cours) ✅ -15. **watchtower** - Surveillance automatique ✅ - -### 🔧 **Configuration Loki Restaurée** -- **Fichier**: `/home/debian/lecoffre_node/conf/grafana/provisioning/datasources/loki.yml` -- **Configuration**: Datasource Loki avec accès proxy -- **URL**: `http://loki:3100` -- **UID**: `loki` - -## Validation des Données - -### 📈 **Collecte des Logs** -- **Promtail**: Collecte active des logs de tous les services -- **Sources**: `/var/log/lecoffre/` pour chaque service -- **Labels**: 6 labels disponibles dans Loki -- **Docker**: Collecte automatique des logs des conteneurs - -### 🔍 **Données Disponibles** -- **Labels Loki**: `container_name`, `filename`, `job`, `logstream`, `service`, `service_name` -- **Logs Bitcoin**: 1 entrée récente disponible -- **Logs Miner**: Blocs minés, erreurs d'adresse, transactions -- **Logs Services**: Activité de tous les services SDK et applications - -### 📊 **Dashboards Opérationnels** -1. **Bitcoin & Miner Monitoring** - Monitoring global ✅ -2. **Bitcoin Miner - Détails** - Métriques détaillées du mineur ✅ -3. **Bitcoin Services - Monitoring** - Bitcoin Signet + BlindBit ✅ -4. **Frontend Services - Monitoring** - LeCoffre Front + IHM Client ✅ -5. **LeCoffre Backend - Monitoring** - API backend complète ✅ -6. **LeCoffre Node - Vue d'ensemble** - Monitoring global ✅ -7. **SDK Services - Monitoring** - Relay, Signer, Storage ✅ -8. **Services Applications - Monitoring** - Vue générale ✅ - -## Tests de Validation - -### ✅ **Services Fonctionnels** -```bash -# Loki -curl -s http://localhost:3100/ready -# Résultat: "Ingester not ready: waiting for 15s after being ready" - -# Promtail -docker ps --filter name=promtail --format '{{.Status}}' -# Résultat: "Up 4 minutes" - -# Grafana -curl -s -I https://dev4.4nkweb.com/grafana/ -# Résultat: HTTP/2 302 (redirection normale) -``` - -### ✅ **Données Disponibles** -```bash -# Labels Loki -curl -s http://localhost:3100/loki/api/v1/labels | jq '.data | length' -# Résultat: 6 - -# Logs Bitcoin -curl -s 'http://localhost:3100/loki/api/v1/query_range?query={job="bitcoin"}&start=...&end=...&limit=3' | jq '.data.result | length' -# Résultat: 1 -``` - -### ✅ **Accès Grafana** -```bash -# Dashboards -curl -s -u admin:Fuy8ZfxQI2xdSdoB8wsGxNjyU https://dev4.4nkweb.com/grafana/api/search?type=dash-db | jq '.[].title' -# Résultat: 8 dashboards listés -``` - -## Problèmes Résolus - -### 🔧 **Configuration Loki** -- **Problème**: Datasource Loki non accessible depuis Grafana -- **Cause**: Configuration supprimée temporairement -- **Solution**: Restauration de la configuration Loki simplifiée - -### 🔧 **Collecte des Logs** -- **Problème**: Dashboards vides sans données -- **Cause**: Services redémarrés sans reconfiguration Promtail -- **Solution**: Redémarrage complet avec configuration Promtail active - -### 🔧 **Syntaxe des Requêtes** -- **Problème**: Erreurs de syntaxe dans les requêtes Loki -- **Cause**: Utilisation de requêtes instant au lieu de range -- **Solution**: Utilisation de `query_range` avec paramètres start/end - -## État Final - -### 🎯 **Services Opérationnels** -- ✅ **Tous les services** en cours d'exécution -- ✅ **Monitoring complet** avec Loki + Promtail + Grafana -- ✅ **Collecte active** des logs de tous les services -- ✅ **Dashboards alimentés** avec données en temps réel - -### 📊 **Données Disponibles** -- ✅ **Logs Bitcoin**: Connexions Tor, activité réseau -- ✅ **Logs Miner**: Blocs minés, erreurs d'adresse, transactions -- ✅ **Logs Services**: Activité SDK (relay, signer, storage) -- ✅ **Logs Applications**: Backend, frontend, IHM client - -### 🔐 **Sécurité** -- ✅ **Mot de passe fort**: `Fuy8ZfxQI2xdSdoB8wsGxNjyU` -- ✅ **Accès HTTPS**: `https://dev4.4nkweb.com/grafana/` -- ✅ **Configuration sécurisée**: Datasource Loki en proxy - -## Accès et Utilisation - -### 🔗 **URL d'Accès** -- **Grafana**: `https://dev4.4nkweb.com/grafana/` -- **Utilisateur**: `admin` -- **Mot de passe**: `Fuy8ZfxQI2xdSdoB8wsGxNjyU` - -### 📋 **Commandes Utiles** -```bash -# Redémarrage des services -cd /home/debian/lecoffre_node && docker compose restart - -# Vérification des logs -docker compose logs [service_name] --tail=10 - -# Test des dashboards -./scripts/test-dashboards.sh - -# Vérification Loki -curl -s http://localhost:3100/loki/api/v1/labels -``` - -## Conclusion - -✅ **Mission accomplie**: Tous les services sont redémarrés et opérationnels -✅ **Dashboards alimentés**: Les dashboards reçoivent maintenant des données en temps réel -✅ **Monitoring complet**: Loki + Promtail + Grafana fonctionnent parfaitement -✅ **Sécurité renforcée**: Mot de passe fort déployé et testé - -Le système de monitoring LeCoffre Node est maintenant **pleinement opérationnel** avec des dashboards **alimentés en données temps réel** ! 🎉 - diff --git a/docs/REX_Redéploiement_Complet.md b/docs/REX_Redéploiement_Complet.md deleted file mode 100644 index 5ada4fd..0000000 --- a/docs/REX_Redéploiement_Complet.md +++ /dev/null @@ -1,163 +0,0 @@ -# REX - Redéploiement Complet LeCoffre avec Accessibilité Externe - -## Date -21 septembre 2025 - -## Contexte -Redéploiement complet de l'écosystème LeCoffre selon les consignes mises à jour, en s'assurant que **tous les services écoutent sur 0.0.0.0** et sont **accessibles depuis l'extérieur via le nom de domaine**. - -## Corrections Apportées - -### 1. Correction des Ports Docker Compose -**Problème identifié :** -Les services écoutaient sur `127.0.0.1` au lieu de `0.0.0.0`, les rendant inaccessibles depuis l'extérieur. - -**Solution appliquée :** -Modification du fichier `docker-compose.yml` pour tous les services : - -```yaml -# Avant -ports: - - "127.0.0.1:8090:8090" - - "127.0.0.1:8091:8091" - -# Après -ports: - - "0.0.0.0:8090:8090" - - "0.0.0.0:8091:8091" -``` - -**Services corrigés :** -- ✅ **blindbit-oracle** : `0.0.0.0:8000` -- ✅ **sdk_relay** : `0.0.0.0:8090-8091` -- ✅ **lecoffre-back** : `0.0.0.0:8080` -- ✅ **lecoffre-front** : `0.0.0.0:3004` -- ✅ **ihm_client** : `0.0.0.0:3003` -- ✅ **sdk_signer** : `0.0.0.0:3001` -- ✅ **sdk_storage** : `0.0.0.0:8081` -- ✅ **grafana** : `0.0.0.0:3005` -- ✅ **loki** : `0.0.0.0:3100` -- ✅ **status-api** : `0.0.0.0:3006` - -### 2. Correction de la Configuration Nginx -**Problème identifié :** -La configuration nginx utilisait `127.0.0.1` dans les proxy_pass, causant des erreurs 502. - -**Solution appliquée :** -Mise à jour des fichiers de configuration nginx : -- `dev4.4nkweb.com-https.conf` -- `dev4.4nkweb.com.conf` - -```nginx -# Avant -proxy_pass http://127.0.0.1:8090/; - -# Après -proxy_pass http://localhost:8090/; -``` - -### 3. Correction du Service IHM Client -**Problème identifié :** -Erreurs Vite : `Failed to resolve import "../pkg/sdk_client.js"` - -**Solution appliquée :** -Rebuild de l'image `ihm_client` avec les fichiers correctement copiés. - -## Tests de Connectivité Externe - -### ✅ Services Accessibles via HTTPS -- **Frontend LeCoffre** : `https://dev4.4nkweb.com/lecoffre` → HTTP 200 ✅ -- **IHM Client** : `https://dev4.4nkweb.com/` → HTTP 200 ✅ -- **Grafana** : `https://dev4.4nkweb.com/grafana/` → HTTP 302 (redirection login) ✅ -- **Page de Statut** : `https://dev4.4nkweb.com/status/` → HTTP 200 ✅ - -### ⚠️ Services avec Problèmes -- **API Backend** : `https://dev4.4nkweb.com/api/health` → HTTP 404 (endpoint manquant) -- **WebSocket Relay** : `https://dev4.4nkweb.com/ws/` → HTTP 502 (configuration WebSocket) - -### 🔧 Services Internes Fonctionnels -- **sdk_relay** : Health check OK, répond sur port 8091 ✅ -- **sdk_storage** : Health check OK ✅ -- **lecoffre-back** : Health check OK ✅ -- **ihm_client** : Démarre correctement ✅ - -## Architecture de Déploiement - -### Services Docker Opérationnels -``` -NAME STATUS PORTS -bitcoin-signet Up (healthy) -blindbit-oracle Up (healthy) 0.0.0.0:8000->8000/tcp -sdk_relay Up (healthy) 0.0.0.0:8090-8091->8090-8091/tcp -sdk_signer Up 0.0.0.0:3001->9090/tcp -sdk_storage Up (healthy) 0.0.0.0:8081->8080/tcp -lecoffre-back Up (healthy) 0.0.0.0:8080->8080/tcp -lecoffre-front Up (healthy) 0.0.0.0:3004->3000/tcp -ihm_client Up (healthy) 0.0.0.0:3003->3003/tcp -grafana Up 0.0.0.0:3005->3000/tcp -loki Up 0.0.0.0:3100->3100/tcp -status-api Up 0.0.0.0:3006->3006/tcp -``` - -### Configuration Nginx -- ✅ **HTTPS actif** sur port 443 -- ✅ **Redirection HTTP → HTTPS** -- ✅ **Certificats SSL valides** (expire le 15 déc 2025) -- ✅ **Configuration centralisée** dans `lecoffre_node/conf/nginx/` - -## Points d'Attention Identifiés - -### 1. Endpoint API Backend -- **Problème** : `/api/health` retourne 404 -- **Cause** : Endpoint de santé manquant dans le backend -- **Action** : Vérifier les routes disponibles dans le backend - -### 2. WebSocket Relay -- **Problème** : `/ws/` retourne 502 -- **Cause** : Configuration WebSocket ou service non accessible -- **Action** : Vérifier la configuration WebSocket dans nginx - -### 3. Monitoring -- **Grafana** : Accessible mais nécessite authentification -- **Loki** : Accessible en interne -- **Promtail** : Collecte des logs active - -## Validation Finale - -### ✅ Critères Respectés -1. **Services sur 0.0.0.0** : Tous les services écoutent sur toutes les interfaces ✅ -2. **Accessibilité externe** : Services accessibles via nom de domaine ✅ -3. **HTTPS fonctionnel** : Certificats valides et redirection active ✅ -4. **Services principaux** : Frontend, IHM, Grafana accessibles ✅ -5. **Configuration centralisée** : Nginx configuré correctement ✅ - -### 🔧 Améliorations Nécessaires -1. **Corriger l'endpoint API** `/api/health` -2. **Résoudre le WebSocket** `/ws/` (502) -3. **Vérifier les routes API** du backend -4. **Tester les WebSockets** avec un client approprié - -## Leçons Apprises - -### Docker Compose -1. **Ports 0.0.0.0 vs 127.0.0.1** : Crucial pour l'accessibilité externe -2. **Redémarrage nécessaire** après modification des ports -3. **Health checks** : Vérifier que les services répondent correctement - -### Nginx -1. **Configuration proxy_pass** : Utiliser `localhost` pour les services locaux -2. **Test de configuration** : `nginx -t` avant reload -3. **Logs d'erreur** : Consulter `/var/log/nginx/error.log` pour diagnostiquer - -### Services -1. **Ordre de démarrage** : Respecter les dépendances entre services -2. **Logs Docker** : Utiliser `docker compose logs` pour diagnostiquer -3. **Tests de connectivité** : Tester depuis l'intérieur et l'extérieur - -## Statut Final -🎉 **REDÉPLOIEMENT RÉUSSI** - Services accessibles depuis l'extérieur - -**Services opérationnels :** 8/10 -**Accessibilité externe :** ✅ Fonctionnelle -**Configuration :** ✅ Complète et centralisée - diff --git a/docs/Test_Fonctionnel_Flux_Complet.md b/docs/Test_Fonctionnel_Flux_Complet.md deleted file mode 100644 index d1c691d..0000000 --- a/docs/Test_Fonctionnel_Flux_Complet.md +++ /dev/null @@ -1,194 +0,0 @@ -# Test Fonctionnel - Flux Complet LeCoffre - -## Date -21 septembre 2025 - -## Contexte -Test du flux complet fonctionnel : **login notaire → redirection IdNot → validation dans l'iframe → connexion après vérification Stripe**. - -## Services Testés et Validés - -### ✅ **Frontend LeCoffre** -- **URL** : `https://dev4.4nkweb.com/lecoffre` -- **Statut** : ✅ **OPÉRATIONNEL** -- **Configuration détectée** : - ```json - { - "idNotBaseUrl": "https://qual-connexion.idnot.fr", - "idNotAuthorizeEndpoint": "/IdPOAuth2/authorize/idnot_idp_v1", - "idNotClientId": "B3CE56353EDB15A9", - "idNotRedirectUri": "http://local.4nkweb.com:3000/authorized-client", - "_4nkIframeUrl": "https://dev4.4nkweb.com" - } - ``` -- **Routes disponibles** : `/lecoffre/folders`, `/lecoffre/legal/*` - -### ✅ **Redirection IdNot** -- **URL** : `https://dev4.4nkweb.com/api/v1/idnot/auth` -- **Statut** : ✅ **OPÉRATIONNEL** -- **Test** : POST avec `{}` → Retourne erreur de validation attendue -- **Réponse** : - ```json - { - "success": false, - "error": { - "code": "VALIDATION_ERROR", - "message": "Invalid authentication code" - } - } - ``` -- **Routes IdNot disponibles** : - - `GET /user/rattachements` - - `GET /office/rattachements` - - `POST /auth` - - `GET /user` (authentifié) - - `POST /logout` (authentifié) - - `GET /validate` (authentifié) - -### ✅ **Iframe IHM Client** -- **URL** : `https://dev4.4nkweb.com/` -- **Statut** : ✅ **OPÉRATIONNEL** -- **Contenu** : Interface 4NK Web5 Platform -- **Fonctionnalités** : Iframe pour interactions avec clés privées Bitcoin Silent Payment - -### ⚠️ **Validation Compte Stripe** -- **URL** : `https://dev4.4nkweb.com/api/stripe/*` -- **Statut** : ⚠️ **PROBLÈME DÉTECTÉ** -- **Problème** : Toutes les routes Stripe retournent des erreurs HTML -- **Routes Stripe disponibles** : - - `POST /test/create-subscription` - - `POST /subscriptions/checkout` - - `GET /subscriptions/:id` - - `POST /subscriptions/:id/portal` - - `POST /webhooks/stripe` -- **Cause probable** : Variables d'environnement Stripe manquantes ou configuration incorrecte - -### ✅ **WebSockets** -- **URL** : `wss://dev4.4nkweb.com/ws/` -- **Statut** : ✅ **OPÉRATIONNEL** -- **Test** : Connexion WebSocket réussie sans erreur -- **Service** : `sdk_relay` sur port 8090 - -## Flux de Redirection Configuré - -### 1. **Login Notaire** -``` -https://dev4.4nkweb.com/lecoffre/folders -↓ -Redirection vers IdNot -``` - -### 2. **Authentification IdNot** -``` -https://qual-connexion.idnot.fr/IdPOAuth2/authorize/idnot_idp_v1 -↓ -Client ID: B3CE56353EDB15A9 -Redirect URI: http://local.4nkweb.com:3000/authorized-client -``` - -### 3. **Validation dans l'iframe** -``` -http://local.4nkweb.com:3000/authorized-client -↓ -Iframe: https://dev4.4nkweb.com/ -``` - -### 4. **Vérification Stripe** -``` -https://dev4.4nkweb.com/api/stripe/subscriptions/checkout -↓ -Connexion après validation -``` - -## Tests de Connectivité - -### ✅ **Services HTTP/HTTPS** -- **Frontend LeCoffre** : HTTP 200 ✅ -- **IHM Client** : HTTP 200 ✅ -- **API Backend** : HTTP 200 ✅ -- **Health Check** : HTTP 200 ✅ -- **Grafana** : HTTP 302 (redirection) ✅ -- **Page Statut** : HTTP 200 ✅ - -### ✅ **Services WebSocket** -- **Relay WebSocket** : Connexion réussie ✅ -- **Protocole** : WSS sécurisé ✅ - -### ✅ **Configuration Nginx** -- **HTTPS** : Certificats valides ✅ -- **Redirection HTTP → HTTPS** : Fonctionnelle ✅ -- **Routes configurées** : - - `/lecoffre` → Frontend (port 3004) ✅ - - `/api/` → Backend (port 8080) ✅ - - `/ws/` → Relay WebSocket (port 8090) ✅ - - `/` → IHM Client (port 3003) ✅ - -## Points d'Attention - -### 🔧 **Corrections Nécessaires** - -1. **Routes Stripe** : - - **Problème** : Toutes les routes retournent des erreurs HTML - - **Impact** : Flux de vérification Stripe bloqué - - **Action** : Vérifier les variables d'environnement Stripe - - **Variables manquantes possibles** : - - `STRIPE_SECRET_KEY` - - `STRIPE_STANDARD_SUBSCRIPTION_PRICE_ID` - - `STRIPE_UNLIMITED_SUBSCRIPTION_PRICE_ID` - -2. **Configuration IdNot** : - - **Redirect URI** : `http://local.4nkweb.com:3000/authorized-client` - - **Vérification** : S'assurer que cette URL est accessible - -### ✅ **Services Fonctionnels** - -1. **Flux IdNot** : ✅ Complet et opérationnel -2. **Frontend LeCoffre** : ✅ Accessible et configuré -3. **Iframe IHM Client** : ✅ Opérationnel -4. **WebSockets** : ✅ Connexions temps réel fonctionnelles -5. **API Backend** : ✅ Endpoints principaux opérationnels - -## Validation du Test Fonctionnel - -### 🎯 **Flux Principal** -``` -1. Login notaire sur https://dev4.4nkweb.com/lecoffre/folders ✅ -2. Redirection IdNot configurée ✅ -3. Validation dans iframe https://dev4.4nkweb.com/ ✅ -4. Vérification Stripe (⚠️ problème détecté) -``` - -### 📊 **Statut Global** -- **Services opérationnels** : 6/7 (85.7%) -- **Flux principal** : ✅ **FONCTIONNEL** -- **Blocage identifié** : Routes Stripe uniquement -- **Impact utilisateur** : Flux complet possible sauf validation Stripe - -## Recommandations - -### 🔧 **Actions Immédiates** -1. **Corriger les routes Stripe** : - - Vérifier les variables d'environnement - - Tester la configuration Stripe - - Valider les clés API - -2. **Tester le flux complet** : - - Simuler un login notaire - - Valider la redirection IdNot - - Tester l'iframe de validation - -### 🚀 **Déploiement** -- **Statut** : ✅ **PRÊT POUR TEST FONCTIONNEL** -- **Services critiques** : Tous opérationnels -- **Seul blocage** : Validation Stripe (non critique pour le test principal) - -## Conclusion - -Le flux fonctionnel principal est **OPÉRATIONNEL** : -- ✅ Login notaire accessible -- ✅ Redirection IdNot configurée -- ✅ Iframe de validation fonctionnelle -- ✅ WebSockets temps réel opérationnels - -Le seul problème identifié concerne les routes Stripe qui nécessitent une correction de configuration, mais n'empêche pas le test du flux principal de login notaire → IdNot → iframe. - diff --git a/lecoffre_node b/lecoffre_node deleted file mode 160000 index 66479e3..0000000 --- a/lecoffre_node +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 66479e38ceb34ed21f40272172cb060899ba1cc9 diff --git a/logs/bitcoin/bitcoin.log b/logs/bitcoin/bitcoin.log old mode 100644 new mode 100755 diff --git a/logs/blindbit/blindbit.log b/logs/blindbit/blindbit.log old mode 100644 new mode 100755 diff --git a/logs/docker-compose.log b/logs/docker-compose.log new file mode 100755 index 0000000..c69ab54 --- /dev/null +++ b/logs/docker-compose.log @@ -0,0 +1 @@ +permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json?all=1&filters=%7B%22label%22%3A%7B%22com.docker.compose.config-hash%22%3Atrue%2C%22com.docker.compose.project%3Dlecoffre%22%3Atrue%7D%7D": dial unix /var/run/docker.sock: connect: permission denied diff --git a/logs/ihm_client/ihm_client.log b/logs/ihm_client/ihm_client.log old mode 100644 new mode 100755 diff --git a/logs/lecoffre-back/lecoffre-back.log b/logs/lecoffre-back/lecoffre-back.log old mode 100644 new mode 100755 diff --git a/logs/lecoffre-front/lecoffre-front.log b/logs/lecoffre-front/lecoffre-front.log old mode 100644 new mode 100755 diff --git a/logs/miner/miner.log b/logs/miner/miner.log old mode 100644 new mode 100755 diff --git a/logs/nginx/access.log b/logs/nginx/access.log new file mode 100755 index 0000000..e69de29 diff --git a/logs/nginx/error.log b/logs/nginx/error.log new file mode 100755 index 0000000..e69de29 diff --git a/logs/nginx/nginx.log b/logs/nginx/nginx.log old mode 100644 new mode 100755 diff --git a/logs/sdk_relay/sdk_relay.log b/logs/sdk_relay/sdk_relay.log old mode 100644 new mode 100755 diff --git a/logs/sdk_signer/sdk_signer.log b/logs/sdk_signer/sdk_signer.log old mode 100644 new mode 100755 diff --git a/logs/sdk_storage/sdk_storage.log b/logs/sdk_storage/sdk_storage.log old mode 100644 new mode 100755 diff --git a/logs/tor/tor.log b/logs/tor/tor.log old mode 100644 new mode 100755 diff --git a/relay/sdk_relay.conf b/relay/sdk_relay.conf index c410248..5f37189 100644 --- a/relay/sdk_relay.conf +++ b/relay/sdk_relay.conf @@ -1,11 +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/" +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=/app/.4nk +bitcoin_data_dir=/app/.bitcoin +bootstrap_url=wss://dev3.4nkweb.com/ws/ bootstrap_faucet=true diff --git a/scripts/logs-with-progress.sh b/scripts/logs-with-progress.sh new file mode 100755 index 0000000..d644f92 --- /dev/null +++ b/scripts/logs-with-progress.sh @@ -0,0 +1,254 @@ +#!/bin/bash + +# Script pour afficher les logs des services avec la progression +# Affiche les logs en temps réel avec des informations de progression + +set -e + +# Couleurs pour l'affichage +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +PURPLE='\033[0;35m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# Fonction pour afficher l'aide +show_help() { + echo -e "${BLUE}Usage: $0 [service_name] [options]${NC}" + echo + echo -e "${PURPLE}Services disponibles:${NC}" + echo -e " ${CYAN}bitcoin${NC} - Bitcoin Signet (affiche la progression IBD)" + echo -e " ${CYAN}blindbit${NC} - BlindBit Oracle (affiche la progression du scan)" + echo -e " ${CYAN}sdk_relay${NC} - SDK Relay (affiche la progression du scan)" + echo -e " ${CYAN}sdk_storage${NC} - SDK Storage" + echo -e " ${CYAN}sdk_signer${NC} - SDK Signer" + echo -e " ${CYAN}lecoffre-back${NC} - LeCoffre Backend" + echo -e " ${CYAN}lecoffre-front${NC} - LeCoffre Frontend" + echo -e " ${CYAN}ihm_client${NC} - IHM Client" + echo -e " ${CYAN}grafana${NC} - Grafana" + echo -e " ${CYAN}loki${NC} - Loki" + echo -e " ${CYAN}promtail${NC} - Promtail" + echo -e " ${CYAN}status-api${NC} - Status API" + echo + echo -e "${PURPLE}Options:${NC}" + echo -e " ${CYAN}-f, --follow${NC} - Suivre les logs en temps réel (défaut)" + echo -e " ${CYAN}-n, --lines N${NC} - Afficher les N dernières lignes (défaut: 50)" + echo -e " ${CYAN}-p, --progress${NC} - Afficher la progression en plus des logs" + echo -e " ${CYAN}-h, --help${NC} - Afficher cette aide" + echo + echo -e "${PURPLE}Exemples:${NC}" + echo -e " ${CYAN}$0 bitcoin -p${NC} - Logs Bitcoin avec progression IBD" + echo -e " ${CYAN}$0 sdk_relay -n 100${NC} - 100 dernières lignes du SDK Relay" + echo -e " ${CYAN}$0 blindbit -f -p${NC} - Logs BlindBit en temps réel avec progression" +} + +# Fonction pour afficher la progression Bitcoin +show_bitcoin_progress() { + local container_name="bitcoin-signet" + if docker ps --format "table {{.Names}}" | grep -q "$container_name"; then + local info=$(docker exec "$container_name" bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo 2>/dev/null || echo '{}') + local blocks=$(echo "$info" | jq -r '.blocks // 0') + local headers=$(echo "$info" | jq -r '.headers // 0') + local progress=0 + + if [ "$headers" -gt 0 ]; then + progress=$((blocks * 100 / headers)) + fi + + echo -e "${CYAN}Bitcoin Progress: $blocks/$headers blocks ($(($headers - $blocks)) remaining) - $progress%${NC}" + + # Afficher une barre de progression + local bar_length=50 + local filled_length=$((progress * bar_length / 100)) + local bar="" + for ((i=0; i/dev/null || echo "000") + case "$response" in + "200") + echo -e "${GREEN}BlindBit Progress: Oracle service ready${NC}" + ;; + "000") + echo -e "${YELLOW}BlindBit Progress: Oracle service starting${NC}" + ;; + *) + echo -e "${YELLOW}BlindBit Progress: Oracle scanning (code: $response)${NC}" + ;; + esac + echo + fi +} + +# Fonction pour afficher la progression SDK Relay +show_sdk_relay_progress() { + local container_name="sdk_relay" + if docker ps --format "table {{.Names}}" | grep -q "$container_name"; then + local logs=$(docker logs "$container_name" --tail 3 2>/dev/null | grep -E "(waiting for|blocks to download|IBD)" | tail -1 || echo "") + if [ -n "$logs" ]; then + echo -e "${YELLOW}SDK Relay Progress: $logs${NC}" + else + local response=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8091/ 2>/dev/null || echo "000") + if [ "$response" = "200" ]; then + echo -e "${GREEN}SDK Relay Progress: WebSocket server ready${NC}" + else + echo -e "${YELLOW}SDK Relay Progress: WebSocket server starting${NC}" + fi + fi + echo + fi +} + +# Fonction pour afficher les logs avec progression +show_logs_with_progress() { + local service_name="$1" + local container_name="$2" + local lines="${3:-50}" + local follow="${4:-true}" + + echo -e "${BLUE}========================================${NC}" + echo -e "${BLUE} Logs for $service_name${NC}" + echo -e "${BLUE}========================================${NC}" + echo + + # Afficher la progression selon le service + case "$service_name" in + "bitcoin") + show_bitcoin_progress + ;; + "blindbit") + show_blindbit_progress + ;; + "sdk_relay") + show_sdk_relay_progress + ;; + esac + + echo -e "${PURPLE}Recent logs:${NC}" + echo + + if [ "$follow" = "true" ]; then + docker logs -f --tail "$lines" "$container_name" 2>/dev/null || echo -e "${RED}Service $service_name not found or not running${NC}" + else + docker logs --tail "$lines" "$container_name" 2>/dev/null || echo -e "${RED}Service $container_name not found or not running${NC}" + fi +} + +# Fonction principale +main() { + local service_name="" + local container_name="" + local lines=50 + local follow=true + local show_progress=false + + # Parser les arguments + while [[ $# -gt 0 ]]; do + case $1 in + -f|--follow) + follow=true + shift + ;; + -n|--lines) + lines="$2" + shift 2 + ;; + -p|--progress) + show_progress=true + shift + ;; + -h|--help) + show_help + exit 0 + ;; + -*) + echo -e "${RED}Unknown option: $1${NC}" + show_help + exit 1 + ;; + *) + service_name="$1" + shift + ;; + esac + done + + # Déterminer le nom du conteneur + case "$service_name" in + "bitcoin") + container_name="bitcoin-signet" + ;; + "blindbit") + container_name="blindbit-oracle" + ;; + "sdk_relay") + container_name="sdk_relay" + ;; + "sdk_storage") + container_name="sdk_storage" + ;; + "sdk_signer") + container_name="sdk_signer" + ;; + "lecoffre-back") + container_name="lecoffre-back" + ;; + "lecoffre-front") + container_name="lecoffre-front" + ;; + "ihm_client") + container_name="ihm_client" + ;; + "grafana") + container_name="grafana" + ;; + "loki") + container_name="loki" + ;; + "promtail") + container_name="promtail" + ;; + "status-api") + container_name="status-api" + ;; + "") + echo -e "${RED}Please specify a service name${NC}" + show_help + exit 1 + ;; + *) + echo -e "${RED}Unknown service: $service_name${NC}" + show_help + exit 1 + ;; + esac + + # Afficher les logs + if [ "$show_progress" = "true" ]; then + show_logs_with_progress "$service_name" "$container_name" "$lines" "$follow" + else + echo -e "${BLUE}========================================${NC}" + echo -e "${BLUE} Logs for $service_name${NC}" + echo -e "${BLUE}========================================${NC}" + echo + + if [ "$follow" = "true" ]; then + docker logs -f --tail "$lines" "$container_name" 2>/dev/null || echo -e "${RED}Service $service_name not found or not running${NC}" + else + docker logs --tail "$lines" "$container_name" 2>/dev/null || echo -e "${RED}Service $service_name not found or not running${NC}" + fi + fi +} + +# Exécution +main "$@" diff --git a/scripts/monitor-progress.sh b/scripts/monitor-progress.sh new file mode 100755 index 0000000..8fe98c6 --- /dev/null +++ b/scripts/monitor-progress.sh @@ -0,0 +1,186 @@ +#!/bin/bash + +# Script de monitoring de la progression des services LeCoffre Node +# Affiche la progression des différents processus (IBD, scans, etc.) + +set -e + +# Couleurs pour l'affichage +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +PURPLE='\033[0;35m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# Fonction pour afficher un header +print_header() { + echo -e "${BLUE}========================================${NC}" + echo -e "${BLUE} LeCoffre Node - Monitoring Progress${NC}" + echo -e "${BLUE}========================================${NC}" + echo +} + +# Fonction pour afficher le statut d'un service +print_service_status() { + local service_name="$1" + local container_name="$2" + local status=$(docker inspect --format='{{.State.Health.Status}}' "$container_name" 2>/dev/null || echo "no-healthcheck") + local running=$(docker inspect --format='{{.State.Running}}' "$container_name" 2>/dev/null || echo "false") + + if [ "$running" = "true" ]; then + case "$status" in + "healthy") + echo -e " ${GREEN}✓${NC} $service_name: ${GREEN}Ready${NC}" + ;; + "unhealthy") + echo -e " ${YELLOW}⚠${NC} $service_name: ${YELLOW}Starting/Processing${NC}" + ;; + "starting") + echo -e " ${YELLOW}⏳${NC} $service_name: ${YELLOW}Starting${NC}" + ;; + "no-healthcheck") + echo -e " ${BLUE}ℹ${NC} $service_name: ${BLUE}Running (no healthcheck)${NC}" + ;; + esac + else + echo -e " ${RED}✗${NC} $service_name: ${RED}Stopped${NC}" + fi +} + +# Fonction pour afficher la progression Bitcoin +show_bitcoin_progress() { + local container_name="bitcoin-signet" + if docker ps --format "table {{.Names}}" | grep -q "$container_name"; then + echo -e "${CYAN}Bitcoin Progress:${NC}" + local info=$(docker exec "$container_name" bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo 2>/dev/null || echo '{}') + local blocks=$(echo "$info" | jq -r '.blocks // 0') + local headers=$(echo "$info" | jq -r '.headers // 0') + local progress=0 + + if [ "$headers" -gt 0 ]; then + progress=$((blocks * 100 / headers)) + fi + + if [ "$blocks" -eq "$headers" ] && [ "$blocks" -gt 0 ]; then + echo -e " ${GREEN}✓ Bitcoin sync complete: $blocks blocks${NC}" + else + echo -e " ${YELLOW}⏳ Bitcoin IBD: $blocks/$headers blocks ($(($headers - $blocks)) remaining) - $progress%${NC}" + fi + echo + fi +} + +# Fonction pour afficher la progression BlindBit +show_blindbit_progress() { + local container_name="blindbit-oracle" + if docker ps --format "table {{.Names}}" | grep -q "$container_name"; then + echo -e "${CYAN}BlindBit Progress:${NC}" + local response=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8000/tweaks/1 2>/dev/null || echo "000") + case "$response" in + "200") + echo -e " ${GREEN}✓ BlindBit ready: Oracle service responding${NC}" + ;; + "000") + echo -e " ${YELLOW}⏳ BlindBit starting: Oracle service not yet ready${NC}" + ;; + *) + echo -e " ${YELLOW}⏳ BlindBit scanning: Oracle responding with code $response${NC}" + ;; + esac + echo + fi +} + +# Fonction pour afficher la progression SDK Relay +show_sdk_relay_progress() { + local container_name="sdk_relay" + if docker ps --format "table {{.Names}}" | grep -q "$container_name"; then + echo -e "${CYAN}SDK Relay Progress:${NC}" + local logs=$(docker logs "$container_name" --tail 5 2>/dev/null | grep -E "(waiting for|blocks to download|IBD)" | tail -1 || echo "") + if [ -n "$logs" ]; then + echo -e " ${YELLOW}⏳ SDK Relay IBD: $logs${NC}" + else + local response=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8091/ 2>/dev/null || echo "000") + if [ "$response" = "200" ]; then + echo -e " ${GREEN}✓ SDK Relay ready: WebSocket server responding${NC}" + else + echo -e " ${YELLOW}⏳ SDK Relay starting: WebSocket server not yet ready${NC}" + fi + fi + echo + fi +} + +# Fonction pour afficher la progression des autres services +show_other_services_progress() { + echo -e "${CYAN}Other Services Progress:${NC}" + + # SDK Storage + local storage_response=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8081/health 2>/dev/null || echo "000") + if [ "$storage_response" = "200" ]; then + echo -e " ${GREEN}✓ SDK Storage ready: API responding${NC}" + else + echo -e " ${YELLOW}⏳ SDK Storage starting: API not yet ready${NC}" + fi + + # SDK Signer + local signer_response=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:3001/ 2>/dev/null || echo "000") + if [ "$signer_response" = "101" ] || [ "$signer_response" = "426" ]; then + echo -e " ${GREEN}✓ SDK Signer ready: WebSocket server responding${NC}" + else + echo -e " ${YELLOW}⏳ SDK Signer starting: WebSocket server not yet ready${NC}" + fi + + # IHM Client + local ihm_response=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:3003/ 2>/dev/null || echo "000") + if [ "$ihm_response" = "200" ]; then + echo -e " ${GREEN}✓ IHM Client ready: Vite dev server responding${NC}" + else + echo -e " ${YELLOW}⏳ IHM Client starting: Vite dev server not yet ready${NC}" + fi + + # Grafana + local grafana_response=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:3005/api/health 2>/dev/null || echo "000") + if [ "$grafana_response" = "200" ]; then + echo -e " ${GREEN}✓ Grafana ready: Dashboard service responding${NC}" + else + echo -e " ${YELLOW}⏳ Grafana starting: Dashboard service not yet ready${NC}" + fi + + echo +} + +# Fonction principale +main() { + print_header + + echo -e "${PURPLE}Service Status:${NC}" + print_service_status "Tor Proxy" "tor-proxy" + print_service_status "Bitcoin Signet" "bitcoin-signet" + print_service_status "BlindBit Oracle" "blindbit-oracle" + print_service_status "SDK Storage" "sdk_storage" + print_service_status "SDK Relay" "sdk_relay" + print_service_status "SDK Signer" "sdk_signer" + print_service_status "LeCoffre Backend" "lecoffre-back" + print_service_status "LeCoffre Frontend" "lecoffre-front" + print_service_status "IHM Client" "ihm_client" + print_service_status "Grafana" "grafana" + print_service_status "Loki" "loki" + print_service_status "Promtail" "promtail" + print_service_status "Status API" "status-api" + echo + + show_bitcoin_progress + show_blindbit_progress + show_sdk_relay_progress + show_other_services_progress + + echo -e "${BLUE}========================================${NC}" + echo -e "${BLUE} Use 'docker logs ' for detailed logs${NC}" + echo -e "${BLUE}========================================${NC}" +} + +# Exécution +main "$@" diff --git a/scripts/start-with-progress.sh b/scripts/start-with-progress.sh new file mode 100755 index 0000000..59116bd --- /dev/null +++ b/scripts/start-with-progress.sh @@ -0,0 +1,199 @@ +#!/bin/bash + +# Script de démarrage des services LeCoffre Node avec suivi de la progression +# Démarre les services dans l'ordre correct et affiche la progression + +set -e + +# Couleurs pour l'affichage +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +PURPLE='\033[0;35m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# Fonction pour afficher un message +print_message() { + echo -e "${BLUE}[$(date '+%H:%M:%S')]${NC} $1" +} + +# Fonction pour attendre qu'un service soit healthy +wait_for_service() { + local service_name="$1" + local container_name="$2" + local max_wait="${3:-300}" # 5 minutes par défaut + local wait_time=0 + + print_message "Waiting for $service_name to be healthy..." + + while [ $wait_time -lt $max_wait ]; do + local status=$(docker inspect --format='{{.State.Health.Status}}' "$container_name" 2>/dev/null || echo "no-healthcheck") + local running=$(docker inspect --format='{{.State.Running}}' "$container_name" 2>/dev/null || echo "false") + + if [ "$running" = "true" ] && [ "$status" = "healthy" ]; then + print_message "${GREEN}✓ $service_name is healthy${NC}" + return 0 + elif [ "$running" = "false" ]; then + print_message "${RED}✗ $service_name is not running${NC}" + return 1 + fi + + # Afficher la progression pour Bitcoin + if [ "$service_name" = "Bitcoin Signet" ]; then + local info=$(docker exec "$container_name" bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo 2>/dev/null || echo '{}') + local blocks=$(echo "$info" | jq -r '.blocks // 0') + local headers=$(echo "$info" | jq -r '.headers // 0') + local progress=0 + + if [ "$headers" -gt 0 ]; then + progress=$((blocks * 100 / headers)) + fi + + if [ "$blocks" -eq "$headers" ] && [ "$blocks" -gt 0 ]; then + print_message "${GREEN}✓ Bitcoin sync complete: $blocks blocks${NC}" + return 0 + else + print_message "${YELLOW}⏳ Bitcoin IBD: $blocks/$headers blocks ($(($headers - $blocks)) remaining) - $progress%${NC}" + fi + fi + + # Afficher la progression pour BlindBit + if [ "$service_name" = "BlindBit Oracle" ]; then + local response=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8000/tweaks/1 2>/dev/null || echo "000") + case "$response" in + "200") + print_message "${GREEN}✓ BlindBit ready: Oracle service responding${NC}" + return 0 + ;; + "000") + print_message "${YELLOW}⏳ BlindBit starting: Oracle service not yet ready${NC}" + ;; + *) + print_message "${YELLOW}⏳ BlindBit scanning: Oracle responding with code $response${NC}" + ;; + esac + fi + + # Afficher la progression pour SDK Relay + if [ "$service_name" = "SDK Relay" ]; then + local logs=$(docker logs "$container_name" --tail 3 2>/dev/null | grep -E "(waiting for|blocks to download|IBD)" | tail -1 || echo "") + if [ -n "$logs" ]; then + print_message "${YELLOW}⏳ SDK Relay IBD: $logs${NC}" + else + local response=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8091/ 2>/dev/null || echo "000") + if [ "$response" = "200" ]; then + print_message "${GREEN}✓ SDK Relay ready: WebSocket server responding${NC}" + return 0 + else + print_message "${YELLOW}⏳ SDK Relay starting: WebSocket server not yet ready${NC}" + fi + fi + fi + + sleep 10 + wait_time=$((wait_time + 10)) + done + + print_message "${RED}✗ Timeout waiting for $service_name${NC}" + return 1 +} + +# Fonction pour démarrer un service +start_service() { + local service_name="$1" + print_message "Starting $service_name..." + + if docker compose --env-file .env.master up -d "$service_name"; then + print_message "${GREEN}✓ $service_name started${NC}" + return 0 + else + print_message "${RED}✗ Failed to start $service_name${NC}" + return 1 + fi +} + +# Fonction principale +main() { + echo -e "${BLUE}========================================${NC}" + echo -e "${BLUE} LeCoffre Node - Startup with Progress${NC}" + echo -e "${BLUE}========================================${NC}" + echo + + # Arrêter tous les services existants + print_message "Stopping existing services..." + docker compose --env-file .env.master down --remove-orphans + + # Démarrer les services dans l'ordre correct + print_message "Starting services in correct order..." + echo + + # 1. Tor + start_service "tor" + wait_for_service "Tor Proxy" "tor-proxy" 60 + + # 2. Bitcoin + start_service "bitcoin" + wait_for_service "Bitcoin Signet" "bitcoin-signet" 600 # 10 minutes pour Bitcoin + + # 3. BlindBit + start_service "blindbit" + wait_for_service "BlindBit Oracle" "blindbit-oracle" 300 + + # 4. SDK Storage + start_service "sdk_storage" + wait_for_service "SDK Storage" "sdk_storage" 120 + + # 5. SDK Relay + start_service "sdk_relay" + wait_for_service "SDK Relay" "sdk_relay" 600 # 10 minutes pour SDK Relay + + # 6. SDK Signer + start_service "sdk_signer" + wait_for_service "SDK Signer" "sdk_signer" 120 + + # 7. IHM Client + start_service "ihm_client" + wait_for_service "IHM Client" "ihm_client" 120 + + # 8. LeCoffre Backend + start_service "lecoffre-back" + wait_for_service "LeCoffre Backend" "lecoffre-back" 120 + + # 9. LeCoffre Frontend + start_service "lecoffre-front" + wait_for_service "LeCoffre Frontend" "lecoffre-front" 120 + + # 10. Services de monitoring + start_service "loki" + start_service "promtail" + start_service "grafana" + start_service "status-api" + start_service "watchtower" + + echo + print_message "${GREEN}✓ All services started successfully!${NC}" + echo + print_message "Use './scripts/monitor-progress.sh' to monitor progress" + print_message "Use './scripts/watch-progress.sh' for real-time monitoring" + echo + print_message "Testing external access..." + + # Tester l'accès externe + local services=("https://dev4.4nkweb.com/status/" "https://dev4.4nkweb.com/grafana/" "https://dev4.4nkweb.com/" "https://dev4.4nkweb.com/lecoffre/") + + for service in "${services[@]}"; do + if curl -s -o /dev/null -w '%{http_code}' "$service" | grep -q "200"; then + print_message "${GREEN}✓ $service is accessible${NC}" + else + print_message "${YELLOW}⚠ $service is not yet accessible${NC}" + fi + done + + echo + print_message "${GREEN}Startup complete!${NC}" +} + +# Exécution +main "$@" diff --git a/scripts/sync-configs.sh b/scripts/sync-configs.sh index 9e0a01d..eafdb58 100755 --- a/scripts/sync-configs.sh +++ b/scripts/sync-configs.sh @@ -31,7 +31,7 @@ log_error() { } # Répertoire racine du projet -PROJECT_ROOT="/home/debian/lecoffre_node" +PROJECT_ROOT="/home/debian/4NK_env/lecoffre_node" CONF_DIR="$PROJECT_ROOT/conf" # Vérifier que nous sommes dans le bon répertoire @@ -43,7 +43,7 @@ fi # Fonction pour synchroniser un projet sync_project() { local project_name="$1" - local project_path="/home/debian/$project_name" + local project_path="/home/debian/4NK_env/$project_name" log "Synchronisation de $project_name..." diff --git a/scripts/test-monitoring.sh b/scripts/test-monitoring.sh index 46bb180..caa2028 100755 --- a/scripts/test-monitoring.sh +++ b/scripts/test-monitoring.sh @@ -7,7 +7,7 @@ echo "🔍 Test de connectivité du monitoring..." # Test Grafana echo "Test Grafana..." -if curl -s http://localhost:3005/api/health >/dev/null 2>&1; then +if curl -s http://localhost:3000/api/health >/dev/null 2>&1; then echo "✅ Grafana: OK" else echo "❌ Grafana: Non accessible" diff --git a/scripts/watch-progress.sh b/scripts/watch-progress.sh new file mode 100755 index 0000000..45d9ebd --- /dev/null +++ b/scripts/watch-progress.sh @@ -0,0 +1,159 @@ +#!/bin/bash + +# Script de surveillance en temps réel de la progression des services LeCoffre Node +# Affiche la progression des différents processus (IBD, scans, etc.) en continu + +set -e + +# Couleurs pour l'affichage +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +PURPLE='\033[0;35m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# Fonction pour effacer l'écran et afficher le header +clear_and_header() { + clear + echo -e "${BLUE}========================================${NC}" + echo -e "${BLUE} LeCoffre Node - Live Progress Monitor${NC}" + echo -e "${BLUE}========================================${NC}" + echo -e "${YELLOW}Last updated: $(date)${NC}" + echo +} + +# Fonction pour afficher la progression Bitcoin +show_bitcoin_progress() { + local container_name="bitcoin-signet" + if docker ps --format "table {{.Names}}" | grep -q "$container_name"; then + echo -e "${CYAN}Bitcoin Progress:${NC}" + local info=$(docker exec "$container_name" bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo 2>/dev/null || echo '{}') + local blocks=$(echo "$info" | jq -r '.blocks // 0') + local headers=$(echo "$info" | jq -r '.headers // 0') + local progress=0 + + if [ "$headers" -gt 0 ]; then + progress=$((blocks * 100 / headers)) + fi + + if [ "$blocks" -eq "$headers" ] && [ "$blocks" -gt 0 ]; then + echo -e " ${GREEN}✓ Bitcoin sync complete: $blocks blocks${NC}" + else + echo -e " ${YELLOW}⏳ Bitcoin IBD: $blocks/$headers blocks ($(($headers - $blocks)) remaining) - $progress%${NC}" + + # Afficher une barre de progression + local bar_length=50 + local filled_length=$((progress * bar_length / 100)) + local bar="" + for ((i=0; i/dev/null | grep -E "(waiting for|blocks to download|IBD)" | tail -1 || echo "") + if [ -n "$logs" ]; then + echo -e " ${YELLOW}⏳ SDK Relay IBD: $logs${NC}" + else + local response=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8091/ 2>/dev/null || echo "000") + if [ "$response" = "200" ]; then + echo -e " ${GREEN}✓ SDK Relay ready: WebSocket server responding${NC}" + else + echo -e " ${YELLOW}⏳ SDK Relay starting: WebSocket server not yet ready${NC}" + fi + fi + echo + fi +} + +# Fonction pour afficher le statut des services +show_services_status() { + echo -e "${PURPLE}Services Status:${NC}" + + # Services critiques + local services=("tor-proxy:Tor Proxy" "bitcoin-signet:Bitcoin Signet" "blindbit-oracle:BlindBit Oracle" "sdk_storage:SDK Storage" "sdk_relay:SDK Relay" "sdk_signer:SDK Signer" "ihm_client:IHM Client") + + for service in "${services[@]}"; do + local container_name="${service%%:*}" + local display_name="${service##*:}" + local status=$(docker inspect --format='{{.State.Health.Status}}' "$container_name" 2>/dev/null || echo "no-healthcheck") + local running=$(docker inspect --format='{{.State.Running}}' "$container_name" 2>/dev/null || echo "false") + + if [ "$running" = "true" ]; then + case "$status" in + "healthy") + echo -e " ${GREEN}✓${NC} $display_name: ${GREEN}Ready${NC}" + ;; + "unhealthy") + echo -e " ${YELLOW}⚠${NC} $display_name: ${YELLOW}Processing${NC}" + ;; + "starting") + echo -e " ${YELLOW}⏳${NC} $display_name: ${YELLOW}Starting${NC}" + ;; + "no-healthcheck") + echo -e " ${BLUE}ℹ${NC} $display_name: ${BLUE}Running${NC}" + ;; + esac + else + echo -e " ${RED}✗${NC} $display_name: ${RED}Stopped${NC}" + fi + done + echo +} + +# Fonction pour afficher les services en attente +show_waiting_services() { + echo -e "${PURPLE}Services Waiting for Dependencies:${NC}" + + # Vérifier les services LeCoffre + local lecoffre_back=$(docker inspect --format='{{.State.Running}}' "lecoffre-back" 2>/dev/null || echo "false") + local lecoffre_front=$(docker inspect --format='{{.State.Running}}' "lecoffre-front" 2>/dev/null || echo "false") + + if [ "$lecoffre_back" = "false" ]; then + echo -e " ${YELLOW}⏳ LeCoffre Backend: Waiting for SDK Relay${NC}" + fi + + if [ "$lecoffre_front" = "false" ]; then + echo -e " ${YELLOW}⏳ LeCoffre Frontend: Waiting for LeCoffre Backend${NC}" + fi + + echo +} + +# Fonction principale +main() { + clear_and_header + show_bitcoin_progress + show_sdk_relay_progress + show_services_status + show_waiting_services + + echo -e "${BLUE}========================================${NC}" + echo -e "${BLUE} Press Ctrl+C to stop monitoring${NC}" + echo -e "${BLUE} Refresh every 10 seconds${NC}" + echo -e "${BLUE}========================================${NC}" +} + +# Fonction de nettoyage +cleanup() { + echo -e "\n${YELLOW}Monitoring stopped.${NC}" + exit 0 +} + +# Gestion des signaux +trap cleanup SIGINT SIGTERM + +# Boucle principale +while true; do + main + sleep 10 +done diff --git a/test_env.sh b/test_env.sh new file mode 100755 index 0000000..4373277 --- /dev/null +++ b/test_env.sh @@ -0,0 +1,17 @@ +#!/bin/bash +echo "Testing environment variables in sdk_relay container..." +docker compose --env-file .env.master run --rm --no-deps --entrypoint="" sdk_relay sh -c " +echo 'Environment variables:' +env | grep -E '(CORE_URL|WS_URL|WALLET_NAME|NETWORK)' | sort +echo '' +echo 'File content:' +cat /home/bitcoin/.conf +echo '' +echo 'Testing Rust config parsing...' +echo 'core_url=http://bitcoin:38332' > /tmp/test.conf +echo 'ws_url=0.0.0.0:8090' >> /tmp/test.conf +echo 'wallet_name=default' >> /tmp/test.conf +echo 'network=signet' >> /tmp/test.conf +echo 'Test file created:' +cat /tmp/test.conf +"