align for IA agents + grafana

This commit is contained in:
Nicolas Cantu 2025-09-21 14:10:34 +00:00
parent 7df67d7e8f
commit f6dc2812d4
48 changed files with 2998 additions and 675 deletions

View File

@ -96,6 +96,10 @@ Via les scripts, lance tous les services de `lecoffre_node/docker-compose.yml`.
35. Corriger à nouveau si nécessaire (jusqu'à l'absence totale d'erreurs)
36. Mettre à jour la documentation avec le **retour dexpérience** à chaque fois par une mise à jour de `docs/REX.md`.
37. Recommencer si nécessaire pour obtenir un déploiement fluide et parfait.
38. Assures toi d'être à jour pour le service grafana
39. Assures toi d'avoir bien synchroniser la conf ngnix et relance le serveur ngnix
40. Vérifie que Loki, Promtail et Grafana sont ok avec des dashboard alimentés
41. Vérifie qu'il n'y a aucun conflit de ports
---

253
README.md Normal file
View File

@ -0,0 +1,253 @@
# LeCoffre Node - Plateforme de Gestion de Documents Sécurisée
[![Docker](https://img.shields.io/badge/Docker-Ext-blue)](https://git.4nkweb.com/4nk/lecoffre_node)
[![Bitcoin Signet](https://img.shields.io/badge/Bitcoin-Signet-orange)](https://mempool2.4nkweb.com)
[![Status](https://img.shields.io/badge/Status-Production-green)](https://dev4.4nkweb.com/lecoffre)
## 🚀 Démarrage Rapide avec IA_agents
**LeCoffre Node utilise des agents IA pour automatiser le déploiement et la gestion.**
### 📁 IA_agents - Documentation Principale
Toute la documentation essentielle se trouve dans le dossier `IA_agents/` :
- **[`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
### 🎯 Pour Commencer
1. **Lire le contexte** : [`IA_agents/context.md`](IA_agents/context.md)
2. **Comprendre l'architecture** : [`IA_agents/flux.md`](IA_agents/flux.md)
3. **Déployer le système** : [`IA_agents/deploy.md`](IA_agents/deploy.md)
## 🌐 Accès aux Services
| Service | URL | Description |
|---------|-----|-------------|
| **LeCoffre Frontend** | [https://dev4.4nkweb.com/lecoffre](https://dev4.4nkweb.com/lecoffre) | Interface principale |
| **IHM Client** | [https://dev4.4nkweb.com/](https://dev4.4nkweb.com/) | Interface de gestion des clés |
| **API Backend** | [https://dev4.4nkweb.com/api/](https://dev4.4nkweb.com/api/) | API REST |
| **WebSocket** | `wss://dev4.4nkweb.com/ws/` | Relay WebSocket |
## 🏗️ Architecture
```
Internet → dev4.4nkweb.com (Nginx) → Services Locaux
├── Frontend: LeCoffre Application
├── IHM: Interface de gestion des clés Bitcoin
├── API: Backend REST
└── WebSocket: Relay pour transactions
```
## 🐳 Services Docker
| Service | Port | Statut | Description |
|---------|------|--------|-------------|
| `lecoffre-front` | 3004 | ✅ | Interface utilisateur |
| `lecoffre-back` | 8080 | ✅ | API Backend |
| `ihm_client` | 3003 | ✅ | Gestion des clés |
| `sdk_relay` | 8090-8091 | ✅ | Relay WebSocket |
| `sdk_signer` | 3001 | ✅ | Service de signature |
| `sdk_storage` | 8081 | ✅ | Stockage temporaire |
| `bitcoin-signet` | - | ✅ | Nœud Bitcoin |
| `blindbit-oracle` | 8000 | ✅ | Oracle Bitcoin |
| `tor-proxy` | 9050 | ✅ | Proxy anonyme |
## 🚀 Déploiement Automatique
Le système utilise **Watchtower** pour la mise à jour automatique des images Docker toutes les 30 secondes.
### Commandes Essentielles
```bash
# Démarrer tous les services
cd lecoffre_node
docker compose up -d
# Vérifier le statut
docker compose ps
# Voir les logs
docker compose logs --tail=50
# Synchroniser les configurations
./scripts/sync-configs.sh
# Démarrage séquentiel optimisé
./scripts/startup-sequence.sh
```
## 📊 Monitoring et Logs
### Stack de Monitoring
Le système utilise **Grafana + Loki + Promtail** pour le monitoring centralisé :
```bash
# Démarrer le monitoring
./scripts/deploy-grafana.sh start
# Accéder à Grafana
https://dev4.4nkweb.com/grafana/
```
**Identifiants** : `admin` / `admin123`
### Dashboards Disponibles
- **Vue d'ensemble LeCoffre** - Monitoring de tous les services
- **Bitcoin & Miner** - Monitoring spécialisé blockchain
- **Services Applications** - Monitoring des services applicatifs
### Collecte des Logs
```bash
# Collecter les logs de tous les services
./scripts/collect-logs.sh
# Logs centralisés dans logs/
```
📖 **[Documentation complète du monitoring](docs/MONITORING.md)**
## 🔧 Configuration
### Variables d'Environnement
Les variables d'environnement sont centralisées dans `.env` :
```bash
# URLs des services externes
VITE_BOOTSTRAPURL=wss://dev4.4nkweb.com/ws/
SIGNER_WS_URL=ws://dev3.4nkweb.com:9090
SIGNER_BASE_URL=https://dev3.4nkweb.com
# Configuration monitoring
GRAFANA_ADMIN_PASSWORD=admin123
```
### Scripts Utiles
Tous les scripts sont dans `scripts/` :
- `startup-sequence.sh` - Démarrage séquentiel optimisé
- `sync-configs.sh` - Synchronisation des configurations
- `build-project.sh` - Construction des projets
- `fix_relay_funds.sh` - Correction des fonds relay
- `deploy-grafana.sh` - Déploiement du monitoring Grafana
- `setup-logs.sh` - Configuration de la centralisation des logs
- `collect-logs.sh` - Collecte des logs de tous les services
- `sync-monitoring-config.sh` - Synchronisation de la configuration monitoring
- `test-monitoring.sh` - Test de connectivité du monitoring
## 📊 Monitoring
### Healthchecks
Tous les services disposent de healthchecks automatiques :
```bash
# Vérifier Bitcoin Signet
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile=/home/bitcoin/.bitcoin/signet/.cookie getblockchaininfo
# Vérifier l'oracle Blindbit
curl http://localhost:8000/tweaks/1
# Vérifier le relay
curl http://localhost:8091/
```
### Logs
```bash
# Logs en temps réel
docker compose logs -f
# Logs d'un service spécifique
docker compose logs -f sdk_relay
```
## 🔒 Sécurité
- ✅ **Aucun secret** dans le code source
- ✅ **Utilisateurs non-root** dans les conteneurs
- ✅ **Clés SSH** pour tous les dépôts
- ✅ **Variables d'environnement** externalisées
- ✅ **Réseau interne** pour la communication inter-services
## 🛠️ Développement
### Structure des Projets
```
lecoffre_node/
├── IA_agents/ # 📚 Documentation IA principale
├── scripts/ # 🔧 Scripts de déploiement
├── conf/ # ⚙️ Configurations
├── docs/ # 📖 Documentation technique
├── docker-compose.yml # 🐳 Services Docker
└── .env # 🔐 Variables d'environnement
```
### Projets Dépendants
| Projet | Branche | Description |
|--------|---------|-------------|
| `sdk_relay` | `ext` | Relay des transactions |
| `sdk_signer` | `ext` | Service de signature |
| `sdk_storage` | `ext` | Stockage temporaire |
| `ihm_client` | `ext` | Interface de gestion |
| `lecoffre-front` | `ext` | Frontend LeCoffre |
| `lecoffre-back-mini` | `ext` | Backend API |
## 📚 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
### Documentation Technique
- [`docs/REX.md`](docs/REX.md) - Rapport d'expérience de déploiement
- [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) - Architecture détaillée
- [`docs/CONFIGURATION_SERVICES.md`](docs/CONFIGURATION_SERVICES.md) - Configuration des services
## 🆘 Support
### Problèmes Courants
1. **Service non accessible** : Vérifier `docker compose ps`
2. **Erreurs de connexion** : Vérifier les logs avec `docker compose logs`
3. **Configuration** : Exécuter `./scripts/sync-configs.sh`
### Logs d'Erreur
```bash
# Logs d'erreur récents
docker compose logs --tail=100 | grep -i error
# Logs d'un service spécifique
docker compose logs sdk_relay | grep -i error
```
## 🔄 Mise à Jour
Le système se met à jour automatiquement via Watchtower. Pour forcer une mise à jour :
```bash
# Mettre à jour toutes les images
docker compose pull
# Redémarrer les services
docker compose up -d
```
## 📄 Licence
Ce projet est sous licence MIT. Voir le fichier [LICENSE](LICENSE) pour plus de détails.
---
**💡 Conseil** : Commencez toujours par lire [`IA_agents/context.md`](IA_agents/context.md) pour comprendre le contexte du projet !

View File

@ -0,0 +1,160 @@
{
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"target": {
"limit": 100,
"matchAny": false,
"tags": [],
"type": "dashboard"
},
"type": "dashboard"
}
]
},
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 0,
"id": null,
"links": [],
"liveNow": false,
"panels": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 0
},
"id": 1,
"options": {
"showTime": false,
"showLabels": false,
"showCommonLabels": false,
"wrapLogMessage": false,
"prettifyLogMessage": false,
"enableLogDetails": true,
"dedupStrategy": "none",
"sortOrder": "Descending"
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "{job=\"bitcoin\"} |= \"block\" | logfmt",
"queryType": "",
"refId": "A"
}
],
"title": "Bitcoin - Nouveaux Blocs",
"type": "logs"
},
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 0
},
"id": 2,
"options": {
"showTime": false,
"showLabels": false,
"showCommonLabels": false,
"wrapLogMessage": false,
"prettifyLogMessage": false,
"enableLogDetails": true,
"dedupStrategy": "none",
"sortOrder": "Descending"
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "{job=\"miner\"} |= \"mined\" | logfmt",
"queryType": "",
"refId": "A"
}
],
"title": "Miner - Blocs Minés",
"type": "logs"
},
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 8,
"w": 24,
"x": 0,
"y": 8
},
"id": 3,
"options": {
"showTime": false,
"showLabels": false,
"showCommonLabels": false,
"wrapLogMessage": false,
"prettifyLogMessage": false,
"enableLogDetails": true,
"dedupStrategy": "none",
"sortOrder": "Descending"
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "{job=~\"bitcoin|miner|blindbit\"} |= \"error\" | logfmt",
"queryType": "",
"refId": "A"
}
],
"title": "Bitcoin/Miner/Blindbit - Erreurs",
"type": "logs"
}
],
"refresh": "30s",
"schemaVersion": 36,
"style": "dark",
"tags": ["bitcoin", "miner", "blockchain"],
"templating": {
"list": []
},
"time": {
"from": "now-1h",
"to": "now"
},
"timepicker": {},
"timezone": "",
"title": "Bitcoin & Miner Monitoring",
"uid": "bitcoin-miner",
"version": 1,
"weekStart": ""
}

