**Motivations:** - Prevent bitcoind crashes caused by heavy RPC calls without timeout - Document bitcoind crash and wallet loading stuck issues - Clean up obsolete files (configure-nginx-proxy.sh, userwallet components, website-skeleton, old fixKnowledge docs) **Root causes:** - RPC calls without timeout causing bitcoind crashes - No pre-check of bitcoind health before heavy operations - Large wallet (315MB) causing long loading times and potential hangs - Missing retry mechanism for transient errors **Correctifs:** - Add timeouts on RPC calls (5 minutes for listunspent, 10 seconds for healthcheck) - Add bitcoind health check before synchronization - Implement retry with exponential backoff - Reduce maximumCount limit from 9999999 to 500000 UTXOs - Improve cron script with pre-checks and better error handling - Add container status verification before script execution **Evolutions:** - New check-services-status.sh script for service diagnostics - Documentation of crash issues in fixKnowledge - Improved logging with timestamps - Better error messages and handling **Pages affectées:** - data/sync-utxos-spent-status.mjs - data/sync-utxos-cron.sh - data/restart-services-cron.sh - data/check-services-status.sh (new) - fixKnowledge/sync-utxos-rpc-optimization.md (new) - fixKnowledge/signet-bitcoind-crash-mining-stopped.md (new) - fixKnowledge/signet-bitcoind-crash-wallet-loading-stuck.md (new) - Removed obsolete files: configure-nginx-proxy.sh, userwallet components, website-skeleton files, old fixKnowledge docs Co-authored-by: Cursor <cursoragent@cursor.com>
187 lines
7.4 KiB
Markdown
187 lines
7.4 KiB
Markdown
# Signet: bitcoind crash puis blocage en chargement de wallet
|
|
|
|
**Date:** 2026-02-08
|
|
**Auteur:** Équipe 4NK
|
|
|
|
## Problème
|
|
|
|
Bitcoind a planté silencieusement dans le conteneur `bitcoin-signet-instance` vers 3h08 du matin. Le conteneur reste actif, mais le processus bitcoind n'est plus en cours d'exécution. Au redémarrage du conteneur à 07:12, bitcoind est bloqué en chargement de wallet ("Loading wallet…").
|
|
|
|
### Symptômes
|
|
|
|
1. **Conteneur actif mais bitcoind planté** :
|
|
- Le conteneur Docker est "Up" mais bitcoind n'est plus en cours d'exécution
|
|
- `ps aux` dans le conteneur montre uniquement `entrypoint.sh`, `run.sh`, `mine.sh`, `tail -f /dev/null`
|
|
- Pas de processus `bitcoind`
|
|
|
|
2. **RPC inaccessible** :
|
|
- `bitcoin-cli` retourne : `Could not connect to the server 127.0.0.1:38332`
|
|
- `curl` vers le RPC depuis l'hôte : connexion reset (exit 56)
|
|
- Le port 38332 est toujours en écoute côté hôte (mapping Docker) mais il n'y a plus de processus RPC derrière
|
|
|
|
3. **Blocage en chargement de wallet** :
|
|
- Après redémarrage, bitcoind est bloqué en "Loading wallet…"
|
|
- `bitcoin-cli getblockchaininfo` retourne : `error code: -28 error message: Loading wallet…`
|
|
- CPU à 100% mais aucun progrès visible
|
|
- Wallet volumineux : 315MB (`wallet.dat`)
|
|
|
|
4. **Erreurs des services dépendants** :
|
|
- Dashboard : erreurs "socket hang up" et "read ECONNRESET"
|
|
- Script `sync-utxos-cron.sh` : erreurs de connexion RPC
|
|
|
|
### Impact
|
|
|
|
- **Fonctionnalité** : Tous les services dépendants de bitcoind sont hors service
|
|
- **Mining** : Le minage est arrêté
|
|
- **API** : L'API d'ancrage ne peut plus fonctionner
|
|
- **Dashboard** : Le dashboard ne peut plus afficher les données de la blockchain
|
|
|
|
## Root causes
|
|
|
|
1. **Crash silencieux de bitcoind** :
|
|
- Bitcoind a planté silencieusement vers 3h08 sans message d'erreur dans les logs
|
|
- Dernière activité normale : bloc miné à 02:54:29 (height 13139)
|
|
- Nouveau bloc reçu à 03:08:48 (height 13140)
|
|
- Après cela, plus aucune activité jusqu'au redémarrage à 07:12:16
|
|
|
|
2. **Wallet volumineux** :
|
|
- Le wallet `custom_signet` fait 315MB
|
|
- Le chargement du wallet peut prendre beaucoup de temps ou bloquer si le wallet est corrompu ou trop volumineux
|
|
|
|
3. **Absence de détection automatique** :
|
|
- Le conteneur Docker reste actif même si bitcoind plante
|
|
- Aucun mécanisme de redémarrage automatique de bitcoind dans le conteneur
|
|
- Le script `check-services-status.sh` détecte le problème mais ne le corrige pas automatiquement
|
|
|
|
## Diagnostic
|
|
|
|
### Vérifier l'état actuel
|
|
|
|
1. **Vérifier les processus dans le conteneur** :
|
|
```bash
|
|
docker exec bitcoin-signet-instance ps aux
|
|
```
|
|
Si bitcoind n'apparaît pas, il a planté.
|
|
|
|
2. **Vérifier l'état du RPC** :
|
|
```bash
|
|
docker exec bitcoin-signet-instance bitcoin-cli -datadir=/root/.bitcoin getblockchaininfo
|
|
```
|
|
Si erreur "Could not connect" ou "Loading wallet…", bitcoind est planté ou bloqué.
|
|
|
|
3. **Vérifier les logs** :
|
|
```bash
|
|
docker logs bitcoin-signet-instance --tail 100
|
|
docker exec bitcoin-signet-instance tail -50 /root/.bitcoin/signet/debug.log
|
|
```
|
|
|
|
4. **Vérifier la taille du wallet** :
|
|
```bash
|
|
docker exec bitcoin-signet-instance du -sh /root/.bitcoin/signet/wallets/custom_signet/
|
|
```
|
|
|
|
### Utiliser le script de diagnostic
|
|
|
|
```bash
|
|
./data/check-services-status.sh
|
|
```
|
|
|
|
Si "RPC: HORS SERVICE", bitcoind a planté.
|
|
|
|
## Correctifs
|
|
|
|
### Solution immédiate : Redémarrer le conteneur
|
|
|
|
```bash
|
|
docker restart bitcoin-signet-instance
|
|
```
|
|
|
|
Attendre 60-120 secondes que bitcoind démarre et charge le wallet, puis vérifier :
|
|
|
|
```bash
|
|
docker exec bitcoin-signet-instance bitcoin-cli -datadir=/root/.bitcoin getblockchaininfo
|
|
```
|
|
|
|
### Si le wallet reste bloqué en chargement
|
|
|
|
Si après redémarrage, bitcoind reste bloqué en "Loading wallet…" pendant plus de 5 minutes :
|
|
|
|
1. **Arrêter le conteneur** :
|
|
```bash
|
|
docker stop bitcoin-signet-instance
|
|
```
|
|
|
|
2. **Vérifier l'intégrité du wallet** :
|
|
```bash
|
|
docker exec bitcoin-signet-instance ls -lah /root/.bitcoin/signet/wallets/custom_signet/
|
|
```
|
|
Vérifier la présence de `wallet.dat-journal` (fichier de journalisation)
|
|
|
|
3. **Redémarrer avec vérification** :
|
|
```bash
|
|
docker start bitcoin-signet-instance
|
|
docker logs bitcoin-signet-instance -f
|
|
```
|
|
Surveiller les logs pour voir si le wallet se charge correctement.
|
|
|
|
4. **Si le wallet est corrompu** :
|
|
- Sauvegarder le wallet actuel
|
|
- Essayer de réparer avec `bitcoin-wallet` (si disponible)
|
|
- Ou restaurer depuis une sauvegarde
|
|
|
|
### Solution préventive : Améliorer la détection et le redémarrage automatique
|
|
|
|
1. **Améliorer le script `check-services-status.sh`** :
|
|
- Détecter si bitcoind est planté même si le conteneur est actif
|
|
- Proposer automatiquement un redémarrage si le problème est détecté
|
|
|
|
2. **Ajouter un healthcheck Docker** :
|
|
- Créer un healthcheck qui vérifie que le RPC bitcoind répond
|
|
- Configurer Docker pour redémarrer automatiquement le conteneur si le healthcheck échoue
|
|
|
|
3. **Surveillance proactive** :
|
|
- Ajouter un cron job qui exécute `check-services-status.sh` toutes les 5 minutes
|
|
- Envoyer une alerte si bitcoind est hors service
|
|
|
|
## Prévention / suivi
|
|
|
|
- **Surveillance régulière** : Exécuter `./data/check-services-status.sh` régulièrement (ou via cron toutes les 5 minutes)
|
|
- **Logs** : Surveiller les logs bitcoind pour détecter les problèmes avant qu'ils ne causent un crash
|
|
- **Sauvegardes** : Sauvegarder régulièrement le wallet et la chaîne
|
|
- **Investigation** : En cas de répétition des crashes, investiguer (RAM, disque, `dmesg` OOM, logs bitcoind complets)
|
|
|
|
## Note importante sur les crons et la cause probable
|
|
|
|
**Le script `restart-services-cron.sh` n'est PAS actuellement dans les crontabs.**
|
|
|
|
**Cause probable du crash récurrent vers 3h** : Le script `sync-utxos-cron.sh` s'exécute à 3h00 et fait un appel RPC très lourd (`listunspent` avec `maximumCount: 9999999`). Avec un wallet volumineux (315MB) et potentiellement des centaines de milliers d'UTXOs, cet appel peut :
|
|
- Consommer beaucoup de mémoire
|
|
- Prendre beaucoup de temps
|
|
- Causer un crash de bitcoind si la mémoire est insuffisante ou si bitcoind est déjà dans un état fragile
|
|
|
|
**Recommandation pour ajouter `restart-services-cron.sh` à 4h** :
|
|
|
|
✅ **OUI, c'est prudent d'ajouter `restart-services-cron.sh` à 4h**, car :
|
|
- Le script a été amélioré pour gérer les wallets volumineux (timeout de 5 minutes, détection du chargement de wallet)
|
|
- Cela permettra de redémarrer bitcoind automatiquement après un crash potentiel vers 3h
|
|
- Le redémarrage à 4h laisse le temps au script `sync-utxos-cron.sh` de se terminer (ou d'échouer) avant le redémarrage
|
|
|
|
⚠️ **Mais il faut aussi** :
|
|
- Surveiller les logs pour confirmer que le crash est bien lié au script `sync-utxos-cron.sh`
|
|
- Considérer d'optimiser le script `sync-utxos-spent-status.mjs` pour réduire la charge sur bitcoind
|
|
- Surveiller la mémoire disponible pour bitcoind
|
|
|
|
**Configuration recommandée** :
|
|
```bash
|
|
# Ajouter dans crontab
|
|
0 4 * * * /home/ncantu/Bureau/code/bitcoin/data/restart-services-cron.sh
|
|
```
|
|
|
|
Cela redémarrera bitcoind tous les jours à 4h, ce qui permettra de récupérer automatiquement après un crash potentiel vers 3h.
|
|
|
|
## Pages affectées
|
|
|
|
- `data/check-services-status.sh` (script de vérification)
|
|
- `fixKnowledge/signet-bitcoind-crash-wallet-loading-stuck.md` (ce document)
|
|
- `fixKnowledge/signet-bitcoind-crash-mining-stopped.md` (documentation similaire)
|