align for IA agents + grafana
This commit is contained in:
parent
7df67d7e8f
commit
f6dc2812d4
@ -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)
|
35. Corriger à nouveau si nécessaire (jusqu'à l'absence totale d'erreurs)
|
||||||
36. Mettre à jour la documentation avec le **retour d’expérience** à chaque fois par une mise à jour de `docs/REX.md`.
|
36. Mettre à jour la documentation avec le **retour d’expérience** à chaque fois par une mise à jour de `docs/REX.md`.
|
||||||
37. Recommencer si nécessaire pour obtenir un déploiement fluide et parfait.
|
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
253
README.md
Normal file
@ -0,0 +1,253 @@
|
|||||||
|
# LeCoffre Node - Plateforme de Gestion de Documents Sécurisée
|
||||||
|
|
||||||
|
[](https://git.4nkweb.com/4nk/lecoffre_node)
|
||||||
|
[](https://mempool2.4nkweb.com)
|
||||||
|
[](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 !
|
160
conf/grafana/dashboards/bitcoin-miner.json
Normal file
160
conf/grafana/dashboards/bitcoin-miner.json
Normal 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": ""
|
||||||
|
}
|
264
conf/grafana/dashboards/lecoffre-overview.json
Normal file
264
conf/grafana/dashboards/lecoffre-overview.json
Normal 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": ""
|
||||||
|
}
|
442
conf/grafana/dashboards/services-overview.json
Normal file
442
conf/grafana/dashboards/services-overview.json
Normal 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
60
conf/grafana/grafana.ini
Normal 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
|
12
conf/grafana/provisioning/dashboards/dashboards.yml
Normal file
12
conf/grafana/provisioning/dashboards/dashboards.yml
Normal 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
|
16
conf/grafana/provisioning/datasources/loki.yml
Normal file
16
conf/grafana/provisioning/datasources/loki.yml
Normal 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}"
|
13
conf/logrotate/bitcoin.conf
Normal file
13
conf/logrotate/bitcoin.conf
Normal 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
|
||||||
|
}
|
13
conf/logrotate/blindbit.conf
Normal file
13
conf/logrotate/blindbit.conf
Normal 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
|
||||||
|
}
|
13
conf/logrotate/ihm_client.conf
Normal file
13
conf/logrotate/ihm_client.conf
Normal 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
|
||||||
|
}
|
13
conf/logrotate/lecoffre-back.conf
Normal file
13
conf/logrotate/lecoffre-back.conf
Normal 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
|
||||||
|
}
|
13
conf/logrotate/lecoffre-front.conf
Normal file
13
conf/logrotate/lecoffre-front.conf
Normal 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
13
conf/logrotate/miner.conf
Normal 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
13
conf/logrotate/nginx.conf
Normal 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
|
||||||
|
}
|
13
conf/logrotate/sdk_relay.conf
Normal file
13
conf/logrotate/sdk_relay.conf
Normal 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
|
||||||
|
}
|
13
conf/logrotate/sdk_signer.conf
Normal file
13
conf/logrotate/sdk_signer.conf
Normal 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
|
||||||
|
}
|
13
conf/logrotate/sdk_storage.conf
Normal file
13
conf/logrotate/sdk_storage.conf
Normal 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
13
conf/logrotate/tor.conf
Normal 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
30
conf/monitoring.conf
Normal 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
49
conf/nginx/grafana.conf
Normal 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
127
conf/promtail/promtail.yml
Normal 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'
|
@ -16,6 +16,7 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- bitcoin_data:/home/bitcoin/.bitcoin
|
- bitcoin_data:/home/bitcoin/.bitcoin
|
||||||
- ./conf/bitcoin/bitcoin.conf:/etc/bitcoin/bitcoin.conf:ro
|
- ./conf/bitcoin/bitcoin.conf:/etc/bitcoin/bitcoin.conf:ro
|
||||||
|
- ./logs/bitcoin:/var/log/bitcoin
|
||||||
networks:
|
networks:
|
||||||
btcnet:
|
btcnet:
|
||||||
aliases:
|
aliases:
|
||||||
@ -42,6 +43,7 @@ services:
|
|||||||
- blindbit_data:/root/.blindbit-oracle
|
- blindbit_data:/root/.blindbit-oracle
|
||||||
- ./blindbit/blindbit.toml:/tmp/blindbit.toml:ro
|
- ./blindbit/blindbit.toml:/tmp/blindbit.toml:ro
|
||||||
- bitcoin_data:/home/bitcoin/.bitcoin
|
- bitcoin_data:/home/bitcoin/.bitcoin
|
||||||
|
- ./logs/blindbit:/var/log/blindbit
|
||||||
entrypoint: >
|
entrypoint: >
|
||||||
sh -c "cp /tmp/blindbit.toml /root/.blindbit-oracle/blindbit.toml &&
|
sh -c "cp /tmp/blindbit.toml /root/.blindbit-oracle/blindbit.toml &&
|
||||||
./main -datadir /root/.blindbit-oracle"
|
./main -datadir /root/.blindbit-oracle"
|
||||||
@ -69,6 +71,7 @@ services:
|
|||||||
- sdk_data:/home/bitcoin/.4nk
|
- sdk_data:/home/bitcoin/.4nk
|
||||||
- bitcoin_data:/home/bitcoin/.bitcoin
|
- bitcoin_data:/home/bitcoin/.bitcoin
|
||||||
- ./scripts/funds:/scripts/funds:ro
|
- ./scripts/funds:/scripts/funds:ro
|
||||||
|
- ./logs/sdk_relay:/var/log/sdk_relay
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:8090:8090"
|
- "127.0.0.1:8090:8090"
|
||||||
- "127.0.0.1:8091:8091"
|
- "127.0.0.1:8091:8091"
|
||||||
@ -101,6 +104,7 @@ services:
|
|||||||
- "127.0.0.1:8080:8080"
|
- "127.0.0.1:8080:8080"
|
||||||
volumes:
|
volumes:
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
- ./logs/lecoffre-back:/var/log/lecoffre-back
|
||||||
networks:
|
networks:
|
||||||
btcnet:
|
btcnet:
|
||||||
aliases:
|
aliases:
|
||||||
@ -131,6 +135,8 @@ services:
|
|||||||
- .env
|
- .env
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.2:3004:3000"
|
- "127.0.0.2:3004:3000"
|
||||||
|
volumes:
|
||||||
|
- ./logs/lecoffre-front:/var/log/lecoffre-front
|
||||||
networks:
|
networks:
|
||||||
btcnet:
|
btcnet:
|
||||||
aliases:
|
aliases:
|
||||||
@ -163,6 +169,8 @@ services:
|
|||||||
- VITE_BOOTSTRAPURL=wss://dev4.4nkweb.com/ws/
|
- VITE_BOOTSTRAPURL=wss://dev4.4nkweb.com/ws/
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:3003:3003"
|
- "127.0.0.1:3003:3003"
|
||||||
|
volumes:
|
||||||
|
- ./logs/ihm_client:/var/log/ihm_client
|
||||||
networks:
|
networks:
|
||||||
btcnet:
|
btcnet:
|
||||||
aliases:
|
aliases:
|
||||||
@ -191,6 +199,8 @@ services:
|
|||||||
container_name: sdk_signer
|
container_name: sdk_signer
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:3001:9090"
|
- "127.0.0.1:3001:9090"
|
||||||
|
volumes:
|
||||||
|
- ./logs/sdk_signer:/var/log/sdk_signer
|
||||||
networks:
|
networks:
|
||||||
btcnet:
|
btcnet:
|
||||||
aliases:
|
aliases:
|
||||||
@ -214,6 +224,8 @@ services:
|
|||||||
container_name: sdk_storage
|
container_name: sdk_storage
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:8081:8080"
|
- "127.0.0.1:8081:8080"
|
||||||
|
volumes:
|
||||||
|
- ./logs/sdk_storage:/var/log/sdk_storage
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD", "sh", "-c", "curl -f http://localhost:8080/health || exit 1"]
|
test: ["CMD", "sh", "-c", "curl -f http://localhost:8080/health || exit 1"]
|
||||||
interval: 30s
|
interval: 30s
|
||||||
@ -249,6 +261,7 @@ services:
|
|||||||
- ./miner/.env
|
- ./miner/.env
|
||||||
volumes:
|
volumes:
|
||||||
- bitcoin_data:/bitcoin:ro
|
- bitcoin_data:/bitcoin:ro
|
||||||
|
- ./logs/miner:/var/log/miner
|
||||||
networks:
|
networks:
|
||||||
btcnet:
|
btcnet:
|
||||||
aliases:
|
aliases:
|
||||||
@ -256,11 +269,65 @@ services:
|
|||||||
profiles: ["miner"]
|
profiles: ["miner"]
|
||||||
restart: unless-stopped
|
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:
|
volumes:
|
||||||
bitcoin_data:
|
bitcoin_data:
|
||||||
name: 4nk_node_bitcoin_data
|
name: 4nk_node_bitcoin_data
|
||||||
blindbit_data:
|
blindbit_data:
|
||||||
sdk_data:
|
sdk_data:
|
||||||
|
grafana_data:
|
||||||
|
loki_data:
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
btcnet:
|
btcnet:
|
||||||
|
@ -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
|
|
@ -1,76 +0,0 @@
|
|||||||
## Analyse détaillée
|
|
||||||
|
|
||||||
### Périmètre
|
|
||||||
|
|
||||||
Analyse du nœud d’orchestration `lecoffre_node` et de son `docker-compose.yml` (services, images, ports, volumes, dépendances inter‑services).
|
|
||||||
|
|
||||||
### 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 d’images 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 qu’il n’est pas utilisé sur la machine. Éviter son démarrage par défaut pour réduire l’empreinte.
|
|
||||||
- Exposition multi‑IP (`127.0.0.2` pour `lecoffre-front`). Vérifier la résolution locale et la compatibilité outillage.
|
|
||||||
|
|
||||||
### Actions proposées
|
|
||||||
|
|
||||||
- Normaliser les tags d’images (`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 d’environnement communes dans `.env` et documenter leurs valeurs attendues.
|
|
||||||
- Aligner la rotation des logs et vérifier la capacité des volumes (`sdk_data`, `bitcoin_data`).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,77 +1,107 @@
|
|||||||
# Architecture LeCoffre Node
|
# 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
|
## 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)
|
### Services Locaux (Docker Compose)
|
||||||
- **sdk_relay** : Service de relais WebSocket (ports 8090-8091)
|
| Service | Port | Image | Statut | Description |
|
||||||
- **sdk_storage** : Service de stockage (port 8081)
|
|---------|------|-------|--------|-------------|
|
||||||
- **bitcoin-signet** : Nœud Bitcoin Signet
|
| **tor-proxy** | 9050 | `btcpayserver/tor:0.4.8.10` | ✅ | Proxy anonyme pour Bitcoin |
|
||||||
- **blindbit-oracle** : Oracle blockchain (port 8000)
|
| **bitcoin-signet** | - | `git.4nkweb.com/4nk/bitcoin:latest` | ✅ | Nœud Bitcoin Signet |
|
||||||
- **tor-proxy** : Proxy Tor
|
| **blindbit-oracle** | 8000 | `git.4nkweb.com/4nk/blindbit-oracle:dev` | ✅ | Oracle blockchain |
|
||||||
- **signet_miner** : Mineur Signet
|
| **sdk_relay** | 8090-8091 | `git.4nkweb.com/4nk/sdk_relay:ext` | ✅ | Relay WebSocket |
|
||||||
- **watchtower** : Surveillance des conteneurs
|
| **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
|
### Services Externes
|
||||||
- **Signer** : dev3.4nkweb.com (port 9090 - actuellement indisponible)
|
| Service | URL | Statut | Description |
|
||||||
- **LeCoffre Front** : https://dev4.4nkweb.com/lecoffre
|
|---------|-----|--------|-------------|
|
||||||
- **IHM Client** : https://dev4.4nkweb.com
|
| **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
|
### Flux Principal
|
||||||
```yaml
|
```
|
||||||
environment:
|
Internet → dev4.4nkweb.com (Nginx) → Services Locaux
|
||||||
- SIGNER_WS_URL=ws://dev3.4nkweb.com:9090
|
├── Frontend: https://dev4.4nkweb.com/lecoffre → lecoffre-front:3004
|
||||||
- RELAY_URLS=ws://sdk_relay:8090
|
├── IHM: https://dev4.4nkweb.com/ → ihm_client:3003
|
||||||
- SIGNER_BASE_URL=https://dev3.4nkweb.com
|
├── API: https://dev4.4nkweb.com/api/ → lecoffre-back:8080
|
||||||
|
└── WebSocket: https://dev4.4nkweb.com/ws/ → sdk_relay:8090
|
||||||
```
|
```
|
||||||
|
|
||||||
### ihm_client
|
### Flux de Redirection
|
||||||
```yaml
|
```
|
||||||
environment:
|
local.4nkdev.com → local.4nkweb.com → https://dev4.4nkweb.com/lecoffre
|
||||||
- REACT_APP_RELAY_URL=ws://sdk_relay:8090
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Séquence de Démarrage
|
## ⚙️ Configuration des Services
|
||||||
|
|
||||||
### Script Optimisé
|
### Variables d'Environnement Clés
|
||||||
Le script `scripts/startup-sequence.sh` utilise les healthchecks Docker Compose pour orchestrer le démarrage :
|
```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
|
### Réseau Docker
|
||||||
2. **sdk_relay** : Attend que blindbit soit healthy, puis démarre avec healthcheck
|
- **Réseau** : `btcnet` (bridge) - subnet `172.20.0.0/16`
|
||||||
3. **ihm_client** : Attend que sdk_relay soit healthy
|
- **Volumes** : `4nk_node_bitcoin_data`, `blindbit_data`, `sdk_data`
|
||||||
4. **lecoffre-back** : Attend que sdk_relay soit healthy
|
|
||||||
5. **lecoffre-front** : Attend que lecoffre-back soit healthy
|
## 🚀 Séquence de Démarrage
|
||||||
|
|
||||||
|
### Ordre Optimisé
|
||||||
|
1. **tor** → **bitcoin** → **blindbit** → **sdk_storage** → **sdk_relay** → **sdk_signer** → **ihm_client** → **lecoffre-back** → **lecoffre-front**
|
||||||
|
|
||||||
### Healthchecks
|
### 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
|
### Watchtower
|
||||||
Le service signer sur dev3.4nkweb.com:9090 n'est pas accessible :
|
- **Mise à jour automatique** des images Docker toutes les 30 secondes
|
||||||
- Port 9090 : Connection refused
|
- **Surveillance** de tous les services avec le label `com.centurylinklabs.watchtower.enable=true`
|
||||||
- Port 443 : Nginx fonctionne mais services backend retournent 502 Bad Gateway
|
|
||||||
|
|
||||||
### Impact
|
### Commandes de Vérification
|
||||||
- lecoffre-back ne peut pas se connecter au signer distant
|
```bash
|
||||||
- ihm_client et lecoffre-front ne peuvent pas démarrer (dépendance)
|
# Statut des services
|
||||||
|
docker compose ps
|
||||||
|
|
||||||
## Solutions Temporaires
|
# Logs en temps réel
|
||||||
En attendant la résolution du problème dev3.4nkweb.com, les options sont :
|
docker compose logs -f
|
||||||
1. Utiliser le signer local (sdk_signer)
|
|
||||||
2. Attendre que le service signer soit redémarré sur dev3.4nkweb.com
|
|
||||||
|
|
||||||
## Documentation Technique
|
# Vérifier Bitcoin
|
||||||
- [Configuration des Services](CONFIGURATION_SERVICES.md)
|
docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile=/home/bitcoin/.bitcoin/signet/.cookie getblockchaininfo
|
||||||
- [Améliorations de Démarrage](STARTUP_IMPROVEMENTS.md)
|
|
||||||
|
|
||||||
## Historique
|
# Vérifier l'oracle
|
||||||
- 20/09/2025 : Implémentation des améliorations de séquence de démarrage
|
curl http://localhost:8000/tweaks/1
|
||||||
- 20/09/2025 : Résolution des problèmes de build CI
|
```
|
||||||
- 20/09/2025 : Documentation de l'architecture et des problèmes de connectivité
|
|
||||||
|
## 📚 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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
76
docs/INDEX.md
Normal 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
326
docs/MONITORING.md
Normal 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 !
|
206
docs/MONITORING_DEPLOYMENT_SUMMARY.md
Normal file
206
docs/MONITORING_DEPLOYMENT_SUMMARY.md
Normal 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 !
|
@ -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
|
|
@ -1,67 +0,0 @@
|
|||||||
### Objet
|
|
||||||
Analyse synthétique de l’orchestrateur `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 d’attention
|
|
||||||
- **Tags d’images**: 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 d’images (`docker-support-v2` si applicable) et éviter `latest` en prod
|
|
||||||
- Vérifier l’alignement `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
2
logs/bitcoin/bitcoin.log
Normal 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
|
2
logs/blindbit/blindbit.log
Normal file
2
logs/blindbit/blindbit.log
Normal 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
|
2
logs/ihm_client/ihm_client.log
Normal file
2
logs/ihm_client/ihm_client.log
Normal 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
|
2
logs/lecoffre-back/lecoffre-back.log
Normal file
2
logs/lecoffre-back/lecoffre-back.log
Normal 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
|
2
logs/lecoffre-front/lecoffre-front.log
Normal file
2
logs/lecoffre-front/lecoffre-front.log
Normal 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
2
logs/miner/miner.log
Normal 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
2
logs/nginx/nginx.log
Normal 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
|
2
logs/sdk_relay/sdk_relay.log
Normal file
2
logs/sdk_relay/sdk_relay.log
Normal 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
|
2
logs/sdk_signer/sdk_signer.log
Normal file
2
logs/sdk_signer/sdk_signer.log
Normal 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
|
2
logs/sdk_storage/sdk_storage.log
Normal file
2
logs/sdk_storage/sdk_storage.log
Normal 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
2
logs/tor/tor.log
Normal 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
38
scripts/collect-logs.sh
Executable 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
265
scripts/deploy-grafana.sh
Executable 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
103
scripts/setup-logs.sh
Executable 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
220
scripts/sync-monitoring-config.sh
Executable 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
32
scripts/test-monitoring.sh
Executable 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!"
|
Loading…
x
Reference in New Issue
Block a user