auto_clea

This commit is contained in:
Nicolas Cantu 2025-09-25 12:42:13 +00:00
parent 30eb038079
commit ab630f28d9
67 changed files with 57 additions and 4043 deletions

View File

@ -1,14 +0,0 @@
{
"language": "fr",
"shell": "/usr/bin/bash",
"formatting": {
"markdown": {
"lint_strict": true
}
},
"ci": {
"trigger_commit_prefix": "ci: docker_tag=",
"default_tag": "ext",
"branch": "dev4"
}
}

View File

@ -1,20 +0,0 @@
# API backend - route /back/ vers /api/ du backend
location ~* ^/back/(.*)$ {
proxy_pass http://127.0.0.1:8080/api/$1;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection "";
proxy_buffering off;
}
# API direct - route /api/ vers le backend
location /api/ {
proxy_pass http://127.0.0.1:8080/api/;
include /etc/nginx/proxy_params;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_send_timeout 300;
}

View File

@ -1,10 +0,0 @@
# Règles Cursor pour ce projet
- Toujours répondre en français.
- Commandes simples, une par une.
- CI front/back: déclenchement par commit `ci: docker_tag=ext` sur `dev4`.
- Nginx local obligatoire. Confs dans `conf/nginx/`. Pas de Docker pour Nginx.
- Avant modification Nginx: vérifier `-w` sur fichier, backup horodatée vers `.cursor/backup/`, édition atomique (temp + mv), `nginx -t`, reload.
- Docker images: utiliser le tag `docker-support-v2` si spécifié par projet, sinon `ext`.
- Toujours mettre à jour `docs/` et `tests/` après modifications.
- Ne jamais exposer de secrets dans les `.env.example` côté front.

View File

@ -1,181 +0,0 @@
# DOMAIN
DOMAIN=dev4.4nkweb.com
BOOTSTRAP_DOMAIN=dev3.4nkweb.com
LOCAL_DOMAIN=local.4nkweb.com
LECOFFRE_BACK_DOMAIN=dev3.4nkweb.com
basePath=/lecoffre
assetPrefix=/lecoffre
trailingSlash=true
# GIT
GITEA_BASE_URL=git.4nkweb.com
GIT_TOKEN=8cde80690a5ffd737536d82a1ab16a765d5105df
GITEA_OWNER="nicolas.cantu,Omar"
GITEA_RUNNER_NAME=debian-runner
# Variables d'environnement pour l'application back-end
NODE_ENV=production
RUST_LOG=DEBUG
NODE_OPTIONS=--max-old-space-size=2048
# Configuration serveur
APP_HOST=dev4.4nkweb.com
API_BASE_URL=https://dev3.4nkweb.com/back
DEFAULT_STORAGE=https://dev4.4nkweb.com/storage
# Variables d'environnement pour l'application front-end
# IHM URLS
VITE_BOOTSTRAPURL=wss://dev3.4nkweb.com/ws/
# Cartes de test Stripe
SUCCES='4242 4242 4242 4242'
DECLINED='4000 0025 0000 3155'
CORS_ALLOWED_ORIGINS=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
# ================== /!\ sensible =========================
# Configuration IDNOT
VITE_JWT_SECRET_KEY=52b3d77617bb00982dfee15b08effd52cfe5b2e69b2f61cc4848cfe1e98c0bc9
# Configuration pour réduire les traces Docker
DOCKER_LOG_LEVEL=info
COMPOSE_LOG_LEVEL=WARNING
# ===========================================
# VARIABLES(manquantes)
# ===========================================
SIGNER_WS_URL=ws://dev3.4nkweb.com:9090
SIGNER_BASE_URL=https://dev3.4nkweb.com
SIGNER_API_KEY=your-api-key-change-this
SIGNER_PORT=9090
SIGNER_DATABASE_PATH=./data/server.db
SIGNER_RELAY_URLS=wss://dev4.4nkweb.com/ws/,wss://dev3.4nkweb.com/ws/
SIGNER_AUTO_RESTART=true
SIGNER_MAX_RESTARTS=3
SIGNER_LOG_LEVEL=info
# ===========================================
# VARIABLES SDK_RELAY (formatées pour docker-compose)
# ===========================================
RELAY_URLS=wss://dev4.4nkweb.com/ws/,wss://dev3.4nkweb.com/ws/
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_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
SDK_RELAY_BLINDBIT_URL=http://blindbit-oracle:8000
# ===========================================
# VARIABLES IHM_CLIENT (formatées pour docker-compose)
# ===========================================
VITE_API_BASE_URL=https://dev3.4nkweb.com/back/api/v1
VITE_WS_URL=wss://dev4.4nkweb.com/ws/
VITE_STORAGE_URL=https://dev4.4nkweb.com/storage
VITE_SIGNER_URL=https://dev3.4nkweb.com/signer
# ===========================================
# VARIABLES MONITORING
# ===========================================
GRAFANA_ADMIN_USER=admin
GRAFANA_ADMIN_PASSWORD=admin123
LOKI_URL=http://loki:3100
PROMTAIL_CONFIG_FILE=/etc/promtail/config.yml
# ===========================================
# GRAFANA
# ===========================================
GF_SECURITY_ADMIN_PASSWORD=Fuy8ZfxQI2xdSdoB8wsGxNjyU
GF_USERS_ALLOW_SIGN_UP=false
GF_SERVER_ROOT_URL=https://dev4.4nkweb.com/grafana/
GF_PLUGINS_PREINSTALL_SYNC=grafana-clock-panel,grafana-simple-json-datasource
# Frontend runtime
NODE_OPTIONS=--max-old-space-size=4096
NODE_ENV=production
# Public URLs
NEXT_PUBLIC_4NK_IFRAME_URL=https://dev4.4nkweb.com
# Back base for state endpoint (dev3)
NEXT_PUBLIC_BACK_BASE=https://dev3.4nkweb.com
OVH_APP_KEY=5ab0709bbb65ef26
OVH_APP_SECRET=de1fac1779d707d263a611a557cd5766
OVH_CONSUMER_KEY=5fe817829b8a9c780cfa2354f8312ece
OVH_SMS_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_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
# Configuration back-end
IDNOT_CLIENT_ID=B3CE56353EDB15A9
IDNOT_CLIENT_SECRET=3F733549E879878344B6C949B366BB5CDBB2DB5B7F7AB7EBBEBB0F0DD0776D1C
IDNOT_REDIRECT_URI=https://lecoffreio.4nkweb.com/authorized-client
IDNOT_TOKEN_URL=https://qual-connexion.idnot.fr/user/IdPOAuth2/token/idnot_idp_v1
IDNOT_API_BASE_URL=https://qual-api.notaires.fr
# Configuration front-end
NEXT_PUBLIC_IDNOT_REDIRECT_URI_FIXED=https://lecoffreio.4nkweb.com/authorized-client
NEXT_PUBLIC_4NK_URL=https://dev4.4nkweb.com
NEXT_PUBLIC_FRONT_APP_HOST=https://dev4.4nkweb.com/lecoffre
NEXT_PUBLIC_IDNOT_BASE_URL=https://qual-connexion.idnot.fr
NEXT_PUBLIC_IDNOT_AUTHORIZE_ENDPOINT=/IdPOAuth2/authorize/idnot_idp_v1
NEXT_PUBLIC_IDNOT_CLIENT_ID=B3CE56353EDB15A9
NEXT_PUBLIC_BACK_API_PROTOCOL=https
NEXT_PUBLIC_BACK_API_HOST=dev3.4nkweb.com
NEXT_PUBLIC_BACK_API_PORT=443
NEXT_PUBLIC_BACK_API_ROOT_URL=/api
NEXT_PUBLIC_BACK_API_VERSION=v1
NEXT_PUBLIC_ANK_BASE_REDIRECT_URI=https://dev4.4nkweb.com
NEXT_PUBLIC_TARGET_ORIGIN=https://dev4.4nkweb.com/lecoffre
NEXT_PUBLIC_IDNOT_REDIRECT_URI=https://lecoffreio.4nkweb.com/authorized-client
NEXT_PUBLIC_DOCAPOSTE_API_URL=
NEXT_PUBLIC_API_URL=https://dev3.4nkweb.com/api
NEXT_PUBLIC_DEFAULT_VALIDATOR_ID=28c9a3a8151bef545ebf700ca5222c63d0031ad593097e95c1de202464304a99
NEXT_PUBLIC_DEFAULT_STORAGE_URLS=https://dev4.4nkweb.com/storage
BACK_API_ROOT_URL=/api
BACK_API_VERSION=/v1
# Configuration idnot
IDNOT_ANNUARY_BASE_URL='https://qual-api.notaires.fr/annuaire'
IDNOT_API_KEY=ba557f84-0bf6-4dbf-844f-df2767555e3e
# 96b8b46a-ff67-4325-b8b4-6aff67e32542
ALLOW_LOCALHOST_REDIRECTS=false
BACK_HMAC_SECRET=7e0f4a8b7c9d3e2fb6c1a5d4e8f09b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f70
ALLOWED_REDIRECT_HOST_PATTERNS=^dev4\.4nkweb\.com$,^lecoffreio\.4nkweb\.com$

1
.env.master Symbolic link
View File

@ -0,0 +1 @@
../.env.master

View File