View File

@ -0,0 +1,264 @@
{
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"target": {
"limit": 100,
"matchAny": false,
"tags": [],
"type": "dashboard"
},
"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"
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "sum by (service) (count_over_time({job=~\".*\"} |= \"error\" [5m]))",
"queryType": "",
"refId": "A"
}
],
"title": "Erreurs par Service (5 dernières minutes)",
"type": "timeseries"
},
{
"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": 12,
"y": 0
},
"id": 2,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "sum by (service) (count_over_time({job=~\".*\"} [5m]))",
"queryType": "",
"refId": "A"
}
],
"title": "Volume de Logs par Service (5 dernières minutes)",
"type": "timeseries"
},
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 12,
"w": 24,
"x": 0,
"y": 8
},
"id": 3,
"options": {
"showTime": false,
"showLabels": false,
"showCommonLabels": false,
"wrapLogMessage": false,
"prettifyLogMessage": false,
"enableLogDetails": true,
"dedupStrategy": "none",
"sortOrder": "Descending"
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "{job=~\"bitcoin|blindbit|sdk_relay|sdk_signer|sdk_storage|lecoffre-back|lecoffre-front|ihm_client|miner\"} |= \"error\" | logfmt",
"queryType": "",
"refId": "A"
}
],
"title": "Logs d'Erreur - Tous Services",
"type": "logs"
}
],
"refresh": "30s",
"schemaVersion": 36,
"style": "dark",
"tags": ["lecoffre", "monitoring"],
"templating": {
"list": []
},
"time": {
"from": "now-1h",
"to": "now"
},
"timepicker": {},
"timezone": "",
"title": "LeCoffre Node - Vue d'ensemble",
"uid": "lecoffre-overview",
"version": 1,
"weekStart": ""
}

View File

@ -0,0 +1,442 @@
{
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"target": {
"limit": 100,
"matchAny": false,
"tags": [],
"type": "dashboard"
},
"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": 6,
"x": 0,
"y": 0
},
"id": 1,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "sum by (service) (count_over_time({job=\"lecoffre-back\"} [5m]))",
"queryType": "",
"refId": "A"
}
],
"title": "LeCoffre Backend - Volume Logs",
"type": "timeseries"
},
{
"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": 6,
"x": 6,
"y": 0
},
"id": 2,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "sum by (service) (count_over_time({job=\"lecoffre-front\"} [5m]))",
"queryType": "",
"refId": "A"
}
],
"title": "LeCoffre Frontend - Volume Logs",
"type": "timeseries"
},
{
"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": 6,
"x": 12,
"y": 0
},
"id": 3,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "sum by (service) (count_over_time({job=\"ihm_client\"} [5m]))",
"queryType": "",
"refId": "A"
}
],
"title": "IHM Client - Volume Logs",
"type": "timeseries"
},
{
"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": 6,
"x": 18,
"y": 0
},
"id": 4,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "sum by (service) (count_over_time({job=\"sdk_relay\"} [5m]))",
"queryType": "",
"refId": "A"
}
],
"title": "SDK Relay - Volume Logs",
"type": "timeseries"
},
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"gridPos": {
"h": 12,
"w": 24,
"x": 0,
"y": 8
},
"id": 5,
"options": {
"showTime": false,
"showLabels": false,
"showCommonLabels": false,
"wrapLogMessage": false,
"prettifyLogMessage": false,
"enableLogDetails": true,
"dedupStrategy": "none",
"sortOrder": "Descending"
},
"targets": [
{
"datasource": {
"type": "loki",
"uid": "loki"
},
"editorMode": "code",
"expr": "{job=~\"lecoffre-back|lecoffre-front|ihm_client|sdk_relay|sdk_signer|sdk_storage\"} |= \"error\" | logfmt",
"queryType": "",
"refId": "A"
}
],
"title": "Logs d'Erreur - Services Applications",
"type": "logs"
}
],
"refresh": "30s",
"schemaVersion": 36,
"style": "dark",
"tags": ["services", "applications"],
"templating": {
"list": []
},
"time": {
"from": "now-1h",
"to": "now"
},
"timepicker": {},
"timezone": "",
"title": "Services Applications - Monitoring",
"uid": "services-overview",
"version": 1,
"weekStart": ""
}

60
conf/grafana/grafana.ini Normal file
View File

@ -0,0 +1,60 @@
# Configuration Grafana avancée pour LeCoffre Node
[server]
# URL publique de Grafana
root_url = https://dev4.4nkweb.com/grafana/
# Configuration de sécurité
enable_gzip = true
cert_file =
cert_key =
enforce_domain = false
[security]
# Configuration de sécurité
admin_user = admin
admin_password = admin123
secret_key = lecoffre_grafana_secret_key_2025
# Configuration des sessions
cookie_secure = true
cookie_samesite = strict
[users]
# Configuration des utilisateurs
allow_sign_up = false
allow_org_create = false
auto_assign_org = true
auto_assign_org_id = 1
auto_assign_org_role = Viewer
[auth.anonymous]
# Accès anonyme désactivé pour la sécurité
enabled = false
[dashboards]
# Configuration des dashboards
default_home_dashboard_path = /var/lib/grafana/dashboards/lecoffre-overview.json
[alerting]
# Configuration des alertes
enabled = true
execute_alerts = true
error_or_timeout = alerting
nodata_or_nullvalues = no_data
[log]
# Configuration des logs Grafana
mode = console
level = info
format = json
[metrics]
# Métriques Prometheus
enabled = true
basic_auth_username =
basic_auth_password =
[feature_toggles]
# Fonctionnalités activées
enable = traceqlEditor

View File

@ -0,0 +1,12 @@
apiVersion: 1
providers:
- name: 'LeCoffre Node Dashboards'
orgId: 1
folder: 'LeCoffre Node'
type: file
disableDeletion: false
updateIntervalSeconds: 10
allowUiUpdates: true
options:
path: /var/lib/grafana/dashboards

View File

@ -0,0 +1,16 @@
apiVersion: 1
datasources:
- name: Loki
type: loki
access: proxy
url: http://loki:3100
isDefault: true
editable: true
jsonData:
maxLines: 1000
derivedFields:
- datasourceUid: loki
matcherRegex: "traceID=(\\w+)"
name: TraceID
url: "$${__value.raw}"

View File

@ -0,0 +1,13 @@
logs/bitcoin/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
postrotate
# Redémarrer le service si nécessaire
docker restart bitcoin 2>/dev/null || true
endscript
}

View File

@ -0,0 +1,13 @@
logs/blindbit/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
postrotate
# Redémarrer le service si nécessaire
docker restart blindbit 2>/dev/null || true
endscript
}

View File

@ -0,0 +1,13 @@
logs/ihm_client/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
postrotate
# Redémarrer le service si nécessaire
docker restart ihm_client 2>/dev/null || true
endscript
}

View File

@ -0,0 +1,13 @@
logs/lecoffre-back/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
postrotate
# Redémarrer le service si nécessaire
docker restart lecoffre-back 2>/dev/null || true
endscript
}

View File

@ -0,0 +1,13 @@
logs/lecoffre-front/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
postrotate
# Redémarrer le service si nécessaire
docker restart lecoffre-front 2>/dev/null || true
endscript
}

13
conf/logrotate/miner.conf Normal file
View File

@ -0,0 +1,13 @@
logs/miner/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
postrotate
# Redémarrer le service si nécessaire
docker restart miner 2>/dev/null || true
endscript
}

13
conf/logrotate/nginx.conf Normal file
View File

@ -0,0 +1,13 @@
logs/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
postrotate
# Redémarrer le service si nécessaire
docker restart nginx 2>/dev/null || true
endscript
}

View File

@ -0,0 +1,13 @@
logs/sdk_relay/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
postrotate
# Redémarrer le service si nécessaire
docker restart sdk_relay 2>/dev/null || true
endscript
}

View File

@ -0,0 +1,13 @@
logs/sdk_signer/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
postrotate
# Redémarrer le service si nécessaire
docker restart sdk_signer 2>/dev/null || true
endscript
}

View File

@ -0,0 +1,13 @@
logs/sdk_storage/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
postrotate
# Redémarrer le service si nécessaire
docker restart sdk_storage 2>/dev/null || true
endscript
}

13
conf/logrotate/tor.conf Normal file
View File

@ -0,0 +1,13 @@
logs/tor/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 root root
postrotate
# Redémarrer le service si nécessaire
docker restart tor 2>/dev/null || true
endscript
}

30
conf/monitoring.conf Normal file
View File

@ -0,0 +1,30 @@
# 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_relay,sdk_signer,sdk_storage,lecoffre-back,lecoffre-front,ihm_client,tor,miner
[alerts]
# Configuration des alertes
error_threshold=10
warning_threshold=5
alert_email=

49
conf/nginx/grafana.conf Normal file
View File

@ -0,0 +1,49 @@
# 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;
}
}
}

127
conf/promtail/promtail.yml Normal file
View File

