ci: docker_tag=ext - Update configurations and monitoring scripts for deployment
This commit is contained in:
parent
282cdae489
commit
2af9890b07
179
.env.master
179
.env.master
@ -1,24 +1,25 @@
|
|||||||
# ===========================================
|
|
||||||
# VARIABLES D'ENVIRONNEMENT MASTER LECOFFRE
|
|
||||||
# ===========================================
|
|
||||||
|
|
||||||
# Variables d'environnement pour l'application back-end
|
# Variables d'environnement pour l'application back-end
|
||||||
NODE_OPTIONS=--max-old-space-size=2048
|
NODE_OPTIONS=--max-old-space-size=2048
|
||||||
NODE_ENV=production
|
NODE_ENV=production
|
||||||
|
|
||||||
# Configuration IDNOT
|
# Configuration IDNOT
|
||||||
IDNOT_ANNUARY_BASE_URL=https://qual-api.notaires.fr/annuaire
|
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_REDIRECT_URI=http://local.4nkweb.com:3000/authorized-client
|
||||||
IDNOT_TOKEN_URL=https://qual-connexion.idnot.fr/user/IdPOAuth2/token/idnot_idp_v1
|
IDNOT_TOKEN_URL=https://qual-connexion.idnot.fr/user/IdPOAuth2/token/idnot_idp_v1
|
||||||
IDNOT_API_BASE_URL=https://qual-api.notaires.fr
|
IDNOT_API_BASE_URL=https://qual-api.notaires.fr
|
||||||
|
|
||||||
# Configuration serveur
|
# Configuration serveur
|
||||||
APP_HOST=dev4.4nkweb.com
|
APP_HOST=dev4.4nkweb.com
|
||||||
|
# API_BASE_URL=https://demo.4nkweb.com/back
|
||||||
API_BASE_URL=https://dev4.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
|
DEFAULT_STORAGE=https://dev4.4nkweb.com/storage
|
||||||
|
|
||||||
# Variables d'environnement pour l'application front-end
|
# 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_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_FRONT_APP_HOST=https://dev4.4nkweb.com/lecoffre
|
||||||
NEXT_PUBLIC_IDNOT_BASE_URL=https://qual-connexion.idnot.fr
|
NEXT_PUBLIC_IDNOT_BASE_URL=https://qual-connexion.idnot.fr
|
||||||
NEXT_PUBLIC_IDNOT_AUTHORIZE_ENDPOINT=/IdPOAuth2/authorize/idnot_idp_v1
|
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_PORT=443
|
||||||
NEXT_PUBLIC_BACK_API_ROOT_URL=/api
|
NEXT_PUBLIC_BACK_API_ROOT_URL=/api
|
||||||
NEXT_PUBLIC_BACK_API_VERSION=v1
|
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
|
||||||
|
|
||||||
# ===========================================
|
NEXT_PUBLIC_DOCAPOSTE_API_URL=
|
||||||
# VARIABLES SDK_RELAY
|
NEXT_PUBLIC_API_URL=https://dev4.4nkweb.com/api
|
||||||
# ===========================================
|
NEXT_PUBLIC_DEFAULT_VALIDATOR_ID=28c9a3a8151bef545ebf700ca5222c63d0031ad593097e95c1de202464304a99
|
||||||
SDK_RELAY_CORE_URL=http://bitcoin:38332
|
NEXT_PUBLIC_DEFAULT_STORAGE_URLS=https://dev4.4nkweb.com/storage
|
||||||
SDK_RELAY_WS_URL=0.0.0.0:8090
|
|
||||||
SDK_RELAY_WALLET_NAME=default
|
# WS
|
||||||
SDK_RELAY_NETWORK=signet
|
# RELAY_URLS=wss://demo.4nkweb.com/ws
|
||||||
SDK_RELAY_BLINDBIT_URL=http://blindbit-proxy:8000
|
RELAY_URLS=wss://dev4.4nkweb.com/ws/,wss://dev3.4nkweb.com/ws/
|
||||||
SDK_RELAY_ZMQ_URL=tcp://bitcoin:29000
|
|
||||||
SDK_RELAY_STORAGE=https://dev4.4nkweb.com/storage
|
# SIGNER_WS_URL=ws://dev4.4nkweb.com/signer/
|
||||||
SDK_RELAY_DATA_DIR=/home/bitcoin/.4nk
|
SIGNER_WS_URL=ws://dev3.4nkweb.com:9090
|
||||||
SDK_RELAY_BITCOIN_DATA_DIR=/home/bitcoin/.bitcoin
|
SIGNER_BASE_URL=https://dev3.4nkweb.com
|
||||||
SDK_RELAY_BOOTSTRAP_URL=ws://dev3.4nkweb.com:8090
|
|
||||||
SDK_RELAY_BOOTSTRAP_FAUCET=true
|
# IHM URLS
|
||||||
SDK_RELAY_RUST_LOG=DEBUG,reqwest=DEBUG,tokio_tungstenite=DEBUG
|
# 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
|
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_PORT=9090
|
||||||
SIGNER_DATABASE_PATH=./data/server.db
|
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_AUTO_RESTART=true
|
||||||
SIGNER_MAX_RESTARTS=3
|
SIGNER_MAX_RESTARTS=3
|
||||||
SIGNER_LOG_LEVEL=info
|
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_API_BASE_URL=https://dev4.4nkweb.com/back/api/v1
|
||||||
VITE_WS_URL=wss://dev4.4nkweb.com/ws/
|
VITE_WS_URL=wss://dev4.4nkweb.com/ws/
|
||||||
VITE_STORAGE_URL=https://dev4.4nkweb.com/storage
|
VITE_STORAGE_URL=https://dev4.4nkweb.com/storage
|
||||||
VITE_SIGNER_URL=https://dev4.4nkweb.com/signer
|
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
|
# VARIABLES MONITORING
|
||||||
# ===========================================
|
# ===========================================
|
||||||
@ -111,3 +154,9 @@ GRAFANA_ADMIN_USER=admin
|
|||||||
GRAFANA_ADMIN_PASSWORD=admin123
|
GRAFANA_ADMIN_PASSWORD=admin123
|
||||||
LOKI_URL=http://loki:3100
|
LOKI_URL=http://loki:3100
|
||||||
PROMTAIL_CONFIG_FILE=/etc/promtail/config.yml
|
PROMTAIL_CONFIG_FILE=/etc/promtail/config.yml
|
||||||
|
|
||||||
|
# ===========================================
|
||||||
|
# VARIABLES MANQUANTES POUR DOCKER-COMPOSE
|
||||||
|
# ===========================================
|
||||||
|
# Mailchimp
|
||||||
|
MAILCHIMP_SERVER_PREFIX=us17
|
||||||
|
92
.gitignore
vendored
92
.gitignore
vendored
@ -1,82 +1,14 @@
|
|||||||
# Secrets et fichiers sensibles
|
|
||||||
.env
|
.env
|
||||||
.env.*
|
!.env.master
|
||||||
!.env.example
|
miner/.env
|
||||||
!.env.exemple
|
miner/signet/priv_key.json
|
||||||
env.master
|
|
||||||
*.key
|
|
||||||
*.pem
|
|
||||||
*.p12
|
|
||||||
*.pfx
|
|
||||||
secrets/
|
|
||||||
keys/
|
|
||||||
|
|
||||||
# Logs
|
# Sensibles et générés
|
||||||
logs/
|
.cursor/
|
||||||
*.log
|
log/*.log
|
||||||
npm-debug.log*
|
miner/.env.signet
|
||||||
yarn-debug.log*
|
miner/tools/*.json
|
||||||
yarn-error.log*
|
conf/nginx/*bak*
|
||||||
|
conf/nginx/*.tmp
|
||||||
# Données et volumes
|
conf/nginx/*.clean
|
||||||
data/
|
.env.bak
|
||||||
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
|
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
core_url="http://bitcoin:38332"
|
core_url=http://bitcoin:38332
|
||||||
ws_url="0.0.0.0:8090"
|
ws_url=0.0.0.0:8090
|
||||||
wallet_name="default"
|
wallet_name=default
|
||||||
network="signet"
|
network=signet
|
||||||
blindbit_url="http://blindbit-oracle:8000"
|
blindbit_url=http://blindbit-oracle:8000
|
||||||
zmq_url="tcp://bitcoin:29000"
|
zmq_url=tcp://bitcoin:29000
|
||||||
storage="https://dev4.4nkweb.com/storage"
|
storage=https://dev4.4nkweb.com/storage
|
||||||
data_dir="/home/bitcoin/.4nk"
|
data_dir=/app/.4nk
|
||||||
bitcoin_data_dir="/home/bitcoin/.bitcoin"
|
bitcoin_data_dir=/app/.bitcoin
|
||||||
bootstrap_url="wss://dev3.4nkweb.com/ws/"
|
bootstrap_url=wss://dev3.4nkweb.com/ws/
|
||||||
bootstrap_faucet=true
|
bootstrap_faucet=true
|
||||||
|
@ -6,6 +6,11 @@ services:
|
|||||||
btcnet:
|
btcnet:
|
||||||
aliases:
|
aliases:
|
||||||
- tor
|
- 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
|
restart: unless-stopped
|
||||||
|
|
||||||
bitcoin:
|
bitcoin:
|
||||||
@ -27,7 +32,7 @@ services:
|
|||||||
chown -R bitcoin:bitcoin /home/bitcoin/.bitcoin || echo 'warn: chown partiel (fichiers bind-mount Windows)';
|
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"
|
exec su-exec bitcoin bitcoind -conf=/etc/bitcoin/bitcoin.conf -signet"
|
||||||
healthcheck:
|
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
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
@ -54,7 +59,7 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- "0.0.0.0:8000:8000"
|
- "0.0.0.0:8000:8000"
|
||||||
healthcheck:
|
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
|
interval: 15s
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 10
|
retries: 10
|
||||||
@ -67,9 +72,9 @@ services:
|
|||||||
blindbit:
|
blindbit:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
volumes:
|
volumes:
|
||||||
- ./conf/relay/sdk_relay.conf:/home/bitcoin/.conf:ro
|
- ./conf/relay/sdk_relay.conf:/app/.conf:ro
|
||||||
- sdk_data:/home/bitcoin/.4nk
|
- sdk_data:/app/.4nk
|
||||||
- bitcoin_data:/home/bitcoin/.bitcoin
|
- bitcoin_data:/app/.bitcoin
|
||||||
- ./scripts/funds:/scripts/funds:ro
|
- ./scripts/funds:/scripts/funds:ro
|
||||||
- ./logs/sdk_relay:/var/log/sdk_relay
|
- ./logs/sdk_relay:/var/log/sdk_relay
|
||||||
ports:
|
ports:
|
||||||
@ -85,8 +90,7 @@ services:
|
|||||||
max-size: "10m"
|
max-size: "10m"
|
||||||
max-file: "3"
|
max-file: "3"
|
||||||
environment:
|
environment:
|
||||||
- NODE_OPTIONS=${NODE_OPTIONS}
|
- HOME=/app
|
||||||
- HOME=/home/bitcoin
|
|
||||||
- CORE_URL=${SDK_RELAY_CORE_URL}
|
- CORE_URL=${SDK_RELAY_CORE_URL}
|
||||||
- WS_URL=${SDK_RELAY_WS_URL}
|
- WS_URL=${SDK_RELAY_WS_URL}
|
||||||
- WALLET_NAME=${SDK_RELAY_WALLET_NAME}
|
- WALLET_NAME=${SDK_RELAY_WALLET_NAME}
|
||||||
@ -98,10 +102,9 @@ services:
|
|||||||
- BITCOIN_DATA_DIR=${SDK_RELAY_BITCOIN_DATA_DIR}
|
- BITCOIN_DATA_DIR=${SDK_RELAY_BITCOIN_DATA_DIR}
|
||||||
- BOOTSTRAP_URL=${SDK_RELAY_BOOTSTRAP_URL}
|
- BOOTSTRAP_URL=${SDK_RELAY_BOOTSTRAP_URL}
|
||||||
- BOOTSTRAP_FAUCET=${SDK_RELAY_BOOTSTRAP_FAUCET}
|
- BOOTSTRAP_FAUCET=${SDK_RELAY_BOOTSTRAP_FAUCET}
|
||||||
- RUST_LOG=${SDK_RELAY_RUST_LOG}
|
|
||||||
- RUST_LOG=INFO
|
- RUST_LOG=INFO
|
||||||
healthcheck:
|
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
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
@ -145,7 +148,7 @@ services:
|
|||||||
user: appuser
|
user: appuser
|
||||||
command: ["node", "dist/server.js"]
|
command: ["node", "dist/server.js"]
|
||||||
healthcheck:
|
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
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 5
|
retries: 5
|
||||||
@ -184,7 +187,7 @@ services:
|
|||||||
user: lecoffreuser
|
user: lecoffreuser
|
||||||
command: ["node", "server.js"]
|
command: ["node", "server.js"]
|
||||||
healthcheck:
|
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
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
@ -217,7 +220,7 @@ services:
|
|||||||
user: root
|
user: root
|
||||||
command: ["npm", "start"]
|
command: ["npm", "start"]
|
||||||
healthcheck:
|
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
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
@ -239,6 +242,12 @@ services:
|
|||||||
- sdk_signer
|
- sdk_signer
|
||||||
user: appuser
|
user: appuser
|
||||||
command: ["node", "/app/dist/index.js"]
|
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:
|
labels:
|
||||||
- "com.centurylinklabs.watchtower.enable=true"
|
- "com.centurylinklabs.watchtower.enable=true"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
@ -261,7 +270,7 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- ./logs/sdk_storage:/var/log/sdk_storage
|
- ./logs/sdk_storage:/var/log/sdk_storage
|
||||||
healthcheck:
|
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
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
@ -323,6 +332,12 @@ services:
|
|||||||
btcnet:
|
btcnet:
|
||||||
aliases:
|
aliases:
|
||||||
- grafana
|
- 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:
|
labels:
|
||||||
- "com.centurylinklabs.watchtower.enable=true"
|
- "com.centurylinklabs.watchtower.enable=true"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
@ -339,6 +354,12 @@ services:
|
|||||||
btcnet:
|
btcnet:
|
||||||
aliases:
|
aliases:
|
||||||
- loki
|
- 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
|
restart: unless-stopped
|
||||||
|
|
||||||
promtail:
|
promtail:
|
||||||
@ -353,6 +374,12 @@ services:
|
|||||||
btcnet:
|
btcnet:
|
||||||
aliases:
|
aliases:
|
||||||
- promtail
|
- 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
|
restart: unless-stopped
|
||||||
|
|
||||||
# Service de statut des services
|
# Service de statut des services
|
||||||
@ -369,6 +396,12 @@ services:
|
|||||||
btcnet:
|
btcnet:
|
||||||
aliases:
|
aliases:
|
||||||
- status-api
|
- 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:
|
labels:
|
||||||
- "com.centurylinklabs.watchtower.enable=true"
|
- "com.centurylinklabs.watchtower.enable=true"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
@ -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
|
|
||||||
|
|
@ -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.
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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** ! 🎉
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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.
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
Subproject commit 66479e38ceb34ed21f40272172cb060899ba1cc9
|
|
0
logs/bitcoin/bitcoin.log
Normal file → Executable file
0
logs/bitcoin/bitcoin.log
Normal file → Executable file
0
logs/blindbit/blindbit.log
Normal file → Executable file
0
logs/blindbit/blindbit.log
Normal file → Executable file
1
logs/docker-compose.log
Executable file
1
logs/docker-compose.log
Executable file
@ -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
|
0
logs/ihm_client/ihm_client.log
Normal file → Executable file
0
logs/ihm_client/ihm_client.log
Normal file → Executable file
0
logs/lecoffre-back/lecoffre-back.log
Normal file → Executable file
0
logs/lecoffre-back/lecoffre-back.log
Normal file → Executable file
0
logs/lecoffre-front/lecoffre-front.log
Normal file → Executable file
0
logs/lecoffre-front/lecoffre-front.log
Normal file → Executable file
0
logs/miner/miner.log
Normal file → Executable file
0
logs/miner/miner.log
Normal file → Executable file
0
logs/nginx/access.log
Executable file
0
logs/nginx/access.log
Executable file
0
logs/nginx/error.log
Executable file
0
logs/nginx/error.log
Executable file
0
logs/nginx/nginx.log
Normal file → Executable file
0
logs/nginx/nginx.log
Normal file → Executable file
0
logs/sdk_relay/sdk_relay.log
Normal file → Executable file
0
logs/sdk_relay/sdk_relay.log
Normal file → Executable file
0
logs/sdk_signer/sdk_signer.log
Normal file → Executable file
0
logs/sdk_signer/sdk_signer.log
Normal file → Executable file
0
logs/sdk_storage/sdk_storage.log
Normal file → Executable file
0
logs/sdk_storage/sdk_storage.log
Normal file → Executable file
0
logs/tor/tor.log
Normal file → Executable file
0
logs/tor/tor.log
Normal file → Executable file
@ -1,11 +1,11 @@
|
|||||||
core_url="http://bitcoin:38332"
|
core_url=http://bitcoin:38332
|
||||||
ws_url="0.0.0.0:8090"
|
ws_url=0.0.0.0:8090
|
||||||
wallet_name="default"
|
wallet_name=default
|
||||||
network="signet"
|
network=signet
|
||||||
blindbit_url="http://blindbit-oracle:8000"
|
blindbit_url=http://blindbit-oracle:8000
|
||||||
zmq_url="tcp://bitcoin:29000"
|
zmq_url=tcp://bitcoin:29000
|
||||||
storage="https://dev4.4nkweb.com/storage"
|
storage=https://dev4.4nkweb.com/storage
|
||||||
data_dir="/home/bitcoin/.4nk"
|
data_dir=/app/.4nk
|
||||||
bitcoin_data_dir="/home/bitcoin/.bitcoin"
|
bitcoin_data_dir=/app/.bitcoin
|
||||||
bootstrap_url="wss://dev3.4nkweb.com/ws/"
|
bootstrap_url=wss://dev3.4nkweb.com/ws/
|
||||||
bootstrap_faucet=true
|
bootstrap_faucet=true
|
||||||
|
254
scripts/logs-with-progress.sh
Executable file
254
scripts/logs-with-progress.sh
Executable file
@ -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<filled_length; i++)); do bar+="█"; done
|
||||||
|
for ((i=filled_length; i<bar_length; i++)); do bar+="░"; done
|
||||||
|
echo -e "${YELLOW}[$bar] $progress%${NC}"
|
||||||
|
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
|
||||||
|
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 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 "$@"
|
186
scripts/monitor-progress.sh
Executable file
186
scripts/monitor-progress.sh
Executable file
@ -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 <container_name>' for detailed logs${NC}"
|
||||||
|
echo -e "${BLUE}========================================${NC}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Exécution
|
||||||
|
main "$@"
|
199
scripts/start-with-progress.sh
Executable file
199
scripts/start-with-progress.sh
Executable file
@ -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 "$@"
|
@ -31,7 +31,7 @@ log_error() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Répertoire racine du projet
|
# Répertoire racine du projet
|
||||||
PROJECT_ROOT="/home/debian/lecoffre_node"
|
PROJECT_ROOT="/home/debian/4NK_env/lecoffre_node"
|
||||||
CONF_DIR="$PROJECT_ROOT/conf"
|
CONF_DIR="$PROJECT_ROOT/conf"
|
||||||
|
|
||||||
# Vérifier que nous sommes dans le bon répertoire
|
# Vérifier que nous sommes dans le bon répertoire
|
||||||
@ -43,7 +43,7 @@ fi
|
|||||||
# Fonction pour synchroniser un projet
|
# Fonction pour synchroniser un projet
|
||||||
sync_project() {
|
sync_project() {
|
||||||
local project_name="$1"
|
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..."
|
log "Synchronisation de $project_name..."
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ echo "🔍 Test de connectivité du monitoring..."
|
|||||||
|
|
||||||
# Test Grafana
|
# Test Grafana
|
||||||
echo "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"
|
echo "✅ Grafana: OK"
|
||||||
else
|
else
|
||||||
echo "❌ Grafana: Non accessible"
|
echo "❌ Grafana: Non accessible"
|
||||||
|
159
scripts/watch-progress.sh
Executable file
159
scripts/watch-progress.sh
Executable file
@ -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<filled_length; i++)); do bar+="█"; done
|
||||||
|
for ((i=filled_length; i<bar_length; i++)); do bar+="░"; done
|
||||||
|
echo -e " ${YELLOW}[$bar] $progress%${NC}"
|
||||||
|
fi
|
||||||
|
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 3 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 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
|
17
test_env.sh
Executable file
17
test_env.sh
Executable file
@ -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
|
||||||
|
"
|
Loading…
x
Reference in New Issue
Block a user