anchorage_layer_simple/fixKnowledge/signet-bitcoind-crash-wallet-loading-stuck.md
ncantu e0ce7a9d83 Optimize sync-utxos RPC calls and document bitcoind crash issues
**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>
2026-02-08 08:18:26 +01:00

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)