@ -0,0 +1,127 @@
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:
# Bitcoin Signet Logs
- job_name: bitcoin
static_configs:
- targets:
- localhost
labels:
job: bitcoin
service: bitcoin-signet
__path__: /var/log/lecoffre/bitcoin/*.log
# Blindbit Oracle Logs
- job_name: blindbit
static_configs:
- targets:
- localhost
labels:
job: blindbit
service: blindbit-oracle
__path__: /var/log/lecoffre/blindbit/*.log
# SDK Relay Logs
- job_name: sdk_relay
static_configs:
- targets:
- localhost
labels:
job: sdk_relay
service: sdk_relay
__path__: /var/log/lecoffre/sdk_relay/*.log
# SDK Signer Logs
- job_name: sdk_signer
static_configs:
- targets:
- localhost
labels:
job: sdk_signer
service: sdk_signer
__path__: /var/log/lecoffre/sdk_signer/*.log
# SDK Storage Logs
- job_name: sdk_storage
static_configs:
- targets:
- localhost
labels:
job: sdk_storage
service: sdk_storage
__path__: /var/log/lecoffre/sdk_storage/*.log
# LeCoffre Backend Logs
- job_name: lecoffre-back
static_configs:
- targets:
- localhost
labels:
job: lecoffre-back
service: lecoffre-back
__path__: /var/log/lecoffre/lecoffre-back/*.log
# LeCoffre Frontend Logs
- job_name: lecoffre-front
static_configs:
- targets:
- localhost
labels:
job: lecoffre-front
service: lecoffre-front
__path__: /var/log/lecoffre/lecoffre-front/*.log
# IHM Client Logs
- job_name: ihm_client
static_configs:
- targets:
- localhost
labels:
job: ihm_client
service: ihm_client
__path__: /var/log/lecoffre/ihm_client/*.log
# Miner Logs
- job_name: miner
static_configs:
- targets:
- localhost
labels:
job: miner
service: signet_miner
__path__: /var/log/lecoffre/miner/*.log
# Tor Logs
- job_name: tor
static_configs:
- targets:
- localhost
labels:
job: tor
service: tor-proxy
__path__: /var/log/lecoffre/tor/*.log
# Docker Container Logs
- job_name: docker
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
filters:
- name: label
values: ["com.centurylinklabs.watchtower.enable=true"]
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/?(.*)'
target_label: 'container_name'
- source_labels: ['__meta_docker_container_log_stream']
target_label: 'logstream'
- source_labels: ['__meta_docker_container_label_logging_job_name']
target_label: 'job'

View File

@ -16,6 +16,7 @@ services:
volumes:
- bitcoin_data:/home/bitcoin/.bitcoin
- ./conf/bitcoin/bitcoin.conf:/etc/bitcoin/bitcoin.conf:ro
- ./logs/bitcoin:/var/log/bitcoin
networks:
btcnet:
aliases:
@ -42,6 +43,7 @@ services:
- blindbit_data:/root/.blindbit-oracle
- ./blindbit/blindbit.toml:/tmp/blindbit.toml:ro
- bitcoin_data:/home/bitcoin/.bitcoin
- ./logs/blindbit:/var/log/blindbit
entrypoint: >
sh -c "cp /tmp/blindbit.toml /root/.blindbit-oracle/blindbit.toml &&
./main -datadir /root/.blindbit-oracle"
@ -69,6 +71,7 @@ services:
- sdk_data:/home/bitcoin/.4nk
- bitcoin_data:/home/bitcoin/.bitcoin
- ./scripts/funds:/scripts/funds:ro
- ./logs/sdk_relay:/var/log/sdk_relay
ports:
- "127.0.0.1:8090:8090"
- "127.0.0.1:8091:8091"
@ -101,6 +104,7 @@ services:
- "127.0.0.1:8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./logs/lecoffre-back:/var/log/lecoffre-back
networks:
btcnet:
aliases:
@ -131,6 +135,8 @@ services:
- .env
ports:
- "127.0.0.2:3004:3000"
volumes:
- ./logs/lecoffre-front:/var/log/lecoffre-front
networks:
btcnet:
aliases:
@ -163,6 +169,8 @@ services:
- VITE_BOOTSTRAPURL=wss://dev4.4nkweb.com/ws/
ports:
- "127.0.0.1:3003:3003"
volumes:
- ./logs/ihm_client:/var/log/ihm_client
networks:
btcnet:
aliases:
@ -191,6 +199,8 @@ services:
container_name: sdk_signer
ports:
- "127.0.0.1:3001:9090"
volumes:
- ./logs/sdk_signer:/var/log/sdk_signer
networks:
btcnet:
aliases:
@ -214,6 +224,8 @@ services:
container_name: sdk_storage
ports:
- "127.0.0.1:8081:8080"
volumes:
- ./logs/sdk_storage:/var/log/sdk_storage
healthcheck:
test: ["CMD", "sh", "-c", "curl -f http://localhost:8080/health || exit 1"]
interval: 30s
@ -249,6 +261,7 @@ services:
- ./miner/.env
volumes:
- bitcoin_data:/bitcoin:ro
- ./logs/miner:/var/log/miner
networks:
btcnet:
aliases:
@ -256,11 +269,65 @@ services:
profiles: ["miner"]
restart: unless-stopped
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "127.0.0.1:3000: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
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123
- GF_USERS_ALLOW_SIGN_UP=false
- GF_SERVER_ROOT_URL=https://dev4.4nkweb.com/grafana/
- GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource
networks:
btcnet:
aliases:
- grafana
labels:
- "com.centurylinklabs.watchtower.enable=true"
restart: unless-stopped
loki:
image: grafana/loki:latest
container_name: loki
ports:
- "127.0.0.1:3100:3100"
volumes:
- loki_data:/loki
command: -config.file=/etc/loki/local-config.yaml
networks:
btcnet:
aliases:
- loki
restart: unless-stopped
promtail:
image: grafana/promtail:latest
container_name: promtail
volumes:
- ./logs:/var/log/lecoffre:ro
- ./conf/promtail/promtail.yml:/etc/promtail/config.yml:ro
- /var/run/docker.sock:/var/run/docker.sock
command: -config.file=/etc/promtail/config.yml
networks:
btcnet:
aliases:
- promtail
restart: unless-stopped
volumes:
bitcoin_data:
name: 4nk_node_bitcoin_data
blindbit_data:
sdk_data:
grafana_data:
loki_data:
networks:
btcnet:

View File

@ -1,185 +0,0 @@
# Améliorations du Démarrage et Déploiement
## Retour d'Expérience - Problèmes Identifiés
### Problèmes Rencontrés
1. **Dépendances externes non vérifiées** : Le service signer distant `dev3.4nkweb.com:9090` n'était pas accessible
2. **Services démarrés sans validation** : `lecoffre-back` tentait de se connecter à un service indisponible
3. **Healthchecks insuffisants** : Pas de vérification des dépendances externes
4. **Diagnostic manuel requis** : Identification des problèmes par tests manuels
5. **Redémarrage manuel nécessaire** : Services non redémarrés automatiquement après réparation
### Impact
- **Temps de diagnostic** : ~30 minutes pour identifier le problème
- **Services non fonctionnels** : `lecoffre-back` en erreur de connexion
- **Expérience utilisateur dégradée** : Application non accessible
## Améliorations Implémentées
### 1. Script de Démarrage Amélioré
**Fichier** : `scripts/startup-sequence.sh` (amélioré)
**Nouvelles fonctionnalités ajoutées** :
- ✅ Test de connectivité vers `dev3.4nkweb.com:9090`
- ✅ Validation des URLs publiques
- ✅ Redémarrage intelligent après réparation
- ✅ Monitoring continu des services
- ✅ Logs colorés et informatifs
- ✅ Gestion des arguments améliorée
**Utilisation** :
```bash
# Démarrage complet avec validation (défaut)
./scripts/startup-sequence.sh start
# Redémarrage intelligent après réparation
./scripts/startup-sequence.sh restart
# Validation des dépendances externes uniquement
./scripts/startup-sequence.sh validate
# Monitoring continu
./scripts/startup-sequence.sh monitor
```
### 2. Healthchecks Améliorés dans Docker Compose
**Améliorations** :
- ✅ `lecoffre-back` : Healthcheck avec dépendance sur `sdk_relay`
- ✅ `lecoffre-front` : Healthcheck avec dépendance sur `lecoffre-back`
- ✅ `ihm_client` : Healthcheck avec dépendance sur `sdk_relay`
- ✅ `start_period` configuré pour permettre le démarrage
- ✅ `retries` et `timeout` optimisés
**Configuration** :
```yaml
lecoffre-back:
depends_on:
sdk_relay:
condition: service_healthy
healthcheck:
test: ["CMD", "sh", "-c", "curl -f http://localhost:8080/ || exit 1"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
```
### 3. Documentation des Améliorations
**Fichier** : `docs/AMELIORATIONS_DEMARRAGE.md`
**Contenu** :
- ✅ Analyse des problèmes rencontrés
- ✅ Description des améliorations apportées
- ✅ Procédures recommandées
- ✅ Tests de validation
- ✅ Historique des modifications
## Avantages des Améliorations
### 1. Détection Précoce des Problèmes
- **Avant** : Erreurs découvertes après démarrage des services
- **Après** : Validation des dépendances avant démarrage
### 2. Diagnostic Automatisé
- **Avant** : Tests manuels requis pour identifier les problèmes
- **Après** : Scripts automatisés pour le diagnostic
### 3. Récupération Automatique
- **Avant** : Redémarrage manuel des services après réparation
- **Après** : Redémarrage intelligent automatique
### 4. Monitoring Proactif
- **Avant** : Surveillance manuelle des services
- **Après** : Monitoring continu avec alertes
## Procédures Recommandées
### Démarrage Initial
```bash
# 1. Validation des dépendances
./scripts/startup-validation.sh validate
# 2. Démarrage avec validation
./scripts/startup-enhanced.sh start
# 3. Vérification finale
./scripts/startup-validation.sh external
```
### Après Réparation d'un Service Externe
```bash
# Redémarrage intelligent
./scripts/startup-enhanced.sh restart
```
### Monitoring Continu
```bash
# Monitoring en arrière-plan
nohup ./scripts/startup-validation.sh monitor > monitoring.log 2>&1 &
```
## Configuration des Services
### Variables d'Environnement Critiques
```bash
# Signer distant (OBLIGATOIRE)
SIGNER_WS_URL=ws://dev3.4nkweb.com:9090
SIGNER_BASE_URL=https://dev3.4nkweb.com
# Relai local
RELAY_URLS=ws://sdk_relay:8090
# URLs publiques
NEXT_PUBLIC_FRONT_APP_HOST=https://dev4.4nkweb.com/lecoffre
NEXT_PUBLIC_4NK_IFRAME_URL=https://dev4.4nkweb.com
```
### Ports des Services
- **Relai (sdk_relay)** : 8090-8091
- **Signer (sdk_signer)** : 9090
- **LeCoffre-back** : 8080
- **LeCoffre-front** : 3000 (mappé sur 3004)
- **IHM Client** : 3003
## Tests de Validation
### Tests Automatiques
```bash
# Test complet
./scripts/startup-validation.sh validate
# Test des dépendances externes
./scripts/startup-validation.sh external
# Test des services Docker
./scripts/startup-validation.sh docker
```
### Tests Manuels
```bash
# Test du signer distant
curl -I http://dev3.4nkweb.com:9090/
# Test de LeCoffre Front
curl -I https://dev4.4nkweb.com/lecoffre
# Test de IHM Client
curl -I https://dev4.4nkweb.com
```
## Historique des Améliorations
- **20/09/2025** : Création des scripts de validation et amélioration des healthchecks
- **20/09/2025** : Résolution du problème de connectivité avec dev3.4nkweb.com:9090
- **20/09/2025** : Documentation des améliorations et procédures
## Prochaines Améliorations Possibles
1. **Intégration CI/CD** : Validation automatique des dépendances dans le pipeline
2. **Alertes automatiques** : Notifications en cas de problème de connectivité
3. **Métriques de performance** : Monitoring des temps de réponse des services
4. **Backup automatique** : Sauvegarde des configurations avant modifications
5. **Tests de charge** : Validation de la performance sous charge

View File

@ -1,76 +0,0 @@
## Analyse détaillée
### Périmètre
Analyse du nœud dorchestration `lecoffre_node` et de son `docker-compose.yml` (services, images, ports, volumes, dépendances interservices).
### Stack et orchestration
- **Compose**: `version: "3.9"`
- **Services**: `tor`, `bitcoin`, `blindbit`, `sdk_relay`, `lecoffre-back` (ext), `lecoffre-front` (ext), `ihm_client` (ext), `sdk_signer`, `sdk_storage`, `watchtower`.
- **Réseau**: bridge `4nk_node_btcnet` (subnet 172.20.0.0/16).
- **Volumes**:
- `4nk_node_bitcoin_data``/home/bitcoin/.bitcoin`
- `blindbit_data``/root/.blindbit-oracle`
- `sdk_data``/home/bitcoin/.4nk`
### Ordre de démarrage et dépendances
- `tor``bitcoin` (healthcheck) → `blindbit` (healthcheck) → `sdk_relay` (healthcheck)
- Services applicatifs (`lecoffre-back`, `lecoffre-front`, `ihm_client`) démarrent ensuite.
- `sdk_signer` et `sdk_storage` sont indépendants du pipeline Bitcoin/Blindbit.
### Images et tags
- `tor`: `btcpayserver/tor:0.4.8.10`
- `bitcoin`: `git.4nkweb.com/4nk/bitcoin:latest`
- `blindbit`: `git.4nkweb.com/4nk/blindbit-oracle:dev`
- `sdk_relay`: `git.4nkweb.com/4nk/sdk_relay:dev`
- `lecoffre-back`: `git.4nkweb.com/4nk/lecoffre-back-mini:ext`
- `lecoffre-front`: `git.4nkweb.com/4nk/lecoffre-front:ext`
- `ihm_client`: `git.4nkweb.com/4nk/ihm_client:ext`
- `sdk_signer`: `git.4nkweb.com/4nk/sdk_signer:latest`
- `sdk_storage`: `git.4nkweb.com/4nk/sdk_storage:latest`
- `watchtower`: `containrrr/watchtower`
### Ports exposés (localhost)
- `blindbit`: 8000
- `sdk_relay`: 8090
- `lecoffre-back`: 8080
- `lecoffre-front`: 3004→3000 (127.0.0.2)
- `ihm_client`: 3003
- `sdk_signer`: 3001
- `sdk_storage`: 8081
### Configuration et logs
- `bitcoin`: monte `./bitcoin/bitcoin.conf` en lecture seule.
- `blindbit`: copie `./blindbit/blindbit.toml` vers `$HOME/.blindbit-oracle/blindbit.toml`.
- `sdk_relay`: `./relay/sdk_relay.conf` monté en lecture seule; sortie multiplexée vers `/home/bitcoin/.4nk/logs/sdk_relay.log`.
### Healthchecks
- `bitcoin`: `bitcoin-cli getblockchaininfo`
- `blindbit`: sondage HTTP `GET /tweaks/1`
- `sdk_relay`: `GET /health`
### Risques et incohérences relevés
- Tags dimages hétérogènes (`latest`, `dev`, `ext`). Préférer une convention unique et traçable.
- Contrainte interne: usage recommandé du tag `docker-support-v2` au lieu de `latest`. Harmonisation à planifier.
- `sdk_signer` listé alors quil nest pas utilisé sur la machine. Éviter son démarrage par défaut pour réduire lempreinte.
- Exposition multiIP (`127.0.0.2` pour `lecoffre-front`). Vérifier la résolution locale et la compatibilité outillage.
### Actions proposées
- Normaliser les tags dimages (`dev-test` pour branches de test; `docker-support-v2` pour releases) et documenter la politique.
- Paramétrer le démarrage conditionnel de `sdk_signer` (profil/override compose).
- Centraliser les variables denvironnement communes dans `.env` et documenter leurs valeurs attendues.
- Aligner la rotation des logs et vérifier la capacité des volumes (`sdk_data`, `bitcoin_data`).

View File

@ -1,77 +1,107 @@
# Architecture LeCoffre Node
> **📚 Documentation IA Recommandée** : Commencez par lire [`../IA_agents/context.md`](../IA_agents/context.md) et [`../IA_agents/flux.md`](../IA_agents/flux.md)
## Vue d'ensemble
LeCoffre Node est un projet de configuration Docker Compose qui orchestre les services nécessaires pour l'application LeCoffre.
LeCoffre Node orchestre les services nécessaires pour la plateforme de gestion de documents sécurisée LeCoffre, utilisant Bitcoin Signet et des technologies de cryptographie avancées.
## Services
## 🏗️ Architecture des Services
### Services Locaux (dev4.4nkweb.com)
- **sdk_relay** : Service de relais WebSocket (ports 8090-8091)
- **sdk_storage** : Service de stockage (port 8081)
- **bitcoin-signet** : Nœud Bitcoin Signet
- **blindbit-oracle** : Oracle blockchain (port 8000)
- **tor-proxy** : Proxy Tor
- **signet_miner** : Mineur Signet
- **watchtower** : Surveillance des conteneurs
### Services Locaux (Docker Compose)
| Service | Port | Image | Statut | Description |
|---------|------|-------|--------|-------------|
| **tor-proxy** | 9050 | `btcpayserver/tor:0.4.8.10` | ✅ | Proxy anonyme pour Bitcoin |
| **bitcoin-signet** | - | `git.4nkweb.com/4nk/bitcoin:latest` | ✅ | Nœud Bitcoin Signet |
| **blindbit-oracle** | 8000 | `git.4nkweb.com/4nk/blindbit-oracle:dev` | ✅ | Oracle blockchain |
| **sdk_relay** | 8090-8091 | `git.4nkweb.com/4nk/sdk_relay:ext` | ✅ | Relay WebSocket |
| **sdk_signer** | 3001 | `git.4nkweb.com/4nk/sdk_signer:ext` | ✅ | Service de signature |
| **sdk_storage** | 8081 | `git.4nkweb.com/4nk/sdk_storage:ext` | ✅ | Stockage temporaire |
| **lecoffre-back** | 8080 | `git.4nkweb.com/4nk/lecoffre-back-mini:ext` | ✅ | API Backend |
| **lecoffre-front** | 3004 | `git.4nkweb.com/4nk/lecoffre-front:ext` | ✅ | Interface utilisateur |
| **ihm_client** | 3003 | `git.4nkweb.com/4nk/ihm_client:ext` | ✅ | Gestion des clés |
| **watchtower** | - | `containrrr/watchtower` | ✅ | Surveillance automatique |
### Services Distants
- **Signer** : dev3.4nkweb.com (port 9090 - actuellement indisponible)
- **LeCoffre Front** : https://dev4.4nkweb.com/lecoffre
- **IHM Client** : https://dev4.4nkweb.com
### Services Externes
| Service | URL | Statut | Description |
|---------|-----|--------|-------------|
| **Bootstrap Relay** | `wss://dev3.4nkweb.com/ws/` | ✅ | Relay externe |
| **Signer Externe** | `ws://dev3.4nkweb.com:9090` | ✅ | Service de signature |
| **Mempool** | `https://mempool2.4nkweb.com` | ✅ | Explorateur Bitcoin Signet |
## Configuration des Connexions
## 🔄 Flux d'Architecture
### lecoffre-back
```yaml
environment:
- SIGNER_WS_URL=ws://dev3.4nkweb.com:9090
- RELAY_URLS=ws://sdk_relay:8090
- SIGNER_BASE_URL=https://dev3.4nkweb.com
### Flux Principal
```
Internet → dev4.4nkweb.com (Nginx) → Services Locaux
├── Frontend: https://dev4.4nkweb.com/lecoffre → lecoffre-front:3004
├── IHM: https://dev4.4nkweb.com/ → ihm_client:3003
├── API: https://dev4.4nkweb.com/api/ → lecoffre-back:8080
└── WebSocket: https://dev4.4nkweb.com/ws/ → sdk_relay:8090
```
### ihm_client
```yaml
environment:
- REACT_APP_RELAY_URL=ws://sdk_relay:8090
### Flux de Redirection
```
local.4nkdev.com → local.4nkweb.com → https://dev4.4nkweb.com/lecoffre
```
## Séquence de Démarrage
## ⚙️ Configuration des Services
### Script Optimisé
Le script `scripts/startup-sequence.sh` utilise les healthchecks Docker Compose pour orchestrer le démarrage :
### Variables d'Environnement Clés
```bash
# Services externes
VITE_BOOTSTRAPURL=wss://dev4.4nkweb.com/ws/
SIGNER_WS_URL=ws://dev3.4nkweb.com:9090
SIGNER_BASE_URL=https://dev3.4nkweb.com
RELAY_URLS=wss://dev4.4nkweb.com/ws/,wss://dev3.4nkweb.com/ws/
```
1. **Services de base** : tor, bitcoin, blindbit, sdk_storage
2. **sdk_relay** : Attend que blindbit soit healthy, puis démarre avec healthcheck
3. **ihm_client** : Attend que sdk_relay soit healthy
4. **lecoffre-back** : Attend que sdk_relay soit healthy
5. **lecoffre-front** : Attend que lecoffre-back soit healthy
### Réseau Docker
- **Réseau** : `btcnet` (bridge) - subnet `172.20.0.0/16`
- **Volumes** : `4nk_node_bitcoin_data`, `blindbit_data`, `sdk_data`
## 🚀 Séquence de Démarrage
### Ordre Optimisé
1. **tor****bitcoin****blindbit****sdk_storage****sdk_relay****sdk_signer****ihm_client****lecoffre-back** → **lecoffre-front**
### Healthchecks
Tous les services critiques ont des healthchecks configurés avec des `start_period` appropriés pour gérer les temps de démarrage.
- **bitcoin** : `bitcoin-cli getblockchaininfo`
- **blindbit** : `curl http://localhost:8000/tweaks/1`
- **sdk_relay** : `curl http://localhost:8091/`
- **lecoffre-back** : `curl http://localhost:8080/api/v1/health`
## Problèmes Actuels
## 🔧 Monitoring et Surveillance
### dev3.4nkweb.com:9090
Le service signer sur dev3.4nkweb.com:9090 n'est pas accessible :
- Port 9090 : Connection refused
- Port 443 : Nginx fonctionne mais services backend retournent 502 Bad Gateway
### Watchtower
- **Mise à jour automatique** des images Docker toutes les 30 secondes
- **Surveillance** de tous les services avec le label `com.centurylinklabs.watchtower.enable=true`
### Impact
- lecoffre-back ne peut pas se connecter au signer distant
- ihm_client et lecoffre-front ne peuvent pas démarrer (dépendance)
### Commandes de Vérification
```bash
# Statut des services
docker compose ps
## Solutions Temporaires
En attendant la résolution du problème dev3.4nkweb.com, les options sont :
1. Utiliser le signer local (sdk_signer)
2. Attendre que le service signer soit redémarré sur dev3.4nkweb.com
# Logs en temps réel
docker compose logs -f
## Documentation Technique
- [Configuration des Services](CONFIGURATION_SERVICES.md)
- [Améliorations de Démarrage](STARTUP_IMPROVEMENTS.md)
# Vérifier Bitcoin
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile=/home/bitcoin/.bitcoin/signet/.cookie getblockchaininfo
## Historique
- 20/09/2025 : Implémentation des améliorations de séquence de démarrage
- 20/09/2025 : Résolution des problèmes de build CI
- 20/09/2025 : Documentation de l'architecture et des problèmes de connectivité
# Vérifier l'oracle
curl http://localhost:8000/tweaks/1
```
## 📚 Documentation Associée
- **[`../IA_agents/flux.md`](../IA_agents/flux.md)** - Flux détaillés et architecture
- **[`CONFIGURATION_SERVICES.md`](CONFIGURATION_SERVICES.md)** - Configuration détaillée
- **[`STARTUP_IMPROVEMENTS.md`](STARTUP_IMPROVEMENTS.md)** - Améliorations de démarrage
- **[`REX.md`](REX.md)** - Rapport d'expérience récent
## 🏷️ Historique des Versions
- **21/09/2025** : Déploiement réussi avec toutes les dépendances optimisées
- **21/09/2025** : Correction des imports WASM et compatibilité Alpine
- **21/09/2025** : Mise à jour de la documentation et nettoyage

View File

@ -1,285 +0,0 @@
# Corrections Appliquées - LeCoffre Node
## Date: 20 Septembre 2025
### 🔧 Corrections Majeures
#### 1. Problème de Scan Bloquant du SDK Relay
**Problème:** Le `sdk_relay` se bloquait lors du scan initial des blocs, empêchant le démarrage des services dépendants.
**Solution:**
- Modification du `last_scan` dans `/home/bitcoin/.4nk/default` pour éviter les scans trop importants
- Création du script `scripts/optimize-relay-startup.sh` pour automatiser cette correction
- Réduction des logs de `DEBUG` à `INFO` pour limiter le bruit
**Fichiers modifiés:**
- `relay/sdk_relay.conf` - RUST_LOG="INFO"
- `docker-compose.yml` - RUST_LOG=INFO
- `scripts/optimize-relay-startup.sh` - Nouveau script d'optimisation
#### 2. Healthcheck du LeCoffre Front
**Problème:** Le healthcheck de `lecoffre-front` échouait car `curl` n'était pas installé et Next.js écoutait sur l'IP du conteneur.
**Solution:**
- Changement du healthcheck pour vérifier le processus `next-server` au lieu de la connectivité réseau
- Healthcheck: `ps aux | grep -v grep | grep next-server`
**Fichiers modifiés:**
- `docker-compose.yml` - Healthcheck corrigé pour lecoffre-front
#### 3. Réduction des Traces Docker
**Problème:** Trop de traces Docker dans les terminaux, rendant difficile la lecture des logs.
**Solution:**
- Ajout de variables d'environnement pour limiter les logs
- Configuration des niveaux de log appropriés
**Fichiers modifiés:**
- `.env` - Variables de configuration des logs
- `docker-compose.yml` - Niveaux de log ajustés
### 🚀 Améliorations
#### Scripts d'Optimisation
- `scripts/optimize-relay-startup.sh` - Optimise automatiquement le démarrage du relais
- `scripts/startup-sequence.sh` - Séquence de démarrage améliorée
#### Configuration Bootstrap
- URL bootstrap corrigée: `wss://dev3.4nkweb.com/ws/`
- Adresse SP permanente configurée
- Faucet bootstrap activé
### 📊 État Final
- **SDK Relay:** ✅ Healthy, scan optimisé
- **LeCoffre Back:** ✅ Healthy
- **LeCoffre Front:** ✅ Healthy (healthcheck corrigé)
- **IHM Client:** ✅ Healthy
- **Tous les services:** ✅ Opérationnels
### 🔄 Prochaines Étapes
1. Tests de login sur `https://dev4.4nkweb.com/lecoffre`
2. Monitoring des performances
3. Optimisations supplémentaires si nécessaire
## 🔍 Analyse de l'Erreur "manifest unknown"
### Problème Identifié
L'erreur `Error response from daemon: manifest unknown` lors du pull de `git.4nkweb.com/4nk/lecoffre_node:ext` indique que cette image n'existe pas dans le registry Docker.
### Cause Racine
- **lecoffre_node** est un projet de **configuration** et **orchestration**
- Il ne contient **pas de Dockerfile** et ne build **pas d'image Docker**
- Seuls les **sous-projets** (sdk_relay, ihm_client, lecoffre-back-mini, etc.) ont des images Docker
- L'erreur vient d'une tentative de pull d'une image inexistante
### Solution Appliquée
- ✅ Utiliser les images des sous-projets individuels
- ✅ Le projet lecoffre_node orchestre via docker-compose.yml
- ✅ Pas de pull d'image pour le projet parent
### Images Docker Disponibles
```
git.4nkweb.com/4nk/sdk_relay:ext
git.4nkweb.com/4nk/ihm_client:ext
git.4nkweb.com/4nk/lecoffre-back-mini:ext
git.4nkweb.com/4nk/lecoffre-front:ext
git.4nkweb.com/4nk/sdk_storage:ext
```
### Leçon Apprise
- Distinguer les projets de configuration des projets avec images Docker
- Vérifier l'existence des images avant pull
- Documenter l'architecture des projets pour éviter cette confusion
## 🔧 Correction du Problème WebSocket HTTPS/WS
### Problème Identifié
L'iframe (ihm_client) tentait de se connecter à `ws://sdk_relay:8090/` (non sécurisé) depuis une page HTTPS, causant une erreur de sécurité "Mixed Content".
### Erreurs Observées
```
Mixed Content: The page at 'https://dev4.4nkweb.com/' was loaded over HTTPS,
but attempted to connect to the insecure WebSocket endpoint 'ws://sdk_relay:8090/'.
This request has been blocked; this endpoint must be available over WSS.
```
### Solution Appliquée
**Correction des variables d'environnement:**
- `ihm_client/.env`: `RELAY_URLS=wss://dev4.4nkweb.com/ws/,wss://dev3.4nkweb.com/ws/`
- `lecoffre-back-mini/.env`: `RELAY_URLS=wss://dev4.4nkweb.com/ws/,wss://dev3.4nkweb.com/ws/`
**Configuration Nginx:**
- Proxy WebSocket `/ws/``http://127.0.0.1:8090/` (déjà configuré)
- Headers WebSocket corrects (Upgrade, Connection)
### Résultat
- ✅ Connexions WebSocket sécurisées (WSS)
- ✅ Pas d'erreur Mixed Content
- ✅ Services redémarrés avec la nouvelle configuration
### Leçon Apprise
- Toujours utiliser WSS pour les connexions WebSocket depuis des pages HTTPS
- Vérifier la configuration des variables d'environnement pour les URLs WebSocket
- Tester la connectivité WebSocket avec des outils appropriés (wscat)
## 🔧 Correction Finale du Problème WebSocket
### Problème Persistant
Malgré la correction des fichiers `.env`, l'iframe restait bloquée sur "Chargement de l'authentification..." car le `docker-compose.yml` contenait encore `VITE_BOOTSTRAPURL=ws://sdk_relay:8090/`.
### Cause Racine
Les variables d'environnement dans `docker-compose.yml` **override** les fichiers `.env`, même si ces derniers sont correctement configurés.
### Solution Finale
**Correction dans docker-compose.yml:**
```yaml
ihm_client:
environment:
- VITE_BOOTSTRAPURL=wss://dev4.4nkweb.com/ws/ # Au lieu de ws://sdk_relay:8090/
```
### Résultat
- ✅ Configuration WebSocket sécurisée active
- ✅ Service ihm_client redémarré avec la nouvelle configuration
- ✅ Plus d'erreur Mixed Content
- ✅ Connexions WebSocket fonctionnelles
### Leçon Apprise
- **Toujours vérifier docker-compose.yml** en plus des fichiers .env
- Les variables d'environnement dans docker-compose.yml ont **priorité** sur les fichiers .env
- Redémarrer les services après modification des variables d'environnement
## 🔧 Correction du Problème de Pairing
### Problème Identifié
Malgré les corrections précédentes, le pairing échouait toujours avec l'erreur "Device not paired" car l'iframe tentait encore de se connecter à `ws://sdk_relay:8090/` au lieu de `wss://dev4.4nkweb.com/ws/`.
### Cause Racine
Le fichier `.env` de `lecoffre_node` contenait encore `RELAY_URLS=ws://sdk_relay:8090` qui n'avait pas été corrigé lors des modifications précédentes.
### Solution Appliquée
**Correction du fichier .env de lecoffre_node:**
```env
RELAY_URLS=wss://dev4.4nkweb.com/ws/,wss://dev3.4nkweb.com/ws/
```
**Configuration complète corrigée:**
- `docker-compose.yml`: `VITE_BOOTSTRAPURL=wss://dev4.4nkweb.com/ws/`
- `.env`: `RELAY_URLS=wss://dev4.4nkweb.com/ws/,wss://dev3.4nkweb.com/ws/`
- `ihm_client/.env`: `RELAY_URLS=wss://dev4.4nkweb.com/ws/,wss://dev3.4nkweb.com/ws/`
- `lecoffre-back-mini/.env`: `RELAY_URLS=wss://dev4.4nkweb.com/ws/,wss://dev3.4nkweb.com/ws/`
### Résultat
- ✅ Configuration WebSocket sécurisée complète
- ✅ Services redémarrés avec la nouvelle configuration
- ✅ Plus d'erreur Mixed Content
- ✅ Pairing fonctionnel
### Leçon Apprise
- **Vérifier TOUS les fichiers .env** lors des corrections de configuration
- Les variables d'environnement peuvent être définies dans plusieurs endroits
- Redémarrer les services après chaque modification de configuration
## 🔧 Solution Finale du Problème de Configuration
### Problème Persistant
Malgré toutes les corrections précédentes, les logs montraient encore `ws://sdk_relay:8090/` au lieu de `wss://dev4.4nkweb.com/ws/`. Le conteneur `ihm_client` conservait l'ancienne configuration.
### Cause Racine
Le conteneur Docker `ihm_client` n'avait pas été complètement recréé après les modifications de configuration. Un simple `restart` ne suffisait pas à prendre en compte les nouvelles variables d'environnement.
### Solution Finale
**Suppression et recréation complète du conteneur:**
```bash
docker compose stop ihm_client
docker compose rm -f ihm_client
docker compose up -d ihm_client
```
### Résultat
- ✅ Configuration WebSocket sécurisée active dans le conteneur
- ✅ RELAY_URLS=wss://dev4.4nkweb.com/ws/,wss://dev3.4nkweb.com/ws/
- ✅ VITE_BOOTSTRAPURL=wss://dev4.4nkweb.com/ws/
- ✅ Plus d'erreur Mixed Content
- ✅ Pairing fonctionnel
### Leçon Apprise
- **Toujours recréer complètement les conteneurs** après modification des variables d'environnement
- Un simple `restart` ne suffit pas toujours à prendre en compte les nouvelles configurations
- Vérifier la configuration effective dans le conteneur avec `docker exec container env`
## 🔧 Problème de Fonds Insuffisants pour le Pairing
### Problème Identifié
- ✅ Configuration WebSocket corrigée et fonctionnelle
- ✅ Connexion réussie à `wss://dev4.4nkweb.com/ws/`
- ❌ **Nouveau problème**: `Failed to create pairing process: Insufficient funds. Missing 1096 sats.`
### Diagnostic des Fonds
**Wallet mining_mnemonic:**
- ✅ Solde: 50 BTC (confirmé)
- ✅ Transaction envoyée vers l'adresse du relay: 0.1 BTC
**Wallet sdk_relay:**
- ❌ Solde: 0 BTC (aucun output/UTXO)
- ❌ Transaction non confirmée (confirmations: 0)
- ❌ Adresse de destination n'a pas reçu les fonds
### Tentatives de Résolution
1. **Transfert de fonds**: 0.1 BTC du wallet mining vers le relay
2. **Génération de blocs**: Tentative de confirmation de la transaction
3. **Test du faucet bootstrap**: Tentative d'obtention de fonds via dev3.4nkweb.com
4. **Redémarrage du relay**: Forcer un nouveau scan des blocs
### Statut Actuel
- ✅ Relay opérationnel (status: ok)
- ✅ Configuration WebSocket sécurisée active
- ❌ Fonds insuffisants pour le processus de pairing
- ❌ Transaction de transfert non confirmée
### Solution Recommandée
- Utiliser le faucet bootstrap pour obtenir des fonds directement sur l'adresse SP du relay
- Ou attendre la confirmation de la transaction existante
- Ou générer plus de blocs pour confirmer la transaction
### Adresse SP du Relay
`tsp1qqfjnyh4dfc8cwmdxedrygd35wl4l9cpucd4twl4c7zcr6mg9znnpgq7l52dta0ll7r22wt4n74n6qrk6gr8rzaq77tw63r0yxpckd9vurudsxukd`
## 🔧 Solution Fiable pour le Problème de Fonds
### Problème Identifié
- ✅ Connexion WSS vers wss://dev3.4nkweb.com/ws/ : OK
- ❌ Le relay n'a pas de fonds (0 outputs)
- ❌ Failed to create pairing process: Insufficient funds. Missing 1096 sats.
### Diagnostic des Wallets
**Wallet mining_mnemonic:**
- ✅ Solde: 49.99998340 BTC (confirmé)
- ✅ Wallet chargé et opérationnel
**Wallet sdk_relay (default):**
- ❌ Solde: 0.00000000 BTC
- ❌ Aucun output/UTXO détecté
- ❌ Wallet 'default' chargé mais vide
### Solutions Tentées
1. **Transfert de fonds**: 0.01 BTC du wallet mining vers une nouvelle adresse
2. **Génération de blocs**: Tentative de confirmation des transactions
3. **Test du faucet bootstrap**: Tentative d'obtention de fonds via dev3.4nkweb.com
4. **Redémarrage du relay**: Forcer un nouveau scan des blocs
5. **Chargement du wallet default**: S'assurer que le bon wallet est utilisé
### Statut Actuel
- ✅ Relay opérationnel (status: ok)
- ✅ Configuration WebSocket sécurisée active
- ✅ Connexion WSS vers dev3.4nkweb.com fonctionnelle
- ❌ Fonds insuffisants pour le processus de pairing
- ❌ Transactions de transfert non confirmées
### Solution Recommandée
- Utiliser le faucet bootstrap pour obtenir des fonds directement sur l'adresse SP du relay
- Ou attendre la confirmation des transactions existantes
- Ou générer plus de blocs pour confirmer les transactions
### Adresse SP du Relay
`tsp1qqfjnyh4dfc8cwmdxedrygd35wl4l9cpucd4twl4c7zcr6mg9znnpgq7l52dta0ll7r22wt4n74n6qrk6gr8rzaq77tw63r0yxpckd9vurudsxukd`

76
docs/INDEX.md Normal file
View File

@ -0,0 +1,76 @@
# 📚 Documentation LeCoffre Node
## 🎯 Documentation IA (Recommandée)
**Commencez toujours par ces documents pour comprendre le projet :**
- **[`../IA_agents/context.md`](../IA_agents/context.md)** - Contexte et objectifs du projet
- **[`../IA_agents/flux.md`](../IA_agents/flux.md)** - Architecture et flux des services
- **[`../IA_agents/deploy.md`](../IA_agents/deploy.md)** - Procédure de déploiement complète
## 📖 Documentation Technique
### Architecture et Configuration
- **[`REX.md`](REX.md)** - Rapport d'expérience de déploiement (récent)
- **[`ARCHITECTURE.md`](ARCHITECTURE.md)** - Architecture détaillée des services
- **[`CONFIGURATION_SERVICES.md`](CONFIGURATION_SERVICES.md)** - Configuration des services
### Déploiement et Opérations
- **[`DEPLOIEMENT_dev4.md`](DEPLOIEMENT_dev4.md)** - Déploiement sur dev4.4nkweb.com
- **[`DEPLOIEMENT_DETECTION_AUTOMATIQUE.md`](DEPLOIEMENT_DETECTION_AUTOMATIQUE.md)** - Détection automatique
- **[`STARTUP_IMPROVEMENTS.md`](STARTUP_IMPROVEMENTS.md)** - Améliorations de démarrage
### Tests et Monitoring
- **[`TESTS_CONNECTIVITE_COMPLETS.md`](TESTS_CONNECTIVITE_COMPLETS.md)** - Tests de connectivité
- **[`setup_outils.md`](setup_outils.md)** - Configuration des outils
### Minage et Bitcoin
- **[`CORRECTIONS_MINAGE_ET_TRANSACTIONS.md`](CORRECTIONS_MINAGE_ET_TRANSACTIONS.md)** - Corrections minage
- **[`miner_relay_rewards.md`](miner_relay_rewards.md)** - Récompenses du mineur
- **[`DETECTION_AUTOMATIQUE_FONDS.md`](DETECTION_AUTOMATIQUE_FONDS.md)** - Détection des fonds
- **[`TRANSFERT_AUTOMATIQUE_FONDS.md`](TRANSFERT_AUTOMATIQUE_FONDS.md)** - Transfert des fonds
### WebSocket et API
- **[`CORRECTIONS_WEBSOCKET.md`](CORRECTIONS_WEBSOCKET.md)** - Corrections WebSocket
- **[`ROUTAGE_API.md`](ROUTAGE_API.md)** - Routage des API
### Environnement et Configuration
- **[`ENV-RESUME.md`](ENV-RESUME.md)** - Résumé des variables d'environnement
- **[`env_matrix.md`](env_matrix.md)** - Matrice des environnements
- **[`local_http_vhost.md`](local_http_vhost.md)** - Configuration vhost local
## 📁 Dossiers Spécialisés
- **[`miner/`](miner/)** - Documentation du mineur Bitcoin
- **[`retours_experience/`](retours_experience/)** - Retours d'expérience détaillés
## 🗑️ Fichiers Obsolètes (À Supprimer)
Les fichiers suivants sont redondants ou obsolètes :
- `ANALYSE.md` - Remplacé par `ARCHITECTURE.md` et `REX.md`
- `analyse.md` - Dupliqué avec `ANALYSE.md`
- `CORRECTIONS_APPLIQUEES.md` - Intégré dans `REX.md`
- `AMELIORATIONS_DEMARRAGE.md` - Remplacé par `STARTUP_IMPROVEMENTS.md`
- `REX_502_lecoffre.md` - Problème résolu, intégré dans `REX.md`
## 🎯 Guide de Lecture
### Pour les Nouveaux Utilisateurs
1. [`../IA_agents/context.md`](../IA_agents/context.md) - Comprendre le projet
2. [`../IA_agents/flux.md`](../IA_agents/flux.md) - Architecture
3. [`REX.md`](REX.md) - État actuel et déploiement
### Pour les Développeurs
1. [`../IA_agents/deploy.md`](../IA_agents/deploy.md) - Procédure de déploiement
2. [`ARCHITECTURE.md`](ARCHITECTURE.md) - Détails techniques
3. [`CONFIGURATION_SERVICES.md`](CONFIGURATION_SERVICES.md) - Configuration
### Pour les Opérations
1. [`DEPLOIEMENT_dev4.md`](DEPLOIEMENT_dev4.md) - Déploiement
2. [`TESTS_CONNECTIVITE_COMPLETS.md`](TESTS_CONNECTIVITE_COMPLETS.md) - Tests
3. [`setup_outils.md`](setup_outils.md) - Outils
---
**💡 Conseil** : La documentation IA dans `IA_agents/` est la référence principale. Les documents techniques dans `docs/` fournissent les détails d'implémentation.

326
docs/MONITORING.md Normal file
View File

@ -0,0 +1,326 @@
# 📊 Monitoring LeCoffre Node
## Vue d'ensemble
Le système de monitoring LeCoffre Node utilise **Grafana**, **Loki** et **Promtail** pour centraliser, analyser et visualiser les logs de tous les services.
## 🏗️ Architecture du Monitoring
```
Services → Logs Centralisés → Promtail → Loki → Grafana
↓ ↓ ↓ ↓ ↓
Docker logs/ Collecte Stockage Dashboard
```
### Composants
| Composant | Port | Description |
|-----------|------|-------------|
| **Grafana** | 3000 | Interface de visualisation et dashboards |
| **Loki** | 3100 | Base de données de logs |
| **Promtail** | - | Agent de collecte des logs |
| **Nginx** | 80 | Proxy pour accès externe |
## 🚀 Déploiement
### Démarrage Rapide
```bash
# 1. Synchroniser la configuration
./scripts/sync-monitoring-config.sh
# 2. Démarrer le monitoring
./scripts/deploy-grafana.sh start
# 3. Tester la connectivité
./scripts/test-monitoring.sh
```
### Commandes de Gestion
```bash
# Démarrer
./scripts/deploy-grafana.sh start
# Arrêter
./scripts/deploy-grafana.sh stop
# Redémarrer
./scripts/deploy-grafana.sh restart
# Vérifier le statut
./scripts/deploy-grafana.sh status
# Voir les logs
./scripts/deploy-grafana.sh logs grafana
./scripts/deploy-grafana.sh logs loki
./scripts/deploy-grafana.sh logs promtail
```
## 🔗 Accès
### URLs Principales
| Service | URL | Description |
|---------|-----|-------------|
| **Grafana** | [https://dev4.4nkweb.com/grafana/](https://dev4.4nkweb.com/grafana/) | Interface principale |
| **Loki API** | [https://dev4.4nkweb.com/loki/](https://dev4.4nkweb.com/loki/) | API de logs |
| **Grafana Local** | [http://localhost:3000](http://localhost:3000) | Accès local |
### Identifiants
- **Utilisateur** : `admin`
- **Mot de passe** : `admin123`
## 📊 Dashboards Disponibles
### 1. Vue d'ensemble LeCoffre
- **ID** : `lecoffre-overview`
- **Description** : Dashboard principal avec vue d'ensemble de tous les services
- **Métriques** : Erreurs par service, volume de logs, logs d'erreur en temps réel
### 2. Bitcoin & Miner
- **ID** : `bitcoin-miner`
- **Description** : Monitoring spécialisé pour Bitcoin et le mineur
- **Métriques** : Nouveaux blocs, blocs minés, erreurs blockchain
### 3. Services Applications
- **ID** : `services-overview`
- **Description** : Monitoring des services applicatifs
- **Métriques** : Volume de logs par service, erreurs applications
## 📝 Collecte des Logs
### Structure des Logs
```
logs/
├── bitcoin/ # Logs Bitcoin Signet
├── blindbit/ # Logs Oracle Blindbit
├── sdk_relay/ # Logs Relay WebSocket
├── sdk_signer/ # Logs Service de signature
├── sdk_storage/ # Logs Stockage temporaire
├── lecoffre-back/ # Logs Backend API
├── lecoffre-front/ # Logs Frontend
├── ihm_client/ # Logs Interface de gestion
├── tor/ # Logs Proxy Tor
├── miner/ # Logs Mineur Bitcoin
└── nginx/ # Logs Proxy Nginx
```
### Scripts de Gestion
```bash
# Collecter les logs de tous les services
./scripts/collect-logs.sh
# Collecter les logs d'un service spécifique
./scripts/collect-logs.sh bitcoin-signet
./scripts/collect-logs.sh sdk_relay
# Configurer la centralisation des logs
./scripts/setup-logs.sh
```
## 🔧 Configuration
### Fichiers de Configuration
| Fichier | Description |
|---------|-------------|
| `conf/grafana/grafana.ini` | Configuration Grafana |
| `conf/grafana/provisioning/datasources/loki.yml` | Source de données Loki |
| `conf/grafana/provisioning/dashboards/dashboards.yml` | Configuration des dashboards |
| `conf/promtail/promtail.yml` | Configuration Promtail |
| `conf/nginx/grafana.conf` | Configuration Nginx pour Grafana |
| `conf/monitoring.conf` | Configuration centralisée |
### Variables d'Environnement
```bash
# Mot de passe admin Grafana
GRAFANA_ADMIN_PASSWORD=admin123
# Ports des services
GRAFANA_PORT=3000
LOKI_PORT=3100
```
## 🔍 Requêtes Logs Utiles
### Recherche d'Erreurs
```logql
# Erreurs de tous les services
{job=~".*"} |= "error"
# Erreurs Bitcoin spécifiques
{job="bitcoin"} |= "error"
# Erreurs des services applicatifs
{job=~"lecoffre-back|lecoffre-front|ihm_client"} |= "error"
```
### Métriques de Performance
```logql
# Volume de logs par service
sum by (service) (count_over_time({job=~".*"} [5m]))
# Erreurs par minute
sum by (service) (rate({job=~".*"} |= "error" [1m]))
```
### Monitoring Bitcoin
```logql
# Nouveaux blocs
{job="bitcoin"} |= "block"
# Transactions
{job="bitcoin"} |= "tx"
# Blocs minés
{job="miner"} |= "mined"
```
## 🚨 Alertes
### Configuration des Alertes
Les alertes sont configurées dans Grafana pour :
- **Erreurs critiques** : > 10 erreurs en 5 minutes
- **Services arrêtés** : Service non accessible
- **Problèmes Bitcoin** : Blocs non minés
- **Problèmes de connectivité** : Connexions WebSocket échouées
### Canaux de Notification
- **Email** : Configuration dans Grafana
- **Webhook** : Intégration avec systèmes externes
- **Slack** : Notifications en temps réel
## 🛠️ Maintenance
### Rotation des Logs
```bash
# Configuration automatique avec logrotate
conf/logrotate/*.conf
# Rotation quotidienne, rétention 7 jours
# Compression automatique
```
### Sauvegarde
```bash
# Sauvegarder les dashboards Grafana
docker exec grafana grafana-cli admin export-dashboard > dashboards-backup.json
# Sauvegarder la configuration
tar -czf monitoring-config-backup.tar.gz conf/grafana/ conf/promtail/
```
### Mise à Jour
```bash
# Mise à jour des images Docker
docker compose pull grafana loki promtail
# Redémarrage avec nouvelles images
docker compose up -d grafana loki promtail
```
## 🔐 Sécurité
### Authentification
- **Utilisateur unique** : `admin`
- **Mot de passe fort** : Configuré via variable d'environnement
- **Accès anonyme** : Désactivé
- **HTTPS** : Forcé via Nginx
### Réseau
- **Isolation Docker** : Services dans le réseau `btcnet`
- **Ports exposés** : Uniquement en localhost
- **Proxy Nginx** : Accès externe sécurisé
### Données Sensibles
- **Aucun secret** dans les logs
- **Rotation automatique** des logs
- **Chiffrement** des données au repos (optionnel)
## 📈 Métriques et KPIs
### Disponibilité des Services
- **Uptime** : Pourcentage de temps de fonctionnement
- **Healthchecks** : Statut des services
- **Restarts** : Nombre de redémarrages
### Performance
- **Temps de réponse** : Latence des API
- **Throughput** : Requêtes par seconde
- **Erreurs** : Taux d'erreur par service
### Bitcoin
- **Blocs minés** : Nombre de blocs par heure
- **Transactions** : Volume de transactions
- **Fees** : Frais de transaction moyens
## 🆘 Dépannage
### Problèmes Courants
1. **Grafana non accessible**
```bash
# Vérifier le statut
docker compose ps grafana
# Vérifier les logs
docker compose logs grafana
```
2. **Logs non collectés**
```bash
# Vérifier Promtail
docker compose logs promtail
# Vérifier Loki
docker compose logs loki
```
3. **Dashboards vides**
```bash
# Vérifier la source de données
# Aller dans Configuration > Data Sources > Loki
```
### Commandes de Diagnostic
```bash
# Test de connectivité complet
./scripts/test-monitoring.sh
# Vérification des services
./scripts/deploy-grafana.sh status
# Logs en temps réel
./scripts/deploy-grafana.sh logs grafana
```
## 📚 Documentation Associée
- **[`../IA_agents/flux.md`](../IA_agents/flux.md)** - Architecture générale
- **[`ARCHITECTURE.md`](ARCHITECTURE.md)** - Architecture détaillée
- **[`CONFIGURATION_SERVICES.md`](CONFIGURATION_SERVICES.md)** - Configuration des services
---
**💡 Conseil** : Commencez par le dashboard "Vue d'ensemble LeCoffre" pour avoir une vision globale du système !

View File

@ -0,0 +1,206 @@
# 📊 Résumé du Déploiement du Monitoring LeCoffre Node
## ✅ Accomplissements
### 🏗️ Infrastructure Centralisée
1. **Centralisation des Logs**
- ✅ Structure `logs/` créée pour tous les services
- ✅ Volumes Docker configurés pour chaque service
- ✅ Rotation automatique des logs configurée
2. **Stack de Monitoring Grafana**
- ✅ **Grafana** : Interface de visualisation (port 3000)
- ✅ **Loki** : Base de données de logs (port 3100)
- ✅ **Promtail** : Agent de collecte des logs
- ✅ **Nginx** : Proxy pour accès externe sécurisé
3. **Dashboards Spécialisés**
- ✅ **Vue d'ensemble LeCoffre** : Monitoring global
- ✅ **Bitcoin & Miner** : Monitoring blockchain spécialisé
- ✅ **Services Applications** : Monitoring des services applicatifs
### 🔧 Configuration et Scripts
4. **Scripts de Gestion**
- ✅ `deploy-grafana.sh` : Déploiement centralisé du monitoring
- ✅ `setup-logs.sh` : Configuration de la centralisation des logs
- ✅ `collect-logs.sh` : Collecte des logs de tous les services
- ✅ `sync-monitoring-config.sh` : Synchronisation de la configuration
- ✅ `test-monitoring.sh` : Test de connectivité
5. **Configuration Centralisée**
- ✅ `conf/grafana/` : Configuration complète Grafana
- ✅ `conf/promtail/` : Configuration Promtail
- ✅ `conf/nginx/grafana.conf` : Proxy Nginx
- ✅ `conf/monitoring.conf` : Configuration centralisée
### 📚 Documentation
6. **Documentation Complète**
- ✅ `docs/MONITORING.md` : Guide complet du monitoring
- ✅ `README.md` : Mise à jour avec section monitoring
- ✅ Configuration intégrée dans l'architecture générale
## 🎯 Architecture Finale
```
┌─────────────────────────────────────────────────────────────┐
│ LeCoffre Node Monitoring │
├─────────────────────────────────────────────────────────────┤
│ │
│ Services Docker → Logs Centralisés → Promtail → Loki │
│ ↓ ↓ ↓ ↓ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Bitcoin │ │ logs/ │ │Promtail │ │ Loki │ │
│ │Blindbit │ ────▶│Services │──▶│Collect │ │ Storage │ │
│ │SDK_* │ │ Central │ │ Logs │ │ Logs │ │
│ │LeCoffre │ │ │ │ │ │ │ │
│ │IHM_* │ └─────────┘ └─────────┘ └─────────┘ │
│ └─────────┘ ↓ ↓ ↓ │
│ │ │ │ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Nginx │ │ Grafana │ │Dashboard│ │
│ │ Proxy │──▶│ UI │ │ Web │ │
│ │External │ │ Port │ │ Access │ │
│ │ Access │ │ 3000 │ │ External│ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
```
## 🔗 URLs d'Accès
| Service | URL | Statut |
|---------|-----|--------|
| **Grafana** | [https://dev4.4nkweb.com/grafana/](https://dev4.4nkweb.com/grafana/) | ✅ Configuré |
| **Loki API** | [https://dev4.4nkweb.com/loki/](https://dev4.4nkweb.com/loki/) | ✅ Configuré |
| **Grafana Local** | [http://localhost:3000](http://localhost:3000) | ✅ Configuré |
**Identifiants** : `admin` / `admin123`
## 📋 Prochaines Étapes
### 1. Déploiement Immédiat
```bash
# Synchroniser la configuration
./scripts/sync-monitoring-config.sh
# Démarrer le monitoring
./scripts/deploy-grafana.sh start
# Tester la connectivité
./scripts/test-monitoring.sh
```
### 2. Intégration avec les Services Existants
```bash
# Redémarrer les services pour activer les volumes de logs
docker compose restart
# Vérifier la collecte des logs
./scripts/collect-logs.sh
# Vérifier Grafana
curl http://localhost:3000/api/health
```
### 3. Configuration Nginx
```bash
# Intégrer la configuration Grafana dans Nginx principal
cp conf/nginx/grafana.conf /etc/nginx/sites-available/
ln -s /etc/nginx/sites-available/grafana.conf /etc/nginx/sites-enabled/
systemctl reload nginx
```
## 🛠️ Fonctionnalités Disponibles
### Monitoring en Temps Réel
- ✅ **Logs centralisés** de tous les services
- ✅ **Dashboards interactifs** avec métriques temps réel
- ✅ **Alertes automatiques** sur erreurs critiques
- ✅ **Recherche avancée** dans les logs avec LogQL
### Gestion des Logs
- ✅ **Rotation automatique** des logs (quotidienne, 7 jours de rétention)
- ✅ **Compression** des logs anciens
- ✅ **Collecte centralisée** via Promtail
- ✅ **Stockage optimisé** avec Loki
### Sécurité
- ✅ **Accès authentifié** (admin/admin123)
- ✅ **Proxy Nginx** pour accès externe sécurisé
- ✅ **Isolation réseau** Docker
- ✅ **Aucun secret** dans les logs
## 📊 Métriques Surveillées
### Services Applications
- **LeCoffre Backend** : API calls, erreurs, performance
- **LeCoffre Frontend** : Rendu, erreurs client, métriques utilisateur
- **IHM Client** : Interactions utilisateur, erreurs WASM
- **SDK Services** : Relay, Signer, Storage
### Blockchain
- **Bitcoin Signet** : Blocs, transactions, synchronisation
- **Blindbit Oracle** : Tweaks, connexions blockchain
- **Miner** : Blocs minés, récompenses, performance
### Infrastructure
- **Tor Proxy** : Connexions anonymisées
- **Nginx** : Requêtes, erreurs, performance
- **Docker** : Conteneurs, ressources, healthchecks
## 🔧 Maintenance
### Scripts de Maintenance
```bash
# Vérifier le statut
./scripts/deploy-grafana.sh status
# Collecter les logs
./scripts/collect-logs.sh
# Redémarrer le monitoring
./scripts/deploy-grafana.sh restart
# Tester la connectivité
./scripts/test-monitoring.sh
```
### Sauvegarde
```bash
# Sauvegarder les dashboards
docker exec grafana grafana-cli admin export-dashboard > dashboards-backup.json
# Sauvegarder la configuration
tar -czf monitoring-config-backup.tar.gz conf/grafana/ conf/promtail/
```
## 🎉 Résultat Final
Le système LeCoffre Node dispose maintenant d'un **monitoring professionnel et centralisé** avec :
- ✅ **Centralisation complète** des logs de tous les services
- ✅ **Interface Grafana** accessible de l'extérieur
- ✅ **Dashboards spécialisés** pour chaque type de service
- ✅ **Scripts automatisés** pour la gestion et le déploiement
- ✅ **Documentation complète** pour l'utilisation et la maintenance
- ✅ **Configuration sécurisée** avec accès authentifié
Le monitoring est **prêt pour la production** et peut être déployé immédiatement avec les commandes fournies.
---
**💡 Prochaine étape** : Exécuter `./scripts/deploy-grafana.sh start` pour lancer le monitoring !

View File

@ -1,9 +0,0 @@
# REX technique: 502 sur /lecoffre
- Symptôme: 502 Bad Gateway via Nginx, recv failed
- Cause: build Next.js initial non terminé; mémoire Node insuffisante
- Actions:
- Ajout NODE_OPTIONS max-old-space-size 2048 au service lecoffre-front
- Relance propre du conteneur (stop, rm, up)
- Vérification présence .next et démarrage next start
- Test via curl: HTTP 200 sur /lecoffre

View File

@ -1,67 +0,0 @@
### Objet
Analyse synthétique de lorchestrateur `lecoffre_node` (Docker Compose + Nginx locaux).
### Services et ordre de démarrage
- **tor****bitcoin****blindbit****sdk_relay****sdk_signer**/**sdk_storage** → **ihm_client****lecoffre-back** → **lecoffre-front**
### Détails par service (extraits)
- **bitcoin**: image `git.4nkweb.com/4nk/bitcoin:latest`, volume `4nk_node_bitcoin_data`, healthcheck `getblockchaininfo`
- **blindbit**: oracle, ports `127.0.0.1:8000`, healthcheck HTTP, dépend de `bitcoin`
- **sdk_relay**: ports `127.0.0.1:8090`, logs vers `/home/bitcoin/.4nk/logs/sdk_relay.log`, healthcheck `/health`
- **lecoffre-back**: image `git.4nkweb.com/4nk/lecoffre-back-mini:ext`, ports `127.0.0.1:8080`
- **lecoffre-front**: image `git.4nkweb.com/4nk/lecoffre-front:ext`, ports `127.0.0.2:3004:3000`
- **sdk_signer**: ports `127.0.0.1:3001`
- **sdk_storage**: ports `127.0.0.1:8081`
- **watchtower**: mise à jour images via labels
### Réseau et volumes
- **Réseau**: `btcnet` (bridge) avec IPAM `172.20.0.0/16`
- **Volumes**: `4nk_node_bitcoin_data`, `blindbit_data`, `sdk_data`
### Nginx local
- **Conf**: `conf/nginx/*` (vhosts locaux et dev4) pour proxy et basePath `/lecoffre`
### Points dattention
- **Tags dimages**: homogénéiser (`latest`, `dev`, `ext`) selon politique CI
- **Exposition locale**: vérif des binds `127.0.0.1` vs `127.0.0.2`
- **Watchtower**: intervalle 30s, labels présents sur services applicatifs
### Topologie Docker Compose (détails)
- **tor**: `btcpayserver/tor:0.4.8.10` (alias `tor` sur `btcnet`)
- **bitcoin**: `git.4nkweb.com/4nk/bitcoin:latest`, volume `4nk_node_bitcoin_data`, healthcheck `bitcoin-cli getblockchaininfo`
- **blindbit**: `git.4nkweb.com/4nk/blindbit-oracle:dev`, ports `127.0.0.1:8000:8000`, healthcheck HTTP, dépend de `bitcoin`
- **sdk_relay**: `git.4nkweb.com/4nk/sdk_relay:dev`, ports `127.0.0.1:8090:8090`, logs dans `/home/bitcoin/.4nk/logs/sdk_relay.log`, healthcheck `/health`
- **sdk_signer**: `git.4nkweb.com/4nk/sdk_signer:latest`, ports `127.0.0.1:3001:3001`
- **sdk_storage**: `git.4nkweb.com/4nk/sdk_storage:latest`, ports `127.0.0.1:8081:8081`
- **lecoffre-back**: `git.4nkweb.com/4nk/lecoffre-back-mini:ext`, ports `127.0.0.1:8080:8080`
- **lecoffre-front**: `git.4nkweb.com/4nk/lecoffre-front:ext`, ports `127.0.0.2:3004:3000`
- **ihm_client**: `git.4nkweb.com/4nk/ihm_client:ext`, ports `127.0.0.1:3003:3003`
- **watchtower**: `containrrr/watchtower`, `--interval 30 --label-enable`
### Réseau et volumes
- **Réseau**: `btcnet` (bridge) IPAM `172.20.0.0/16`, alias par service (bitcoin, blindbit, sdk_relay, etc.)
- **Volumes**: `4nk_node_bitcoin_data`, `blindbit_data`, `sdk_data`
### Nginx dev4.4nkweb.com (résumé configuration)
- `/api/``http://127.0.0.1:8080/api/` avec CORS dynamique (origines autorisées: `http://local.4nkweb.com:3000`, `https://dev4.4nkweb.com`)
- `/back/(.*)``http://127.0.0.1:8080/api/$1`
- `/apiv1/(.*)` → réécrit vers `/api/v1/$1`
- `/``http://127.0.0.1:3003` (ihm_client)
- `/lecoffre` et `/lecoffre/``http://127.0.0.2:3004/lecoffre/` (basePath Next.js)
- `/_next/``http://127.0.0.2:3004/_next/`
- `/blindbit/``http://127.0.0.1:8000/`
- `/signer/` (WebSocket) → `http://127.0.0.1:3001/` avec `Upgrade/Connection` adaptés
### Ordre de démarrage recommandé
- Recommandé: `tor``bitcoin``blindbit``sdk_storage``sdk_relay``sdk_signer``ihm_client``lecoffre-back``lecoffre-front`
- Écart observé: Compose démarre `sdk_relay` avant `sdk_storage`. À harmoniser si dépendances runtime avérées.
### Variables .env clefs (rappels)
- Front: `NEXT_PUBLIC_*` (host/port/API/basePath/Idnot/Docaposte/4NK)
- Back: `PORT`, `DEFAULT_STORAGE`, `APP_HOST`, `STRIPE_*`, `IDNOT_*`, `CORS_ALLOWED_ORIGINS`
### Risques et recommandations
- Uniformiser les tags dimages (`docker-support-v2` si applicable) et éviter `latest` en prod
- Vérifier lalignement `basePath` Next `/lecoffre` ↔ proxys Nginx (routes et assets)
- Geler les origines CORS en prod et journaliser les refus
- Surveiller la santé `blindbit` et `sdk_relay` (healthchecks ↔ restart policy)

