anchorage_layer_simple/fixKnowledge/api-anchorage-health-503-remediation.md
ncantu 937646cc45 Daily backup to git cron, backup/restore scripts, docs
**Motivations:**
- Export Signet and mining wallet backups to git with only 2 versions kept
- Document and add backup/restore scripts for signet and mining wallet

**Correctifs:**
- Backup-to-git uses SSH URL for passwordless cron; copy timestamped files only; prune to 2 versions; remove *-latest from backup repo

**Evolutions:**
- data/backup-to-git-cron.sh: daily export to git.4nkweb.com/4nk/backup
- save-signet-datadir-backup.sh, restore-signet-from-backup.sh, export-mining-wallet.sh, import-mining-wallet.sh
- features/backup-to-git-daily-cron.md, docs/MAINTENANCE.md backup section
- .gitignore: data/backup-to-git.log

**Pages affectées:**
- .gitignore, data/backup-to-git-cron.sh, docs/MAINTENANCE.md, features/backup-to-git-daily-cron.md
- save-signet-datadir-backup.sh, restore-signet-from-backup.sh, export-mining-wallet.sh, import-mining-wallet.sh
- Plus autres fichiers modifiés ou non suivis déjà présents dans le working tree
2026-02-04 03:07:57 +01:00

4.7 KiB
Raw Blame History

Correction: Health check anchor-api HTTP 503 causes et remédiation

Date: 2026-01-28 Auteur: Équipe 4NK

Problème

Le health check de lAPI dancrage renvoie HTTP 503, avec des messages du type « Health check a échoué (HTTP 503) » ou « LAPI dancrage nest pas accessible », sans indiquer la cause précise.

Machine concernée : 192.168.1.105 (bitcoin)
Domaine externe : https://anchorage.certificator.4nkweb.com
Service : anchorage-api (port 3010)

Impact

  • Monitoring ou dashboard marquent lAPI comme indisponible sans distinguer « processus arrêté » et « pas prêt » (Bitcoin déconnecté, UTXOs verrouillés).
  • Lutilisateur ne voit pas la raison du 503 (Bitcoin, mutex, UTXOs stale) pour agir.

Root cause

  1. Causes du 503 côté api-anchorage (src/routes/health.js) :

    • GET /health : 503 si Bitcoin RPC non connecté ou si checkConnection() lève.
    • GET /health/detailed : 503 si Bitcoin non connecté, ou UTXOs verrouillés depuis > 10 min (stale_locks > 0), ou plus de 10 UTXOs verrouillés.
  2. Causes côté consommateur :

    • Le dashboard proxy renvoyait 200 avec un body réduit au lieu de transmettre le 503 et le body complet → le client ne voyait pas la raison.
    • Aucun endpoint de liveness (processus vivant) → impossible de distinguer « service down » et « service up mais not ready ».

Correctifs

1. api-anchorage : endpoint de liveness

  • GET /health/live : retourne toujours 200 tant que le processus tourne (sans vérifier Bitcoin ni mutex).
  • Usage : monitoring / load-balancer pour ne pas considérer le service comme mort quand il renvoie 503 (readiness).
  • Exclusion de lauth API Key pour /health/live dans server.js.

2. signet-dashboard : propagation du 503 et du body

  • Option preserveStatus dans makeHttpRequest : retourne { statusCode, body } pour préserver le code HTTP et le body JSON.
  • Route GET /api/anchor/health/detailed : appelle lAPI dancrage avec preserveStatus: true, puis répond avec res.status(result.statusCode).json(result.body).
  • Effet : en cas de 503, le client reçoit 503 et le détail (bitcoin.connected, mutex, utxos, stale_locks).

3. signet-dashboard (hash-list.html) : affichage de la raison

  • Si la réponse est 503 et que le body na pas la structure health (mutex, utxos, bitcoin), affichage dun message derreur incluant health.error ou health.message et le code 503.
  • Si la réponse est 503 mais que le body contient le health complet, affichage du panneau health normal avec mention « 503 - voir détails ci-dessous » pour létat général.
  • En cas dexception (réseau, parse), affichage de « LAPI dancrage nest pas accessible » avec le message derreur.

Modifications

Motivations :

  • Rendre le 503 explicable (Bitcoin, mutex, UTXOs) et permettre une remédiation ciblée.
  • Séparer liveness (processus up) et readiness (prêt à ancrer).

Root causes :

  • 503 défini par lAPI sans toujours être propagé avec son body ; pas de liveness.

Correctifs :

  • GET /health/live dans api-anchorage ; propagation 503 + body dans le dashboard ; affichage de la raison dans hash-list.

Pages affectées :

  • api-anchorage/src/routes/health.js (GET /health/live)
  • api-anchorage/src/server.js (exclusion auth /health/live)
  • signet-dashboard/src/server.js (preserveStatus, route health/detailed)
  • signet-dashboard/public/hash-list.html (affichage erreur 503 et raison)

Modalités de remédiation en production

Quand le health check renvoie 503 :

  1. Vérifier liveness : curl -s https://anchorage.certificator.4nkweb.com/health/live → 200 si le processus tourne.
  2. Lire la cause : curl -s https://anchorage.certificator.4nkweb.com/health/detailed (ou via le dashboard) et regarder :
    • bitcoin.connected === false → vérifier Bitcoin Core (RPC) sur 192.168.1.105.
    • utxos.stale_locks > 0 ou utxos.locked > 10 → déverrouiller les UTXOs (voir ci-dessous).
  3. Service arrêté : sur la machine 192.168.1.105, systemctl status anchorage-api puis sudo systemctl restart anchorage-api si besoin.
  4. UTXOs verrouillés : sur la machine hébergeant api-anchorage, exécuter node unlock-utxos.mjs dans le répertoire api-anchorage, ou utiliser le bouton « Déverrouiller les UTXOs » depuis le dashboard (hash-list) si lAPI est de nouveau joignable.

Modalités danalyse

  • Consulter les logs du service : journalctl -u anchorage-api -n 100.
  • Vérifier le RPC Bitcoin : bitcoin-cli -rpcconnect=... getblockchaininfo.
  • Appeler GET /health/detailed et interpréter ok, bitcoin.connected, utxos.locked, utxos.stale_locks.