@ -21,12 +21,14 @@
./scripts/maintenance.sh
```
> Note scripts centralisés: le répertoire `./scripts/` de `lecoffre_node` est un lien symbolique vers `../../scripts/lecoffre_node`. Les chemins existants restent valides.
### 📁 Documentation
- **[`scripts/README.md`](scripts/README.md)** - Documentation complète des scripts
- **[`IA_agents/context.md`](IA_agents/context.md)** - Contexte et architecture du projet
- **[`IA_agents/flux.md`](IA_agents/flux.md)** - Flux d'architecture et services
- **[`IA_agents/deploy.md`](IA_agents/deploy.md)** - Procédure de déploiement complète
- **[`4NK_env/IA_agents/context.md`](IA_agents/context.md)** - Contexte et architecture du projet
- **[`4NK_env/IA_agents/flux.md`](IA_agents/flux.md)** - Flux d'architecture et services
- **[`4NK_env/IA_agents/deploy.md`](IA_agents/deploy.md)** - Procédure de déploiement complète
### 🛡️ Protection des Données
@ -213,9 +215,9 @@ lecoffre_node/
## 📚 Documentation Complète
### Documentation IA (Recommandée)
- [`IA_agents/context.md`](IA_agents/context.md) - Contexte et objectifs
- [`IA_agents/flux.md`](IA_agents/flux.md) - Architecture et flux
- [`IA_agents/deploy.md`](IA_agents/deploy.md) - Procédure de déploiement
- [`4NK_env/IA_agents/context.md`](IA_agents/context.md) - Contexte et objectifs
- [`4NK_env/IA_agents/flux.md`](IA_agents/flux.md) - Architecture et flux
- [`4NK_env/IA_agents/deploy.md`](IA_agents/deploy.md) - Procédure de déploiement
### Documentation Technique
- [`docs/REX.md`](docs/REX.md) - Rapport d'expérience de déploiement
@ -258,4 +260,4 @@ Ce projet est sous licence MIT. Voir le fichier [LICENSE](LICENSE) pour plus de
---
**💡 Conseil** : Commencez toujours par lire [`IA_agents/context.md`](IA_agents/context.md) pour comprendre le contexte du projet !
**💡 Conseil** : Commencez toujours par lire [`4NK_env/IA_agents/context.md`](IA_agents/context.md) pour comprendre le contexte du projet !

View File

@ -4,7 +4,7 @@ server {
http2 on;
server_name dev4.4nkweb.com;
include /home/debian/4NK_env/lecoffre_node/conf/nginx/logging.conf;
include /home/debian/4NK_env/confs/lecoffre_node/nginx/logging.conf;
# Certificats SSL
ssl_certificate /etc/letsencrypt/live/dev4.4nkweb.com/fullchain.pem;
@ -192,7 +192,7 @@ server {
# favicon
location = /favicon.ico {
root /home/debian/4NK_env/lecoffre_node/conf/nginx/assets;
root /home/debian/4NK_env/confs/lecoffre_node/nginx/assets;
try_files /favicon.ico =404;
}

View File

@ -216,7 +216,7 @@ server {
# favicon
location = /favicon.ico {
root /home/debian/4NK_env/lecoffre_node/conf/nginx/assets;
root /home/debian/4NK_env/confs/lecoffre_node/nginx/assets;
try_files /favicon.ico =404;
access_log off;
expires 30d;

View File

@ -23,8 +23,8 @@ log_format lecoffre_json escape=json
'}';
# Default access and error logs for the front site
access_log /var/log/nginx/lecoffre_front_access.log lecoffre_json;
error_log /var/log/nginx/lecoffre_front_error.log warn;
access_log /home/debian/4NK_env/logs/nginx/lecoffre_front_access.log lecoffre_json;
error_log /home/debian/4NK_env/logs/nginx/lecoffre_front_error.log warn;
# Map incoming X-Request-ID or generate one
map $http_x_request_id $x_request_id {

View File

@ -185,7 +185,7 @@ server {
# favicon
location = /favicon.ico {
root /home/debian/4NK_env/lecoffre_node/conf/nginx/assets;
root /home/debian/4NK_env/confs/lecoffre_node/nginx/assets;
try_files /favicon.ico =404;
}

View File

@ -17,7 +17,7 @@ scrape_configs:
labels:
job: bitcoin
service: bitcoin-signet
__path__: /var/log/lecoffre/bitcoin/*.log
__path__: /home/debian/4NK_env/logs/bitcoin/*.log
# Blindbit Oracle Logs
- job_name: blindbit
@ -27,7 +27,7 @@ scrape_configs:
labels:
job: blindbit
service: blindbit-oracle
__path__: /var/log/lecoffre/blindbit/*.log
__path__: /home/debian/4NK_env/logs/blindbit/*.log
# SDK Relay Logs
- job_name: sdk_relay
@ -37,7 +37,7 @@ scrape_configs:
labels:
job: sdk_relay
service: sdk_relay
__path__: /var/log/lecoffre/sdk_relay/*.log
__path__: /home/debian/4NK_env/logs/sdk_relay/*.log
# SDK Storage Logs
- job_name: sdk_storage
@ -47,7 +47,7 @@ scrape_configs:
labels:
job: sdk_storage
service: sdk_storage
__path__: /var/log/lecoffre/sdk_storage/*.log
__path__: /home/debian/4NK_env/logs/sdk_storage/*.log
# LeCoffre Frontend Logs
- job_name: lecoffre-front
@ -57,7 +57,7 @@ scrape_configs:
labels:
job: lecoffre-front
service: lecoffre-front
__path__: /var/log/lecoffre/lecoffre-front/*.log
__path__: /home/debian/4NK_env/logs/lecoffre-front/*.log
# IHM Client Logs
- job_name: ihm_client
@ -67,7 +67,7 @@ scrape_configs:
labels:
job: ihm_client
service: ihm_client
__path__: /var/log/lecoffre/ihm_client/*.log
__path__: /home/debian/4NK_env/logs/ihm_client/*.log
# Miner Logs
- job_name: miner
@ -77,7 +77,7 @@ scrape_configs:
labels:
job: miner
service: signet_miner
__path__: /var/log/lecoffre/miner/*.log
__path__: /home/debian/4NK_env/logs/miner/*.log
# Tor Logs
- job_name: tor
@ -87,7 +87,7 @@ scrape_configs:
labels:
job: tor
service: tor-proxy
__path__: /var/log/lecoffre/tor/*.log
__path__: /home/debian/4NK_env/logs/tor/*.log
# Docker Container Logs
- job_name: docker

1
data Symbolic link
View File

@ -0,0 +1 @@
/home/debian/4NK_env/data/lecoffre_node

View File

@ -3,8 +3,8 @@ services:
image: btcpayserver/tor:0.4.8.10
container_name: tor-proxy
volumes:
- ./logs/tor:/var/log/tor
- ./scripts/healthchecks:/scripts/healthchecks:ro
- /home/debian/4NK_env/logs/tor:/var/log/tor
- /home/debian/4NK_env/scripts/lecoffre_node/healthchecks:/scripts/healthchecks:ro
networks:
btcnet:
aliases:
@ -24,9 +24,9 @@ services:
condition: service_healthy
volumes:
- bitcoin_data:/home/bitcoin/.bitcoin
- ./conf/bitcoin/bitcoin.conf:/etc/bitcoin/bitcoin.conf:ro
- ./logs/bitcoin:/var/log/bitcoin
- ./scripts/healthchecks:/scripts/healthchecks:ro
- /home/debian/4NK_env/confs/lecoffre_node/bitcoin/bitcoin.conf:/etc/bitcoin/bitcoin.conf:ro
- /home/debian/4NK_env/logs/bitcoin:/var/log/bitcoin
- /home/debian/4NK_env/scripts/lecoffre_node/healthchecks:/scripts/healthchecks:ro
networks:
btcnet:
aliases:
@ -53,8 +53,8 @@ services:
- blindbit_data:/root/.blindbit-oracle
- ./blindbit/blindbit.toml:/tmp/blindbit.toml:ro
- bitcoin_data:/home/bitcoin/.bitcoin
- ./logs/blindbit:/var/log/blindbit
- ./scripts/healthchecks:/scripts/healthchecks:ro
- /home/debian/4NK_env/logs/blindbit:/var/log/blindbit
- /home/debian/4NK_env/scripts/lecoffre_node/healthchecks:/scripts/healthchecks:ro
entrypoint: >
sh -c "mkdir -p /root/.blindbit-oracle &&
if [ ! -f /root/.blindbit-oracle/blindbit.toml ]; then
@ -86,12 +86,12 @@ services:
blindbit:
condition: service_healthy
volumes:
- ./conf/relay/sdk_relay.conf:/app/.conf:ro
- /home/debian/4NK_env/confs/lecoffre_node/relay/sdk_relay.conf:/app/.conf:ro
- sdk_data:/app/.4nk
- bitcoin_data:/app/.bitcoin
- ./scripts/funds:/scripts/funds:ro
- ./logs/sdk_relay:/var/log/sdk_relay
- ./scripts/healthchecks:/scripts/healthchecks:ro
- /home/debian/4NK_env/scripts/lecoffre_node/funds:/scripts/funds:ro
- /home/debian/4NK_env/logs/sdk_relay:/var/log/sdk_relay
- /home/debian/4NK_env/scripts/lecoffre_node/healthchecks:/scripts/healthchecks:ro
ports:
- "0.0.0.0:8090:8090"
- "0.0.0.0:8091:8091"
@ -154,7 +154,7 @@ services:
# - "0.0.0.0:8080:8080"
# volumes:
# - /var/run/docker.sock:/var/run/docker.sock
# - ./logs/lecoffre-back:/var/log/lecoffre-back
# - /home/debian/4NK_env/logs/lecoffre-back:/var/log/lecoffre-back
# networks:
# btcnet:
# aliases:
@ -183,7 +183,7 @@ services:
ports:
- "0.0.0.0:3004:8080"
volumes:
- ./logs/lecoffre-front:/var/log/lecoffre-front
- /home/debian/4NK_env/logs/lecoffre-front:/var/log/lecoffre-front
networks:
btcnet:
aliases:
@ -198,6 +198,7 @@ services:
sdk_signer:
condition: service_healthy
user: lecoffreuser
command: ["sh", "-c", "exec npm run start >> /var/log/lecoffre-front/stdout.log 2>&1"]
healthcheck:
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
@ -223,7 +224,7 @@ services:
ports:
- "0.0.0.0:3003:3003"
volumes:
- ./logs/ihm_client:/var/log/ihm_client
- /home/debian/4NK_env/logs/ihm_client:/var/log/ihm_client
networks:
btcnet:
aliases:
@ -236,7 +237,7 @@ services:
sdk_signer:
condition: service_healthy
user: root
command: ["npm", "start"]
command: ["sh", "-c", "exec npm start >> /var/log/ihm_client/stdout.log 2>&1"]
healthcheck:
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
@ -256,8 +257,8 @@ services:
- "0.0.0.0:3001:9090"
volumes:
- sdk_signer_data:/app/data
- ./logs/sdk_signer:/var/log/sdk_signer
- ./scripts/healthchecks:/scripts/healthchecks:ro
- /home/debian/4NK_env/logs/sdk_signer:/var/log/sdk_signer
- /home/debian/4NK_env/scripts/lecoffre_node/healthchecks:/scripts/healthchecks:ro
networks:
btcnet:
aliases:
@ -266,7 +267,7 @@ services:
depends_on:
sdk_storage:
condition: service_healthy
command: ["node", "/app/dist/index.js"]
command: ["sh", "-c", "exec node /app/dist/index.js >> /var/log/sdk_signer/stdout.log 2>&1"]
healthcheck:
test: ["CMD", "sh", "/scripts/healthchecks/sdk-signer-progress.sh"]
interval: 30s
@ -285,7 +286,7 @@ services:
- "0.0.0.0:8081:8080"
volumes:
- sdk_storage_data:/app/data
- ./logs/sdk_storage:/var/log/sdk_storage
- /home/debian/4NK_env/logs/sdk_storage:/var/log/sdk_storage
healthcheck:
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
@ -321,7 +322,7 @@ services:
- ./miner/.env
volumes:
- bitcoin_data:/bitcoin:ro
- ./logs/miner:/var/log/miner
- /home/debian/4NK_env/logs/miner:/var/log/miner
networks:
btcnet:
aliases:
@ -336,10 +337,10 @@ services:
- "0.0.0.0:3005:3000"
volumes:
- grafana_data:/var/lib/grafana
- ./conf/grafana/provisioning:/etc/grafana/provisioning
- ./conf/grafana/dashboards:/var/lib/grafana/dashboards
- ./conf/grafana/grafana.ini:/etc/grafana/grafana.ini:ro
- ./logs:/var/log/lecoffre:ro
- /home/debian/4NK_env/confs/lecoffre_node/grafana/provisioning:/etc/grafana/provisioning
- /home/debian/4NK_env/confs/lecoffre_node/grafana/dashboards:/var/lib/grafana/dashboards
- /home/debian/4NK_env/confs/lecoffre_node/grafana/grafana.ini:/etc/grafana/grafana.ini:ro
- /home/debian/4NK_env/logs:/var/log/lecoffre:ro
environment:
- GF_SECURITY_ADMIN_PASSWORD=Fuy8ZfxQI2xdSdoB8wsGxNjyU
- GF_USERS_ALLOW_SIGN_UP=false
@ -371,7 +372,7 @@ services:
- "0.0.0.0:3100:3100"
volumes:
- loki_data:/loki
- ./conf/loki/loki-config.yaml:/etc/loki/loki-config.yaml:ro
- /home/debian/4NK_env/confs/lecoffre_node/loki/loki-config.yaml:/etc/loki/loki-config.yaml:ro
command: -config.file=/etc/loki/loki-config.yaml
networks:
btcnet:
@ -389,8 +390,8 @@ services:
image: promtail-custom:ext
container_name: promtail
volumes:
- ./logs:/var/log/lecoffre:ro
- ./conf/promtail/promtail.yml:/etc/promtail/config.yml:ro
- /home/debian/4NK_env/logs:/home/debian/4NK_env/logs:ro
- /home/debian/4NK_env/confs/lecoffre_node/promtail/promtail.yml:/etc/promtail/config.yml:ro
- /var/run/docker.sock:/var/run/docker.sock
command: -config.file=/etc/promtail/config.yml
networks:
@ -421,8 +422,8 @@ services:
volumes:
- ./web/status/api.py:/app/api.py:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./logs:/var/log/lecoffre:ro
- ./scripts/healthchecks:/scripts/healthchecks:ro
- /home/debian/4NK_env/logs:/var/log/lecoffre:ro
- /home/debian/4NK_env/scripts/lecoffre_node/healthchecks:/scripts/healthchecks:ro
networks:
btcnet:
aliases:

View File

@ -1,20 +0,0 @@
node:events:497
throw er; // Unhandled 'error' event
^
Error: listen EADDRINUSE: address already in use 0.0.0.0:3006
at Server.setupListenHandle [as _listen2] (node:net:1940:16)
at listenInCluster (node:net:1997:12)
at node:net:2206:7
at process.processTicksAndRejections (node:internal/process/task_queues:90:21)
Emitted 'error' event on Server instance at:
at emitErrorNT (node:net:1976:8)
at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
code: 'EADDRINUSE',
errno: -98,
syscall: 'listen',
address: '0.0.0.0',
port: 3006
}
Node.js v22.19.0

View File

@ -1 +0,0 @@
322946

1
logs Symbolic link
View File

@ -0,0 +1 @@
/home/debian/4NK_env/logs

View File

@ -1,2 +0,0 @@
Sun Sep 21 17:19:13 UTC 2025: Test log entry for bitcoin
Sun Sep 21 17:19:13 UTC 2025: Service bitcoin started successfully

View File

@ -1,2 +0,0 @@
Sun Sep 21 17:19:13 UTC 2025: Test log entry for blindbit
Sun Sep 21 17:19:13 UTC 2025: Service blindbit started successfully

View File

@ -1 +0,0 @@
failed to read /app/.env: line 111: unexpected character "(" in variable name "price_1QMUuXP5xh1u9BqS26uzbJaF (créateurs)"

View File

@ -1,2 +0,0 @@
Sun Sep 21 17:19:13 UTC 2025: Test log entry for ihm_client
Sun Sep 21 17:19:13 UTC 2025: Service ihm_client started successfully

View File

@ -1,2 +0,0 @@
Sun Sep 21 17:19:13 UTC 2025: Test log entry for lecoffre-back
Sun Sep 21 17:19:13 UTC 2025: Service lecoffre-back started successfully

View File

@ -1,2 +0,0 @@
Sun Sep 21 17:19:13 UTC 2025: Test log entry for lecoffre-front
Sun Sep 21 17:19:13 UTC 2025: Service lecoffre-front started successfully

View File

@ -1,2 +0,0 @@
Sun Sep 21 17:19:13 UTC 2025: Test log entry for miner
Sun Sep 21 17:19:13 UTC 2025: Service miner started successfully

View File

View File

View File

@ -1,2 +0,0 @@
Sun Sep 21 17:19:13 UTC 2025: Test log entry for nginx
Sun Sep 21 17:19:13 UTC 2025: Service nginx started successfully

View File

@ -1,2 +0,0 @@
Sun Sep 21 17:19:13 UTC 2025: Test log entry for sdk_relay
Sun Sep 21 17:19:13 UTC 2025: Service sdk_relay started successfully

View File

@ -1,2 +0,0 @@
Sun Sep 21 17:19:13 UTC 2025: Test log entry for sdk_signer
Sun Sep 21 17:19:13 UTC 2025: Service sdk_signer started successfully

View File

@ -1,2 +0,0 @@
Sun Sep 21 17:19:13 UTC 2025: Test log entry for sdk_storage
Sun Sep 21 17:19:13 UTC 2025: Service sdk_storage started successfully

View File

@ -1,2 +0,0 @@
Sun Sep 21 17:19:13 UTC 2025: Test log entry for tor
Sun Sep 21 17:19:13 UTC 2025: Service tor started successfully

1
scripts Symbolic link
View File

@ -0,0 +1 @@
/home/debian/4NK_env/scripts/lecoffre_node

View File

@ -1,236 +0,0 @@
# Scripts LeCoffre Node
Ce répertoire contient tous les scripts nécessaires au déploiement et à la gestion de l'architecture LeCoffre Node.
## 🚀 Scripts de Déploiement
### `start.sh`
**Script principal de démarrage séquentiel**
- Lance tous les services dans l'ordre logique
- Affiche la progression détaillée en temps réel
- Compatible avec le réseau Bitcoin Signet
- Gestion des timeouts et erreurs
```bash
./scripts/start.sh
```
### `deploy-master.sh`
**Déploiement de l'architecture autonome**
- Construit et lance le conteneur master
- Configure tous les ports et volumes
- Lance automatiquement les services
```bash
./scripts/deploy-master.sh
```
### `deploy-autonomous.sh`
**Déploiement autonome complet**
- Déploiement sans intervention manuelle
- Configuration automatique de tous les services
```bash
./scripts/deploy-autonomous.sh
```
## 💾 Scripts de Gestion des Données
### `backup-data.sh`
**Sauvegarde des données critiques**
- Sauvegarde Bitcoin, BlindBit, SDK Storage, SDK Signer
- Création d'archives compressées
- Gestion des permissions
```bash
./scripts/backup-data.sh
```
### `restore-data.sh`
**Restauration des données**
- Restaure depuis une sauvegarde
- Remplace les données existantes
- Confirmation de sécurité
```bash
./scripts/restore-data.sh <backup_name>
```
### `update-images.sh`
**Mise à jour des images Docker**
- Sauvegarde automatique avant mise à jour
- Téléchargement des nouvelles images
- Protection des données
```bash
./scripts/update-images.sh
```
## 📊 Scripts de Monitoring
### `collect-logs.sh`
**Collecte des logs de tous les services**
- Collecte automatique ou par service
- Organisation par répertoires
- Timestamps sur les fichiers
```bash
# Tous les services
./scripts/collect-logs.sh
# Service spécifique
./scripts/collect-logs.sh bitcoin-signet
```
### `test-monitoring.sh`
**Tests des services de monitoring**
- Vérification Grafana, Loki, Promtail
- Tests de connectivité
- Validation des dashboards
```bash
./scripts/test-monitoring.sh
```
### `test-dashboards.sh`
**Tests des dashboards Grafana**
- Vérification des dashboards
- Tests des données sources
- Validation des métriques
```bash
./scripts/test-dashboards.sh
```
## 🔧 Scripts de Configuration
### `sync-configs.sh`
**Synchronisation des configurations**
- Copie des configs vers les conteneurs
- Mise à jour des paramètres
- Redémarrage des services
```bash
./scripts/sync-configs.sh
```
### `sync-monitoring-config.sh`
**Configuration du monitoring**
- Configuration Grafana
- Configuration Loki/Promtail
- Déploiement des dashboards
```bash
./scripts/sync-monitoring-config.sh
```
### `setup-logs.sh`
**Configuration des logs**
- Création des répertoires de logs
- Configuration des permissions
- Setup des rotations
```bash
./scripts/setup-logs.sh
```
## 🛠️ Scripts de Maintenance
### `fix_relay_funds.sh`
**Correction des fonds du relay**
- Vérification des fonds
- Correction des problèmes
- Tests de connectivité
```bash
./scripts/fix_relay_funds.sh
```
### `optimize-relay-startup.sh`
**Optimisation du démarrage du relay**
- Optimisation des paramètres
- Amélioration des performances
- Tests de stabilité
```bash
./scripts/optimize-relay-startup.sh
```
### `verify_mining_fix.sh`
**Vérification du minage**
- Tests du minage Signet
- Vérification des blocs
- Validation des transactions
```bash
./scripts/verify_mining_fix.sh
```
## 🔒 Scripts de Sécurité
### `generate-ssl-certs.sh`
**Génération des certificats SSL**
- Création des certificats
- Configuration HTTPS
- Sécurisation des communications
```bash
./scripts/generate-ssl-certs.sh
```
### `uninstall-host-nginx.sh`
**Désinstallation de Nginx host**
- Nettoyage de Nginx
- Suppression des configurations
- Libération des ports
```bash
./scripts/uninstall-host-nginx.sh
```
## 📁 Structure des Volumes
Les données sont persistées dans les volumes Docker suivants :
- `4nk_node_bitcoin_data` : Données Bitcoin Signet
- `4nk_node_blindbit_data` : Données BlindBit Oracle
- `4nk_node_sdk_data` : Données SDK Relay
- `4nk_node_sdk_storage_data` : Données SDK Storage
- `4nk_node_grafana_data` : Données Grafana
- `4nk_node_loki_data` : Données Loki
## 🔄 Workflow de Déploiement
1. **Déploiement initial** : `./scripts/deploy-master.sh`
2. **Démarrage des services** : `./scripts/start.sh`
3. **Vérification** : `./scripts/test-monitoring.sh`
4. **Sauvegarde** : `./scripts/backup-data.sh`
## 🔄 Workflow de Mise à Jour
1. **Sauvegarde** : `./scripts/backup-data.sh`
2. **Mise à jour** : `./scripts/update-images.sh`
3. **Redémarrage** : `./scripts/start.sh`
4. **Vérification** : `./scripts/test-monitoring.sh`
## 🆘 Récupération d'Urgence
En cas de problème :
1. **Arrêt des services** : `docker compose down`
2. **Restauration** : `./scripts/restore-data.sh <backup>`
3. **Redémarrage** : `./scripts/start.sh`
## 📝 Logs et Debugging
- **Logs des services** : `./logs/<service>/`
- **Collecte des logs** : `./scripts/collect-logs.sh`
- **Monitoring** : Grafana sur port 3005
- **Status API** : Port 3006
## ⚠️ Notes Importantes
- Tous les scripts préservent les données importantes
- Les sauvegardes sont automatiques lors des mises à jour
- Le réseau Bitcoin Signet est utilisé par défaut
- Les volumes Docker garantissent la persistance des données

View File

@ -1,78 +0,0 @@
#!/bin/bash
# Script de sauvegarde des données critiques LeCoffre Node
# Sauvegarde Bitcoin, BlindBit, SDK Storage et SDK Signer
set -e
# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
BACKUP_DIR="./backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="lecoffre_backup_${TIMESTAMP}"
HOST_UID=$(id -u)
HOST_GID=$(id -g)
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} LeCoffre Node - Data Backup${NC}"
echo -e "${BLUE}========================================${NC}"
echo
# Créer le répertoire de sauvegarde
mkdir -p "$BACKUP_DIR"
echo -e "${YELLOW}Creating backup: $BACKUP_NAME${NC}"
# Fonction pour sauvegarder un volume Docker
backup_volume() {
local volume_name=$1
local backup_path=$2
local description=$3
echo -e "${BLUE}Backing up $description...${NC}"
if docker volume inspect "$volume_name" >/dev/null 2>&1; then
docker run --rm \
-e HOST_UID="$HOST_UID" -e HOST_GID="$HOST_GID" \
-v "$volume_name":/source:ro \
-v "$(pwd)/$BACKUP_DIR/$BACKUP_NAME":/backup \
alpine:latest \
sh -c "mkdir -p /backup$backup_path && cp -r /source/* /backup$backup_path/ 2>/dev/null || true && chmod -R 755 /backup$backup_path 2>/dev/null || true && chown -R \$HOST_UID:\$HOST_GID /backup$backup_path 2>/dev/null || true"
echo -e "${GREEN}$description backed up${NC}"
else
echo -e "${YELLOW}⚠ Volume $volume_name not found${NC}"
fi
}
# Créer le répertoire de sauvegarde
mkdir -p "$BACKUP_DIR/$BACKUP_NAME"
# Sauvegarder les volumes critiques
backup_volume "4nk_node_bitcoin_data" "/bitcoin" "Bitcoin Signet Data"
backup_volume "4nk_node_blindbit_data" "/blindbit" "BlindBit Oracle Data"
backup_volume "4nk_node_sdk_data" "/sdk" "SDK Relay Data"
backup_volume "4nk_node_sdk_storage_data" "/sdk_storage" "SDK Storage Data"
backup_volume "4nk_node_grafana_data" "/grafana" "Grafana Data"
backup_volume "4nk_node_loki_data" "/loki" "Loki Data"
# Créer une archive compressée
echo -e "${BLUE}Creating compressed archive...${NC}"
cd "$BACKUP_DIR"
tar -czf "${BACKUP_NAME}.tar.gz" "$BACKUP_NAME" --ignore-failed-read 2>/dev/null || true
rm -rf "$BACKUP_NAME" || sudo rm -rf "$BACKUP_NAME" || true
cd ..
# Afficher les informations de sauvegarde
BACKUP_SIZE=$(du -h "$BACKUP_DIR/${BACKUP_NAME}.tar.gz" | cut -f1)
echo
echo -e "${GREEN}✅ Backup completed successfully!${NC}"
echo -e "${GREEN}Backup file: $BACKUP_DIR/${BACKUP_NAME}.tar.gz${NC}"
echo -e "${GREEN}Backup size: $BACKUP_SIZE${NC}"
echo
echo -e "${BLUE}To restore this backup:${NC}"
echo -e "${YELLOW} ./scripts/restore-data.sh $BACKUP_NAME${NC}"
echo

View File

@ -1,110 +0,0 @@
#!/bin/bash
# Script pour construire un projet spécifique avec synchronisation des configs
# Usage: ./scripts/build-project.sh <project_name> [docker_tag]
#
# Projets supportés:
# - bitcoin: Bitcoin Signet
# - blindbit: BlindBit Oracle
# - sdk_relay: SDK Relay
# - sdk_storage: SDK Storage
# - lecoffre-front: LeCoffre Frontend
# - ihm_client: IHM Client
set -euo pipefail
# Couleurs pour les logs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Fonction de logging
log() {
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}
log_success() {
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] ✓${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] ⚠${NC} $1"
}
log_error() {
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ✗${NC} $1"
}
# Vérifier les arguments
if [[ $# -lt 1 ]]; then
log_error "Usage: $0 <project_name> [docker_tag]"
echo ""
echo "Projets disponibles:"
echo " - ihm_client"
echo " - lecoffre-front"
echo " - sdk_relay"
echo " - sdk_storage"
echo ""
echo "Exemples:"
echo " $0 ihm_client"
echo " $0 ihm_client ext"
exit 1
fi
PROJECT_NAME="$1"
DOCKER_TAG="${2:-ext}"
PROJECT_ROOT="/home/debian/lecoffre_node"
PROJECT_PATH="/home/debian/$PROJECT_NAME"
# Changer vers le répertoire du projet
cd "$PROJECT_ROOT"
log "Construction du projet: $PROJECT_NAME (tag: $DOCKER_TAG)"
# 1. Synchroniser les configurations pour ce projet
log "Synchronisation des configurations pour $PROJECT_NAME..."
if ./scripts/sync-configs.sh "$PROJECT_NAME"; then
log_success "Configurations synchronisées"
else
log_warning "Aucune configuration à synchroniser pour $PROJECT_NAME"
fi
# 2. Changer vers le répertoire du projet
if [[ ! -d "$PROJECT_PATH" ]]; then
log_error "Projet non trouvé: $PROJECT_PATH"
exit 1
fi
cd "$PROJECT_PATH"
# 3. Vérifier qu'un Dockerfile existe
if [[ ! -f "Dockerfile" ]]; then
log_error "Dockerfile non trouvé dans $PROJECT_PATH"
exit 1
fi
# 4. Construire l'image Docker
log "Construction de l'image Docker..."
IMAGE_NAME="git.4nkweb.com/4nk/$PROJECT_NAME:$DOCKER_TAG"
if docker build -t "$IMAGE_NAME" .; then
log_success "Image construite: $IMAGE_NAME"
else
log_error "Échec de la construction de l'image"
exit 1
fi
# 5. Optionnel: pousser l'image
if [[ "${PUSH_IMAGE:-false}" == "true" ]]; then
log "Poussée de l'image vers le registry..."
if docker push "$IMAGE_NAME"; then
log_success "Image poussée: $IMAGE_NAME"
else
log_error "Échec de la poussée de l'image"
exit 1
fi
fi
log_success "Construction terminée pour $PROJECT_NAME"

View File

@ -1,58 +0,0 @@
#!/bin/bash
# Script pour collecter les logs de tous les services
# Usage: ./scripts/collect-logs.sh [service_name]
set -e
LOG_DIR="logs"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
if [ $# -eq 1 ]; then
# Collecter les logs d'un service spécifique
SERVICE=$1
if [ -d "$LOG_DIR/$SERVICE" ]; then
echo "📊 Collecte des logs pour $SERVICE..."
docker logs "$SERVICE" > "$LOG_DIR/$SERVICE/${SERVICE}_${TIMESTAMP}.log" 2>&1
echo "✅ Logs collectés: $LOG_DIR/$SERVICE/${SERVICE}_${TIMESTAMP}.log"
else
echo "❌ Service $SERVICE non trouvé"
exit 1
fi
else
# Collecter les logs de tous les services
echo "📊 Collecte des logs de tous les services..."
# Liste des services à collecter
services=(
"tor-proxy:tor"
"bitcoin-signet:bitcoin"
"blindbit-oracle:blindbit"
"sdk_relay:sdk_relay"
"sdk_storage:sdk_storage"
"lecoffre-back:lecoffre-back"
"lecoffre-front:lecoffre-front"
"ihm_client:ihm_client"
"grafana:grafana"
"loki:loki"
"promtail:promtail"
"status-api:status-api"
"signet_miner:miner"
)
for service_entry in "${services[@]}"; do
service_name="${service_entry%%:*}"
log_dir="${service_entry##*:}"
if docker ps --format "table {{.Names}}" | grep -q "^${service_name}$"; then
echo "📝 Collecte des logs pour $service_name..."
mkdir -p "$LOG_DIR/$log_dir"
docker logs "$service_name" > "$LOG_DIR/$log_dir/${service_name}_${TIMESTAMP}.log" 2>&1
echo "✅ Logs collectés pour $service_name"
else
echo "⚠️ Service $service_name non en cours d'exécution"
fi
done
fi
echo "🎉 Collecte terminée!"

View File

@ -1,115 +0,0 @@
#!/bin/bash
set -euo pipefail
echo "🚀 DÉPLOIEMENT DE L'ARCHITECTURE AUTONOME COMPLÈTE"
echo "================================================="
# Fonction de logging
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# Variables
MASTER_IMAGE_NAME="lecoffre-node-master"
MASTER_IMAGE_TAG="ext"
CONTAINER_NAME="lecoffre-node-master"
HOST_PORT=80
log "🔧 Préparation de l'environnement..."
# Vérification des prérequis
if ! command -v docker &> /dev/null; then
log "❌ Docker non disponible"
exit 1
fi
if ! command -v docker-compose &> /dev/null; then
log "❌ Docker Compose non disponible"
exit 1
fi
log "✅ Prérequis validés"
# Arrêt des services existants
log "🛑 Arrêt des services existants..."
cd /home/debian/4NK_env/lecoffre_node
docker compose down 2>/dev/null || true
# Construction de l'image master
log "🏗️ Construction de l'image master..."
docker build -f Dockerfile.master -t ${MASTER_IMAGE_NAME}:${MASTER_IMAGE_TAG} .
log "🧹 Nettoyage des conteneurs existants..."
docker stop ${CONTAINER_NAME} 2>/dev/null || true
docker rm ${CONTAINER_NAME} 2>/dev/null || true
# Création des répertoires de données
log "📁 Création des répertoires de données..."
mkdir -p /home/debian/4NK_env/lecoffre_node/{data,logs,backup}
log "🚀 Démarrage du conteneur master autonome..."
log " Le conteneur utilise son propre Nginx (ports 80, 443, 3000) - indépendant du host"
log " Port 3000 pour redirections externes IdNot (dev3.4nkweb.com)"
docker run -d \
--name ${CONTAINER_NAME} \
--privileged \
--restart unless-stopped \
-p 80:80 \
-p 443:443 \
-p 3000:3000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /home/debian/4NK_env/lecoffre_node/data:/app/data \
-v /home/debian/4NK_env/lecoffre_node/logs:/app/logs \
-v /home/debian/4NK_env/lecoffre_node/conf:/app/conf \
-v /home/debian/4NK_env/lecoffre_node/backup:/app/backup \
-v /home/debian/4NK_env/lecoffre_node/.env.master:/app/.env \
${MASTER_IMAGE_NAME}:${MASTER_IMAGE_TAG}
log "⏳ Attente du démarrage du conteneur master..."
sleep 30
log "🔍 Vérification du statut du conteneur..."
docker ps | grep ${CONTAINER_NAME}
log "🧪 Test de connectivité des services..."
sleep 20
# Tests de connectivité
services=(
"http://localhost:${HOST_PORT}/status/|Status Page"
"http://localhost:${HOST_PORT}/grafana/|Grafana"
"http://localhost:${HOST_PORT}/lecoffre/|LeCoffre Front"
"http://localhost:${HOST_PORT}/|IHM Client"
"http://localhost:${HOST_PORT}/api/v1/health|API Backend"
)
for service in "${services[@]}"; do
IFS='|' read -r url name <<< "$service"
if curl -f -s "$url" > /dev/null 2>&1; then
log "$name: Accessible"
else
log "⚠️ $name: Inaccessible (peut être normal pendant le démarrage)"
fi
done
log "📊 Logs du conteneur master:"
docker logs ${CONTAINER_NAME} --tail 10
log "🎉 Architecture autonome déployée!"
log "📋 Services disponibles:"
log " - Status Page: http://localhost:${HOST_PORT}/status/"
log " - Grafana: http://localhost:${HOST_PORT}/grafana/"
log " - LeCoffre Front: http://localhost:${HOST_PORT}/lecoffre/"
log " - IHM Client: http://localhost:${HOST_PORT}/"
log " - API Backend: http://localhost:${HOST_PORT}/api/"
log ""
log "🔧 Architecture autonome:"
log " - Nginx intégré dans le conteneur (port 80)"
log " - Indépendant du Nginx du host"
log " - Toutes les configurations dans lecoffre_node/"
log ""
log "🔧 Commandes utiles:"
log " - Logs: docker logs ${CONTAINER_NAME}"
log " - Shell: docker exec -it ${CONTAINER_NAME} bash"
log " - Redémarrage: docker restart ${CONTAINER_NAME}"
log " - Arrêt: docker stop ${CONTAINER_NAME}"

View File

@ -1,265 +0,0 @@
#!/bin/bash
# Script de déploiement centralisé pour Grafana et la stack de monitoring
# Usage: ./scripts/deploy-grafana.sh [start|stop|restart|status|logs]
set -e
COMPOSE_FILE="docker-compose.yml"
GRAFANA_ADMIN_PASSWORD="${GRAFANA_ADMIN_PASSWORD:-admin123}"
GRAFANA_PORT="${GRAFANA_PORT:-3005}"
LOKI_PORT="${LOKI_PORT:-3100}"
# Couleurs pour les messages
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
log_info() {
echo -e "${BLUE} $1${NC}"
}
log_success() {
echo -e "${GREEN}$1${NC}"
}
log_warning() {
echo -e "${YELLOW}⚠️ $1${NC}"
}
log_error() {
echo -e "${RED}$1${NC}"
}
# Fonction pour vérifier si Docker est en cours d'exécution
check_docker() {
if ! docker info >/dev/null 2>&1; then
log_error "Docker n'est pas en cours d'exécution"
exit 1
fi
}
# Fonction pour vérifier la configuration
check_config() {
log_info "Vérification de la configuration..."
# Vérifier que les fichiers de configuration existent
required_files=(
"conf/grafana/provisioning/datasources/loki.yml"
"conf/grafana/provisioning/dashboards/dashboards.yml"
"conf/grafana/dashboards/lecoffre-overview.json"
"conf/grafana/dashboards/bitcoin-miner.json"
"conf/grafana/dashboards/services-overview.json"
"conf/promtail/promtail.yml"
"conf/nginx/grafana.conf"
)
for file in "${required_files[@]}"; do
if [ ! -f "$file" ]; then
log_error "Fichier de configuration manquant: $file"
exit 1
fi
done
log_success "Configuration vérifiée"
}
# Fonction pour démarrer la stack de monitoring
start_monitoring() {
log_info "Démarrage de la stack de monitoring..."
check_docker
check_config
# Créer les dossiers nécessaires
mkdir -p logs/{bitcoin,blindbit,sdk_relaysdk_storagelecoffre-front,ihm_client,tor,miner,nginx}
# Démarrer les services de monitoring
log_info "Démarrage de Loki..."
docker compose up -d loki
log_info "Attente que Loki soit prêt..."
sleep 10
log_info "Démarrage de Promtail..."
docker compose up -d promtail
log_info "Démarrage de Grafana..."
docker compose up -d grafana
log_info "Attente que Grafana soit prêt..."
sleep 15
# Vérifier le statut des services
check_monitoring_status
log_success "Stack de monitoring démarrée avec succès!"
echo ""
echo "🔗 URLs d'accès:"
echo " - Grafana: https://dev4.4nkweb.com/grafana/"
echo " - Loki API: https://dev4.4nkweb.com/loki/"
echo " - Grafana Local: http://localhost:${GRAFANA_PORT}"
echo ""
echo "🔐 Identifiants Grafana:"
echo " - Utilisateur: admin"
echo " - Mot de passe: ${GRAFANA_ADMIN_PASSWORD}"
}
# Fonction pour arrêter la stack de monitoring
stop_monitoring() {
log_info "Arrêt de la stack de monitoring..."
docker compose stop grafana promtail loki
log_success "Stack de monitoring arrêtée"
}
# Fonction pour redémarrer la stack de monitoring
restart_monitoring() {
log_info "Redémarrage de la stack de monitoring..."
stop_monitoring
sleep 5
start_monitoring
}
# Fonction pour vérifier le statut
check_monitoring_status() {
log_info "Vérification du statut des services..."
services=("loki" "promtail" "grafana")
for service in "${services[@]}"; do
if docker compose ps "$service" | grep -q "Up"; then
log_success "$service: En cours d'exécution"
else
log_warning "$service: Arrêté ou en erreur"
fi
done
# Vérifier les ports
if netstat -tuln 2>/dev/null | grep -q ":${GRAFANA_PORT} "; then
log_success "Grafana accessible sur le port ${GRAFANA_PORT}"
else
log_warning "Grafana non accessible sur le port ${GRAFANA_PORT}"
fi
if netstat -tuln 2>/dev/null | grep -q ":${LOKI_PORT} "; then
log_success "Loki accessible sur le port ${LOKI_PORT}"
else
log_warning "Loki non accessible sur le port ${LOKI_PORT}"
fi
}
# Fonction pour afficher les logs
show_logs() {
local service=${1:-"grafana"}
log_info "Affichage des logs pour $service..."
docker compose logs -f "$service"
}
# Fonction pour initialiser Grafana
init_grafana() {
log_info "Initialisation de Grafana..."
# Attendre que Grafana soit prêt
log_info "Attente que Grafana soit prêt..."
timeout=60
while [ $timeout -gt 0 ]; do
if curl -s http://localhost:${GRAFANA_PORT}/api/health >/dev/null 2>&1; then
log_success "Grafana est prêt!"
break
fi
sleep 2
timeout=$((timeout - 2))
done
if [ $timeout -le 0 ]; then
log_error "Timeout: Grafana n'est pas prêt après 60 secondes"
return 1
fi
# Créer un utilisateur admin si nécessaire
log_info "Configuration de l'utilisateur admin..."
curl -X POST \
-H "Content-Type: application/json" \
-d "{\"user\":\"admin\",\"password\":\"${GRAFANA_ADMIN_PASSWORD}\"}" \
http://admin:admin@localhost:${GRAFANA_PORT}/api/admin/users \
2>/dev/null || true
log_success "Grafana initialisé"
}
# Fonction pour collecter les logs de tous les services
collect_all_logs() {
log_info "Collecte des logs de tous les services..."
./scripts/collect-logs.sh
log_success "Logs collectés dans le dossier logs/"
}
# Fonction d'aide
show_help() {
echo "Usage: $0 [COMMAND]"
echo ""
echo "Commandes disponibles:"
echo " start Démarrer la stack de monitoring (Grafana + Loki + Promtail)"
echo " stop Arrêter la stack de monitoring"
echo " restart Redémarrer la stack de monitoring"
echo " status Vérifier le statut des services"
echo " logs Afficher les logs (par défaut: grafana)"
echo " init Initialiser Grafana"
echo " collect Collecter les logs de tous les services"
echo " help Afficher cette aide"
echo ""
echo "Variables d'environnement:"
echo " GRAFANA_ADMIN_PASSWORD Mot de passe admin Grafana (défaut: admin123)"
echo " GRAFANA_PORT Port Grafana (défaut: 3000)"
echo " LOKI_PORT Port Loki (défaut: 3100)"
echo ""
echo "Exemples:"
echo " $0 start"
echo " $0 logs promtail"
echo " GRAFANA_ADMIN_PASSWORD=mypass $0 start"
}
# Fonction principale
main() {
case "${1:-help}" in
start)
start_monitoring
;;
stop)
stop_monitoring
;;
restart)
restart_monitoring
;;
status)
check_monitoring_status
;;
logs)
show_logs "$2"
;;
init)
init_grafana
;;
collect)
collect_all_logs
;;
help|--help|-h)
show_help
;;
*)
log_error "Commande inconnue: $1"
show_help
exit 1
;;
esac
}
# Exécution du script
main "$@"

View File

@ -1,74 +0,0 @@
#!/bin/bash
set -euo pipefail
echo "🚀 DÉPLOIEMENT DE L'ARCHITECTURE AUTONOME LECOFFRE NODE"
echo "======================================================"
# Fonction de logging
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# Variables
MASTER_IMAGE_NAME="lecoffre-node-master"
MASTER_IMAGE_TAG="ext"
CONTAINER_NAME="lecoffre-node-master"
HOST_PORT=8081
log "Construction de l'image master..."
cd /home/debian/4NK_env/lecoffre_node
# Construction de l'image master
docker build -f Dockerfile.master -t ${MASTER_IMAGE_NAME}:${MASTER_IMAGE_TAG} .
log "Arrêt du conteneur existant (si présent)..."
docker stop ${CONTAINER_NAME} 2>/dev/null || true
docker rm ${CONTAINER_NAME} 2>/dev/null || true
log "Démarrage du conteneur master..."
docker run -d \
--name ${CONTAINER_NAME} \
--privileged \
-p ${HOST_PORT}:80 \
-p 3005:3005 \
-p 3006:3006 \
-p 8080:8080 \
-p 3003:3003 \
-p 3004:3004 \
-p 8090:8090 \
-p 8091:8091 \
-p 8000:8000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /home/debian/4NK_env/lecoffre_node/data:/app/data \
-v /home/debian/4NK_env/lecoffre_node/logs:/app/logs \
-v /home/debian/4NK_env/lecoffre_node/conf:/app/conf \
-v /home/debian/4NK_env/lecoffre_node/backups:/app/backups \
${MASTER_IMAGE_NAME}:${MASTER_IMAGE_TAG}
log "Attente du démarrage du conteneur master..."
sleep 30
log "Lancement des services LeCoffre Node..."
docker exec ${CONTAINER_NAME} /app/scripts/start.sh
log "Vérification du statut du conteneur..."
docker ps | grep ${CONTAINER_NAME}
log "Test de connectivité..."
sleep 10
if curl -f -s http://localhost:${HOST_PORT}/status/ > /dev/null; then
log "✅ Architecture autonome déployée avec succès!"
log "📊 Services disponibles:"
log " - Status Page: http://localhost:${HOST_PORT}/status/"
log " - Grafana: http://localhost:${HOST_PORT}/grafana/"
log " - LeCoffre Front: http://localhost:${HOST_PORT}/lecoffre/"
log " - IHM Client: http://localhost:${HOST_PORT}/"
log " - API Backend: http://localhost:${HOST_PORT}/api/"
else
log "❌ Problème de déploiement détecté"
log "Logs du conteneur:"
docker logs ${CONTAINER_NAME} --tail 20
exit 1
fi
log "🎉 Déploiement terminé avec succès!"

View File

@ -1,55 +0,0 @@
#!/bin/bash
# Script pour déployer la page de statut
set -e
WEB_ROOT="/var/www/lecoffre"
STATUS_DIR="$WEB_ROOT/status"
SOURCE_DIR="./web/status"
echo "🚀 Déploiement de la page de statut..."
# Création du répertoire web si nécessaire
sudo mkdir -p "$WEB_ROOT"
# Création du répertoire de statut
sudo mkdir -p "$STATUS_DIR"
# Copie des fichiers statiques
echo "📁 Copie des fichiers statiques..."
sudo cp -r "$SOURCE_DIR"/* "$STATUS_DIR/"
# Suppression des fichiers non nécessaires sur le serveur
sudo rm -f "$STATUS_DIR/api.js"
sudo rm -f "$STATUS_DIR/package.json"
sudo rm -f "$STATUS_DIR/Dockerfile"
# Permissions
echo "🔐 Configuration des permissions..."
sudo chown -R www-data:www-data "$STATUS_DIR"
sudo chmod -R 755 "$STATUS_DIR"
# Test de la configuration Nginx
echo "🔍 Test de la configuration Nginx..."
if sudo nginx -t; then
echo "✅ Configuration Nginx valide"
else
echo "❌ Erreur dans la configuration Nginx"
exit 1
fi
# Rechargement de Nginx
echo "🔄 Rechargement de Nginx..."
sudo systemctl reload nginx
echo "✅ Page de statut déployée avec succès!"
echo ""
echo "🔗 URLs d'accès:"
echo " - Page de statut: https://dev4.4nkweb.com/status/"
echo " - API de statut: https://dev4.4nkweb.com/status/api"
echo ""
echo "📋 Prochaines étapes:"
echo "1. Construire et démarrer le service status-api: docker compose up -d status-api"
echo "2. Vérifier l'accès: curl https://dev4.4nkweb.com/status/"
echo "3. Tester l'API: curl https://dev4.4nkweb.com/status/api"

View File

@ -1,87 +0,0 @@
#!/bin/bash
set -euo pipefail
echo "🚀 DÉMARRAGE DU CONTAINER MASTER LECOFFRE_NODE"
echo "=============================================="
# Fonction de logging
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# Vérification des prérequis
log "Vérification des prérequis..."
# Vérifier que Docker est disponible
if ! command -v docker &> /dev/null; then
log "❌ Docker non disponible"
exit 1
fi
# Vérifier que docker-compose est disponible
if ! command -v docker-compose &> /dev/null; then
log "❌ Docker Compose non disponible"
exit 1
fi
# Vérifier que Nginx est configuré
if [ ! -f /etc/nginx/nginx.conf ]; then
log "❌ Configuration Nginx manquante"
exit 1
fi
log "✅ Prérequis validés"
# Initialisation des répertoires
log "Initialisation des répertoires..."
mkdir -p /app/data /app/logs /app/logs/nginx /var/log/supervisor
chown -R appuser:appuser /app/logs /var/log/supervisor || true
# Configuration des permissions Docker
if [ -S /var/run/docker.sock ]; then
chown appuser:appuser /var/run/docker.sock || true
fi
# Test de la configuration Nginx
log "Test de la configuration Nginx..."
if ! nginx -t; then
log "❌ Configuration Nginx invalide"
exit 1
fi
log "✅ Configuration Nginx valide"
# Initialisation de la base de données Docker Compose
log "Initialisation Docker Compose..."
cd /app
# Création du réseau Docker si nécessaire
docker network create lecoffre_network 2>/dev/null || true
# Préparation des variables d'environnement
log "Configuration des variables d'environnement..."
export COMPOSE_PROJECT_NAME=lecoffre
export COMPOSE_FILE=/app/docker-compose.yml
# Démarrage des services en arrière-plan
log "Démarrage des services Docker Compose..."
nohup docker-compose up -d > /app/logs/docker-compose.log 2>&1 &
DOCKER_COMPOSE_PID=$!
# Attente du démarrage des services
log "Attente du démarrage des services..."
sleep 30
# Vérification de l'état des services
log "Vérification de l'état des services..."
docker-compose ps
log "✅ Container Master LeCoffre Node démarré avec succès"
log "📊 Services disponibles:"
log " - Nginx: http://localhost"
log " - Status: http://localhost/status/"
log " - Grafana: http://localhost/grafana/"
# Démarrage de Supervisor
log "Démarrage de Supervisor..."
exec "$@"

View File

@ -1,64 +0,0 @@
#!/bin/bash
echo "=== CORRECTION DES FONDS DU RELAY ==="
echo ""
# Vérification des fonds dans Bitcoin Core
echo "1. Vérification des fonds dans Bitcoin Core..."
BALANCE=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="/home/bitcoin/.bitcoin/signet/.cookie" -rpcwallet="default" getbalance)
echo " Solde du wallet default: $BALANCE BTC"
# Vérification des outputs du relay
echo "2. Vérification des outputs du relay..."
OUTPUTS=$(docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq -r '.outputs | length // 0' 2>/dev/null || echo "0")
echo " Nombre d'outputs détectés par le relay: $OUTPUTS"
# Vérification de l'adresse SP
echo "3. Vérification de l'adresse SP..."
SP_ADDRESS=$(docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq -r '.sp_address // "null"' 2>/dev/null || echo "null")
echo " Adresse SP du relay: $SP_ADDRESS"
# Vérification de la configuration
echo "4. Vérification de la configuration..."
CONFIG_SP=$(docker exec sdk_relay cat /home/bitcoin/.conf 2>/dev/null | grep "sp_address=" | cut -d'"' -f2)
echo " Adresse SP dans la config: $CONFIG_SP"
if [ "$OUTPUTS" = "0" ] && [ "$BALANCE" != "0.00000000" ]; then
echo ""
echo "🎯 PROBLÈME IDENTIFIÉ : Le relay a des fonds dans Bitcoin Core mais ne les détecte pas !"
echo ""
echo "5. Solution : Forcer le scan des outputs..."
# Mise à jour manuelle de la configuration du relay
echo "6. Mise à jour manuelle de la configuration du relay..."
docker exec sdk_relay sh -c 'echo "{\"sp_address\":\"'$CONFIG_SP'\",\"outputs\":[],\"last_scan\":0,\"birthday\":0}" > /home/bitcoin/.4nk/default'
# Redémarrage du relay
echo "7. Redémarrage du relay..."
docker compose -f /home/debian/lecoffre_node/docker-compose.yml restart sdk_relay
# Attente
echo "8. Attente du redémarrage..."
sleep 15
# Vérification
echo "9. Vérification après correction..."
NEW_OUTPUTS=$(docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq -r '.outputs | length // 0' 2>/dev/null || echo "0")
echo " Nouveau nombre d'outputs: $NEW_OUTPUTS"
if [ "$NEW_OUTPUTS" != "0" ]; then
echo "✅ SUCCÈS : Le relay détecte maintenant ses outputs !"
else
echo "❌ ÉCHEC : Le relay ne détecte toujours pas ses outputs"
echo " Solution alternative : Vérifier les logs du relay"
docker logs sdk_relay --tail 10
fi
else
echo ""
echo "✅ Le relay fonctionne correctement"
echo " - Solde Bitcoin Core: $BALANCE BTC"
echo " - Outputs détectés: $OUTPUTS"
fi
echo ""
echo "=== FIN DU DIAGNOSTIC ==="

View File

@ -1,229 +0,0 @@
#!/bin/bash
# Script de transfert automatique de fonds du wallet mining vers le relay
# Usage: ./auto_transfer_funds.sh [amount] [relay_address]
set -e
# Configuration
MINING_WALLET="mining_mnemonic"
RELAY_WALLET="default"
BITCOIN_RPC_URL="bitcoin:38332"
COOKIE_FILE="/home/bitcoin/.bitcoin/signet/.cookie"
MIN_AMOUNT=0.001 # Montant minimum à transférer (0.001 BTC = 100,000 sats)
DEFAULT_AMOUNT=0.01 # Montant par défaut (0.01 BTC = 1,000,000 sats)
# Couleurs pour les logs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Fonctions de logging
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Fonction pour vérifier la connectivité Bitcoin
check_bitcoin_connectivity() {
log_info "Vérification de la connectivité Bitcoin..."
if ! docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" getblockchaininfo > /dev/null 2>&1; then
log_error "Impossible de se connecter au nœud Bitcoin"
return 1
fi
log_success "Connexion Bitcoin OK"
return 0
}
# Fonction pour vérifier le solde du wallet mining
check_mining_balance() {
log_info "Vérification du solde du wallet mining..."
local balance=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" getbalance 2>/dev/null || echo "0")
if [ "$balance" = "0" ]; then
log_error "Wallet mining vide ou inaccessible"
return 1
fi
log_success "Solde wallet mining: $balance BTC"
echo "$balance"
return 0
}
# Fonction pour vérifier le solde du wallet relay
check_relay_balance() {
log_info "Vérification du solde du wallet relay..."
# Charger le wallet relay s'il n'est pas déjà chargé
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" loadwallet "$RELAY_WALLET" > /dev/null 2>&1 || true
local balance=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$RELAY_WALLET" getbalance 2>/dev/null || echo "0")
log_info "Solde wallet relay: $balance BTC"
echo "$balance"
return 0
}
# Fonction pour générer une adresse pour le relay
generate_relay_address() {
log_info "Génération d'une adresse pour le relay..."
# Charger le wallet relay
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" loadwallet "$RELAY_WALLET" > /dev/null 2>&1 || true
local address=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$RELAY_WALLET" getnewaddress "relay_funding" 2>/dev/null)
if [ -z "$address" ]; then
log_error "Impossible de générer une adresse pour le relay"
return 1
fi
log_success "Adresse générée: $address"
echo "$address"
return 0
}
# Fonction pour transférer des fonds
transfer_funds() {
local amount=$1
local address=$2
log_info "Transfert de $amount BTC vers $address..."
local txid=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" sendtoaddress "$address" "$amount" 2>/dev/null)
if [ -z "$txid" ]; then
log_error "Échec du transfert de fonds"
return 1
fi
log_success "Transfert effectué. TXID: $txid"
echo "$txid"
return 0
}
# Fonction pour confirmer une transaction
confirm_transaction() {
local txid=$1
local address=$2
log_info "Confirmation de la transaction $txid..."
# Générer des blocs pour confirmer la transaction
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" generatetoaddress 6 "$address" > /dev/null 2>&1
# Vérifier les confirmations
local confirmations=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" gettransaction "$txid" 2>/dev/null | jq -r '.confirmations // 0')
if [ "$confirmations" -gt 0 ]; then
log_success "Transaction confirmée ($confirmations confirmations)"
return 0
else
log_warning "Transaction non confirmée (confirmations: $confirmations)"
return 1
fi
}
# Fonction pour vérifier les fonds du relay dans le fichier de configuration
check_relay_funds_in_config() {
log_info "Vérification des fonds du relay dans la configuration..."
local outputs_count=$(docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq -r '.outputs | length // 0' 2>/dev/null || echo "0")
log_info "Nombre d'outputs du relay: $outputs_count"
echo "$outputs_count"
return 0
}
# Fonction principale
main() {
local amount=${1:-$DEFAULT_AMOUNT}
local relay_address=${2:-""}
log_info "=== TRANSFERT AUTOMATIQUE DE FONDS ==="
log_info "Montant: $amount BTC"
# Vérifications préliminaires
if ! check_bitcoin_connectivity; then
exit 1
fi
# Vérifier le solde du wallet mining
local mining_balance=$(check_mining_balance)
if [ $? -ne 0 ]; then
exit 1
fi
# Vérifier si le montant demandé est disponible
if (( $(echo "$mining_balance < $amount" | bc -l) )); then
log_error "Solde insuffisant dans le wallet mining ($mining_balance BTC < $amount BTC)"
exit 1
fi
# Vérifier le solde actuel du relay
local relay_balance=$(check_relay_balance)
# Vérifier les fonds dans la configuration du relay
local outputs_count=$(check_relay_funds_in_config)
# Si le relay a déjà des fonds, ne pas transférer
if (( $(echo "$relay_balance > 0" | bc -l) )) || [ "$outputs_count" -gt 0 ]; then
log_info "Le relay a déjà des fonds (balance: $relay_balance BTC, outputs: $outputs_count)"
log_success "Aucun transfert nécessaire"
exit 0
fi
# Générer une adresse pour le relay si non fournie
if [ -z "$relay_address" ]; then
relay_address=$(generate_relay_address)
if [ $? -ne 0 ]; then
exit 1
fi
fi
# Effectuer le transfert
local txid=$(transfer_funds "$amount" "$relay_address")
if [ $? -ne 0 ]; then
exit 1
fi
# Confirmer la transaction
if confirm_transaction "$txid" "$relay_address"; then
log_success "Transfert de fonds réussi et confirmé"
# Redémarrer le relay pour qu'il détecte les nouveaux fonds
log_info "Redémarrage du relay pour détecter les nouveaux fonds..."
docker compose restart sdk_relay
log_success "Relay redémarré. Les fonds devraient être détectés dans quelques secondes."
else
log_warning "Transfert effectué mais non confirmé. Le relay pourrait ne pas détecter les fonds immédiatement."
fi
log_success "=== TRANSFERT AUTOMATIQUE TERMINÉ ==="
}
# Vérifier que bc est installé
if ! command -v bc &> /dev/null; then
log_error "bc n'est pas installé. Installation..."
sudo apt-get update && sudo apt-get install -y bc
fi
# Exécuter la fonction principale
main "$@"

View File

@ -1,44 +0,0 @@
#!/bin/bash
# Script d'intégration pour vérifier et transférer des fonds automatiquement
# Usage: ./check_and_transfer_funds.sh [min_amount]
set -e
MIN_AMOUNT=${1:-0.001} # Montant minimum en BTC (par défaut 0.001 BTC = 100,000 sats)
COOKIE_FILE="/home/bitcoin/.bitcoin/signet/.cookie"
RELAY_WALLET="default"
echo "=== VÉRIFICATION ET TRANSFERT AUTOMATIQUE DE FONDS ==="
# Vérifier les fonds du relay dans la configuration
echo "Vérification des fonds du relay..."
OUTPUTS_COUNT=$(docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq -r '.outputs | length // 0' 2>/dev/null || echo "0")
if [ "$OUTPUTS_COUNT" -gt 0 ]; then
echo "Le relay a déjà des fonds ($OUTPUTS_COUNT outputs). Aucun transfert nécessaire."
exit 0
fi
# Vérifier le solde du wallet relay dans Bitcoin Core
echo "Vérification du solde du wallet relay dans Bitcoin Core..."
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" loadwallet "$RELAY_WALLET" > /dev/null 2>&1 || true
RELAY_BALANCE=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$RELAY_WALLET" getbalance 2>/dev/null || echo "0")
if [ "$(echo "$RELAY_BALANCE >= $MIN_AMOUNT" | bc -l)" = "1" ]; then
echo "Le relay a suffisamment de fonds ($RELAY_BALANCE BTC >= $MIN_AMOUNT BTC). Aucun transfert nécessaire."
exit 0
fi
echo "Fonds insuffisants détectés. Lancement du transfert automatique..."
echo "Solde actuel: $RELAY_BALANCE BTC"
echo "Montant minimum requis: $MIN_AMOUNT BTC"
# Lancer le script de transfert
TRANSFER_AMOUNT=$(echo "$MIN_AMOUNT * 10" | bc -l) # Transférer 10x le montant minimum
echo "Transfert de $TRANSFER_AMOUNT BTC..."
# Exécuter le script de transfert
./scripts/funds/simple_transfer.sh "$TRANSFER_AMOUNT"
echo "=== VÉRIFICATION ET TRANSFERT TERMINÉ ==="

View File

@ -1,171 +0,0 @@
#!/usr/bin/env node
/**
* Service de détection et transfert automatique de fonds
* Ce service surveille les applications et transfère automatiquement des fonds
* quand un manque de fonds est détecté
*/
const { spawn, exec } = require('child_process');
const fs = require('fs');
const path = require('path');
class FundsDetectorService {
constructor() {
this.isRunning = false;
this.checkInterval = 30000; // 30 secondes
this.minFundsThreshold = 0.001; // 0.001 BTC = 100,000 sats
this.transferAmount = 0.01; // 0.01 BTC = 1,000,000 sats
this.logFile = '/tmp/funds_detector.log';
}
log(message) {
const timestamp = new Date().toISOString();
const logMessage = `[${timestamp}] ${message}\n`;
console.log(logMessage.trim());
fs.appendFileSync(this.logFile, logMessage);
}
async checkRelayFunds() {
try {
// Vérifier les fonds du relay dans la configuration
const outputsCount = await this.getRelayOutputsCount();
this.log(`Relay outputs count: ${outputsCount}`);
// Vérifier le solde du wallet relay dans Bitcoin Core
const relayBalance = await this.getRelayBalance();
this.log(`Relay balance: ${relayBalance} BTC`);
// Si le relay n'a pas de fonds, déclencher le transfert
if (outputsCount === 0 && parseFloat(relayBalance) < this.minFundsThreshold) {
this.log(`⚠️ Fonds insuffisants détectés. Lancement du transfert automatique...`);
await this.transferFunds();
return true;
}
this.log(`✅ Fonds suffisants (outputs: ${outputsCount}, balance: ${relayBalance} BTC)`);
return false;
} catch (error) {
this.log(`❌ Erreur lors de la vérification des fonds: ${error.message}`);
return false;
}
}
async getRelayOutputsCount() {
return new Promise((resolve, reject) => {
exec('docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq -r \'.outputs | length // 0\' 2>/dev/null || echo "0"', (error, stdout, stderr) => {
if (error) {
reject(error);
} else {
resolve(parseInt(stdout.trim()) || 0);
}
});
});
}
async getRelayBalance() {
return new Promise((resolve, reject) => {
exec('docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="/home/bitcoin/.bitcoin/signet/.cookie" -rpcwallet="default" getbalance 2>/dev/null || echo "0"', (error, stdout, stderr) => {
if (error) {
reject(error);
} else {
resolve(parseFloat(stdout.trim()) || 0);
}
});
});
}
async transferFunds() {
try {
this.log(`🔄 Transfert de ${this.transferAmount} BTC...`);
// Charger le wallet relay
await this.execCommand('docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="/home/bitcoin/.bitcoin/signet/.cookie" loadwallet "default" > /dev/null 2>&1 || true');
// Générer une adresse pour le relay
const relayAddress = await this.execCommand('docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="/home/bitcoin/.bitcoin/signet/.cookie" -rpcwallet="default" getnewaddress "relay_funding" 2>/dev/null');
this.log(`Adresse générée: ${relayAddress}`);
// Effectuer le transfert
const txid = await this.execCommand(`docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="/home/bitcoin/.bitcoin/signet/.cookie" -rpcwallet="mining_mnemonic" sendtoaddress "${relayAddress}" "${this.transferAmount}" 2>/dev/null`);
this.log(`Transaction ID: ${txid}`);
// Générer des blocs pour confirmer
await this.execCommand(`docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="/home/bitcoin/.bitcoin/signet/.cookie" -rpcwallet="mining_mnemonic" generatetoaddress 6 "${relayAddress}" > /dev/null 2>&1`);
// Redémarrer le relay
this.log(`🔄 Redémarrage du relay...`);
await this.execCommand('docker compose restart sdk_relay');
this.log(`✅ Transfert de fonds réussi et relay redémarré`);
return true;
} catch (error) {
this.log(`❌ Erreur lors du transfert: ${error.message}`);
return false;
}
}
async execCommand(command) {
return new Promise((resolve, reject) => {
exec(command, (error, stdout, stderr) => {
if (error) {
reject(error);
} else {
resolve(stdout.trim());
}
});
});
}
async start() {
if (this.isRunning) {
this.log('Service déjà en cours d\'exécution');
return;
}
this.isRunning = true;
this.log('🚀 Démarrage du service de détection des fonds');
this.log(`Seuil minimum: ${this.minFundsThreshold} BTC`);
this.log(`Montant de transfert: ${this.transferAmount} BTC`);
this.log(`Intervalle de vérification: ${this.checkInterval / 1000} secondes`);
const checkLoop = async () => {
if (!this.isRunning) return;
try {
await this.checkRelayFunds();
} catch (error) {
this.log(`❌ Erreur dans la boucle de vérification: ${error.message}`);
}
setTimeout(checkLoop, this.checkInterval);
};
// Démarrer la boucle de vérification
checkLoop();
}
stop() {
this.isRunning = false;
this.log('🛑 Arrêt du service de détection des fonds');
}
}
// Gestion des signaux pour un arrêt propre
process.on('SIGINT', () => {
console.log('\n🛑 Arrêt du service...');
process.exit(0);
});
process.on('SIGTERM', () => {
console.log('\n🛑 Arrêt du service...');
process.exit(0);
});
// Démarrer le service si ce script est exécuté directement
if (require.main === module) {
const service = new FundsDetectorService();
service.start();
}
module.exports = FundsDetectorService;

View File

@ -1,46 +0,0 @@
#!/bin/bash
# Script de monitoring des fonds du relay
# Usage: ./monitor_funds.sh [interval_seconds]
set -e
INTERVAL=${1:-30} # Intervalle de vérification en secondes (par défaut 30s)
COOKIE_FILE="/home/bitcoin/.bitcoin/signet/.cookie"
RELAY_WALLET="default"
echo "=== MONITORING DES FONDS DU RELAY ==="
echo "Intervalle de vérification: $INTERVAL secondes"
echo "Appuyez sur Ctrl+C pour arrêter"
while true; do
echo ""
echo "--- $(date) ---"
# Vérifier les fonds du relay dans la configuration
OUTPUTS_COUNT=$(docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq -r '.outputs | length // 0' 2>/dev/null || echo "0")
echo "Outputs du relay: $OUTPUTS_COUNT"
# Vérifier le solde du wallet relay dans Bitcoin Core
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" loadwallet "$RELAY_WALLET" > /dev/null 2>&1 || true
RELAY_BALANCE=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$RELAY_WALLET" getbalance 2>/dev/null || echo "0")
echo "Solde wallet relay: $RELAY_BALANCE BTC"
# Vérifier le solde du wallet mining
MINING_BALANCE=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="mining_mnemonic" getbalance 2>/dev/null || echo "0")
echo "Solde wallet mining: $MINING_BALANCE BTC"
# Vérifier l'état du relay
RELAY_STATUS=$(docker compose ps sdk_relay --format "table {{.Status}}" | tail -n +2)
echo "État du relay: $RELAY_STATUS"
# Si le relay n'a pas de fonds, lancer le transfert automatique
if [ "$OUTPUTS_COUNT" -eq 0 ] && [ "$(echo "$RELAY_BALANCE < 0.001" | bc -l)" = "1" ]; then
echo "⚠️ Fonds insuffisants détectés. Lancement du transfert automatique..."
./scripts/funds/simple_transfer.sh 0.01
else
echo "✅ Fonds suffisants"
fi
sleep "$INTERVAL"
done

View File

@ -1,63 +0,0 @@
#!/bin/bash
# Script simplifié de transfert de fonds
set -e
MINING_WALLET="mining_mnemonic"
RELAY_WALLET="default"
COOKIE_FILE="/home/bitcoin/.bitcoin/signet/.cookie"
AMOUNT=${1:-0.01}
echo "=== TRANSFERT SIMPLE DE FONDS ==="
echo "Montant: $AMOUNT BTC"
# Vérifier la connectivité
echo "Vérification de la connectivité Bitcoin..."
if ! docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" getblockchaininfo > /dev/null 2>&1; then
echo "ERREUR: Impossible de se connecter au nœud Bitcoin"
exit 1
fi
# Vérifier le solde du wallet mining
echo "Vérification du solde du wallet mining..."
MINING_BALANCE=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" getbalance 2>/dev/null || echo "0")
echo "Solde wallet mining: $MINING_BALANCE BTC"
# Charger le wallet relay
echo "Chargement du wallet relay..."
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" loadwallet "$RELAY_WALLET" > /dev/null 2>&1 || true
# Vérifier le solde du wallet relay
echo "Vérification du solde du wallet relay..."
RELAY_BALANCE=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$RELAY_WALLET" getbalance 2>/dev/null || echo "0")
echo "Solde wallet relay: $RELAY_BALANCE BTC"
# Si le relay a déjà des fonds, ne pas transférer
if [ "$(echo "$RELAY_BALANCE > 0" | bc -l)" = "1" ]; then
echo "Forçage d'un nouveau transfert pour créer des outputs..."
exit 0
fi
# Générer une adresse pour le relay
echo "Génération d'une adresse pour le relay..."
RELAY_ADDRESS=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$RELAY_WALLET" getnewaddress "relay_funding" 2>/dev/null)
echo "Adresse générée: $RELAY_ADDRESS"
# Effectuer le transfert
echo "Transfert de $AMOUNT BTC vers $RELAY_ADDRESS..."
TXID=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" sendtoaddress "$RELAY_ADDRESS" "$AMOUNT" 2>/dev/null)
echo "Transaction ID: $TXID"
# Générer des blocs pour confirmer
echo "Génération de blocs pour confirmer la transaction..."
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" generatetoaddress 6 "$RELAY_ADDRESS" > /dev/null 2>&1
# Vérifier les confirmations
CONFIRMATIONS=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" gettransaction "$TXID" 2>/dev/null | jq -r '.confirmations // 0')
echo "Confirmations: $CONFIRMATIONS"
# Redémarrer le relay
echo "Redémarrage du relay..."
docker compose restart sdk_relay
echo "=== TRANSFERT TERMINÉ ==="

View File

@ -1,40 +0,0 @@
#!/bin/bash
# Script de vérification des fonds au démarrage
# Usage: ./startup_funds_check.sh
set -e
echo "=== VÉRIFICATION DES FONDS AU DÉMARRAGE ==="
# Attendre que les services soient prêts
echo "Attente du démarrage des services..."
sleep 30
# Vérifier la connectivité Bitcoin
echo "Vérification de la connectivité Bitcoin..."
for i in {1..10}; do
if docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="/home/bitcoin/.bitcoin/signet/.cookie" getblockchaininfo > /dev/null 2>&1; then
echo "✅ Connexion Bitcoin OK"
break
fi
echo "⏳ Attente de la connexion Bitcoin... ($i/10)"
sleep 10
done
# Vérifier l'état du relay
echo "Vérification de l'état du relay..."
for i in {1..10}; do
if docker exec sdk_relay curl -f http://localhost:8091/ > /dev/null 2>&1; then
echo "✅ Relay opérationnel"
break
fi
echo "⏳ Attente du relay... ($i/10)"
sleep 10
done
# Vérifier et transférer les fonds si nécessaire
echo "Vérification des fonds..."
./scripts/funds/check_and_transfer_funds.sh 0.001
echo "=== VÉRIFICATION DES FONDS TERMINÉE ==="

View File

@ -1,35 +0,0 @@
#!/bin/bash
set -euo pipefail
echo "🔐 GÉNÉRATION DES CERTIFICATS SSL AUTO-SIGNÉS"
echo "============================================="
# Fonction de logging
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# Création des répertoires SSL
log "Création des répertoires SSL..."
mkdir -p /app/ssl
# Génération de la clé privée
log "Génération de la clé privée..."
openssl genrsa -out /app/ssl/nginx-selfsigned.key 2048
# Génération du certificat auto-signé
log "Génération du certificat auto-signé..."
openssl req -new -x509 -key /app/ssl/nginx-selfsigned.key \
-out /app/ssl/nginx-selfsigned.crt \
-days 365 \
-subj "/C=FR/ST=France/L=Paris/O=LeCoffre/OU=Development/CN=dev3.4nkweb.com/emailAddress=admin@lecoffre.io"
# Configuration des permissions
log "Configuration des permissions..."
chmod 644 /app/ssl/nginx-selfsigned.key
chmod 644 /app/ssl/nginx-selfsigned.crt
log "✅ Certificats SSL générés avec succès"
log " Certificat: /app/ssl/nginx-selfsigned.crt"
log " Clé privée: /app/ssl/nginx-selfsigned.key"
log " Valide pour: dev3.4nkweb.com"

View File

@ -1,24 +0,0 @@
#!/bin/bash
# Script de test de progression pour Bitcoin Signet
info=$(bitcoin-cli -signet -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo 2>/dev/null || echo '{}')
blocks=$(echo "$info" | jq -r '.blocks // 0')
headers=$(echo "$info" | jq -r '.headers // 0')
ibd=$(echo "$info" | jq -r '.initialblockdownload // false')
verification_progress=$(echo "$info" | jq -r '.verificationprogress // 0')
# Bitcoin est considéré comme ready s'il répond aux commandes et a au moins quelques blocs
if [ "$blocks" -gt 0 ]; then
if [ "$ibd" = "false" ] || [ "$blocks" -eq "$headers" ]; then
echo "Bitcoin ready: Synced ($blocks blocks)"
else
remaining=$((headers - blocks))
progress=$((blocks * 100 / headers))
verification_percent=$(echo "$verification_progress * 100" | bc -l | cut -d. -f1)
echo "Bitcoin IBD: $blocks/$headers ($remaining remaining) - $progress% - Verification: $verification_percent%"
fi
exit 0
else
echo "Bitcoin starting: No blocks yet"
exit 1
fi

View File

@ -1,18 +0,0 @@
#!/bin/bash
# Script de test de progression pour BlindBit
# Vérifier si le processus BlindBit est en cours d'exécution
if pgrep main > /dev/null 2>/dev/null; then
# Vérifier l'API - être plus tolérant
if wget -q --spider http://localhost:8000/tweaks/1 2>/dev/null; then
echo 'BlindBit ready: Oracle service responding'
exit 0
else
# Vérifier si le processus est en cours d'exécution (même si l'API n'est pas encore prête)
echo 'BlindBit starting: Oracle service initializing'
exit 1
fi
else
echo 'BlindBit starting: Process not ready'
exit 1
fi

View File

@ -1,24 +0,0 @@
#!/bin/bash
# Script de test de progression pour SDK Relay
# Vérifier si le processus SDK Relay est en cours d'exécution
if pgrep sdk_relay > /dev/null 2>/dev/null; then
# Vérifier l'API WebSocket
if curl -f http://localhost:8091/ >/dev/null 2>&1; then
echo 'SDK Relay ready: WebSocket server responding'
exit 0
else
# Récupérer les logs récents pour voir la progression
relay_logs=$(tail -20 /var/log/sdk_relay/sdk_relay.log 2>/dev/null | grep -E "(IBD|blocks|headers|waiting|scanning|connecting)" | tail -1 || echo "")
if [ -n "$relay_logs" ]; then
echo "SDK Relay sync: $relay_logs"
exit 1
else
echo 'SDK Relay starting: WebSocket server initializing'
exit 1
fi
fi
else
echo 'SDK Relay starting: Process not ready'
exit 1
fi

View File

@ -1,4 +0,0 @@
#!/bin/sh
# Healthcheck for SDK Signer
# Prefer checking the HTTP endpoint first; fall back to log-based progress hints

View File

@ -1,7 +0,0 @@
#!/bin/bash
# Script de test de progression pour Tor
# Test simple : considérer Tor comme prêt après un délai
# Tor a terminé son bootstrap selon les logs Docker
echo 'Tor ready: Bootstrap complete (100%)'
exit 0

View File

@ -1,182 +0,0 @@
#!/bin/bash
# Script de maintenance LeCoffre Node
# Nettoyage, optimisation et vérifications de santé
set -e
# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Fonction pour afficher un message avec timestamp
print_message() {
echo -e "${BLUE}[$(date '+%H:%M:%S')]${NC} $1"
}
# Fonction pour afficher le menu
show_menu() {
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} LeCoffre Node - Maintenance Menu${NC}"
echo -e "${BLUE}========================================${NC}"
echo
echo -e "${CYAN}1.${NC} Validation complète du déploiement"
echo -e "${CYAN}2.${NC} Sauvegarde des données"
echo -e "${CYAN}3.${NC} Nettoyage des logs anciens"
echo -e "${CYAN}4.${NC} Nettoyage des images Docker inutilisées"
echo -e "${CYAN}5.${NC} Vérification de l'espace disque"
echo -e "${CYAN}6.${NC} Redémarrage des services"
echo -e "${CYAN}7.${NC} Mise à jour des images"
echo -e "${CYAN}8.${NC} Collecte des logs"
echo -e "${CYAN}9.${NC} Vérification de la santé des services"
echo -e "${CYAN}0.${NC} Quitter"
echo
}
# Fonction de validation complète
validate_deployment() {
print_message "Lancement de la validation complète..."
./scripts/validate-deployment.sh
}
# Fonction de sauvegarde
backup_data() {
print_message "Création d'une sauvegarde des données..."
./scripts/backup-data.sh
}
# Fonction de nettoyage des logs
cleanup_logs() {
print_message "Nettoyage des logs anciens..."
# Supprimer les logs de plus de 30 jours
find ./logs -name "*.log" -type f -mtime +30 -delete 2>/dev/null || true
# Nettoyer les logs Docker
docker system prune -f --filter "until=720h" 2>/dev/null || true
echo -e "${GREEN}✓ Logs anciens nettoyés${NC}"
}
# Fonction de nettoyage Docker
cleanup_docker() {
print_message "Nettoyage des images Docker inutilisées..."
# Supprimer les images inutilisées
docker image prune -f 2>/dev/null || true
# Supprimer les conteneurs arrêtés
docker container prune -f 2>/dev/null || true
# Supprimer les réseaux inutilisés
docker network prune -f 2>/dev/null || true
echo -e "${GREEN}✓ Images Docker inutilisées supprimées${NC}"
}
# Fonction de vérification de l'espace disque
check_disk_space() {
print_message "Vérification de l'espace disque..."
echo -e "${CYAN}Espace disque disponible:${NC}"
df -h | grep -E "(Filesystem|/dev/)"
echo
echo -e "${CYAN}Taille des volumes Docker:${NC}"
docker system df
echo
echo -e "${CYAN}Taille des répertoires de logs:${NC}"
du -sh ./logs/* 2>/dev/null || echo "Aucun log trouvé"
echo
echo -e "${CYAN}Taille des sauvegardes:${NC}"
du -sh ./backups/* 2>/dev/null || echo "Aucune sauvegarde trouvée"
}
# Fonction de redémarrage des services
restart_services() {
print_message "Redémarrage des services..."
echo -e "${YELLOW}Arrêt des services...${NC}"
docker compose --env-file .env.master down
echo -e "${YELLOW}Démarrage des services...${NC}"
./scripts/start.sh
}
# Fonction de mise à jour
update_images() {
print_message "Mise à jour des images Docker..."
./scripts/update-images.sh
}
# Fonction de collecte des logs
collect_logs() {
print_message "Collecte des logs de tous les services..."
./scripts/collect-logs.sh
}
# Fonction de vérification de santé
check_health() {
print_message "Vérification de la santé des services..."
echo -e "${CYAN}Statut des conteneurs:${NC}"
docker compose --env-file .env.master ps
echo
echo -e "${CYAN}Utilisation des ressources:${NC}"
docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}"
}
# Boucle principale
while true; do
show_menu
echo -n -e "${YELLOW}Choisissez une option (0-9): ${NC}"
read -r choice
case $choice in
1)
validate_deployment
;;
2)
backup_data
;;
3)
cleanup_logs
;;
4)
cleanup_docker
;;
5)
check_disk_space
;;
6)
restart_services
;;
7)
update_images
;;
8)
collect_logs
;;
9)
check_health
;;
0)
echo -e "${GREEN}Au revoir!${NC}"
exit 0
;;
*)
echo -e "${RED}Option invalide. Veuillez choisir entre 0 et 9.${NC}"
;;
esac
echo
echo -e "${YELLOW}Appuyez sur Entrée pour continuer...${NC}"
read -r
clear
done

View File

@ -1,65 +0,0 @@
#!/bin/bash
# Script d'optimisation du démarrage du relais
# Évite les scans bloquants en ajustant last_scan si nécessaire
set -e
echo "🔧 Optimisation du démarrage du relais..."
# Vérifier si le conteneur sdk_relay existe
if ! docker ps -a --format "table {{.Names}}" | grep -q "sdk_relay"; then
echo "⚠️ Conteneur sdk_relay non trouvé"
exit 0
fi
# Vérifier si le conteneur est en cours d'exécution
if ! docker ps --format "table {{.Names}}" | grep -q "sdk_relay"; then
echo "⚠️ Conteneur sdk_relay non démarré"
exit 0
fi
# Obtenir la hauteur actuelle de la blockchain
echo "📊 Récupération de la hauteur de la blockchain..."
CURRENT_HEIGHT=$(docker exec sdk_relay curl -s -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"1.0","id":"test","method":"getblockcount","params":[]}' http://bitcoin:38332/ | jq -r '.result' 2>/dev/null || echo "0")
if [ "$CURRENT_HEIGHT" = "0" ] || [ "$CURRENT_HEIGHT" = "null" ]; then
echo "⚠️ Impossible de récupérer la hauteur de la blockchain"
exit 0
fi
echo "📊 Hauteur actuelle: $CURRENT_HEIGHT"
# Vérifier le last_scan actuel
LAST_SCAN=$(docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq -r '.last_scan' 2>/dev/null || echo "0")
if [ "$LAST_SCAN" = "0" ] || [ "$LAST_SCAN" = "null" ]; then
echo "⚠️ Impossible de récupérer le last_scan"
exit 0
fi
echo "📊 Dernier scan: $LAST_SCAN"
# Calculer la différence
DIFF=$((CURRENT_HEIGHT - LAST_SCAN))
echo "📊 Blocs à scanner: $DIFF"
# Si plus de 20 blocs à scanner, ajuster pour éviter le blocage
if [ "$DIFF" -gt 20 ]; then
echo "⚠️ Trop de blocs à scanner ($DIFF), ajustement pour éviter le blocage..."
NEW_SCAN=$((CURRENT_HEIGHT - 5))
# Sauvegarder la configuration actuelle
docker exec sdk_relay cp /home/bitcoin/.4nk/default /home/bitcoin/.4nk/default.backup
# Mettre à jour le last_scan
docker exec sdk_relay sh -c "cd /home/bitcoin/.4nk && sed 's/\"last_scan\":$LAST_SCAN/\"last_scan\":$NEW_SCAN/' default > default.new && mv default.new default"
echo "✅ last_scan ajusté de $LAST_SCAN à $NEW_SCAN"
echo "🔄 Redémarrage du relais..."
docker compose restart sdk_relay
else
echo "✅ Nombre de blocs à scanner acceptable ($DIFF)"
fi
echo "✅ Optimisation terminée"

View File

@ -1,100 +0,0 @@
#!/bin/bash
# Script de préparation avant build Docker
# Synchronise les configurations et prépare l'environnement
set -euo pipefail
# Couleurs pour les logs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Fonction de logging
log() {
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}
log_success() {
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] ✓${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] ⚠${NC} $1"
}
log_error() {
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ✗${NC} $1"
}
# Répertoire racine du projet
PROJECT_ROOT="/home/debian/lecoffre_node"
# Changer vers le répertoire du projet
cd "$PROJECT_ROOT"
log "Préparation avant build Docker..."
# 1. Synchroniser toutes les configurations
log "Synchronisation des configurations..."
if ./scripts/sync-configs.sh; then
log_success "Configurations synchronisées"
else
log_error "Échec de la synchronisation des configurations"
exit 1
fi
# 2. Mettre à jour les dépendances de tous les projets
log "Mise à jour des dépendances..."
if ./scripts/startup-sequence.sh update-deps; then
log_success "Dépendances mises à jour"
else
log_warning "Échec de la mise à jour des dépendances"
fi
# 3. Vérifier les fichiers ignore
log "Vérification des fichiers ignore..."
if ./scripts/startup-sequence.sh check-ignore; then
log_success "Fichiers ignore vérifiés"
else
log_warning "Problèmes détectés avec les fichiers ignore"
fi
# 4. Nettoyer les fichiers non suivis
log "Nettoyage des fichiers non suivis..."
if ./scripts/startup-sequence.sh clean-untracked; then
log_success "Fichiers non suivis nettoyés"
else
log_warning "Échec du nettoyage des fichiers non suivis"
fi
# 5. Vérifier que les services nécessaires sont arrêtés
log "Vérification des services Docker..."
if docker compose ps --services --filter "status=running" | grep -q .; then
log_warning "Certains services sont en cours d'exécution"
log "Arrêt des services pour le build..."
docker compose down
log_success "Services arrêtés"
else
log_success "Aucun service en cours d'exécution"
fi
# 6. Nettoyer les images Docker obsolètes (optionnel)
if [[ "${CLEAN_DOCKER:-false}" == "true" ]]; then
log "Nettoyage des images Docker obsolètes..."
docker system prune -f
log_success "Nettoyage terminé"
fi
# 7. Vérifier l'espace disque
log "Vérification de l'espace disque..."
DISK_USAGE=$(df /home/debian | tail -1 | awk '{print $5}' | sed 's/%//')
if [[ $DISK_USAGE -gt 90 ]]; then
log_warning "Espace disque faible: ${DISK_USAGE}% utilisé"
else
log_success "Espace disque OK: ${DISK_USAGE}% utilisé"
fi
log_success "Préparation terminée - Prêt pour le build Docker"

View File

@ -1,94 +0,0 @@
#!/bin/bash
# Script de restauration des données LeCoffre Node
# Restaure Bitcoin, BlindBit, SDK Storage et SDK Signer
set -e
# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
BACKUP_DIR="./backups"
if [ $# -eq 0 ]; then
echo -e "${RED}Usage: $0 <backup_name>${NC}"
echo -e "${YELLOW}Available backups:${NC}"
ls -la "$BACKUP_DIR"/*.tar.gz 2>/dev/null | awk '{print " " $9}' | sed 's|.*/||' | sed 's|\.tar\.gz||' || echo " No backups found"
exit 1
fi
BACKUP_NAME="$1"
BACKUP_FILE="$BACKUP_DIR/${BACKUP_NAME}.tar.gz"
if [ ! -f "$BACKUP_FILE" ]; then
echo -e "${RED}Error: Backup file $BACKUP_FILE not found${NC}"
exit 1
fi
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} LeCoffre Node - Data Restore${NC}"
echo -e "${BLUE}========================================${NC}"
echo
echo -e "${YELLOW}Restoring from: $BACKUP_NAME${NC}"
echo -e "${RED}WARNING: This will overwrite existing data!${NC}"
echo -e "${YELLOW}Are you sure you want to continue? (y/N)${NC}"
read -r response
if [[ ! "$response" =~ ^[Yy]$ ]]; then
echo -e "${YELLOW}Restore cancelled${NC}"
exit 0
fi
# Arrêter les services
echo -e "${BLUE}Stopping services...${NC}"
docker compose --env-file .env.master down >/dev/null 2>&1 || true
# Extraire la sauvegarde
echo -e "${BLUE}Extracting backup...${NC}"
cd "$BACKUP_DIR"
tar -xzf "${BACKUP_NAME}.tar.gz"
cd ..
# Fonction pour restaurer un volume Docker
restore_volume() {
local volume_name=$1
local backup_path=$2
local description=$3
echo -e "${BLUE}Restoring $description...${NC}"
# Créer le volume s'il n'existe pas
docker volume create "$volume_name" >/dev/null 2>&1 || true
# Restaurer les données
if [ -d "$BACKUP_DIR/$BACKUP_NAME$backup_path" ]; then
docker run --rm \
-v "$volume_name":/target \
-v "$(pwd)/$BACKUP_DIR/$BACKUP_NAME$backup_path":/source:ro \
alpine:latest \
sh -c "rm -rf /target/* && cp -r /source/* /target/ 2>/dev/null || true"
echo -e "${GREEN}$description restored${NC}"
else
echo -e "${YELLOW}⚠ No backup data found for $description${NC}"
fi
}
# Restaurer les volumes critiques
restore_volume "4nk_node_bitcoin_data" "/bitcoin" "Bitcoin Signet Data"
restore_volume "4nk_node_blindbit_data" "/blindbit" "BlindBit Oracle Data"
restore_volume "4nk_node_sdk_data" "/sdk" "SDK Relay Data"
restore_volume "4nk_node_sdk_storage_data" "/sdk_storage" "SDK Storage Data"
restore_volume "4nk_node_grafana_data" "/grafana" "Grafana Data"
restore_volume "4nk_node_loki_data" "/loki" "Loki Data"
# Nettoyer les fichiers temporaires
rm -rf "$BACKUP_DIR/$BACKUP_NAME"
echo
echo -e "${GREEN}✅ Data restoration completed successfully!${NC}"
echo -e "${YELLOW}You can now start the services with: ./scripts/start.sh${NC}"
echo

View File

@ -1,103 +0,0 @@
#!/bin/bash
# Script pour configurer la centralisation des logs
# Usage: ./scripts/setup-logs.sh
set -e
echo "🔧 Configuration de la centralisation des logs..."
# Créer les dossiers de logs
mkdir -p logs/{bitcoin,blindbit,sdk_relaysdk_storagelecoffre-front,ihm_client,tor,miner,nginx}
# Créer des fichiers de log de test pour chaque service
echo "📝 Création des fichiers de log de test..."
for service in bitcoin blindbit sdk_relaysdk_storage lecoffre-front ihm_client tor miner nginx; do
log_file="logs/${service}/${service}.log"
echo "$(date): Test log entry for ${service}" > "$log_file"
echo "$(date): Service ${service} started successfully" >> "$log_file"
echo "✅ Créé: $log_file"
done
# Créer des fichiers de log avec rotation
echo "🔄 Configuration de la rotation des logs..."
for service in bitcoin blindbit sdk_relaysdk_storage lecoffre-front ihm_client tor miner nginx; do
logrotate_config="conf/logrotate/${service}.conf"
mkdir -p conf/logrotate
cat > "$logrotate_config" << EOF
logs/${service}/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
postrotate
# Redémarrer le service si nécessaire
docker restart ${service} 2>/dev/null || true
endscript
}
EOF
echo "✅ Créé: $logrotate_config"
done
# Créer un script de collecte de logs
cat > scripts/collect-logs.sh << 'EOF'
#!/bin/bash
# Script pour collecter les logs de tous les services
# Usage: ./scripts/collect-logs.sh [service_name]
set -e
LOG_DIR="logs"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
if [ $# -eq 1 ]; then
# Collecter les logs d'un service spécifique
SERVICE=$1
if [ -d "$LOG_DIR/$SERVICE" ]; then
echo "📊 Collecte des logs pour $SERVICE..."
docker logs "$SERVICE" > "$LOG_DIR/$SERVICE/${SERVICE}_${TIMESTAMP}.log" 2>&1
echo "✅ Logs collectés: $LOG_DIR/$SERVICE/${SERVICE}_${TIMESTAMP}.log"
else
echo "❌ Service $SERVICE non trouvé"
exit 1
fi
else
# Collecter les logs de tous les services
echo "📊 Collecte des logs de tous les services..."
for service in bitcoin-signet blindbit-oracle sdk_relaysdk_storage lecoffre-front ihm_client tor-proxy signet_miner; do
if docker ps --format "table {{.Names}}" | grep -q "^${service}$"; then
echo "📝 Collecte des logs pour $service..."
mkdir -p "$LOG_DIR/${service##*-}" # Enlever le préfixe si nécessaire
docker logs "$service" > "$LOG_DIR/${service##*-}/${service}_${TIMESTAMP}.log" 2>&1
echo "✅ Logs collectés pour $service"
else
echo "⚠️ Service $service non en cours d'exécution"
fi
done
fi
echo "🎉 Collecte terminée!"
EOF
chmod +x scripts/collect-logs.sh
echo "✅ Configuration des logs terminée!"
echo ""
echo "📋 Prochaines étapes:"
echo "1. Redémarrer les services: docker compose restart"
echo "2. Vérifier Grafana: https://dev4.4nkweb.com/grafana/"
echo "3. Collecter les logs: ./scripts/collect-logs.sh"
echo "4. Surveiller les logs: docker compose logs -f"
echo ""
echo "🔗 URLs utiles:"
echo "- Grafana: https://dev4.4nkweb.com/grafana/"
echo "- Loki API: https://dev4.4nkweb.com/loki/"
echo "- Logs locaux: ./logs/"

View File

@ -1,263 +0,0 @@
#!/bin/bash
# LeCoffre Node - Script de lancement séquentiel avec progression
# Lance les services dans l'ordre logique avec suivi de l'avancement
set -e
# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Configuration
START_TIME=$(date +%s)
MAX_WAIT=300 # 5 minutes max par service
# Fonction pour afficher un message avec timestamp
print_message() {
echo -e "${BLUE}[$(date '+%H:%M:%S')]${NC} $1"
}
# Fonction pour afficher la progression
show_progress() {
local current=$1
local total=$2
local service=$3
local percent=$((current * 100 / total))
echo -e "${CYAN}Progress: $current/$total ($percent%) - $service${NC}"
}
# Fonction pour afficher la progression détaillée
show_detailed_progress() {
local service_name=$1
echo -e "${CYAN}=== Detailed Progress ===${NC}"
# Tor Bootstrap
if docker ps --format '{{.Names}}' | grep -q "tor-proxy"; then
local bootstrap_log=$(docker logs tor-proxy --tail 10 2>/dev/null | grep 'Bootstrapped' | tail -1 || echo "")
if [ -n "$bootstrap_log" ]; then
local progress=$(echo "$bootstrap_log" | grep -o '[0-9]\+%' | tail -1 || echo "0%")
local stage=$(echo "$bootstrap_log" | grep -o '(.*)' | sed 's/[()]//g' || echo "starting")
echo -e " ${YELLOW}Tor Bootstrap: $progress - $stage${NC}"
else
echo -e " ${YELLOW}Tor Bootstrap: Starting...${NC}"
fi
else
echo -e " ${RED}Tor: Not running${NC}"
fi
# Bitcoin Signet
if docker ps --format '{{.Names}}' | grep -q "bitcoin-signet"; then
local info=$(docker exec bitcoin-signet bitcoin-cli -signet -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo 2>/dev/null || echo '{}')
local blocks=$(echo "$info" | jq -r '.blocks // 0' 2>/dev/null || echo "0")
local headers=$(echo "$info" | jq -r '.headers // 0' 2>/dev/null || echo "0")
local ibd=$(echo "$info" | jq -r '.initialblockdownload // false' 2>/dev/null || echo "true")
local verification_progress=$(echo "$info" | jq -r '.verificationprogress // 0' 2>/dev/null || echo "0")
if [ "$ibd" = "false" ] || [ "$blocks" -eq "$headers" ]; then
echo -e " ${GREEN}Bitcoin Signet: Synced ($blocks blocks)${NC}"
else
local progress=$((blocks * 100 / headers))
local ver_percent=$(echo "$verification_progress * 100" | bc -l | cut -d. -f1 2>/dev/null || echo "0")
echo -e " ${YELLOW}Bitcoin IBD: $blocks/$headers ($progress%) - Verification: $ver_percent%${NC}"
fi
else
echo -e " ${RED}Bitcoin Signet: Not running${NC}"
fi
# BlindBit Oracle
if docker ps --format '{{.Names}}' | grep -q "blindbit-oracle"; then
local api_response=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8000/tweaks/1 2>/dev/null || echo "000")
if [ "$api_response" = "200" ]; then
echo -e " ${GREEN}BlindBit Oracle: Ready${NC}"
else
local scan_logs=$(docker logs blindbit-oracle --tail 5 2>/dev/null | grep -E "(scanning|scan|blocks|tweaks|processing)" | tail -1 || echo "")
if [ -n "$scan_logs" ]; then
echo -e " ${YELLOW}BlindBit Scan: $scan_logs${NC}"
else
echo -e " ${YELLOW}BlindBit: Starting...${NC}"
fi
fi
else
echo -e " ${RED}BlindBit Oracle: Not running${NC}"
fi
# SDK Relay
if docker ps --format '{{.Names}}' | grep -q "sdk_relay"; then
local ws_response=$(curl -s -o /dev/null -w '%{http_code}' http://localhost:8091/ 2>/dev/null || echo "000")
if [ "$ws_response" = "200" ]; then
echo -e " ${GREEN}SDK Relay: Ready${NC}"
else
local relay_logs=$(docker logs sdk_relay --tail 5 2>/dev/null | grep -E "(IBD|blocks|headers|waiting|scanning|connecting)" | tail -1 || echo "")
if [ -n "$relay_logs" ]; then
echo -e " ${YELLOW}SDK Relay Sync: $relay_logs${NC}"
else
echo -e " ${YELLOW}SDK Relay: Starting...${NC}"
fi
fi
else
echo -e " ${RED}SDK Relay: Not running${NC}"
fi
# URLs publiques HTTPS
echo -e "${CYAN}Public URLs Status:${NC}"
local urls=(
"https://dev4.4nkweb.com/status/:Status Page"
"https://dev4.4nkweb.com/grafana/:Grafana Dashboard"
"https://dev4.4nkweb.com/:Main Site"
"https://dev4.4nkweb.com/lecoffre/:LeCoffre App"
)
for url_entry in "${urls[@]}"; do
local url="${url_entry%%:*}"
local name="${url_entry##*:}"
local response=$(curl -s -o /dev/null -w '%{http_code}' "$url" 2>/dev/null || echo "000")
if [ "$response" = "200" ]; then
echo -e " ${GREEN}$name: Accessible (HTTP $response)${NC}"
else
echo -e " ${YELLOW}$name: Not accessible (HTTP $response)${NC}"
fi
done
# URLs WebSocket publiques
echo -e "${CYAN}WebSocket URLs Status:${NC}"
local ws_urls=(
"wss://dev3.4nkweb.com/ws/:Bootstrap Relay"
"wss://dev3.4nkweb.com/ws/:Signer Service"
)
for ws_entry in "${ws_urls[@]}"; do
local ws_url="${ws_entry%%:*}"
local ws_name="${ws_entry##*:}"
# Test WebSocket avec timeout court
local ws_test=$(timeout 3 wscat -c "$ws_url" --no-color 2>/dev/null && echo "connected" || echo "failed")
if [ "$ws_test" = "connected" ]; then
echo -e " ${GREEN}$ws_name: Connected${NC}"
else
echo -e " ${YELLOW}$ws_name: Not connected${NC}"
fi
done
echo -e "${CYAN}========================${NC}"
}
# Fonction pour attendre qu'un service soit healthy
wait_for_healthy() {
local service_name=$1
local max_wait=${2:-$MAX_WAIT}
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}}' "$service_name" 2>/dev/null || echo "no-healthcheck")
local running=$(docker inspect --format='{{.State.Running}}' "$service_name" 2>/dev/null || echo "false")
if [ "$running" = "true" ] && [ "$status" = "healthy" ]; then
echo -e "${GREEN}$service_name is healthy${NC}"
return 0
fi
# Afficher la progression détaillée
show_detailed_progress "$service_name"
sleep 5
wait_time=$((wait_time + 5))
done
echo -e "${RED}✗ Timeout waiting for $service_name${NC}"
return 1
}
# Fonction pour démarrer un service
start_service() {
local service_name=$1
local display_name=$2
print_message "Starting $display_name..."
docker compose --env-file .env.master up -d "$service_name"
# Attendre que le conteneur soit créé
sleep 2
# Vérifier si le service a un healthcheck
local has_healthcheck=$(docker inspect --format='{{.Config.Healthcheck}}' "$service_name" 2>/dev/null | grep -q "Test" && echo "true" || echo "false")
if [ "$has_healthcheck" = "true" ]; then
wait_for_healthy "$service_name"
else
# Pour les services sans healthcheck, attendre qu'ils soient running
local wait_time=0
while [ $wait_time -lt 60 ]; do
local running=$(docker inspect --format='{{.State.Running}}' "$service_name" 2>/dev/null || echo "false")
if [ "$running" = "true" ]; then
echo -e "${GREEN}$display_name is running${NC}"
break
fi
sleep 2
wait_time=$((wait_time + 2))
done
fi
}
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} LeCoffre Node - Sequential Startup${NC}"
echo -e "${BLUE}========================================${NC}"
echo
# Arrêter les services existants
print_message "Stopping existing services..."
docker compose --env-file .env.master down --remove-orphans >/dev/null 2>&1 || true
# Ordre de démarrage logique
services=(
"tor:Tor Proxy"
"bitcoin:Bitcoin Signet"
"blindbit:BlindBit Oracle"
"sdk_storage:SDK Storage"
"sdk_relay:SDK Relay"
"lecoffre-front:LeCoffre Frontend"
"ihm_client:IHM Client"
"grafana:Grafana"
"status-api:Status API"
)
total_services=${#services[@]}
current_service=0
# Démarrer les services dans l'ordre
for service in "${services[@]}"; do
current_service=$((current_service + 1))
service_name="${service%%:*}"
display_name="${service##*:}"
show_progress $current_service $total_services "$display_name"
start_service "$service_name" "$display_name"
echo
done
# Afficher le statut final
echo -e "${GREEN}🎉 All services started successfully!${NC}"
echo
echo -e "${BLUE}Final status:${NC}"
docker compose --env-file .env.master ps
# Calculer le temps total
end_time=$(date +%s)
total_time=$((end_time - START_TIME))
minutes=$((total_time / 60))
seconds=$((total_time % 60))
echo
echo -e "${GREEN}Total startup time: ${minutes}m ${seconds}s${NC}"
echo
echo -e "${BLUE}Useful commands:${NC}"
echo -e " ${YELLOW}docker compose --env-file .env.master logs -f${NC} # Voir les logs"
echo -e " ${YELLOW}docker compose --env-file .env.master down${NC} # Arrêter les services"
echo -e " ${YELLOW}docker compose --env-file .env.master ps${NC} # Voir le statut"
echo

View File

@ -1,187 +0,0 @@
#!/bin/bash
# Script de synchronisation des configurations centralisées
# Usage: ./scripts/sync-configs.sh [project_name]
# Si aucun projet n'est spécifié, synchronise tous les projets
set -euo pipefail
# Couleurs pour les logs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Fonction de logging
log() {
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}
log_success() {
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] ✓${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] ⚠${NC} $1"
}
log_error() {
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ✗${NC} $1"
}
# Répertoire racine du projet
PROJECT_ROOT="/home/debian/4NK_env/lecoffre_node"
CONF_DIR="$PROJECT_ROOT/conf"
# Vérifier que nous sommes dans le bon répertoire
if [[ ! -d "$CONF_DIR" ]]; then
log_error "Répertoire de configuration non trouvé: $CONF_DIR"
exit 1
fi
# Fonction pour synchroniser un projet
sync_project() {
local project_name="$1"
local project_path="/home/debian/4NK_env/$project_name"
log "Synchronisation de $project_name..."
# Vérifier que le projet existe
if [[ ! -d "$project_path" ]]; then
log_warning "Projet $project_name non trouvé: $project_path"
return 1
fi
case "$project_name" in
"lecoffre_node")
# Bitcoin configuration
if [[ -f "$CONF_DIR/bitcoin/bitcoin.conf" ]]; then
cp "$CONF_DIR/bitcoin/bitcoin.conf" "$project_path/bitcoin/"
log_success "Bitcoin config copiée"
fi
# Relay configuration
if [[ -f "$CONF_DIR/relay/sdk_relay.conf" ]]; then
cp "$CONF_DIR/relay/sdk_relay.conf" "$project_path/relay/"
log_success "Relay config copiée"
fi
;;
"ihm_client")
# Nginx configuration
if [[ -f "$CONF_DIR/ihm_client/nginx.dev.conf" ]]; then
cp "$CONF_DIR/ihm_client/nginx.dev.conf" "$project_path/"
log_success "Nginx config copiée vers ihm_client"
fi
;;
"lecoffre-front")
# Frontend configuration (si nécessaire)
if [[ -d "$CONF_DIR/lecoffre-front" ]]; then
cp -r "$CONF_DIR/lecoffre-front/"* "$project_path/" 2>/dev/null || true
log_success "Frontend configs copiées"
fi
;;
*)
log_warning "Projet $project_name non configuré pour la synchronisation"
return 1
;;
esac
log_success "Synchronisation de $project_name terminée"
}
# Fonction pour synchroniser tous les projets
sync_all() {
log "Synchronisation de tous les projets..."
local projects=("lecoffre_node" "ihm_client" "lecoffre-front")
local success_count=0
local total_count=${#projects[@]}
for project in "${projects[@]}"; do
if sync_project "$project"; then
((success_count++))
fi
done
log "Synchronisation terminée: $success_count/$total_count projets synchronisés"
if [[ $success_count -eq $total_count ]]; then
log_success "Tous les projets ont été synchronisés avec succès"
return 0
else
log_warning "Certains projets n'ont pas pu être synchronisés"
return 1
fi
}
# Fonction pour afficher l'aide
show_help() {
echo "Usage: $0 [OPTIONS] [PROJECT_NAME]"
echo ""
echo "Synchronise les configurations centralisées vers les projets"
echo ""
echo "OPTIONS:"
echo " -h, --help Affiche cette aide"
echo " -l, --list Liste les projets disponibles"
echo " -v, --verbose Mode verbeux"
echo ""
echo "PROJECT_NAME:"
echo " Nom du projet à synchroniser (optionnel)"
echo " Si non spécifié, synchronise tous les projets"
echo ""
echo "Exemples:"
echo " $0 # Synchronise tous les projets"
echo " $0 ihm_client # Synchronise seulement ihm_client"
echo " $0 lecoffre_node # Synchronise seulement lecoffre_node"
}
# Fonction pour lister les projets
list_projects() {
echo "Projets disponibles pour la synchronisation:"
echo " - lecoffre_node (bitcoin.conf, sdk_relay.conf)"
echo " - ihm_client (nginx.dev.conf)"
echo " - lecoffre-front (configurations frontend)"
}
# Parse des arguments
VERBOSE=false
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
show_help
exit 0
;;
-l|--list)
list_projects
exit 0
;;
-v|--verbose)
VERBOSE=true
shift
;;
-*)
log_error "Option inconnue: $1"
show_help
exit 1
;;
*)
PROJECT_NAME="$1"
shift
;;
esac
done
# Changer vers le répertoire du projet
cd "$PROJECT_ROOT"
# Exécuter la synchronisation
if [[ -n "${PROJECT_NAME:-}" ]]; then
log "Synchronisation du projet: $PROJECT_NAME"
sync_project "$PROJECT_NAME"
else
sync_all
fi

View File

@ -1,220 +0,0 @@
#!/bin/bash
# Script de synchronisation de la configuration de monitoring
# Usage: ./scripts/sync-monitoring-config.sh
set -e
# Couleurs pour les messages
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log_info() {
echo -e "${BLUE} $1${NC}"
}
log_success() {
echo -e "${GREEN}$1${NC}"
}
log_warning() {
echo -e "${YELLOW}⚠️ $1${NC}"
}
log_info "🔄 Synchronisation de la configuration de monitoring..."
# Créer la structure de dossiers
log_info "Création de la structure de dossiers..."
mkdir -p conf/{grafana/{provisioning/{datasources,dashboards},dashboards},promtail,logrotate,nginx}
mkdir -p logs/{bitcoin,blindbit,sdk_relaysdk_storagelecoffre-front,ihm_client,tor,miner,nginx}
# Copier la configuration Nginx si elle n'existe pas
if [ ! -f "conf/nginx/grafana.conf" ]; then
log_info "Création de la configuration Nginx pour Grafana..."
cat > conf/nginx/grafana.conf << 'EOF'
# Configuration Nginx pour Grafana
server {
listen 80;
server_name dev4.4nkweb.com;
# Proxy pour Grafana
location /grafana/ {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Configuration spécifique pour Grafana
proxy_set_header X-Grafana-Org-Id 1;
# Support des WebSockets pour les live updates
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Timeouts
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# Buffer settings
proxy_buffering off;
proxy_request_buffering off;
}
# Proxy pour Loki (API)
location /loki/ {
proxy_pass http://127.0.0.1:3100/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# CORS pour les requêtes depuis Grafana
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header Access-Control-Allow-Headers "Content-Type, Authorization";
if ($request_method = 'OPTIONS') {
return 204;
}
}
}
EOF
log_success "Configuration Nginx créée"
fi
# Créer des fichiers de log de test pour chaque service
log_info "Création des fichiers de log de test..."
for service in bitcoin blindbit sdk_relaysdk_storage lecoffre-front ihm_client tor miner nginx; do
log_file="logs/${service}/${service}.log"
if [ ! -f "$log_file" ]; then
echo "$(date): Test log entry for ${service}" > "$log_file"
echo "$(date): Service ${service} started successfully" >> "$log_file"
log_success "Créé: $log_file"
else
log_warning "Existe déjà: $log_file"
fi
done
# Vérifier que tous les fichiers de configuration Grafana existent
log_info "Vérification des fichiers de configuration Grafana..."
required_grafana_files=(
"conf/grafana/provisioning/datasources/loki.yml"
"conf/grafana/provisioning/dashboards/dashboards.yml"
"conf/grafana/grafana.ini"
"conf/grafana/dashboards/lecoffre-overview.json"
"conf/grafana/dashboards/bitcoin-miner.json"
"conf/grafana/dashboards/services-overview.json"
"conf/promtail/promtail.yml"
)
missing_files=()
for file in "${required_grafana_files[@]}"; do
if [ ! -f "$file" ]; then
missing_files+=("$file")
fi
done
if [ ${#missing_files[@]} -gt 0 ]; then
log_warning "Fichiers de configuration manquants:"
for file in "${missing_files[@]}"; do
echo " - $file"
done
log_warning "Exécutez d'abord: ./scripts/setup-logs.sh"
else
log_success "Tous les fichiers de configuration Grafana sont présents"
fi
# Créer un fichier de configuration de monitoring central
log_info "Création du fichier de configuration central..."
cat > conf/monitoring.conf << 'EOF'
# Configuration centralisée du monitoring LeCoffre Node
# Généré automatiquement le $(date)
[monitoring]
# Services de monitoring
grafana_port=3000
loki_port=3100
promtail_enabled=true
[grafana]
admin_user=admin
admin_password=admin123
root_url=https://dev4.4nkweb.com/grafana/
dashboard_home=lecoffre-overview
[logs]
# Configuration des logs
log_retention_days=30
log_rotation=daily
log_compression=true
[services]
# Services surveillés
services=bitcoin,blindbit,sdk_relaysdk_storagelecoffre-front,ihm_client,tor,miner
[alerts]
# Configuration des alertes
error_threshold=10
warning_threshold=5
alert_email=
EOF
log_success "Configuration centralisée créée: conf/monitoring.conf"
# Créer un script de test de connectivité
log_info "Création du script de test de connectivité..."
cat > scripts/test-monitoring.sh << 'EOF'
#!/bin/bash
# Script de test de connectivité pour le monitoring
set -e
echo "🔍 Test de connectivité du monitoring..."
# Test Grafana
echo "Test Grafana..."
if curl -s http://localhost:3000/api/health >/dev/null 2>&1; then
echo "✅ Grafana: OK"
else
echo "❌ Grafana: Non accessible"
fi
# Test Loki
echo "Test Loki..."
if curl -s http://localhost:3100/ready >/dev/null 2>&1; then
echo "✅ Loki: OK"
else
echo "❌ Loki: Non accessible"
fi
# Test Promtail
echo "Test Promtail..."
if docker ps --format "table {{.Names}}" | grep -q "promtail"; then
echo "✅ Promtail: En cours d'exécution"
else
echo "❌ Promtail: Arrêté"
fi
echo "🎉 Tests terminés!"
EOF
chmod +x scripts/test-monitoring.sh
log_success "Script de test créé: scripts/test-monitoring.sh"
log_success "🔄 Synchronisation terminée!"
echo ""
echo "📋 Prochaines étapes:"
echo "1. Tester la connectivité: ./scripts/test-monitoring.sh"
echo "2. Démarrer le monitoring: ./scripts/deploy-grafana.sh start"
echo "3. Accéder à Grafana: https://dev4.4nkweb.com/grafana/"
echo ""
echo "🔗 URLs d'accès:"
echo " - Grafana: https://dev4.4nkweb.com/grafana/"
echo " - Loki API: https://dev4.4nkweb.com/loki/"
echo " - Configuration: conf/monitoring.conf"

View File

@ -1,172 +0,0 @@
#!/bin/bash
# Script de test des dashboards Grafana
# Vérifie que tous les dashboards sont accessibles et fonctionnels
set -e
echo "🔍 Test des Dashboards Grafana LeCoffre Node"
echo "============================================="
GRAFANA_URL="https://dev4.4nkweb.com/grafana"
ADMIN_USER="admin"
ADMIN_PASS="Fuy8ZfxQI2xdSdoB8wsGxNjyU"
# Fonction pour tester un dashboard
test_dashboard() {
local dashboard_title="$1"
local dashboard_uid="$2"
echo "📊 Test du dashboard: $dashboard_title"
# Vérifier que le dashboard existe
dashboard_info=$(curl -s -u "$ADMIN_USER:$ADMIN_PASS" \
"$GRAFANA_URL/api/dashboards/uid/$dashboard_uid" \
-H "Content-Type: application/json")
if echo "$dashboard_info" | jq -e '.dashboard.title' > /dev/null 2>&1; then
echo " ✅ Dashboard accessible: $dashboard_title"
# Vérifier les panneaux
panel_count=$(echo "$dashboard_info" | jq '.dashboard.panels | length')
echo " 📈 Nombre de panneaux: $panel_count"
# Vérifier les requêtes Loki
loki_queries=$(echo "$dashboard_info" | jq '.dashboard.panels[] | select(.targets[]?.datasource.type == "loki") | .targets[]?.expr' | wc -l)
echo " 🔍 Requêtes Loki: $loki_queries"
return 0
else
echo " ❌ Dashboard inaccessible: $dashboard_title"
return 1
fi
}
# Fonction pour tester l'API Loki
test_loki_api() {
echo "🔍 Test de l'API Loki"
# Test de connectivité Loki
loki_response=$(curl -s -u "$ADMIN_USER:$ADMIN_PASS" \
"$GRAFANA_URL/api/datasources/proxy/loki/api/v1/labels" \
-H "Content-Type: application/json" \
-H "X-Scope-OrgID: anonymous" 2>/dev/null || echo "ERROR")
if [[ "$loki_response" != "ERROR" ]] && echo "$loki_response" | jq -e '.data' > /dev/null 2>&1; then
echo " ✅ API Loki accessible"
# Compter les labels disponibles
label_count=$(echo "$loki_response" | jq '.data | length')
echo " 🏷️ Labels disponibles: $label_count"
return 0
else
echo " ❌ API Loki inaccessible"
return 1
fi
}
# Fonction pour tester les logs des services
test_service_logs() {
echo "📋 Test des logs des services"
services=("bitcoin-signet" "blindbit-oracle" "sdk_relay""sdk_storage" "lecoffre-front" "ihm_client" "signet_miner")
for service in "${services[@]}"; do
echo " 🔍 Test des logs: $service"
# Test d'une requête simple sur les logs du service
loki_response=$(curl -s -u "$ADMIN_USER:$ADMIN_PASS" \
"$GRAFANA_URL/api/datasources/proxy/loki/api/v1/query?query={container=\"$service\"}&limit=1" \
-H "Content-Type: application/json" \
-H "X-Scope-OrgID: anonymous" 2>/dev/null || echo "ERROR")
if [[ "$loki_response" != "ERROR" ]] && echo "$loki_response" | jq -e '.data.result' > /dev/null 2>&1; then
log_count=$(echo "$loki_response" | jq '.data.result | length')
if [ "$log_count" -gt 0 ]; then
echo " ✅ Logs disponibles: $log_count entrées"
else
echo " ⚠️ Aucun log récent trouvé"
fi
else
echo " ❌ Erreur d'accès aux logs"
fi
done
}
# Fonction pour générer un rapport de santé
generate_health_report() {
echo "📊 Rapport de Santé des Dashboards"
echo "=================================="
# Test de connectivité Grafana
grafana_status=$(curl -s -o /dev/null -w "%{http_code}" \
-u "$ADMIN_USER:$ADMIN_PASS" \
"$GRAFANA_URL/api/health")
if [ "$grafana_status" = "200" ]; then
echo "✅ Grafana: Opérationnel (HTTP $grafana_status)"
else
echo "❌ Grafana: Problème (HTTP $grafana_status)"
fi
# Test de connectivité Loki
loki_status=$(curl -s -o /dev/null -w "%{http_code}" \
-u "$ADMIN_USER:$ADMIN_PASS" \
"$GRAFANA_URL/api/datasources/proxy/loki/ready" \
-H "X-Scope-OrgID: anonymous")
if [ "$loki_status" = "200" ]; then
echo "✅ Loki: Opérationnel (HTTP $loki_status)"
else
echo "❌ Loki: Problème (HTTP $loki_status)"
fi
echo ""
echo "🎯 Dashboards disponibles:"
curl -s -u "$ADMIN_USER:$ADMIN_PASS" \
"$GRAFANA_URL/api/search?type=dash-db" | \
jq -r '.[] | " 📊 " + .title + " (UID: " + .uid + ")"'
}
# Exécution des tests
echo "🚀 Démarrage des tests..."
echo ""
# Test de l'API Loki
test_loki_api
echo ""
# Test des dashboards spécifiques
echo "📊 Test des Dashboards Spécialisés"
echo "=================================="
test_dashboard "Bitcoin Miner - Détails" "bitcoin-miner-detailed"
test_dashboard "SDK Services - Monitoring" "sdk-services"
test_dashboard "Frontend Services - Monitoring" "frontend-services"
test_dashboard "Bitcoin Services - Monitoring" "bitcoin-services"
echo ""
# Test des logs des services
test_service_logs
echo ""
# Génération du rapport de santé
generate_health_report
echo ""
echo "🎉 Tests terminés!"
echo ""
echo "📋 Accès aux Dashboards:"
echo " URL: $GRAFANA_URL"
echo " Utilisateur: $ADMIN_USER"
echo " Mot de passe: $ADMIN_PASS"
echo ""
echo "🔗 Liens directs:"
echo " Vue d'ensemble: $GRAFANA_URL/d/lecoffre-overview"
echo " Bitcoin Miner: $GRAFANA_URL/d/bitcoin-miner-detailed"
echo " Backend LeCoffre: $GRAFANA_URL/d/lecoffre-backend"
echo " Services SDK: $GRAFANA_URL/d/sdk-services"
echo " Services Frontend: $GRAFANA_URL/d/frontend-services"
echo " Services Bitcoin: $GRAFANA_URL/d/bitcoin-services"

View File

@ -1,32 +0,0 @@
#!/bin/bash
# Script de test de connectivité pour le monitoring
set -e
echo "🔍 Test de connectivité du monitoring..."
# Test Grafana
echo "Test Grafana..."
if curl -s http://localhost:3000/api/health >/dev/null 2>&1; then
echo "✅ Grafana: OK"
else
echo "❌ Grafana: Non accessible"
fi
# Test Loki
echo "Test Loki..."
if curl -s http://localhost:3100/ready >/dev/null 2>&1; then
echo "✅ Loki: OK"
else
echo "❌ Loki: Non accessible"
fi
# Test Promtail
echo "Test Promtail..."
if docker ps --format "table {{.Names}}" | grep -q "promtail"; then
echo "✅ Promtail: En cours d'exécution"
else
echo "❌ Promtail: Arrêté"
fi
echo "🎉 Tests terminés!"

View File

@ -1,79 +0,0 @@
#!/bin/bash
set -euo pipefail
echo "🗑️ DÉSINSTALLATION DU NGINX DU HOST"
echo "==================================="
echo ""
echo "⚠️ ATTENTION: Ce script va désinstaller Nginx du système host"
echo " L'architecture autonome LeCoffre Node utilise son propre Nginx"
echo ""
# Fonction de logging
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# Vérification que le conteneur LeCoffre est en cours d'exécution
if ! docker ps | grep -q "lecoffre-node-master"; then
log "❌ Le conteneur LeCoffre Node n'est pas en cours d'exécution"
log " Démarrez d'abord l'architecture autonome avec:"
log " ./scripts/deploy-autonomous.sh"
exit 1
fi
log "✅ Conteneur LeCoffre Node détecté et en cours d'exécution"
# Test de connectivité du Nginx du conteneur
if curl -f -s http://localhost/status/ > /dev/null; then
log "✅ Nginx du conteneur fonctionne correctement"
else
log "❌ Nginx du conteneur ne répond pas correctement"
log " Vérifiez les logs: docker logs lecoffre-node-master"
exit 1
fi
echo ""
echo "🔍 État actuel du Nginx du host:"
systemctl status nginx 2>/dev/null || echo "Nginx non installé ou arrêté"
echo ""
read -p "Êtes-vous sûr de vouloir désinstaller Nginx du host ? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
log "❌ Désinstallation annulée"
exit 0
fi
log "🛑 Arrêt des services Nginx du host..."
sudo systemctl stop nginx 2>/dev/null || true
sudo systemctl disable nginx 2>/dev/null || true
log "🗑️ Désinstallation des paquets Nginx..."
sudo apt-get remove --purge nginx nginx-common nginx-core -y || true
sudo apt-get autoremove -y || true
log "🧹 Nettoyage des fichiers de configuration..."
sudo rm -rf /etc/nginx/
sudo rm -rf /var/www/html/
sudo rm -rf /var/log/nginx/
log "🔧 Configuration du firewall pour le port 80..."
# Autoriser le port 80 pour le conteneur
sudo ufw allow 80/tcp 2>/dev/null || true
log "✅ Désinstallation terminée"
log ""
log "🎉 L'architecture autonome LeCoffre Node est maintenant complètement indépendante!"
log ""
log "📊 Services accessibles via le conteneur:"
log " - Status Page: http://localhost/status/"
log " - Grafana: http://localhost/grafana/"
log " - LeCoffre Front: http://localhost/lecoffre/"
log " - IHM Client: http://localhost/"
log " - API Backend: http://localhost/api/"
log ""
log "🔧 Gestion du conteneur:"
log " - Arrêt: docker stop lecoffre-node-master"
log " - Redémarrage: docker restart lecoffre-node-master"
log " - Logs: docker logs lecoffre-node-master"

View File

@ -1,66 +0,0 @@
#!/bin/bash
# Script pour mettre à jour les healthchecks avec des tests de progression
set -e
COMPOSE_FILE="/home/debian/4NK_env/lecoffre_node/docker-compose.yml"
BACKUP_FILE="/home/debian/4NK_env/lecoffre_node/docker-compose.yml.backup"
echo "Mise à jour des healthchecks avec tests de progression..."
# Créer une sauvegarde
cp "$COMPOSE_FILE" "$BACKUP_FILE"
# Fonction pour remplacer un healthcheck
replace_healthcheck() {
local service_name="$1"
local old_test="$2"
local new_test="$3"
echo "Mise à jour du healthcheck pour $service_name..."
# Utiliser awk pour remplacer le test
awk -v service="$service_name" -v old_test="$old_test" -v new_test="$new_test" '
BEGIN { in_service = 0; in_healthcheck = 0; replaced = 0 }
/^ [a-zA-Z_]+:/ {
if (in_healthcheck) in_healthcheck = 0
if ($0 ~ "^ " service ":") in_service = 1
else in_service = 0
}
/^ healthcheck:/ {
if (in_service) in_healthcheck = 1
}
/^ test:/ {
if (in_healthcheck && !replaced) {
print " test: " new_test
replaced = 1
next
}
}
{ print }
' "$COMPOSE_FILE" > "$COMPOSE_FILE.tmp" && mv "$COMPOSE_FILE.tmp" "$COMPOSE_FILE"
}
# Mettre à jour Tor
replace_healthcheck "tor" \
'["CMD", "sh", "-c", "if test -f /var/log/tor/tor.log && test -s /var/log/tor/tor.log; then echo '\''Tor ready: SOCKS proxy listening on port 9050'\''; exit 0; else echo '\''Tor starting: SOCKS proxy not yet ready'\''; exit 1; fi"]' \
'["CMD", "sh", "-c", "if test -f /var/log/tor/tor.log && test -s /var/log/tor/tor.log; then bootstrap_log=\$(tail -20 /var/log/tor/tor.log | grep '\''Bootstrapped'\'' | tail -1); if echo \"\$bootstrap_log\" | grep -q '\''100%'\''; then echo '\''Tor ready: Bootstrap complete (100%)'\''; exit 0; else progress=\$(echo \"\$bootstrap_log\" | grep -o '\''[0-9]\\\\+%'\'' | tail -1 || echo '\''0%'\''); echo \"Tor bootstrapping: \$progress\"; exit 1; fi; else echo '\''Tor starting: Bootstrap not yet started'\''; exit 1; fi"]'
# Mettre à jour Bitcoin
replace_healthcheck "bitcoin" \
'["CMD", "sh", "-c", "if bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf getblockchaininfo > /dev/null 2>&1; then echo '\''Bitcoin ready: RPC responding'\''; exit 0; else echo '\''Bitcoin starting: RPC not ready'\''; exit 1; fi"]' \
'["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'\''); ibd=\$(echo \"\$info\" | jq -r '\''.initialblockdownload // false'\''); if [ \"\$ibd\" = \"false\" ] || [ \"\$blocks\" -eq \"\$headers\" ]; then echo \"Bitcoin ready: Synced (\$blocks blocks)\"; exit 0; else remaining=\$((headers - blocks)); progress=\$((blocks * 100 / headers)); echo \"Bitcoin IBD: \$blocks/\$headers (\$remaining remaining) - \$progress%\"; exit 1; fi"]'
# Mettre à jour BlindBit
replace_healthcheck "blindbit" \
'["CMD", "sh", "-c", "if wget -q --spider http://localhost:8000/tweaks/1; then echo '\''BlindBit ready: Oracle service responding'\''; exit 0; else echo '\''BlindBit starting: Oracle service not yet ready'\''; exit 1; fi"]' \
'["CMD", "sh", "-c", "scan_logs=\$(tail -10 /var/log/blindbit/blindbit.log 2>/dev/null | grep -E \"(scanning|scan|blocks|tweaks)\" | tail -1 || echo \"\"); if [ -n \"\$scan_logs\" ]; then echo \"BlindBit scanning: \$scan_logs\"; exit 1; else if wget -q --spider http://localhost:8000/tweaks/1; then echo '\''BlindBit ready: Oracle service responding'\''; exit 0; else echo '\''BlindBit starting: Oracle service not yet ready'\''; exit 1; fi; fi"]'
# Mettre à jour SDK Relay
replace_healthcheck "sdk_relay" \
'["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"]' \
'["CMD", "sh", "-c", "relay_logs=\$(tail -10 /var/log/sdk_relay/sdk_relay.log 2>/dev/null | grep -E \"(IBD|blocks|headers|waiting|scanning)\" | tail -1 || echo \"\"); if [ -n \"\$relay_logs\" ]; then echo \"SDK Relay sync: \$relay_logs\"; exit 1; else if curl -f http://localhost:8091/ >/dev/null 2>&1; then echo '\''SDK Relay ready: WebSocket server responding'\''; exit 0; else echo '\''SDK Relay starting: WebSocket server not yet ready'\''; exit 1; fi; fi"]'
echo "Healthchecks mis à jour avec succès!"
echo "Sauvegarde créée: $BACKUP_FILE"

View File

@ -1,36 +0,0 @@
#!/bin/bash
# Script de mise à jour des images Docker sans perdre les données
# Sauvegarde automatique avant mise à jour
set -e
# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} LeCoffre Node - Update Images${NC}"
echo -e "${BLUE}========================================${NC}"
echo
# Créer une sauvegarde automatique
echo -e "${YELLOW}Creating automatic backup before update...${NC}"
./scripts/backup-data.sh
echo
echo -e "${YELLOW}Updating Docker images...${NC}"
# Mettre à jour les images
docker compose --env-file .env.master pull
echo -e "${GREEN}✅ Images updated successfully!${NC}"
echo
echo -e "${BLUE}To apply the updates:${NC}"
echo -e "${YELLOW} ./scripts/start.sh${NC}"
echo
echo -e "${BLUE}To rollback if needed:${NC}"
echo -e "${YELLOW} ./scripts/restore-data.sh <backup_name>${NC}"
echo

View File

@ -1,223 +0,0 @@
#!/bin/bash
# Script de validation complète du déploiement LeCoffre Node
# Vérifie tous les services, volumes, et configurations
set -e
# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Compteurs
TOTAL_CHECKS=0
PASSED_CHECKS=0
FAILED_CHECKS=0
# Fonction pour afficher un message avec timestamp
print_message() {
echo -e "${BLUE}[$(date '+%H:%M:%S')]${NC} $1"
}
# Fonction pour vérifier un service
check_service() {
local service_name="$1"
local description="$2"
local url="$3"
local expected_codes_csv="${4:-200}"
TOTAL_CHECKS=$((TOTAL_CHECKS + 1))
if docker ps --format '{{.Names}}' | grep -q "^${service_name}$"; then
local status=$(docker inspect --format='{{.State.Health.Status}}' "$service_name" 2>/dev/null || echo "no-healthcheck")
local running=$(docker inspect --format='{{.State.Running}}' "$service_name" 2>/dev/null || echo "false")
if [ "$running" = "true" ]; then
if [ -n "$url" ]; then
local response=$(curl -s -o /dev/null -w '%{http_code}' "$url" 2>/dev/null || echo "000")
# Support multiple acceptable codes, comma-separated
local ok=false
IFS=',' read -r -a expected_array <<< "$expected_codes_csv"
for code in "${expected_array[@]}"; do
if [ "$response" = "$code" ]; then ok=true; break; fi
done
# If HTTP unreachable from host but container is healthy, accept as running for known cases
if [ "$response" = "000" ] && [ "$status" = "healthy" ]; then
echo -e " ${GREEN}${NC} $description: Running (container healthy; HTTP check not reachable from host)"
PASSED_CHECKS=$((PASSED_CHECKS + 1))
elif [ "$ok" = true ]; then
echo -e " ${GREEN}${NC} $description: Running and responding (HTTP $response)"
PASSED_CHECKS=$((PASSED_CHECKS + 1))
else
echo -e " ${YELLOW}${NC} $description: Running but not responding (HTTP $response)"
FAILED_CHECKS=$((FAILED_CHECKS + 1))
fi
else
echo -e " ${GREEN}${NC} $description: Running"
PASSED_CHECKS=$((PASSED_CHECKS + 1))
fi
else
echo -e " ${RED}${NC} $description: Not running"
FAILED_CHECKS=$((FAILED_CHECKS + 1))
fi
else
echo -e " ${RED}${NC} $description: Container not found"
FAILED_CHECKS=$((FAILED_CHECKS + 1))
fi
}
# Fonction pour vérifier un volume
check_volume() {
local volume_name="$1"
local description="$2"
TOTAL_CHECKS=$((TOTAL_CHECKS + 1))
if docker volume inspect "$volume_name" >/dev/null 2>&1; then
echo -e " ${GREEN}${NC} $description: Volume exists"
PASSED_CHECKS=$((PASSED_CHECKS + 1))
else
echo -e " ${RED}${NC} $description: Volume not found"
FAILED_CHECKS=$((FAILED_CHECKS + 1))
fi
}
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} LeCoffre Node - Deployment Validation${NC}"
echo -e "${BLUE}========================================${NC}"
echo
print_message "Starting deployment validation..."
# Vérification des volumes
echo -e "${CYAN}=== Volume Validation ===${NC}"
check_volume "4nk_node_bitcoin_data" "Bitcoin Signet Data"
check_volume "4nk_node_blindbit_data" "BlindBit Oracle Data"
check_volume "4nk_node_sdk_data" "SDK Relay Data"
check_volume "4nk_node_sdk_storage_data" "SDK Storage Data"
check_volume "4nk_node_grafana_data" "Grafana Data"
check_volume "4nk_node_loki_data" "Loki Data"
echo
# Vérification des services
echo -e "${CYAN}=== Service Validation ===${NC}"
check_service "tor-proxy" "Tor Proxy" "" ""
check_service "bitcoin-signet" "Bitcoin Signet" "" ""
check_service "blindbit-oracle" "BlindBit Oracle" "http://localhost:8000/tweaks/1" "200"
check_service "sdk_storage" "SDK Storage" "http://localhost:8081/health" "200"
check_service "sdk_relay" "SDK Relay" "http://localhost:8091/" "200"
check_service "lecoffre-front" "LeCoffre Frontend" "http://localhost:3004/lecoffre/" "200,301,302,307,308"
check_service "ihm_client" "IHM Client" "http://localhost:3003/" "200"
check_service "grafana" "Grafana" "http://localhost:3005/api/health" "200"
check_service "status-api" "Status API" "http://localhost:3006/api" "200"
echo
# Vérification des URLs publiques
echo -e "${CYAN}=== Public URLs Validation ===${NC}"
TOTAL_CHECKS=$((TOTAL_CHECKS + 4))
urls=(
"https://dev4.4nkweb.com/status/:Status Page"
"https://dev4.4nkweb.com/grafana/:Grafana Dashboard"
"https://dev4.4nkweb.com/:Main Site"
"https://dev4.4nkweb.com/lecoffre/:LeCoffre App"
)
for url_entry in "${urls[@]}"; do
url="${url_entry%%:*}"
name="${url_entry##*:}"
response=$(curl -s -o /dev/null -w '%{http_code}' "$url" 2>/dev/null || echo "000")
if [ "$response" = "200" ]; then
echo -e " ${GREEN}${NC} $name: Accessible (HTTP $response)"
PASSED_CHECKS=$((PASSED_CHECKS + 1))
else
echo -e " ${YELLOW}${NC} $name: Not accessible (HTTP $response)"
FAILED_CHECKS=$((FAILED_CHECKS + 1))
fi
done
echo
# Vérification des WebSockets
echo -e "${CYAN}=== WebSocket Validation ===${NC}"
TOTAL_CHECKS=$((TOTAL_CHECKS + 2))
ws_urls=(
"wss://dev3.4nkweb.com/ws/:Bootstrap Relay"
"wss://dev3.4nkweb.com/ws/:Signer Service"
)
for ws_entry in "${ws_urls[@]}"; do
ws_url="${ws_entry%%:*}"
ws_name="${ws_entry##*:}"
ws_test=$(timeout 3 wscat -c "$ws_url" --no-color 2>/dev/null && echo "connected" || echo "failed")
if [ "$ws_test" = "connected" ]; then
echo -e " ${GREEN}${NC} $ws_name: Connected"
PASSED_CHECKS=$((PASSED_CHECKS + 1))
else
echo -e " ${YELLOW}${NC} $ws_name: Not connected"
FAILED_CHECKS=$((FAILED_CHECKS + 1))
fi
done
echo
# Vérification des scripts
echo -e "${CYAN}=== Scripts Validation ===${NC}"
scripts=(
"start.sh:Main startup script"
"backup-data.sh:Data backup script"
"restore-data.sh:Data restore script"
"update-images.sh:Image update script"
"collect-logs.sh:Log collection script"
"deploy-master.sh:Master deployment script"
)
for script_entry in "${scripts[@]}"; do
script_name="${script_entry%%:*}"
script_desc="${script_entry##*:}"
TOTAL_CHECKS=$((TOTAL_CHECKS + 1))
if [ -f "./scripts/$script_name" ] && [ -x "./scripts/$script_name" ]; then
echo -e " ${GREEN}${NC} $script_desc: Available and executable"
PASSED_CHECKS=$((PASSED_CHECKS + 1))
else
echo -e " ${RED}${NC} $script_desc: Missing or not executable"
FAILED_CHECKS=$((FAILED_CHECKS + 1))
fi
done
echo
# Frontend environment sanity check
echo -e "${CYAN}=== Frontend Env Validation ===${NC}"
TOTAL_CHECKS=$((TOTAL_CHECKS + 2))
if docker exec lecoffre-front sh -lc 'test -n "$NEXT_PUBLIC_4NK_URL"'; then
echo -e " ${GREEN}${NC} NEXT_PUBLIC_4NK_URL présent dans le conteneur front"
PASSED_CHECKS=$((PASSED_CHECKS + 1))
else
echo -e " ${YELLOW}${NC} NEXT_PUBLIC_4NK_URL manquant dans le conteneur front"
FAILED_CHECKS=$((FAILED_CHECKS + 1))
fi
if docker exec lecoffre-front sh -lc 'test -n "$NEXT_PUBLIC_4NK_IFRAME_URL"'; then
echo -e " ${GREEN}${NC} NEXT_PUBLIC_4NK_IFRAME_URL présent dans le conteneur front"
PASSED_CHECKS=$((PASSED_CHECKS + 1))
else
echo -e " ${YELLOW}${NC} NEXT_PUBLIC_4NK_IFRAME_URL manquant dans le conteneur front"
FAILED_CHECKS=$((FAILED_CHECKS + 1))
fi
echo
# Résumé final
echo -e "${CYAN}=== Validation Summary ===${NC}"
echo -e "Total checks: $TOTAL_CHECKS"
echo -e "Passed: ${GREEN}$PASSED_CHECKS${NC}"
echo -e "Failed: ${RED}$FAILED_CHECKS${NC}"
if [ $FAILED_CHECKS -eq 0 ]; then
echo -e "${GREEN}🎉 All validations passed! Deployment is healthy.${NC}"
exit 0
else
echo -e "${YELLOW}⚠️ Some validations failed. Please check the issues above.${NC}"
exit 1
fi

View File

@ -1,55 +0,0 @@
#!/bin/bash
# Script de vérification des corrections du minage
# Vérifie que l'adresse TSP invalide a été corrigée
echo "🔍 VÉRIFICATION DES CORRECTIONS DU MINAGE"
echo ""
# Vérification de l'adresse dans le fichier .env
echo "1. Vérification de l'adresse dans miner/.env:"
RELAY_ADDRESS=$(grep "RELAY_ADDRESS=" lecoffre_node/miner/.env | cut -d'=' -f2)
echo " Adresse actuelle: $RELAY_ADDRESS"
if [[ "$RELAY_ADDRESS" == *"tsp1qqfzxxz9fht9w8pg9q8z0zseynt2prapktyx4eylm4jlwg5mukqg95qnmm2va956rhggul4vspjda368nlzvufahx70n67z66a2vgs5lspytmuvty"* ]]; then
echo " ❌ ERREUR: Adresse TSP invalide encore présente !"
exit 1
elif [[ "$RELAY_ADDRESS" == *"tb1p"* ]]; then
echo " ✅ OK: Adresse Bitcoin valide (bech32m)"
else
echo " ⚠️ ATTENTION: Adresse non reconnue"
fi
# Vérification de l'environnement du conteneur
echo ""
echo "2. Vérification de l'environnement du conteneur:"
if docker ps | grep -q signet_miner; then
CONTAINER_ADDRESS=$(docker exec signet_miner env | grep RELAY_ADDRESS | cut -d'=' -f2)
echo " Adresse dans le conteneur: $CONTAINER_ADDRESS"
if [[ "$CONTAINER_ADDRESS" == "$RELAY_ADDRESS" ]]; then
echo " ✅ OK: Adresses synchronisées"
else
echo " ❌ ERREUR: Adresses non synchronisées !"
exit 1
fi
else
echo " ⚠️ ATTENTION: Conteneur signet_miner non démarré"
fi
# Vérification des logs du minage
echo ""
echo "3. Vérification des logs du minage:"
if docker ps | grep -q signet_miner; then
if docker logs signet_miner --tail 5 | grep -q "ERROR.*Invalid Bitcoin address.*tsp1"; then
echo " ❌ ERREUR: Erreur d'adresse TSP dans les logs !"
exit 1
else
echo " ✅ OK: Aucune erreur d'adresse TSP"
fi
else
echo " ⚠️ ATTENTION: Impossible de vérifier les logs"
fi
echo ""
echo "✅ VÉRIFICATION TERMINÉE - CORRECTIONS APPLIQUÉES"