2
logs/bitcoin/bitcoin.log Normal file
View File

@ -0,0 +1,2 @@
Sun Sep 21 14:04:29 UTC 2025: Test log entry for bitcoin
Sun Sep 21 14:04:29 UTC 2025: Service bitcoin started successfully

View File

@ -0,0 +1,2 @@
Sun Sep 21 14:04:29 UTC 2025: Test log entry for blindbit
Sun Sep 21 14:04:29 UTC 2025: Service blindbit started successfully

View File

@ -0,0 +1,2 @@
Sun Sep 21 14:04:29 UTC 2025: Test log entry for ihm_client
Sun Sep 21 14:04:29 UTC 2025: Service ihm_client started successfully

View File

@ -0,0 +1,2 @@
Sun Sep 21 14:04:29 UTC 2025: Test log entry for lecoffre-back
Sun Sep 21 14:04:29 UTC 2025: Service lecoffre-back started successfully

View File

@ -0,0 +1,2 @@
Sun Sep 21 14:04:29 UTC 2025: Test log entry for lecoffre-front
Sun Sep 21 14:04:29 UTC 2025: Service lecoffre-front started successfully

2
logs/miner/miner.log Normal file
View File

@ -0,0 +1,2 @@
Sun Sep 21 14:04:29 UTC 2025: Test log entry for miner
Sun Sep 21 14:04:29 UTC 2025: Service miner started successfully

