From 17e8b50f7a93d062f679a7baf61eb3be1b372004 Mon Sep 17 00:00:00 2001 From: Debian Date: Mon, 8 Sep 2025 14:06:54 +0000 Subject: [PATCH] =?UTF-8?q?docs(configuration,architecture):=20document=20?= =?UTF-8?q?tags=20:dev=20en=20cours=20de=20cr=C3=A9ation;=20chore(compose)?= =?UTF-8?q?:=20montages=20logs=20et=20torrc;=20network:=20ipam=20+=20hostn?= =?UTF-8?q?ames?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cursorignore | 6 +- .gitignore | 4 +- CHANGELOG.md | 7 + TEMPLATE_VERSION | 2 +- VERSION | 2 +- conf/bitcoin.conf.exemple | 54 --- conf/blindbit.toml | 25 -- conf/blindbit.toml.exemple | 25 -- conf/sdk_relay1.conf.exemple | 22 -- conf/sdk_relay2.conf.exemple | 22 -- conf/sdk_relay3.conf.exemple | 22 -- docker-compose.yml | 125 +++++-- docs/ARCHITECTURE.md | 7 + docs/CONFIGURATION.md | 34 ++ docs/NETWORK.md | 13 + docs/RELEASE_NOTES.md | 5 + log-monitoring.yml | 3 + log/README.md | 203 ++++++++++ log/dashboards/4nk-node-overview.json | 347 ++++++++++++++++++ log/grafana-dashboards.yml | 13 + log/grafana-datasources.yml | 11 + log/loki-config.yaml | 45 +++ log/promtail-config.yml | 32 ++ log/start-monitoring.sh | 49 +++ modules/bitcoin/Dockerfile | 8 - modules/bitcoin/conf/bitcoin.conf.exemple | 69 ++++ modules/blindbit/Dockerfile | 37 -- modules/blindbit/conf/blindbit.toml | 50 +++ modules/blindbit/conf/blindbit.toml.exemple | 50 +++ modules/ihm_client/Dockerfile | 44 --- modules/ihm_client/conf/.env.exemple | 16 + modules/ihm_client/conf/config.ts | 7 + .../ihm_client/conf/config.ts.exemple | 0 modules/sdk_relay1/Dockerfile | 46 --- .../sdk_relay1/conf/sdk_relay1.conf.exemple | 6 + modules/sdk_relay2/Dockerfile | 46 --- .../sdk_relay2/conf/sdk_relay2.conf.exemple | 6 + modules/sdk_relay3/Dockerfile | 46 --- .../sdk_relay3/conf/sdk_relay3.conf.exemple | 6 + modules/sdk_signer/Dockerfile | 17 - .../sdk_signer/conf}/sdk_signer.conf.exemple | 6 +- modules/sdk_storage/Dockerfile | 19 - .../conf}/sdk_storage.conf.exemple | 0 modules/tor/Dockerfile | 9 - modules/tor/entrypoint.sh | 19 + {conf => modules/tor}/tor.conf.exemple | 0 projects/lecoffre-back-mini/Dockerfile | 6 - projects/lecoffre-front/Dockerfile | 6 - .../lecoffre-back-mini/conf/.env.exemple | 0 .../lecoffre/lecoffre-front/conf/.env.exemple | 0 tests/RELEASE_NOTES.md | 4 + 51 files changed, 1098 insertions(+), 503 deletions(-) delete mode 100644 conf/bitcoin.conf.exemple delete mode 100644 conf/blindbit.toml delete mode 100644 conf/blindbit.toml.exemple delete mode 100644 conf/sdk_relay1.conf.exemple delete mode 100644 conf/sdk_relay2.conf.exemple delete mode 100644 conf/sdk_relay3.conf.exemple create mode 100644 docs/CONFIGURATION.md create mode 100644 docs/NETWORK.md create mode 100644 docs/RELEASE_NOTES.md create mode 100644 log/README.md create mode 100644 log/dashboards/4nk-node-overview.json create mode 100644 log/grafana-dashboards.yml create mode 100644 log/grafana-datasources.yml create mode 100644 log/loki-config.yaml create mode 100644 log/promtail-config.yml create mode 100755 log/start-monitoring.sh delete mode 100644 modules/bitcoin/Dockerfile create mode 100644 modules/bitcoin/conf/bitcoin.conf.exemple delete mode 100644 modules/blindbit/Dockerfile create mode 100644 modules/blindbit/conf/blindbit.toml create mode 100644 modules/blindbit/conf/blindbit.toml.exemple delete mode 100755 modules/ihm_client/Dockerfile create mode 100644 modules/ihm_client/conf/.env.exemple create mode 100644 modules/ihm_client/conf/config.ts rename conf/ihm_client.conf.exemple => modules/ihm_client/conf/config.ts.exemple (100%) delete mode 100644 modules/sdk_relay1/Dockerfile create mode 100644 modules/sdk_relay1/conf/sdk_relay1.conf.exemple delete mode 100644 modules/sdk_relay2/Dockerfile create mode 100644 modules/sdk_relay2/conf/sdk_relay2.conf.exemple delete mode 100644 modules/sdk_relay3/Dockerfile create mode 100644 modules/sdk_relay3/conf/sdk_relay3.conf.exemple delete mode 100644 modules/sdk_signer/Dockerfile rename {conf => modules/sdk_signer/conf}/sdk_signer.conf.exemple (84%) delete mode 100644 modules/sdk_storage/Dockerfile rename {conf => modules/sdk_storage/conf}/sdk_storage.conf.exemple (100%) delete mode 100644 modules/tor/Dockerfile create mode 100644 modules/tor/entrypoint.sh rename {conf => modules/tor}/tor.conf.exemple (100%) delete mode 100644 projects/lecoffre-back-mini/Dockerfile delete mode 100644 projects/lecoffre-front/Dockerfile rename conf/lecoffre-back-mini_env.conf.exemple => projects/lecoffre/lecoffre-back-mini/conf/.env.exemple (100%) rename conf/lecoffre-front_env.conf.exemple => projects/lecoffre/lecoffre-front/conf/.env.exemple (100%) create mode 100644 tests/RELEASE_NOTES.md diff --git a/.cursorignore b/.cursorignore index f511eb9d..abe42628 100644 --- a/.cursorignore +++ b/.cursorignore @@ -105,5 +105,7 @@ backups/sql/ !AGENTS.md -certs/ -log/ \ No newline at end of file +*/certs/ +*/log/ +*/conf/ +*/archive/ \ No newline at end of file diff --git a/.gitignore b/.gitignore index 196e277c..432069ee 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +archive/ + # Dépendances node_modules/ @@ -17,7 +19,6 @@ pnpm-debug.log* # Environnements .env -.env.* # Éditeurs / OS .DS_Store @@ -32,7 +33,6 @@ tests/reports/ *.backup certs/ -log/ *.log # Ignore real configuration files, but keep example configs *.conf diff --git a/CHANGELOG.md b/CHANGELOG.md index 46f25039..67e377e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,11 @@ +## Changed (2025-09-08) # Changelog - 4NK Node + +## [1.1.3] - 2025-09-07 + +### Added +- Mise à jour mineure de versionnage et documentation (ALIGNEMENT VERSION / TESTS) + ## [1.1.2] - 2025-08-27 ### Added diff --git a/TEMPLATE_VERSION b/TEMPLATE_VERSION index 264fc296..cbf2c7a2 100644 --- a/TEMPLATE_VERSION +++ b/TEMPLATE_VERSION @@ -1 +1 @@ -v2025.08.5 \ No newline at end of file +v2025.08.6 \ No newline at end of file diff --git a/VERSION b/VERSION index 0f1acbd5..99a4aef0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v1.1.2 +v1.1.3 diff --git a/conf/bitcoin.conf.exemple b/conf/bitcoin.conf.exemple deleted file mode 100644 index 73a5b594..00000000 --- a/conf/bitcoin.conf.exemple +++ /dev/null @@ -1,54 +0,0 @@ -# Configuration Bitcoin Core Signet pour Docker 4NK_node - -# Configuration globale -datadir=/home/bitcoin/.bitcoin -server=1 -txindex=1 -debug=1 -loglevel=debug -logthreadnames=1 -signet=1 -onion=4nk-tor:9050 -listenonion=1 -proxy=4nk-tor:9050 -listen=1 - -# Paramètres RPC -rpcuser=EXEMPLE -rpcpassword=EXEMPLE -rpcallowip=172.18.0.0/16 -rpcworkqueue=32 -rpcthreads=4 -rpcdoccheck=1 - -# Paramètres ZMQ -zmqpubhashblock=tcp://0.0.0.0:29000 -zmqpubrawtx=tcp://0.0.0.0:29000 - -# Configuration spécifique du signet custom -[signet] -whitelist=download@127.0.0.1 -txindex=1 -proxy=4nk-tor:9050 -listenonion=1 -listen=1 -signetchallenge=0020341c43803863c252df326e73574a27d7e19322992061017b0dc893e2eab90821 -# Nœuds onion du réseau signet custom -addnode=6xi33lwwslsx3yi3f7c56wnqtdx4v73vj2up3prrwebpwbz6qisnqbyd.onion:38333 -addnode=d6i546e2sjezhyy2eupyc2wqtbgjnkubcjd4prhqurtlmp7nsp6yxqyd.onion:38333 -# Ports Signet (P2P et RPC) -port=38333 -rpcport=38332 -rpcbind=0.0.0.0 -rpcuser=bitcoin -rpcpassword=bitcoin - -fallbackfee=0.0001 - -zmqpubrawblock=tcp://0.0.0.0:29000 -zmqpubrawtx=tcp://0.0.0.0:29000 -#zmqpubhashtx=tcp://0.0.0.0:29000 -zmqpubhashblock=tcp://0.0.0.0:29000 -#zmqpubsequence=tcp://0.0.0.0:29000 - -blockfilterindex=1 \ No newline at end of file diff --git a/conf/blindbit.toml b/conf/blindbit.toml deleted file mode 100644 index 5766d586..00000000 --- a/conf/blindbit.toml +++ /dev/null @@ -1,25 +0,0 @@ -# Configuration pour blindbit-oracle -host = "0.0.0.0:8000" - -# Définit la chaîne sur laquelle le wallet fonctionne -chain = "signet" - -# Point d'accès RPC Bitcoin (sans cookie, autorisé par rpcallowip) -rpc_endpoint = "http://4nk-bitcoin:38332" - -# Auth RPC Bitcoin -rpc_user = "bitcoin" -rpc_pass = "bitcoin" - -# Hauteur de départ pour la synchronisation -sync_start_height = 1 - -# Paramètres de performance -max_parallel_tweak_computations = 4 -max_parallel_requests = 4 - -# Configuration des index -tweaks_only = 0 -tweaks_full_basic = 1 -tweaks_full_with_dust_filter = 1 -tweaks_cut_through_with_dust_filter = 1 \ No newline at end of file diff --git a/conf/blindbit.toml.exemple b/conf/blindbit.toml.exemple deleted file mode 100644 index 52f46155..00000000 --- a/conf/blindbit.toml.exemple +++ /dev/null @@ -1,25 +0,0 @@ -# Configuration pour blindbit-oracle -host = "0.0.0.0:8000" - -# Définit la chaîne sur laquelle le wallet fonctionne -chain = "signet" - -# Point d'accès RPC Bitcoin (sans cookie, autorisé par rpcallowip) -rpc_endpoint = "http://4nk-bitcoin:38332" - -# Auth RPC Bitcoin -rpc_user = "EXEMPLE" -rpc_pass = "EXEMPLE" - -# Hauteur de départ pour la synchronisation -sync_start_height = 1 - -# Paramètres de performance -max_parallel_tweak_computations = 4 -max_parallel_requests = 4 - -# Configuration des index -tweaks_only = 0 -tweaks_full_basic = 1 -tweaks_full_with_dust_filter = 1 -tweaks_cut_through_with_dust_filter = 1 \ No newline at end of file diff --git a/conf/sdk_relay1.conf.exemple b/conf/sdk_relay1.conf.exemple deleted file mode 100644 index 89a1b5cd..00000000 --- a/conf/sdk_relay1.conf.exemple +++ /dev/null @@ -1,22 +0,0 @@ -# Configuration sdk_relay pour Docker -# Services connectés via réseau Docker - -# Bitcoin Core RPC (sans cookie, autorisé par rpcallowip) -core_url=http://4nk-bitcoin:38332 -rpc_user=EXEMPLE -rpc_password=EXEMPLE -# core_wallet=relay_wallet -ws_url=0.0.0.0:8090 -http_url=0.0.0.0:8091 -wallet_name=relay_wallet.json -network=signet -blindbit_url=http://blindbit:8000 -zmq_url=tcp://4nk-bitcoin:29000 -data_dir=.4nk -# cookie non utilisé - -# Mode développement -dev_mode=true -standalone=true -blindbit_enabled=true -relay_id=relay-1 diff --git a/conf/sdk_relay2.conf.exemple b/conf/sdk_relay2.conf.exemple deleted file mode 100644 index e07e6451..00000000 --- a/conf/sdk_relay2.conf.exemple +++ /dev/null @@ -1,22 +0,0 @@ -# Configuration sdk_relay pour Docker -# Services connectés via réseau Docker - -# Bitcoin Core RPC (sans cookie, autorisé par rpcallowip) -core_url=http://4nk-bitcoin:38332 -rpc_user=EXEMPLE -rpc_password=EXEMPLE -core_wallet=relay_wallet -ws_url=0.0.0.0:8090 -http_url=0.0.0.0:8091 -wallet_name=relay_wallet.json -network=signet -blindbit_url=http://blindbit:8000 -zmq_url=tcp://4nk-bitcoin:29000 -data_dir=.4nk -# cookie non utilisé - -# Mode développement -dev_mode=true -standalone=true -blindbit_enabled=true -relay_id=relay-2 diff --git a/conf/sdk_relay3.conf.exemple b/conf/sdk_relay3.conf.exemple deleted file mode 100644 index 1de76db1..00000000 --- a/conf/sdk_relay3.conf.exemple +++ /dev/null @@ -1,22 +0,0 @@ -# Configuration sdk_relay pour Docker -# Services connectés via réseau Docker - -# Bitcoin Core RPC (sans cookie, autorisé par rpcallowip) -core_url=http://4nk-bitcoin:38332 -rpc_user=EXEMPLE -rpc_password=EXEMPLE -core_wallet=relay_wallet -ws_url=0.0.0.0:8090 -http_url=0.0.0.0:8091 -wallet_name=relay_wallet.json -network=signet -blindbit_url=http://blindbit:8000 -zmq_url=tcp://4nk-bitcoin:29000 -data_dir=.4nk -# cookie non utilisé - -# Mode développement -dev_mode=true -standalone=true -blindbit_enabled=true -relay_id=relay-3 diff --git a/docker-compose.yml b/docker-compose.yml index 2f14b30e..af773d94 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,29 +4,36 @@ version: '3.8' services: tor: - image: 4nk-node-tor:latest + image: torproject/tor:latest container_name: 4nk-tor + hostname: tor.4nk.local ports: - "9050:9050" - "9051:9051" volumes: - - tor_data:/var/lib/tor + - ./modules/tor/conf/tor.conf:/etc/tor/torrc:ro + - ./modules/tor/data:/var/lib/tor + - ./modules/tor/log:/var/log/tor networks: - - 4nk_network + 4nk_network: + ipv4_address: 172.20.0.10 restart: unless-stopped bitcoin: - image: 4nk-node-bitcoin:latest + image: ruimarinho/bitcoin-core:latest container_name: 4nk-bitcoin + hostname: bitcoin.4nk.local ports: - "38333:38333" - "38332:38332" - "29000:29000" volumes: - - bitcoin_data:/home/bitcoin/.bitcoin - - ./conf/bitcoin.conf:/home/bitcoin/bitcoin.conf:ro + - ./modules/bitcoin/data:/home/bitcoin/.bitcoin + - ./modules/bitcoin/conf/bitcoin.conf:/home/bitcoin/.bitcoin/bitcoin.conf:ro + - ./modules/bitcoin/logs:/home/bitcoin/.bitcoin/logs networks: - - 4nk_network + 4nk_network: + ipv4_address: 172.20.0.11 restart: unless-stopped depends_on: - tor @@ -34,6 +41,7 @@ services: blindbit: image: 4nk-node-blindbit:latest container_name: 4nk-blindbit + hostname: blindbit.4nk.local ports: - "8000:8000" @@ -50,9 +58,12 @@ services: command: ["/main", "--datadir", "/blindbit"] working_dir: / volumes: - - ./conf/blindbit.toml:/blindbit/blindbit.toml:ro + - ./modules/blindbit/conf/blindbit.toml:/blindbit/blindbit.toml:ro + - ./modules/blindbit/data:/blindbit + - ./modules/blindbit/logs:/blindbit/logs networks: - - 4nk_network + 4nk_network: + ipv4_address: 172.20.0.12 restart: unless-stopped depends_on: - bitcoin @@ -64,14 +75,17 @@ services: start_period: 40s sdk_storage: - image: 4nk-node-sdk_storage:docker-support-v2 + image: 4nk-node-sdk_storage:dev container_name: 4nk-sdk-storage + hostname: sdk-storage.4nk.local ports: - "8081:8081" volumes: - - ./conf/sdk_storage.conf:/usr/local/bin/sdk_storage.conf:ro + - ./modules/sdk_storage/conf/sdk_storage.conf:/usr/local/bin/sdk_storage.conf:ro + - ./modules/sdk_storage/log:/app/logs networks: - - 4nk_network + 4nk_network: + ipv4_address: 172.20.0.13 restart: unless-stopped depends_on: - blindbit @@ -83,8 +97,9 @@ services: start_period: 40s sdk_relay1: - image: 4nk-node-sdk_relay1:docker-support-v2 + image: 4nk-node-sdk_relay1:dev container_name: 4nk-sdk-relay1 + hostname: sdk-relay1.4nk.local ports: - "8090:8090" - "8091:8091" @@ -92,10 +107,12 @@ services: - RELAY_RPC_USER=bitcoin - RELAY_RPC_PASSWORD=bitcoin volumes: - - ./conf/sdk_relay1.conf:/home/bitcoin/.conf:ro + - ./modules/sdk_relay1/conf/sdk_relay1.conf:/home/bitcoin/.conf:ro + - ./modules/sdk_relay1/logs:/home/bitcoin/logs working_dir: /home/bitcoin networks: - - 4nk_network + 4nk_network: + ipv4_address: 172.20.0.14 restart: unless-stopped depends_on: - sdk_storage @@ -107,8 +124,9 @@ services: start_period: 40s sdk_relay2: - image: 4nk-node-sdk_relay2:docker-support-v2 + image: 4nk-node-sdk_relay2:dev container_name: 4nk-sdk-relay2 + hostname: sdk-relay2.4nk.local ports: - "8092:8090" - "8093:8091" @@ -116,10 +134,12 @@ services: - RELAY_RPC_USER=bitcoin - RELAY_RPC_PASSWORD=bitcoin volumes: - - ./conf/sdk_relay2.conf:/home/bitcoin/.conf:ro + - ./modules/sdk_relay2/conf/sdk_relay2.conf:/home/bitcoin/.conf:ro + - ./modules/sdk_relay2/logs:/home/bitcoin/logs working_dir: /home/bitcoin networks: - - 4nk_network + 4nk_network: + ipv4_address: 172.20.0.15 restart: unless-stopped depends_on: - sdk_storage @@ -131,8 +151,9 @@ services: start_period: 40s sdk_relay3: - image: 4nk-node-sdk_relay3:docker-support-v2 + image: 4nk-node-sdk_relay3:dev container_name: 4nk-sdk-relay3 + hostname: sdk-relay3.4nk.local ports: - "8094:8090" - "8095:8091" @@ -140,10 +161,12 @@ services: - RELAY_RPC_USER=bitcoin - RELAY_RPC_PASSWORD=bitcoin volumes: - - ./conf/sdk_relay3.conf:/home/bitcoin/.conf:ro + - ./modules/sdk_relay3/conf/sdk_relay3.conf:/home/bitcoin/.conf:ro + - ./modules/sdk_relay3/logs:/home/bitcoin/logs working_dir: /home/bitcoin networks: - - 4nk_network + 4nk_network: + ipv4_address: 172.20.0.16 restart: unless-stopped depends_on: - sdk_storage @@ -155,15 +178,18 @@ services: start_period: 40s sdk_signer: - image: 4nk-node-sdk_signer:docker-support-v2 + image: 4nk-node-sdk_signer:dev container_name: 4nk-sdk-signer + hostname: sdk-signer.4nk.local ports: - "9090:9090" volumes: - - ./conf/sdk_signer.conf:/usr/local/bin/sdk_signer.conf:ro - - sdk_signer_data:/app/data + - ./modules/sdk_signer/conf/sdk_signer.conf:/usr/local/bin/sdk_signer.conf:ro + - ./modules/sdk_signer/data:/app/data + - ./modules/sdk_signer/logs:/usr/src/app/logs networks: - - 4nk_network + 4nk_network: + ipv4_address: 172.20.0.17 restart: unless-stopped depends_on: - sdk_relay1 @@ -177,13 +203,17 @@ services: start_period: 40s ihm_client: - image: 4nk-node-ihm_client:docker-support-v2 + image: 4nk-node-ihm_client:dev container_name: 4nk-ihm-client + hostname: ihm-client.4nk.local ports: - "8080:80" - "3003:3003" + volumes: + - ./modules/ihm_client/logs:/var/log/ihm_client networks: - - 4nk_network + 4nk_network: + ipv4_address: 172.20.0.18 restart: unless-stopped depends_on: - sdk_signer @@ -197,6 +227,7 @@ services: miniback-postgres: image: postgres:15 container_name: miniback-postgres + hostname: miniback-postgres.4nk.local environment: - POSTGRES_USER=miniback - POSTGRES_PASSWORD=minibackpassword @@ -204,45 +235,59 @@ services: volumes: - miniback_pg_data:/var/lib/postgresql/data networks: - - 4nk_network + 4nk_network: + ipv4_address: 172.20.0.30 restart: unless-stopped ports: - "5432:5432" miniback: - image: 4nk-node-miniback:latest + image: 4nk-node-miniback:dev container_name: miniback + hostname: miniback.4nk.local env_file: - - ./conf/lecoffre-back-mini_env.conf + - ./projects/lecoffre/lecoffre-back-mini/conf/lecoffre-back-mini_env.conf depends_on: - miniback-postgres networks: - - 4nk_network + 4nk_network: + ipv4_address: 172.20.0.31 restart: unless-stopped volumes: - - ./logs/miniback:/logs - - ./conf/lecoffre-back-mini_env.conf:/app/.env:ro + - ./projects/lecoffre/lecoffre-back-mini/logs:/logs + - ./projects/lecoffre/lecoffre-back-mini/conf/lecoffre-back-mini_env.conf:/app/.env:ro coffre_front: - image: lecoffre-front:latest + image: lecoffre-front:dev container_name: coffre-front + hostname: coffre-front.4nk.local + volumes: + - ./projects/lecoffre/lecoffre-front/logs:/logs networks: - - 4nk_network + 4nk_network: + ipv4_address: 172.20.0.32 restart: unless-stopped coffre_back_mini: - image: lecoffre-back-mini:latest + image: lecoffre-back-mini:dev container_name: coffre-back-mini + hostname: coffre-back-mini.4nk.local networks: - - 4nk_network + 4nk_network: + ipv4_address: 172.20.0.33 restart: unless-stopped volumes: - tor_data: - bitcoin_data: - sdk_signer_data: miniback_pg_data: networks: 4nk_network: driver: bridge + ipam: + config: + - subnet: 172.20.0.0/16 + 4nk_projects_net: + driver: bridge + ipam: + config: + - subnet: 172.21.0.0/16 diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 2bea3bf4..b6cddea0 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -11,3 +11,10 @@ ## Sécurité ## Observabilité + +### Politique des images + +- Externes : Tor (`torproject/tor:latest`), Bitcoin Core (`ruimarinho/bitcoin-core:latest`), Blindbit (`4nk-node-blindbit:latest`). +- Internes : images taguées `:dev` en cours de création (sdk_storage, sdk_relay1/2/3, sdk_signer, ihm_client, miniback, lecoffre-front, lecoffre-back-mini). + +Les hostnames internes sont fixés en `.4nk.local` et une IP statique est réservée par service sur `4nk_network`. diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md new file mode 100644 index 00000000..1e91f4b7 --- /dev/null +++ b/docs/CONFIGURATION.md @@ -0,0 +1,34 @@ +## Configuration des images et tags + +### Introduction + +Ce document précise l'état courant de la politique de tags d'images et leur utilisation dans l'orchestrateur de `4NK_node`. + +### Politique de tags (en cours de création) + +- Les tags de build « dev » sont en cours de création pour les services applicatifs internes. +- À date, l'orchestrateur référence : + - Images externes stables (inchangées) : `torproject/tor:latest`, `ruimarinho/bitcoin-core:latest` et `4nk-node-blindbit:latest`. + - Images internes basculées sur le tag « dev » (en attente de disponibilité sur le registre) : + - `4nk-node-sdk_storage:dev` + - `4nk-node-sdk_relay1:dev`, `4nk-node-sdk_relay2:dev`, `4nk-node-sdk_relay3:dev` + - `4nk-node-sdk_signer:dev` + - `4nk-node-ihm_client:dev` + - `4nk-node-miniback:dev` + - `lecoffre-front:dev`, `lecoffre-back-mini:dev` + +Lorsque les tags « dev » seront effectivement publiés, un `docker compose pull` puis un redémarrage permettront d'aligner les environnements. + +### Réseaux et adresses + +- Réseau principal `4nk_network` : `172.20.0.0/16`, IP et hostnames statiques par service. +- Réseau réservé projets `4nk_projects_net` : `172.21.0.0/16` (aucun service attaché pour l'instant). + +### Montages de configuration et journaux + +- Les fichiers de configuration sont montés depuis `modules/*/conf` et `projects/*/*/conf`. +- Les journaux applicatifs sont montés depuis `modules/*/logs` et `projects/*/*/logs` pour observabilité. + +### Conclusion + +Les tags « dev » sont en cours de création et déjà référencés dans l'orchestrateur afin d'anticiper leur disponibilité. Cette page sera actualisée dès publication effective. Les mises à jour corrélées sont reflétées dans `docs/ARCHITECTURE.md` et le `CHANGELOG.md`. diff --git a/docs/NETWORK.md b/docs/NETWORK.md new file mode 100644 index 00000000..d52006d8 --- /dev/null +++ b/docs/NETWORK.md @@ -0,0 +1,13 @@ +tor: hostname=tor.4nk.local, ip=172.20.0.10 +bitcoin: hostname=bitcoin.4nk.local, ip=172.20.0.11 +blindbit: hostname=blindbit.4nk.local, ip=172.20.0.12 +sdk_storage: hostname=sdk-storage.4nk.local, ip=172.20.0.13 +sdk_relay1: hostname=sdk-relay1.4nk.local, ip=172.20.0.14 +sdk_relay2: hostname=sdk-relay2.4nk.local, ip=172.20.0.15 +sdk_relay3: hostname=sdk-relay3.4nk.local, ip=172.20.0.16 +sdk_signer: hostname=sdk-signer.4nk.local, ip=172.20.0.17 +ihm_client: hostname=ihm-client.4nk.local, ip=172.20.0.18 +miniback-postgres: hostname=miniback-postgres.4nk.local, ip=172.20.0.30 +miniback: hostname=miniback.4nk.local, ip=172.20.0.31 +coffre_front: hostname=coffre-front.4nk.local, ip=172.20.0.32 +coffre_back_mini: hostname=coffre-back-mini.4nk.local, ip=172.20.0.33 \ No newline at end of file diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md new file mode 100644 index 00000000..64a83c52 --- /dev/null +++ b/docs/RELEASE_NOTES.md @@ -0,0 +1,5 @@ +# Release 1.1.3 - 2025-09-07 + +- Mise à jour des versions `VERSION` et `TEMPLATE_VERSION`. +- Ajout des notes de release dédiées dans `docs/RELEASE_NOTES.md` et `tests/RELEASE_NOTES.md`. +- Mise à jour du changelog pour refléter cette release. diff --git a/log-monitoring.yml b/log-monitoring.yml index bf346461..6515660f 100644 --- a/log-monitoring.yml +++ b/log-monitoring.yml @@ -22,6 +22,9 @@ services: - ./log/promtail-config.yml:/etc/promtail/config.yml:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro - /var/log/docker:/var/log/docker:ro + - ./modules:/workspace/modules:ro + - ./projects:/workspace/projects:ro + - ./log:/workspace/logs:ro networks: - 4nk_network restart: unless-stopped diff --git a/log/README.md b/log/README.md new file mode 100644 index 00000000..5abf0c1a --- /dev/null +++ b/log/README.md @@ -0,0 +1,203 @@ +# 📊 Monitoring des Logs 4NK_node + +Ce répertoire contient la configuration complète pour surveiller et analyser les logs de tous les services 4NK_node en temps réel. + +## 🚀 Démarrage Rapide + +### 1. Démarrer le monitoring +```bash +cd 4NK_node +./log/start-monitoring.sh +``` + +### 2. Accéder à Grafana +- **URL**: http://localhost:3000 +- **Utilisateur**: `admin` +- **Mot de passe**: `admin` + +### 3. Dashboard principal +Le dashboard principal est automatiquement configuré et accessible à : +http://localhost:3000/d/4nk-node-logs/4nk-node-vue-d-ensemble-des-logs + +## 🏗️ Architecture + +``` +┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ +│ Services │ │ Promtail │ │ Loki │ +│ 4NK_node │───▶│ (Collecteur) │───▶│ (Stockage) │ +│ │ │ │ │ │ +└─────────────────┘ └─────────────────┘ └─────────────────┘ + │ │ + ▼ ▼ + ┌─────────────────┐ ┌─────────────────┐ + │ Grafana │ │ Dashboards │ + │ (Visualisation) │◄───│ (Analyses) │ + └─────────────────┘ └─────────────────┘ +``` + +## 📁 Structure des Fichiers + +``` +log/ +├── README.md # Ce fichier +├── start-monitoring.sh # Script de démarrage +├── log-monitoring.yml # Docker Compose pour le monitoring +├── loki-config.yaml # Configuration Loki +├── promtail-config.yml # Configuration Promtail +├── grafana-datasources.yml # Sources de données Grafana +├── grafana-dashboards.yml # Configuration des dashboards +└── dashboards/ + └── 4nk-node-overview.json # Dashboard principal +``` + +## 🔧 Services de Monitoring + +### Loki (Port 3100) +- **Rôle**: Stockage et indexation des logs +- **Fonctionnalités**: Requêtes LogQL, rétention configurable +- **Stockage**: Fichiers locaux avec compression + +### Promtail (Port 9080) +- **Rôle**: Collecte des logs Docker +- **Fonctionnalités**: Parsing JSON, étiquetage automatique +- **Collecte**: Logs de tous les conteneurs 4NK_node + +### Grafana (Port 3000) +- **Rôle**: Interface de visualisation +- **Fonctionnalités**: Dashboards, alertes, requêtes temps réel +- **Accès**: Interface web avec authentification + +## 📊 Dashboards Disponibles + +### Dashboard Principal : "4NK Node - Vue d'ensemble des Logs" +- **Log Rate par Service**: Graphique temporel des logs par service +- **Total Logs (5m)**: Statistique du nombre total de logs +- **Logs en Temps Réel**: Affichage en direct des logs de tous les services +- **Répartition par Service**: Graphique circulaire des logs par service +- **Répartition par Niveau**: Graphique circulaire des logs par niveau (info, error, debug) + +## 🔍 Requêtes LogQL Utiles + +### Logs d'un service spécifique +```logql +{job="4nk_node", service="bitcoin"} +``` + +### Logs d'erreur +```logql +{job="4nk_node"} |= "error" +``` + +### Logs des dernières 5 minutes +```logql +{job="4nk_node"} [5m] +``` + +### Recherche de texte +```logql +{job="4nk_node"} |~ "connection.*failed" +``` + +## 🛠️ Commandes Utiles + +### Démarrer le monitoring +```bash +docker compose -f log-monitoring.yml up -d +``` + +### Voir les logs des services de monitoring +```bash +docker compose -f log-monitoring.yml logs -f +``` + +### Arrêter le monitoring +```bash +docker compose -f log-monitoring.yml down +``` + +### Redémarrer un service spécifique +```bash +docker compose -f log-monitoring.yml restart grafana +``` + +### Vérifier le statut +```bash +docker compose -f log-monitoring.yml ps +``` + +## 📈 Métriques Surveillées + +### Services 4NK_node +- **bitcoin**: Logs de synchronisation, connexions RPC +- **blindbit**: Logs de traitement des blocs, erreurs +- **sdk_relay1/2/3**: Logs de connexion Bitcoin, erreurs RPC +- **sdk_signer**: Logs de connexion aux relays, erreurs WebSocket +- **sdk_storage**: Logs de base de données, erreurs de stockage +- **ihm_client**: Logs de l'interface utilisateur +- **tor**: Logs de connexion, erreurs de proxy + +### Niveaux de Log +- **INFO**: Informations générales, statut des services +- **ERROR**: Erreurs critiques, échecs de connexion +- **DEBUG**: Informations détaillées pour le débogage +- **WARN**: Avertissements, problèmes non critiques + +## 🔒 Sécurité + +- **Grafana**: Authentification requise (admin/admin) +- **Loki**: Pas d'authentification (accès local uniquement) +- **Promtail**: Pas d'authentification (collecte locale uniquement) +- **Ports exposés**: 3000 (Grafana), 3100 (Loki), 9080 (Promtail) + +## 🚨 Dépannage + +### Grafana ne démarre pas +```bash +docker compose -f log-monitoring.yml logs grafana +``` + +### Promtail ne collecte pas de logs +```bash +docker compose -f log-monitoring.yml logs promtail +``` + +### Loki ne stocke pas de logs +```bash +docker compose -f log-monitoring.yml logs loki +``` + +### Vérifier les permissions +```bash +ls -la log/ +chmod +x log/start-monitoring.sh +``` + +## 📝 Personnalisation + +### Ajouter un nouveau service +1. Modifier `promtail-config.yml` +2. Ajouter une nouvelle section `static_configs` +3. Redémarrer Promtail + +### Créer un nouveau dashboard +1. Créer un fichier JSON dans `dashboards/` +2. Modifier `grafana-dashboards.yml` si nécessaire +3. Redémarrer Grafana + +### Modifier la rétention des logs +1. Modifier `loki-config.yaml` +2. Ajuster `retention_period` et `chunk_retain_period` +3. Redémarrer Loki + +## 🌟 Fonctionnalités Avancées + +- **Alertes**: Configuration d'alertes sur des patterns de logs +- **Rétention**: Gestion automatique de la rétention des logs +- **Compression**: Compression automatique des anciens logs +- **Recherche**: Recherche full-text dans tous les logs +- **Filtrage**: Filtrage par service, niveau, timestamp +- **Export**: Export des logs en différents formats + +--- + +**Note**: Ce système de monitoring est conçu pour un environnement de développement. Pour la production, considérez l'ajout d'authentification et de chiffrement. diff --git a/log/dashboards/4nk-node-overview.json b/log/dashboards/4nk-node-overview.json new file mode 100644 index 00000000..3894cacb --- /dev/null +++ b/log/dashboards/4nk-node-overview.json @@ -0,0 +1,347 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": null, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "loki", + "uid": "loki" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "vis": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "loki", + "uid": "loki" + }, + "editorMode": "code", + "expr": "rate({job=\"4nk_node\"} [5m])", + "queryType": "", + "refId": "A" + } + ], + "title": "Log Rate par Service", + "type": "timeseries" + }, + { + "datasource": { + "type": "loki", + "uid": "loki" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 2, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.0.0", + "targets": [ + { + "datasource": { + "type": "loki", + "uid": "loki" + }, + "editorMode": "code", + "expr": "count_over_time({job=\"4nk_node\"} [5m])", + "queryType": "", + "refId": "A" + } + ], + "title": "Total Logs (5m)", + "type": "stat" + }, + { + "datasource": { + "type": "loki", + "uid": "loki" + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 3, + "options": { + "dedupStrategy": "none", + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": false, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "targets": [ + { + "datasource": { + "type": "loki", + "uid": "loki" + }, + "editorMode": "code", + "expr": "{job=\"4nk_node\"} | json | line_format \"{{.service}}: {{.msg}}\"", + "maxLines": 100, + "queryType": "", + "refId": "A" + } + ], + "title": "Logs en Temps Réel - Tous les Services", + "type": "logs" + }, + { + "datasource": { + "type": "loki", + "uid": "loki" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "vis": false + } + }, + "mappings": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 4, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "loki", + "uid": "loki" + }, + "editorMode": "code", + "expr": "count_over_time({job=\"4nk_node\"} [5m]) by (service)", + "queryType": "", + "refId": "A" + } + ], + "title": "Répartition des Logs par Service", + "type": "piechart" + }, + { + "datasource": { + "type": "loki", + "uid": "loki" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 5, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "loki", + "uid": "loki" + }, + "editorMode": "code", + "expr": "count_over_time({job=\"4nk_node\"} [5m]) by (level)", + "queryType": "", + "refId": "A" + } + ], + "title": "Répartition des Logs par Niveau", + "type": "piechart" + } + ], + "refresh": "5s", + "schemaVersion": 38, + "style": "dark", + "tags": [ + "4nk_node", + "monitoring", + "logs" + ], + "templating": { + "list": [] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "4NK Node - Vue d'ensemble des Logs", + "uid": "4nk-node-logs", + "version": 1, + "weekStart": "" +} diff --git a/log/grafana-dashboards.yml b/log/grafana-dashboards.yml new file mode 100644 index 00000000..c5375226 --- /dev/null +++ b/log/grafana-dashboards.yml @@ -0,0 +1,13 @@ +apiVersion: 1 + +providers: + - name: '4NK Dashboards' + orgId: 1 + folder: '4NK' + type: file + disableDeletion: false + editable: true + updateIntervalSeconds: 30 + options: + path: /etc/grafana/provisioning/dashboards/dashboards +EOF diff --git a/log/grafana-datasources.yml b/log/grafana-datasources.yml new file mode 100644 index 00000000..21652f8e --- /dev/null +++ b/log/grafana-datasources.yml @@ -0,0 +1,11 @@ +apiVersion: 1 + +datasources: + - name: Loki + type: loki + access: proxy + url: http://loki:3100 + isDefault: true + jsonData: + maxLines: 5000 +EOF diff --git a/log/loki-config.yaml b/log/loki-config.yaml new file mode 100644 index 00000000..ba32f3d5 --- /dev/null +++ b/log/loki-config.yaml @@ -0,0 +1,45 @@ +server: + http_listen_port: 3100 + grpc_listen_port: 9096 + log_level: info + chunk_target_size: 1048576 +schema_config: + configs: + - from: 2020-10-15 + store: boltdb-shipper + object_store: filesystem + schema: v11 + index: + prefix: index_ + period: 24h +storage_config: + boltdb_shipper: + active_index_directory: /loki/index + cache_location: /loki/boltdb-cache + shared_store: filesystem + filesystem: + directory: /loki/chunks +limits_config: + enforce_metric_name: false + reject_old_samples: true + reject_old_samples_max_age: 168h +chunk_store_config: + max_look_back_period: 168h +compactor: + working_directory: /loki/boltdb-shipper-compactor + shared_store: filesystem + compactor_ring: + kvstore: + store: inmemory +ruler: + storage: + type: local + local: + directory: /loki/rules + ring: + kvstore: + store: inmemory + rule_path: /loki/rules-temp + alertmanager_url: http://localhost:9093 + enable_api: true +EOF diff --git a/log/promtail-config.yml b/log/promtail-config.yml new file mode 100644 index 00000000..67fb9e2d --- /dev/null +++ b/log/promtail-config.yml @@ -0,0 +1,32 @@ +server: + http_listen_port: 9080 + grpc_listen_port: 0 + +positions: + filename: /tmp/positions.yaml + +clients: + - url: http://loki:3100/loki/api/v1/push + +scrape_configs: + - job_name: 4nk_node_core_logs + static_configs: + - targets: [localhost] + labels: + job: 4nk_node_core + __path__: /workspace/logs/**/*.log + + - job_name: 4nk_modules_logs + static_configs: + - targets: [localhost] + labels: + job: 4nk_modules + __path__: /workspace/modules/*/logs/**/*.log + + - job_name: 4nk_projects_logs + static_configs: + - targets: [localhost] + labels: + job: 4nk_projects + __path__: /workspace/projects/*/*/logs/**/*.log +EOF diff --git a/log/start-monitoring.sh b/log/start-monitoring.sh new file mode 100755 index 00000000..02812dab --- /dev/null +++ b/log/start-monitoring.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +# Script de démarrage du monitoring des logs 4NK_node +# Auteur: Assistant IA +# Date: $(date) + +echo "🚀 Démarrage du monitoring des logs 4NK_node..." + +# Vérifier que nous sommes dans le bon répertoire +if [ ! -f "log-monitoring.yml" ]; then + echo "❌ Erreur: Ce script doit être exécuté depuis le répertoire 4NK_node" + exit 1 +fi + +# Démarrer les services de monitoring +echo "📊 Démarrage de Loki (stockage des logs)..." +docker compose -f log-monitoring.yml up -d loki + +echo "⏳ Attente du démarrage de Loki..." +sleep 10 + +echo "📥 Démarrage de Promtail (collecte des logs)..." +docker compose -f log-monitoring.yml up -d promtail + +echo "⏳ Attente du démarrage de Promtail..." +sleep 5 + +echo "📈 Démarrage de Grafana (visualisation)..." +docker compose -f log-monitoring.yml up -d grafana + +echo "⏳ Attente du démarrage de Grafana..." +sleep 10 + +# Vérifier le statut des services +echo "🔍 Vérification du statut des services..." +docker compose -f log-monitoring.yml ps + +echo "" +echo "✅ Monitoring des logs démarré avec succès !" +echo "" +echo "🌐 Accès aux services :" +echo " - Grafana: http://localhost:3000 (admin/admin)" +echo " - Loki: http://localhost:3100" +echo " - Promtail: http://localhost:9080" +echo "" +echo "📊 Dashboard principal: http://localhost:3000/d/4nk-node-logs/4nk-node-vue-d-ensemble-des-logs" +echo "" +echo "📝 Pour arrêter: docker compose -f log-monitoring.yml down" +echo "📝 Pour voir les logs: docker compose -f log-monitoring.yml logs -f" diff --git a/modules/bitcoin/Dockerfile b/modules/bitcoin/Dockerfile deleted file mode 100644 index 06098f86..00000000 --- a/modules/bitcoin/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM alpine:latest -RUN apk add --no-cache bitcoin curl -RUN addgroup -g 1001 bitcoinuser && adduser -D -s /bin/sh -u 1001 -G bitcoinuser bitcoinuser -RUN mkdir -p /home/bitcoin/.bitcoin/signet && chown -R bitcoinuser:bitcoinuser /home/bitcoin -USER bitcoinuser -WORKDIR /home/bitcoin -EXPOSE 38333 18443 29000 -CMD ["bitcoind", "-signet", "-conf=/home/bitcoin/bitcoin.conf"] diff --git a/modules/bitcoin/conf/bitcoin.conf.exemple b/modules/bitcoin/conf/bitcoin.conf.exemple new file mode 100644 index 00000000..f64e0900 --- /dev/null +++ b/modules/bitcoin/conf/bitcoin.conf.exemple @@ -0,0 +1,69 @@ +listen=1 +daemon=1 + +[signet] +whitelist=download@bitcoin.4nk.local +txindex=1 +proxy=tor.4nk.local:9050 +listenonion=1 +signetchallenge=0020341c43803863c252df326e73574a27d7e19322992061017b0dc893e2eab90821 +addnode=6xi33lwwslsx3yi3f7c56wnqtdx4v73vj2up3prrwebpwbz6qisnqbyd.onion:38333 +addnode=d6i546e2sjezhyy2eupyc2wqtbgjnkubcjd4prhqurtlmp7nsp6yxqyd.onion:38333 + +fallbackfee=0.0001 + +zmqpubrawblock=tcp://bitcoin.4nk.local:29000 +zmqpubrawtx=tcp://bitcoin.4nk.local:29000 +zmqpubhashblock=tcp://bitcoin.4nk.local:29000 + +blockfilterindex=1 +# 0.0.0.0:8000 to expose outside of localhost +# default: "127.0.0.1:8000" +host = "bitcoin.4nk.local:8000" + +# Defines on which chain the wallet runs. Allowed values: main, testnet, signet, regtest. +# default: signet +chain = "signet" + +# default: http://127.0.0.1:8332 +rpc_endpoint = "http://bitcoin.4nk.local:38332" + +# required, unless rpc_user and rpc_pass are set +cookie_path = "$HOME/.bitcoin/signet/.cookie" + +# required, unless cookie_path is set +rpc_pass = "" + +# required, unless cookie_path is set +rpc_user = "" + +# required (has to be >= 1) +sync_start_height = 1 + +# the default for this is 1, but should be set to a higher value to increase performance, +# one should set this in accordance to how many cores one wants to use +max_parallel_tweak_computations = 4 + +# (depends on max-rpc-workers of the underlying full node) +max_parallel_requests = 4 + +# optional - will only generate tweaks (still both cut-through and full-index) +# default: 0 +tweaks_only = 0 + +# The base index. Only includes the tweaks. No dust filtering or cut-through possible +# default: 1 +tweaks_full_basic = 1 + +# if this is set a full non-cut-through index will be created. +# This index can be used to filter for dust (?dustLimit=). If this is active the base index will not be created. +# All full index queries will be served from this with or without (?dustLimit=) set in the query. +# default 0 +tweaks_full_with_dust_filter = 0 + +# This index applies cut-through and dust filtering. +# Beware that it will be stored in addition to any full index (with or without dust) if activated. +# It has more storage requirements than the simple indices. +# Currently still requires tweaks_only=0. +# default: 0 +tweaks_cut_through_with_dust_filter = 0 \ No newline at end of file diff --git a/modules/blindbit/Dockerfile b/modules/blindbit/Dockerfile deleted file mode 100644 index 27411b20..00000000 --- a/modules/blindbit/Dockerfile +++ /dev/null @@ -1,37 +0,0 @@ -# blindbit-oracle/Dockerfile -FROM golang:1.25-alpine as builder - -RUN apk add --no-cache git - -WORKDIR /app - -# Cloner le repo blindbit-oracle -RUN git clone --branch dev --depth 1 https://github.com/setavenger/blindbit-oracle.git . - -# Compiler le binaire -RUN if [ -d ./cmd ]; then \ - go build -o /go/bin/blindbit-oracle ./cmd/blindbit-oracle; \ -else \ - go build -o /go/bin/blindbit-oracle ./...; \ -fi - -# Utiliser debian:bookworm-slim qui contient GLIBC 2.34 -FROM debian:bookworm-slim - -# Installation des dépendances nécessaires -RUN apt-get update && apt-get install -y ca-certificates curl && rm -rf /var/lib/apt/lists/* - -# Copier le binaire depuis le builder -COPY --from=builder /go/bin/blindbit-oracle /usr/local/bin/blindbit-oracle - -# Créer le répertoire de données -RUN mkdir -p /data - -# Créer le volume pour les données -VOLUME ["/data"] - -# Exposer le port par défaut -EXPOSE 8000 - -# Démarrer blindbit-oracle avec le répertoire de données spécifié -ENTRYPOINT ["blindbit-oracle", "-datadir", "/data"] \ No newline at end of file diff --git a/modules/blindbit/conf/blindbit.toml b/modules/blindbit/conf/blindbit.toml new file mode 100644 index 00000000..1124bbf5 --- /dev/null +++ b/modules/blindbit/conf/blindbit.toml @@ -0,0 +1,50 @@ +# 0.0.0.0:8000 to expose outside of localhost +# default: "127.0.0.1:8000" +host = "blindbit.4nk.local:8000" + +# Defines on which chain the wallet runs. Allowed values: main, testnet, signet, regtest. +# default: signet +chain = "signet" + +# default: http://bitcoin.4nk.local:8332 +rpc_endpoint = "http://bitcoin.4nk.local:38332" + +# required, unless rpc_user and rpc_pass are set +cookie_path = "$HOME/.bitcoin/signet/.cookie" + +# required, unless cookie_path is set +rpc_pass = "" + +# required, unless cookie_path is set +rpc_user = "" + +# required (has to be >= 1) +sync_start_height = 1 + +# the default for this is 1, but should be set to a higher value to increase performance, +# one should set this in accordance to how many cores one wants to use +max_parallel_tweak_computations = 4 + +# (depends on max-rpc-workers of the underlying full node) +max_parallel_requests = 4 + +# optional - will only generate tweaks (still both cut-through and full-index) +# default: 0 +tweaks_only = 0 + +# The base index. Only includes the tweaks. No dust filtering or cut-through possible +# default: 1 +tweaks_full_basic = 1 + +# if this is set a full non-cut-through index will be created. +# This index can be used to filter for dust (?dustLimit=). If this is active the base index will not be created. +# All full index queries will be served from this with or without (?dustLimit=) set in the query. +# default 0 +tweaks_full_with_dust_filter = 0 + +# This index applies cut-through and dust filtering. +# Beware that it will be stored in addition to any full index (with or without dust) if activated. +# It has more storage requirements than the simple indices. +# Currently still requires tweaks_only=0. +# default: 0 +tweaks_cut_through_with_dust_filter = 0 \ No newline at end of file diff --git a/modules/blindbit/conf/blindbit.toml.exemple b/modules/blindbit/conf/blindbit.toml.exemple new file mode 100644 index 00000000..a6e4f70e --- /dev/null +++ b/modules/blindbit/conf/blindbit.toml.exemple @@ -0,0 +1,50 @@ +# 0.0.0.0:8000 to expose outside of localhost +# default: "127.0.0.1:8000" +host = "bitcoin.4nk.local:8000" + +# Defines on which chain the wallet runs. Allowed values: main, testnet, signet, regtest. +# default: signet +chain = "signet" + +# default: http://bitcoin.4nk.local:8332 +rpc_endpoint = "http://bitcoin.4nk.local:38332" + +# required, unless rpc_user and rpc_pass are set +cookie_path = "$HOME/.bitcoin/signet/.cookie" + +# required, unless cookie_path is set +rpc_pass = "" + +# required, unless cookie_path is set +rpc_user = "" + +# required (has to be >= 1) +sync_start_height = 1 + +# the default for this is 1, but should be set to a higher value to increase performance, +# one should set this in accordance to how many cores one wants to use +max_parallel_tweak_computations = 4 + +# (depends on max-rpc-workers of the underlying full node) +max_parallel_requests = 4 + +# optional - will only generate tweaks (still both cut-through and full-index) +# default: 0 +tweaks_only = 0 + +# The base index. Only includes the tweaks. No dust filtering or cut-through possible +# default: 1 +tweaks_full_basic = 1 + +# if this is set a full non-cut-through index will be created. +# This index can be used to filter for dust (?dustLimit=). If this is active the base index will not be created. +# All full index queries will be served from this with or without (?dustLimit=) set in the query. +# default 0 +tweaks_full_with_dust_filter = 0 + +# This index applies cut-through and dust filtering. +# Beware that it will be stored in addition to any full index (with or without dust) if activated. +# It has more storage requirements than the simple indices. +# Currently still requires tweaks_only=0. +# default: 0 +tweaks_cut_through_with_dust_filter = 0 \ No newline at end of file diff --git a/modules/ihm_client/Dockerfile b/modules/ihm_client/Dockerfile deleted file mode 100755 index b16e5579..00000000 --- a/modules/ihm_client/Dockerfile +++ /dev/null @@ -1,44 +0,0 @@ -# Dockerfile: construction des artefacts (dist/) sans serveur — Nginx géré par 4NK_node -FROM node:20-alpine AS builder - -WORKDIR /app - -# Installation des dépendances système -RUN apk update && apk add --no-cache \ - git \ - build-base \ - python3 \ - make \ - g++ \ - curl \ - ca-certificates - -# Copie des fichiers de dépendances -COPY package*.json ./ - -# Installation des dépendances (inclut les devDependencies nécessaires au build) -RUN npm install - -# Copie du code source -COPY . . - -# Préparation des dépendances wasm (pkg/sdk_client) -ARG SDK_CLIENT_PKG_URL="" -ARG SDK_CLIENT_PKG_TARBALL="" -ARG SDK_CLIENT_PKG_BASE="https://git.4nkweb.com/4nk/ihm_client/raw/branch/docker-support/pkg" -ENV SDK_CLIENT_PKG_URL=${SDK_CLIENT_PKG_URL} -ENV SDK_CLIENT_PKG_TARBALL=${SDK_CLIENT_PKG_TARBALL} -ENV SDK_CLIENT_PKG_BASE=${SDK_CLIENT_PKG_BASE} -RUN chmod +x ./scripts/setup-remote-deps.sh && npm run build_wasm - -# Build de l'application -RUN npm run build - -# Stage artefacts uniquement (pas de serveur ici) -FROM alpine:3.19 AS dist -WORKDIR /opt/ihm_client -COPY --from=builder /app/dist ./dist -COPY --from=builder /app/package*.json ./ - -# Conteneur neutre (aucun port exposé, artefacts montables dans 4NK_node) -CMD ["sh", "-c", "echo 'dist prêt dans /opt/ihm_client/dist'; tail -f /dev/null"] diff --git a/modules/ihm_client/conf/.env.exemple b/modules/ihm_client/conf/.env.exemple new file mode 100644 index 00000000..013d3805 --- /dev/null +++ b/modules/ihm_client/conf/.env.exemple @@ -0,0 +1,16 @@ + +[PROD] +U32_MAX=4294967295 +BASEURL="http://ihm-client.4nk.local" +BOOTSTRAPURL=["http://sdk-relay1.4nk.local:8090"] +STORAGEURL="http://sdk-storage.4nk.local/storage" +BLINDBITURL="http://blindbit.4nk.local:8000" +DEFAULTAMOUNT=1000 + +[DEV] +U32_MAX=4294967295 +BASEURL="http://ihm-client.4nk.local" +BOOTSTRAPURL=["http://sdk-relay1.4nk.local:8090"] +STORAGEURL="http://sdk-storage.4nk.local/storage" +BLINDBITURL="http://blindbit.4nk.local:8000" +DEFAULTAMOUNT=1000 \ No newline at end of file diff --git a/modules/ihm_client/conf/config.ts b/modules/ihm_client/conf/config.ts new file mode 100644 index 00000000..755e827a --- /dev/null +++ b/modules/ihm_client/conf/config.ts @@ -0,0 +1,7 @@ +const U32_MAX = import.meta.env.U32_MAX; +const BASEURL = import.meta.env.DEV.BASEURL; +const BOOTSTRAPURL = import.meta.env.DEV.BOOTSTRAPURL; +const STORAGEURL = import.meta.env.DEV.STORAGEURL; +const BLINDBITURL = import.meta.env.DEV.BLINDBITURL; +const DEFAULTAMOUNT = import.meta.env.DEV.DEFAULTAMOUNT; +const EMPTY32BYTES = import.meta.env.DEV.EMPTY32BYTES; \ No newline at end of file diff --git a/conf/ihm_client.conf.exemple b/modules/ihm_client/conf/config.ts.exemple similarity index 100% rename from conf/ihm_client.conf.exemple rename to modules/ihm_client/conf/config.ts.exemple diff --git a/modules/sdk_relay1/Dockerfile b/modules/sdk_relay1/Dockerfile deleted file mode 100644 index 1be41c16..00000000 --- a/modules/sdk_relay1/Dockerfile +++ /dev/null @@ -1,46 +0,0 @@ -FROM rust:1.75-alpine AS builder - -# Install build dependencies -RUN apk add --no-cache musl-dev openssl-dev - -# Set working directory -WORKDIR /app - -# Copy source code -COPY . . - -# Build the application -RUN cargo build --release - -# Runtime stage -FROM alpine:latest - -# Install runtime dependencies -RUN apk add --no-cache libgcc - -# Create app user -RUN addgroup -g 1001 appuser && adduser -D -s /bin/sh -u 1001 -G appuser appuser - -# Set working directory -WORKDIR /app - -# Copy binary from builder -COPY --from=builder /app/target/release/sdk_relay /usr/local/bin/sdk_relay - -# Configuration file will be mounted via docker-compose - -# Set permissions -RUN chown -R appuser:appuser /app - -# Switch to app user -USER appuser - -# Expose ports -EXPOSE 8090 8091 - -# Health check -HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ - CMD wget --quiet --tries=1 --timeout=5 --spider http://localhost:8091 || exit 1 - -# Run the application -CMD ["/usr/local/bin/sdk_relay"] diff --git a/modules/sdk_relay1/conf/sdk_relay1.conf.exemple b/modules/sdk_relay1/conf/sdk_relay1.conf.exemple new file mode 100644 index 00000000..b1577f8c --- /dev/null +++ b/modules/sdk_relay1/conf/sdk_relay1.conf.exemple @@ -0,0 +1,6 @@ +core_url="http://bitcoin.4nk.local:38332" +ws_url="sdk-relay1.4nk.local:8090" +wallet_name="default" +network="signet" +blindbit_url="http://blindbit.4nk.local:8000" +zmq_url="tcp://bitcoin.4nk.local:29000" \ No newline at end of file diff --git a/modules/sdk_relay2/Dockerfile b/modules/sdk_relay2/Dockerfile deleted file mode 100644 index 1be41c16..00000000 --- a/modules/sdk_relay2/Dockerfile +++ /dev/null @@ -1,46 +0,0 @@ -FROM rust:1.75-alpine AS builder - -# Install build dependencies -RUN apk add --no-cache musl-dev openssl-dev - -# Set working directory -WORKDIR /app - -# Copy source code -COPY . . - -# Build the application -RUN cargo build --release - -# Runtime stage -FROM alpine:latest - -# Install runtime dependencies -RUN apk add --no-cache libgcc - -# Create app user -RUN addgroup -g 1001 appuser && adduser -D -s /bin/sh -u 1001 -G appuser appuser - -# Set working directory -WORKDIR /app - -# Copy binary from builder -COPY --from=builder /app/target/release/sdk_relay /usr/local/bin/sdk_relay - -# Configuration file will be mounted via docker-compose - -# Set permissions -RUN chown -R appuser:appuser /app - -# Switch to app user -USER appuser - -# Expose ports -EXPOSE 8090 8091 - -# Health check -HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ - CMD wget --quiet --tries=1 --timeout=5 --spider http://localhost:8091 || exit 1 - -# Run the application -CMD ["/usr/local/bin/sdk_relay"] diff --git a/modules/sdk_relay2/conf/sdk_relay2.conf.exemple b/modules/sdk_relay2/conf/sdk_relay2.conf.exemple new file mode 100644 index 00000000..b1577f8c --- /dev/null +++ b/modules/sdk_relay2/conf/sdk_relay2.conf.exemple @@ -0,0 +1,6 @@ +core_url="http://bitcoin.4nk.local:38332" +ws_url="sdk-relay1.4nk.local:8090" +wallet_name="default" +network="signet" +blindbit_url="http://blindbit.4nk.local:8000" +zmq_url="tcp://bitcoin.4nk.local:29000" \ No newline at end of file diff --git a/modules/sdk_relay3/Dockerfile b/modules/sdk_relay3/Dockerfile deleted file mode 100644 index 1be41c16..00000000 --- a/modules/sdk_relay3/Dockerfile +++ /dev/null @@ -1,46 +0,0 @@ -FROM rust:1.75-alpine AS builder - -# Install build dependencies -RUN apk add --no-cache musl-dev openssl-dev - -# Set working directory -WORKDIR /app - -# Copy source code -COPY . . - -# Build the application -RUN cargo build --release - -# Runtime stage -FROM alpine:latest - -# Install runtime dependencies -RUN apk add --no-cache libgcc - -# Create app user -RUN addgroup -g 1001 appuser && adduser -D -s /bin/sh -u 1001 -G appuser appuser - -# Set working directory -WORKDIR /app - -# Copy binary from builder -COPY --from=builder /app/target/release/sdk_relay /usr/local/bin/sdk_relay - -# Configuration file will be mounted via docker-compose - -# Set permissions -RUN chown -R appuser:appuser /app - -# Switch to app user -USER appuser - -# Expose ports -EXPOSE 8090 8091 - -# Health check -HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ - CMD wget --quiet --tries=1 --timeout=5 --spider http://localhost:8091 || exit 1 - -# Run the application -CMD ["/usr/local/bin/sdk_relay"] diff --git a/modules/sdk_relay3/conf/sdk_relay3.conf.exemple b/modules/sdk_relay3/conf/sdk_relay3.conf.exemple new file mode 100644 index 00000000..b1577f8c --- /dev/null +++ b/modules/sdk_relay3/conf/sdk_relay3.conf.exemple @@ -0,0 +1,6 @@ +core_url="http://bitcoin.4nk.local:38332" +ws_url="sdk-relay1.4nk.local:8090" +wallet_name="default" +network="signet" +blindbit_url="http://blindbit.4nk.local:8000" +zmq_url="tcp://bitcoin.4nk.local:29000" \ No newline at end of file diff --git a/modules/sdk_signer/Dockerfile b/modules/sdk_signer/Dockerfile deleted file mode 100644 index 459a31f7..00000000 --- a/modules/sdk_signer/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM node:18-slim AS builder -WORKDIR /usr/src/app -COPY package.json package-lock.json ./ -RUN npm ci -COPY tsconfig.json ./ -COPY src ./src -COPY pkg ./pkg -RUN npm run build - -FROM node:18-slim -WORKDIR /usr/src/app -COPY --from=builder /usr/src/app/dist ./dist -COPY --from=builder /usr/src/app/package.json ./package.json -COPY --from=builder /usr/src/app/node_modules ./node_modules -EXPOSE 9090 -ENV PORT=9090 -CMD ["node","dist/index.js"] diff --git a/conf/sdk_signer.conf.exemple b/modules/sdk_signer/conf/sdk_signer.conf.exemple similarity index 84% rename from conf/sdk_signer.conf.exemple rename to modules/sdk_signer/conf/sdk_signer.conf.exemple index b4c84ff8..0d9276fb 100644 --- a/conf/sdk_signer.conf.exemple +++ b/modules/sdk_signer/conf/sdk_signer.conf.exemple @@ -11,8 +11,8 @@ blindbit_url = "http://4nk-blindbit:8000" bitcoin_rpc_url = "http://4nk-bitcoin:38332" # Authentification Bitcoin -bitcoin_rpc_user = "EXEMPLE" -bitcoin_rpc_password = "EXEMPLE" +bitcoin_rpc_user = "bitcoin" +bitcoin_rpc_password = "bitcoin" # Mode développement dev_mode = true @@ -24,7 +24,7 @@ timeout = 30 # Logging log_level = "info" -log_file = "/home/bitcoin/logs/sdk_signer.log" +log_file = "$HOME/bitcoin/logs/sdk_signer.log" # Sécurité enable_tls = false diff --git a/modules/sdk_storage/Dockerfile b/modules/sdk_storage/Dockerfile deleted file mode 100644 index 8e191aaf..00000000 --- a/modules/sdk_storage/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -# syntax=docker/dockerfile:1 - -FROM rust:1 as builder -WORKDIR /app -COPY Cargo.toml Cargo.lock ./ -COPY src ./src -RUN cargo build --release - -FROM debian:stable-slim -RUN useradd -m -u 10001 appuser && \ - apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/* -WORKDIR /app -COPY --from=builder /app/target/release/sdk_storage /usr/local/bin/sdk_storage -RUN mkdir -p /app/storage && chown -R appuser:appuser /app -USER appuser -EXPOSE 8081 -ENV RUST_LOG=info -ENTRYPOINT ["/usr/local/bin/sdk_storage"] -CMD ["--permanent"] diff --git a/conf/sdk_storage.conf.exemple b/modules/sdk_storage/conf/sdk_storage.conf.exemple similarity index 100% rename from conf/sdk_storage.conf.exemple rename to modules/sdk_storage/conf/sdk_storage.conf.exemple diff --git a/modules/tor/Dockerfile b/modules/tor/Dockerfile deleted file mode 100644 index e825fd24..00000000 --- a/modules/tor/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM alpine:latest -RUN apk add --no-cache tor curl - -RUN addgroup -g 1001 toruser && adduser -D -s /bin/sh -u 1001 -G toruser toruser -RUN mkdir -p /var/lib/tor && chown -R toruser:toruser /var/lib/tor - -USER toruser -EXPOSE 9050 9051 -CMD ["tor", "-f", "/etc/tor/torrc"] diff --git a/modules/tor/entrypoint.sh b/modules/tor/entrypoint.sh new file mode 100644 index 00000000..bd617e6b --- /dev/null +++ b/modules/tor/entrypoint.sh @@ -0,0 +1,19 @@ +#!/bin/sh +set -e + +TORRC_PATH=/etc/tor/torrc +if [ ! -f "$TORRC_PATH" ]; then + mkdir -p /etc/tor + cat > "$TORRC_PATH" << 'EOF' +Log notice file /var/log/tor/notices.log +DataDirectory /var/lib/tor +SocksPort 0.0.0.0:9050 +ControlPort 9051 +EOF +fi + +# Ensure permissions for Tor data directories when running as root +chown -R 0:0 /var/lib/tor /var/log/tor /etc/tor 2>/dev/null || true +chmod -R a+rwX /var/lib/tor /var/log/tor /etc/tor 2>/dev/null || true + +tor -f "$TORRC_PATH" diff --git a/conf/tor.conf.exemple b/modules/tor/tor.conf.exemple similarity index 100% rename from conf/tor.conf.exemple rename to modules/tor/tor.conf.exemple diff --git a/projects/lecoffre-back-mini/Dockerfile b/projects/lecoffre-back-mini/Dockerfile deleted file mode 100644 index 993b37d7..00000000 --- a/projects/lecoffre-back-mini/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -# Dockerfile minimal pour lecoffre-back-mini (local project) -FROM alpine:3.19 -RUN apk add --no-cache bash -WORKDIR /app -COPY . /app -CMD ["bash", "-lc", "echo 'lecoffre-back-mini backend ready' && tail -f /dev/null"] diff --git a/projects/lecoffre-front/Dockerfile b/projects/lecoffre-front/Dockerfile deleted file mode 100644 index b9ea0e27..00000000 --- a/projects/lecoffre-front/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM node:20-alpine -WORKDIR /app -COPY package*.json ./ -RUN npm install --silent -COPY . . -CMD ["node", "server.js"] diff --git a/conf/lecoffre-back-mini_env.conf.exemple b/projects/lecoffre/lecoffre-back-mini/conf/.env.exemple similarity index 100% rename from conf/lecoffre-back-mini_env.conf.exemple rename to projects/lecoffre/lecoffre-back-mini/conf/.env.exemple diff --git a/conf/lecoffre-front_env.conf.exemple b/projects/lecoffre/lecoffre-front/conf/.env.exemple similarity index 100% rename from conf/lecoffre-front_env.conf.exemple rename to projects/lecoffre/lecoffre-front/conf/.env.exemple diff --git a/tests/RELEASE_NOTES.md b/tests/RELEASE_NOTES.md new file mode 100644 index 00000000..5c858ba9 --- /dev/null +++ b/tests/RELEASE_NOTES.md @@ -0,0 +1,4 @@ +# Release tests 1.1.3 - 2025-09-07 + +- Ajout des notes de tests pour la release 1.1.3. +- Synchronisation des notes de release avec docs/RELEASE_NOTES.md.