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

7.4 KiB

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 :

    docker exec bitcoin-signet-instance ps aux
    

    Si bitcoind n'apparaît pas, il a planté.

  2. Vérifier l'état du RPC :

    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 :

    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 :

    docker exec bitcoin-signet-instance du -sh /root/.bitcoin/signet/wallets/custom_signet/
    

Utiliser le script de diagnostic

./data/check-services-status.sh

Si "RPC: HORS SERVICE", bitcoind a planté.

Correctifs

Solution immédiate : Redémarrer le conteneur

docker restart bitcoin-signet-instance

Attendre 60-120 secondes que bitcoind démarre et charge le wallet, puis vérifier :

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 :

    docker stop bitcoin-signet-instance
    
  2. Vérifier l'intégrité du wallet :

    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 :

    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 :

# 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)