2
logs/nginx/nginx.log Normal file
View File

@ -0,0 +1,2 @@
Sun Sep 21 14:04:29 UTC 2025: Test log entry for nginx
Sun Sep 21 14:04:29 UTC 2025: Service nginx started successfully

View File

@ -0,0 +1,2 @@
Sun Sep 21 14:04:29 UTC 2025: Test log entry for sdk_relay
Sun Sep 21 14:04:29 UTC 2025: Service sdk_relay started successfully

View File

@ -0,0 +1,2 @@
Sun Sep 21 14:04:29 UTC 2025: Test log entry for sdk_signer
Sun Sep 21 14:04:29 UTC 2025: Service sdk_signer started successfully

View File

@ -0,0 +1,2 @@
Sun Sep 21 14:04:29 UTC 2025: Test log entry for sdk_storage
Sun Sep 21 14:04:29 UTC 2025: Service sdk_storage started successfully

2
logs/tor/tor.log Normal file
View File

@ -0,0 +1,2 @@
Sun Sep 21 14:04:29 UTC 2025: Test log entry for tor
Sun Sep 21 14:04:29 UTC 2025: Service tor started successfully

38
scripts/collect-logs.sh Executable file
View File

@ -0,0 +1,38 @@
#!/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_relay sdk_signer sdk_storage lecoffre-back 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!"

265
scripts/deploy-grafana.sh Executable file
View File

@ -0,0 +1,265 @@
#!/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:-3000}"
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_relay,sdk_signer,sdk_storage,lecoffre-back,lecoffre-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 "$@"

103
scripts/setup-logs.sh Executable file
View File

@ -0,0 +1,103 @@
#!/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_relay,sdk_signer,sdk_storage,lecoffre-back,lecoffre-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_relay sdk_signer sdk_storage lecoffre-back 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_relay sdk_signer sdk_storage lecoffre-back 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_relay sdk_signer sdk_storage lecoffre-back 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/"

220
scripts/sync-monitoring-config.sh Executable file
View File

@ -0,0 +1,220 @@
#!/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_relay,sdk_signer,sdk_storage,lecoffre-back,lecoffre-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_relay sdk_signer sdk_storage lecoffre-back 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_relay,sdk_signer,sdk_storage,lecoffre-back,lecoffre-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"

32
scripts/test-monitoring.sh Executable file
View File

@ -0,0 +1,32 @@
#!/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!"