**Motivations:** - Add API services for anchorage and faucet functionality - Add dashboard interface for signet monitoring - Improve documentation and maintenance guides - Enhance existing scripts for better functionality **Root causes:** - Need for API services to interact with Bitcoin Signet - Need for user-friendly dashboard interface - Need for comprehensive documentation - Scripts required improvements for better reliability **Correctifs:** - Updated Dockerfile with better configuration - Improved gen-bitcoind-conf.sh and gen-signet-keys.sh scripts - Enhanced mine.sh, miner, run.sh, and setup-signet.sh scripts - Updated env.example with new configuration options **Evolutions:** - Added api-anchorage service with anchor functionality - Added api-faucet service for testnet coin distribution - Added signet-dashboard for monitoring and management - Added comprehensive documentation in docs/ directory - Added configure-nginx-proxy.sh for proxy configuration - Added update-signet.sh for signet updates - Added ETAT_SYSTEME.md and START_DASHBOARD_AND_FAUCET.md guides - Added .bitcoin-version file for version tracking **Pages affectées:** - Dockerfile - env.example - gen-bitcoind-conf.sh - gen-signet-keys.sh - mine.sh - miner - run.sh - setup-signet.sh - api-anchorage/ (new) - api-faucet/ (new) - signet-dashboard/ (new) - docs/ (new) - configure-nginx-proxy.sh (new) - update-signet.sh (new) - ETAT_SYSTEME.md (new) - START_DASHBOARD_AND_FAUCET.md (new) - .bitcoin-version (new) - .env (modified) - mempool/ (added)
276 lines
7.7 KiB
Bash
Executable File
276 lines
7.7 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
# Script de mise à jour du Bitcoin Signet Custom
|
|
# Auteur: Équipe 4NK
|
|
# Date: 2026-01-09
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
cd "$SCRIPT_DIR"
|
|
|
|
# Couleurs pour les messages
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Fonction d'affichage
|
|
info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
}
|
|
|
|
warning() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
}
|
|
|
|
error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
# Vérification des prérequis
|
|
check_prerequisites() {
|
|
info "Vérification des prérequis..."
|
|
|
|
if ! command -v docker &> /dev/null; then
|
|
error "Docker n'est pas installé"
|
|
exit 1
|
|
fi
|
|
|
|
if ! sudo docker ps &> /dev/null; then
|
|
error "Impossible d'accéder à Docker. Vérifiez les permissions."
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -f ".env" ]; then
|
|
error "Le fichier .env n'existe pas"
|
|
exit 1
|
|
fi
|
|
|
|
success "Prérequis vérifiés"
|
|
}
|
|
|
|
# Récupération de la version actuelle
|
|
get_current_version() {
|
|
if [ -f ".bitcoin-version" ]; then
|
|
cat .bitcoin-version
|
|
else
|
|
grep -oP 'BITCOIN_VERSION=\$\{BITCOIN_VERSION:-?\K[0-9]+\.[0-9]+' Dockerfile | head -1 || echo "unknown"
|
|
fi
|
|
}
|
|
|
|
# Récupération de la dernière version disponible
|
|
get_latest_version() {
|
|
local version
|
|
|
|
# Essayer plusieurs méthodes pour récupérer la version
|
|
version=$(curl -s https://api.github.com/repos/bitcoin/bitcoin/releases/latest 2>/dev/null | \
|
|
grep -oP '"tag_name": "\Kv?[0-9]+\.[0-9]+\.[0-9]+' | head -1 | sed 's/^v//')
|
|
|
|
if [ -z "$version" ]; then
|
|
version=$(curl -s https://bitcoincore.org/bin/ 2>/dev/null | \
|
|
grep -oP 'bitcoin-core-\K[0-9]+\.[0-9]+\.[0-9]+' | sort -V | tail -1)
|
|
fi
|
|
|
|
if [ -z "$version" ]; then
|
|
# Version par défaut si aucune méthode ne fonctionne
|
|
version="30.2"
|
|
warning "Impossible de récupérer la version automatiquement, utilisation de la version par défaut: $version"
|
|
fi
|
|
|
|
echo "$version"
|
|
}
|
|
|
|
# Sauvegarde avant mise à jour
|
|
backup_data() {
|
|
info "Sauvegarde des données avant mise à jour..."
|
|
|
|
local backup_dir="backups"
|
|
local backup_file="${backup_dir}/signet-backup-$(date +%Y%m%d-%H%M%S).tar.gz"
|
|
|
|
mkdir -p "$backup_dir"
|
|
|
|
if sudo docker ps | grep -q bitcoin-signet-instance; then
|
|
info "Sauvegarde des données du conteneur..."
|
|
sudo docker exec bitcoin-signet-instance tar czf /tmp/bitcoin-backup.tar.gz /root/.bitcoin/ 2>/dev/null || true
|
|
sudo docker cp bitcoin-signet-instance:/tmp/bitcoin-backup.tar.gz "$backup_file" 2>/dev/null || true
|
|
fi
|
|
|
|
# Sauvegarder le .env
|
|
cp .env "${backup_dir}/.env.backup-$(date +%Y%m%d-%H%M%S)"
|
|
|
|
success "Sauvegarde effectuée: $backup_file"
|
|
}
|
|
|
|
# Mise à jour du Dockerfile
|
|
update_dockerfile() {
|
|
local new_version=$1
|
|
|
|
info "Mise à jour du Dockerfile avec Bitcoin Core $new_version..."
|
|
|
|
# Mettre à jour la version dans le Dockerfile
|
|
sed -i "s/ARG BITCOIN_VERSION=\${BITCOIN_VERSION:-[0-9]\+\.[0-9]\+}/ARG BITCOIN_VERSION=\${BITCOIN_VERSION:-${new_version}}/" Dockerfile
|
|
|
|
success "Dockerfile mis à jour"
|
|
}
|
|
|
|
# Reconstruction de l'image
|
|
rebuild_image() {
|
|
info "Reconstruction de l'image Docker..."
|
|
|
|
if sudo docker build -t bitcoin-signet .; then
|
|
success "Image reconstruite avec succès"
|
|
else
|
|
error "Échec de la reconstruction de l'image"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Redémarrage du conteneur
|
|
restart_container() {
|
|
info "Redémarrage du conteneur..."
|
|
|
|
# Arrêter le conteneur existant
|
|
if sudo docker ps | grep -q bitcoin-signet-instance; then
|
|
info "Arrêt du conteneur existant..."
|
|
sudo docker stop bitcoin-signet-instance
|
|
sudo docker rm bitcoin-signet-instance
|
|
fi
|
|
|
|
# Démarrer le nouveau conteneur
|
|
info "Démarrage du nouveau conteneur..."
|
|
sudo docker run --env-file .env -d \
|
|
--name bitcoin-signet-instance \
|
|
-p 38332:38332 \
|
|
-p 38333:38333 \
|
|
-p 28332:28332 \
|
|
-p 28333:28333 \
|
|
-p 28334:28334 \
|
|
bitcoin-signet
|
|
|
|
success "Conteneur redémarré"
|
|
}
|
|
|
|
# Vérification post-mise à jour
|
|
verify_update() {
|
|
info "Vérification de la mise à jour..."
|
|
|
|
sleep 10
|
|
|
|
# Vérifier que le conteneur est en cours d'exécution
|
|
if ! sudo docker ps | grep -q bitcoin-signet-instance; then
|
|
error "Le conteneur n'est pas en cours d'exécution"
|
|
return 1
|
|
fi
|
|
|
|
# Vérifier la version de Bitcoin
|
|
local version_info
|
|
version_info=$(sudo docker exec bitcoin-signet-instance bitcoin-cli -datadir=/root/.bitcoin -version 2>/dev/null || \
|
|
sudo docker exec bitcoin-signet-instance bitcoin-cli -datadir=/root/.bitcoin getnetworkinfo 2>/dev/null | grep -oP '"subversion": "\K[^"]+' || echo "unknown")
|
|
|
|
if [ "$version_info" != "unknown" ]; then
|
|
success "Version Bitcoin détectée: $version_info"
|
|
else
|
|
warning "Impossible de vérifier la version, mais le conteneur fonctionne"
|
|
fi
|
|
|
|
# Vérifier l'état de la blockchain
|
|
local blockchain_info
|
|
blockchain_info=$(sudo docker exec bitcoin-signet-instance bitcoin-cli -datadir=/root/.bitcoin getblockchaininfo 2>/dev/null | grep -oP '"chain": "\K[^"]+' || echo "unknown")
|
|
|
|
if [ "$blockchain_info" = "signet" ]; then
|
|
success "Blockchain signet opérationnelle"
|
|
else
|
|
warning "État de la blockchain: $blockchain_info"
|
|
fi
|
|
}
|
|
|
|
# Fonction principale
|
|
main() {
|
|
local target_version="${1:-}"
|
|
local current_version
|
|
local latest_version
|
|
|
|
echo "=========================================="
|
|
echo " Mise à jour du Bitcoin Signet Custom"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
check_prerequisites
|
|
|
|
current_version=$(get_current_version)
|
|
info "Version actuelle: $current_version"
|
|
|
|
if [ -n "$target_version" ]; then
|
|
latest_version="$target_version"
|
|
info "Version cible spécifiée: $latest_version"
|
|
else
|
|
info "Récupération de la dernière version disponible..."
|
|
latest_version=$(get_latest_version)
|
|
info "Dernière version disponible: $latest_version"
|
|
fi
|
|
|
|
if [ "$current_version" = "$latest_version" ]; then
|
|
success "Déjà à jour (version $current_version)"
|
|
exit 0
|
|
fi
|
|
|
|
echo ""
|
|
warning "ATTENTION: Cette mise à jour va:"
|
|
warning " 1. Arrêter le conteneur actuel"
|
|
warning " 2. Reconstruire l'image Docker"
|
|
warning " 3. Redémarrer le conteneur"
|
|
echo ""
|
|
read -p "Continuer? (o/N): " -n 1 -r
|
|
echo ""
|
|
|
|
if [[ ! $REPLY =~ ^[OoYy]$ ]]; then
|
|
info "Mise à jour annulée"
|
|
exit 0
|
|
fi
|
|
|
|
echo ""
|
|
backup_data
|
|
echo ""
|
|
update_dockerfile "$latest_version"
|
|
echo ""
|
|
rebuild_image
|
|
echo ""
|
|
restart_container
|
|
echo ""
|
|
verify_update
|
|
echo ""
|
|
|
|
# Enregistrer la nouvelle version
|
|
echo "$latest_version" > .bitcoin-version
|
|
success "Version enregistrée: $latest_version"
|
|
|
|
echo ""
|
|
success "Mise à jour terminée avec succès!"
|
|
info "Pour voir les logs: sudo docker logs -f bitcoin-signet-instance"
|
|
info "Pour vérifier l'état: sudo docker exec bitcoin-signet-instance bitcoin-cli -datadir=/root/.bitcoin getblockchaininfo"
|
|
}
|
|
|
|
# Gestion des arguments
|
|
if [ "${1:-}" = "--help" ] || [ "${1:-}" = "-h" ]; then
|
|
echo "Usage: $0 [VERSION]"
|
|
echo ""
|
|
echo "Mise à jour du Bitcoin Signet Custom"
|
|
echo ""
|
|
echo "Arguments:"
|
|
echo " VERSION Version spécifique de Bitcoin Core (ex: 27.0)"
|
|
echo " Si non spécifié, utilise la dernière version disponible"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " -h, --help Affiche cette aide"
|
|
echo ""
|
|
exit 0
|
|
fi
|
|
|
|
# Exécution du script principal
|
|
main "$@"
|