**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
173 lines
5.1 KiB
Bash
Executable File
173 lines
5.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Script to export mining private key and wallet descriptors with private keys for backup
|
|
# Author: 4NK Team
|
|
# Date: 2026-01-23
|
|
|
|
set -e
|
|
|
|
CONTAINER_NAME="bitcoin-signet-instance"
|
|
# Use BITCOIN_DIR from container so we talk to the same datadir as bitcoind
|
|
DATADIR=""
|
|
WALLET_NAME="custom_signet"
|
|
BACKUP_DIR="./backups"
|
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
BACKUP_FILE="${BACKUP_DIR}/backup_${TIMESTAMP}.txt"
|
|
|
|
# Create backup directory if it doesn't exist
|
|
mkdir -p "${BACKUP_DIR}"
|
|
|
|
echo "=== Exporting Bitcoin Signet Backup ==="
|
|
echo "Container: ${CONTAINER_NAME}"
|
|
echo "Backup file: ${BACKUP_FILE}"
|
|
echo ""
|
|
|
|
# Check if container is running
|
|
if ! sudo docker ps --format "{{.Names}}" | grep -q "^${CONTAINER_NAME}$"; then
|
|
echo "Error: Container ${CONTAINER_NAME} is not running"
|
|
exit 1
|
|
fi
|
|
|
|
DATADIR=$(sudo docker exec "$CONTAINER_NAME" printenv BITCOIN_DIR 2>/dev/null || echo "/root/.bitcoin")
|
|
|
|
# Start backup file with header
|
|
cat > "${BACKUP_FILE}" << EOF
|
|
# Bitcoin Signet Backup
|
|
# Generated: $(date -Iseconds)
|
|
# Container: ${CONTAINER_NAME}
|
|
#
|
|
# WARNING: This file contains private keys. Keep it secure and encrypted.
|
|
# ======================================================================
|
|
|
|
EOF
|
|
|
|
# Export PRIVKEY (mining private key)
|
|
echo "1. Exporting mining private key (PRIVKEY)..."
|
|
PRIVKEY=$(sudo docker exec ${CONTAINER_NAME} cat ${DATADIR}/PRIVKEY.txt 2>/dev/null || echo "")
|
|
if [[ -n "${PRIVKEY}" ]]; then
|
|
cat >> "${BACKUP_FILE}" << EOF
|
|
## Mining Private Key (PRIVKEY)
|
|
PRIVKEY=${PRIVKEY}
|
|
|
|
EOF
|
|
echo " ✓ PRIVKEY exported"
|
|
else
|
|
echo " ⚠ PRIVKEY not found in container"
|
|
cat >> "${BACKUP_FILE}" << EOF
|
|
## Mining Private Key (PRIVKEY)
|
|
# PRIVKEY not found in container
|
|
|
|
EOF
|
|
fi
|
|
|
|
# Export SIGNETCHALLENGE
|
|
echo "2. Exporting SIGNETCHALLENGE..."
|
|
SIGNETCHALLENGE=$(sudo docker exec ${CONTAINER_NAME} cat ${DATADIR}/SIGNETCHALLENGE.txt 2>/dev/null || echo "")
|
|
if [[ -n "${SIGNETCHALLENGE}" ]]; then
|
|
cat >> "${BACKUP_FILE}" << EOF
|
|
## Signet Challenge
|
|
SIGNETCHALLENGE=${SIGNETCHALLENGE}
|
|
|
|
EOF
|
|
echo " ✓ SIGNETCHALLENGE exported"
|
|
else
|
|
echo " ⚠ SIGNETCHALLENGE not found in container"
|
|
cat >> "${BACKUP_FILE}" << EOF
|
|
## Signet Challenge
|
|
# SIGNETCHALLENGE not found in container
|
|
|
|
EOF
|
|
fi
|
|
|
|
# Export wallet descriptors with private keys
|
|
echo "3. Exporting wallet descriptors with private keys..."
|
|
cat >> "${BACKUP_FILE}" << EOF
|
|
## Wallet Descriptors (with private keys)
|
|
# Wallet name: ${WALLET_NAME}
|
|
# Command: bitcoin-cli -datadir=${DATADIR} listdescriptors true
|
|
|
|
EOF
|
|
|
|
# Get descriptors with private keys (true parameter includes private keys)
|
|
DESCRIPTORS=$(sudo docker exec ${CONTAINER_NAME} bitcoin-cli -datadir=${DATADIR} listdescriptors true 2>/dev/null || echo "")
|
|
if [[ -n "${DESCRIPTORS}" ]]; then
|
|
echo "${DESCRIPTORS}" | jq '.' >> "${BACKUP_FILE}" 2>/dev/null || echo "${DESCRIPTORS}" >> "${BACKUP_FILE}"
|
|
echo " ✓ Wallet descriptors exported"
|
|
else
|
|
echo " ⚠ Failed to export wallet descriptors"
|
|
cat >> "${BACKUP_FILE}" << EOF
|
|
# Failed to export wallet descriptors
|
|
# Make sure the wallet is loaded and accessible
|
|
|
|
EOF
|
|
fi
|
|
|
|
# Export wallet info
|
|
echo "4. Exporting wallet information..."
|
|
cat >> "${BACKUP_FILE}" << EOF
|
|
|
|
## Wallet Information
|
|
EOF
|
|
|
|
WALLET_INFO=$(sudo docker exec ${CONTAINER_NAME} bitcoin-cli -datadir=${DATADIR} getwalletinfo 2>/dev/null || echo "")
|
|
if [[ -n "${WALLET_INFO}" ]]; then
|
|
echo "${WALLET_INFO}" | jq '.' >> "${BACKUP_FILE}" 2>/dev/null || echo "${WALLET_INFO}" >> "${BACKUP_FILE}"
|
|
echo " ✓ Wallet info exported"
|
|
else
|
|
echo " ⚠ Failed to export wallet info"
|
|
cat >> "${BACKUP_FILE}" << EOF
|
|
# Failed to export wallet info
|
|
|
|
EOF
|
|
fi
|
|
|
|
# Export network info
|
|
echo "5. Exporting network information..."
|
|
cat >> "${BACKUP_FILE}" << EOF
|
|
|
|
## Network Information
|
|
EOF
|
|
|
|
NETWORK_INFO=$(sudo docker exec ${CONTAINER_NAME} bitcoin-cli -datadir=${DATADIR} getnetworkinfo 2>/dev/null || echo "")
|
|
if [[ -n "${NETWORK_INFO}" ]]; then
|
|
echo "${NETWORK_INFO}" | jq '.' >> "${BACKUP_FILE}" 2>/dev/null || echo "${NETWORK_INFO}" >> "${BACKUP_FILE}"
|
|
echo " ✓ Network info exported"
|
|
else
|
|
echo " ⚠ Failed to export network info"
|
|
fi
|
|
|
|
# Export blockchain info
|
|
echo "6. Exporting blockchain information..."
|
|
cat >> "${BACKUP_FILE}" << EOF
|
|
|
|
## Blockchain Information
|
|
EOF
|
|
|
|
BLOCKCHAIN_INFO=$(sudo docker exec ${CONTAINER_NAME} bitcoin-cli -datadir=${DATADIR} getblockchaininfo 2>/dev/null || echo "")
|
|
if [[ -n "${BLOCKCHAIN_INFO}" ]]; then
|
|
echo "${BLOCKCHAIN_INFO}" | jq '.' >> "${BACKUP_FILE}" 2>/dev/null || echo "${BLOCKCHAIN_INFO}" >> "${BACKUP_FILE}"
|
|
echo " ✓ Blockchain info exported"
|
|
else
|
|
echo " ⚠ Failed to export blockchain info"
|
|
fi
|
|
|
|
# Add footer
|
|
cat >> "${BACKUP_FILE}" << EOF
|
|
|
|
# ======================================================================
|
|
# End of Backup
|
|
# ======================================================================
|
|
EOF
|
|
|
|
echo ""
|
|
echo "=== Backup completed ==="
|
|
echo "Backup file: ${BACKUP_FILE}"
|
|
echo "File size: $(du -h "${BACKUP_FILE}" | cut -f1)"
|
|
echo ""
|
|
echo "⚠ WARNING: This file contains private keys. Keep it secure!"
|
|
echo " Recommended: Encrypt this file before storing or transferring."
|
|
echo ""
|
|
echo "To encrypt the backup:"
|
|
echo " gpg -c ${BACKUP_FILE}"
|
|
echo ""
|