**Motivations:** - Fix 401 error on anchorage API due to .env not being loaded correctly - Fix 502 error on dashboard due to service not running - Add backup script for mining keys and wallet descriptors - Improve service management with startup scripts and systemd services **Root causes:** - dotenv.config() was called without explicit path, causing .env to be loaded from wrong directory - Services were not started automatically, causing 502 errors - No backup mechanism for critical keys and wallet data **Correctifs:** - Improved .env loading in api-anchorage/src/server.js with explicit path - Improved .env loading in signet-dashboard/src/server.js with explicit path - Added backups/ directory to .gitignore to prevent committing sensitive data - Created export-backup.sh script for backing up mining keys and wallet descriptors **Evolutions:** - Added api-anchorage/start.sh script for proper service startup - Added api-anchorage/anchorage-api.service systemd service file - Added fixKnowledge/api-anchorage-401-error.md documentation - Added fixKnowledge/dashboard-502-error.md documentation - Updated mempool submodule **Pages affectées:** - .gitignore (added backups/) - api-anchorage/src/server.js (improved .env loading) - api-anchorage/start.sh (new) - api-anchorage/anchorage-api.service (new) - signet-dashboard/src/server.js (improved .env loading) - export-backup.sh (new) - fixKnowledge/api-anchorage-401-error.md (new) - fixKnowledge/dashboard-502-error.md (new) - mempool (submodule updated)
199 lines
5.7 KiB
Markdown
199 lines
5.7 KiB
Markdown
# Correction : Erreur 401 "Invalid or missing API key" sur l'API d'ancrage
|
|
|
|
**Auteur** : Équipe 4NK
|
|
**Date** : 2026-01-24
|
|
**Version** : 1.0
|
|
|
|
## Problème Identifié
|
|
|
|
L'API d'ancrage retournait une erreur 401 "Invalid or missing API key" même avec la bonne clé API configurée dans le fichier `.env`.
|
|
|
|
### Symptômes
|
|
|
|
- L'API est accessible sur `https://anchorage.certificator.4nkweb.com`
|
|
- Le health check fonctionne (`/health`)
|
|
- Le fichier `.env` contient la bonne clé : `770b9b33-8a15-4a6d-8f95-1cd2b36e7376`
|
|
- Le backend envoie correctement le header `x-api-key`
|
|
- **Mais** : L'API retourne 401 "Invalid or missing API key"
|
|
|
|
## Cause Racine
|
|
|
|
L'API en cours d'exécution n'avait pas rechargé les variables d'environnement depuis le fichier `.env`. Le processus Node.js avait été démarré avec une ancienne configuration ou sans charger correctement le `.env`.
|
|
|
|
**Problème technique** : Le code utilisait `dotenv.config()` sans chemin explicite, ce qui pouvait charger le `.env` depuis un mauvais répertoire si le script était exécuté depuis un autre répertoire que celui de l'API.
|
|
|
|
## Correctifs Appliqués
|
|
|
|
### 1. Amélioration du chargement du `.env` dans `server.js`
|
|
|
|
**Fichier** : `api-anchorage/src/server.js`
|
|
|
|
**Avant** :
|
|
```javascript
|
|
import dotenv from 'dotenv';
|
|
// ...
|
|
dotenv.config();
|
|
```
|
|
|
|
**Après** :
|
|
```javascript
|
|
import dotenv from 'dotenv';
|
|
import { fileURLToPath } from 'url';
|
|
import { dirname, join } from 'path';
|
|
|
|
// Get the directory of the current module
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = dirname(__filename);
|
|
|
|
// Charger les variables d'environnement depuis le répertoire racine du projet api-anchorage
|
|
// Cela garantit que le .env est chargé même si le script est exécuté depuis un autre répertoire
|
|
const envPath = join(__dirname, '../.env');
|
|
dotenv.config({ path: envPath });
|
|
```
|
|
|
|
**Impact** : Le `.env` est maintenant chargé depuis un chemin explicite, garantissant que le bon fichier est utilisé même si le script est exécuté depuis un autre répertoire.
|
|
|
|
### 2. Création d'un script de démarrage
|
|
|
|
**Fichier** : `api-anchorage/start.sh`
|
|
|
|
Script bash qui :
|
|
- Vérifie que le fichier `.env` existe
|
|
- Vérifie que Node.js est installé
|
|
- Installe les dépendances si nécessaire
|
|
- Charge explicitement les variables d'environnement
|
|
- Démarre l'API
|
|
|
|
### 3. Création d'un service systemd
|
|
|
|
**Fichier** : `api-anchorage/anchorage-api.service`
|
|
|
|
Service systemd pour gérer l'API correctement avec :
|
|
- Redémarrage automatique en cas d'échec
|
|
- Journalisation des logs
|
|
- Configuration de sécurité
|
|
|
|
## Modifications
|
|
|
|
### Fichiers Modifiés
|
|
|
|
- `api-anchorage/src/server.js` : Amélioration du chargement du `.env` avec chemin explicite
|
|
|
|
### Fichiers Créés
|
|
|
|
- `api-anchorage/start.sh` : Script de démarrage
|
|
- `api-anchorage/anchorage-api.service` : Service systemd
|
|
- `fixKnowledge/api-anchorage-401-error.md` : Cette documentation
|
|
|
|
## Modalités de Déploiement
|
|
|
|
### Redémarrage de l'API
|
|
|
|
1. **Arrêter les processus existants** :
|
|
```bash
|
|
# Trouver les processus
|
|
ps aux | grep "node src/server.js" | grep -v grep
|
|
|
|
# Arrêter les processus (remplacer PID par les PIDs trouvés)
|
|
kill <PID>
|
|
```
|
|
|
|
2. **Vérifier que le port est libre** :
|
|
```bash
|
|
sudo lsof -i :3010
|
|
```
|
|
|
|
3. **Démarrer l'API** :
|
|
```bash
|
|
cd /home/ncantu/Bureau/code/bitcoin/api-anchorage
|
|
npm start
|
|
# Ou utiliser le script de démarrage
|
|
./start.sh
|
|
```
|
|
|
|
### Installation du service systemd (optionnel)
|
|
|
|
1. **Copier le service** :
|
|
```bash
|
|
sudo cp api-anchorage/anchorage-api.service /etc/systemd/system/
|
|
```
|
|
|
|
2. **Recharger systemd** :
|
|
```bash
|
|
sudo systemctl daemon-reload
|
|
```
|
|
|
|
3. **Activer et démarrer le service** :
|
|
```bash
|
|
sudo systemctl enable anchorage-api
|
|
sudo systemctl start anchorage-api
|
|
```
|
|
|
|
4. **Vérifier le statut** :
|
|
```bash
|
|
sudo systemctl status anchorage-api
|
|
```
|
|
|
|
## Modalités d'Analyse
|
|
|
|
### Vérification que l'API fonctionne
|
|
|
|
1. **Test du health check** :
|
|
```bash
|
|
curl http://localhost:3010/health
|
|
```
|
|
|
|
2. **Test avec la clé API** :
|
|
```bash
|
|
curl -X POST http://localhost:3010/api/anchor/document \
|
|
-H 'Content-Type: application/json' \
|
|
-H 'x-api-key: 770b9b33-8a15-4a6d-8f95-1cd2b36e7376' \
|
|
--data-raw '{"hash":"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"}'
|
|
```
|
|
|
|
3. **Vérifier les logs** :
|
|
```bash
|
|
# Si démarré avec npm start
|
|
tail -f /tmp/anchorage-api.log
|
|
|
|
# Si démarré avec systemd
|
|
sudo journalctl -u anchorage-api -f
|
|
```
|
|
|
|
### Vérification du chargement du `.env`
|
|
|
|
1. **Vérifier que le `.env` contient la bonne clé** :
|
|
```bash
|
|
cd api-anchorage
|
|
grep API_KEYS .env
|
|
```
|
|
|
|
2. **Vérifier que l'API charge le `.env`** :
|
|
- Les logs au démarrage doivent afficher le port et le host configurés
|
|
- Si l'API accepte la clé API, le `.env` est correctement chargé
|
|
|
|
## Résultat
|
|
|
|
✅ **Problème résolu**
|
|
|
|
- L'API charge maintenant correctement le `.env` depuis un chemin explicite
|
|
- La clé API `770b9b33-8a15-4a6d-8f95-1cd2b36e7376` est acceptée
|
|
- L'ancrage fonctionne correctement
|
|
- Les transactions sont créées et envoyées au mempool
|
|
|
|
## Prévention
|
|
|
|
Pour éviter ce problème à l'avenir :
|
|
|
|
1. **Toujours utiliser un chemin explicite pour le `.env`** dans les applications Node.js
|
|
2. **Redémarrer l'API après modification du `.env`**
|
|
3. **Utiliser un service systemd ou PM2** pour gérer l'API et faciliter les redémarrages
|
|
4. **Vérifier les logs au démarrage** pour confirmer que les variables d'environnement sont chargées
|
|
|
|
## Pages Affectées
|
|
|
|
- `api-anchorage/src/server.js` : Amélioration du chargement du `.env`
|
|
- `api-anchorage/start.sh` : Script de démarrage (nouveau)
|
|
- `api-anchorage/anchorage-api.service` : Service systemd (nouveau)
|
|
- `fixKnowledge/api-anchorage-401-error.md` : Documentation (nouveau)
|