anchorage_layer_simple/save-signet-datadir-backup.sh
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

60 lines
2.2 KiB
Bash
Executable File

#!/bin/bash
#
# Create a full datadir backup (blocks + chainstate + config) from the running
# Bitcoin Signet container. Use this on the machine that has the chain you want
# to keep (e.g. height ~11535), then copy the archive and run restore-signet-from-backup.sh
# on the target machine.
#
# Usage: ./save-signet-datadir-backup.sh [output_dir]
# Default output: backups/signet-datadir-YYYYMMDD-HHMMSS.tar.gz
#
# Author: 4NK Team
# Date: 2026-02-02
set -e
CONTAINER_NAME="bitcoin-signet-instance"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
OUTPUT_DIR="${1:-$SCRIPT_DIR/backups}"
mkdir -p "$OUTPUT_DIR"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
BACKUP_FILE="$OUTPUT_DIR/signet-datadir-$TIMESTAMP.tar.gz"
if ! docker ps --format "{{.Names}}" | grep -q "^${CONTAINER_NAME}$"; then
echo "Error: Container $CONTAINER_NAME is not running."
exit 1
fi
# Datadir inside container: use BITCOIN_DIR from container so backup matches actual bitcoind data
DATADIR=$(docker exec "$CONTAINER_NAME" printenv BITCOIN_DIR 2>/dev/null || echo "/root/.bitcoin")
DATADIR_REL="${DATADIR#/}"
echo "=== Full Signet datadir backup ==="
echo "Container: $CONTAINER_NAME"
echo "Datadir: $DATADIR"
echo "Output: $BACKUP_FILE"
echo ""
echo "Creating archive inside container..."
# tar may exit 1 if a file changed during read (e.g. wallet.dat); archive is usually still usable
sudo docker exec "$CONTAINER_NAME" tar czf /tmp/signet-datadir-backup.tar.gz -C / "$DATADIR_REL" || { e=$?; [ "$e" -eq 1 ] || exit "$e"; }
echo "Copying archive to host..."
sudo docker cp "$CONTAINER_NAME:/tmp/signet-datadir-backup.tar.gz" "$BACKUP_FILE"
echo "Removing temp file in container..."
sudo docker exec "$CONTAINER_NAME" rm -f /tmp/signet-datadir-backup.tar.gz
echo ""
echo "Backup saved: $BACKUP_FILE"
echo "Size: $(du -h "$BACKUP_FILE" | cut -f1)"
# Symlink for easy download (signet-datadir-latest.tar.gz)
ln -sf "$(basename "$BACKUP_FILE")" "$OUTPUT_DIR/signet-datadir-latest.tar.gz"
echo "Latest symlink: $OUTPUT_DIR/signet-datadir-latest.tar.gz -> $(basename "$BACKUP_FILE")"
echo ""
echo "To restore on this or another machine:"
echo " ./restore-signet-from-backup.sh $BACKUP_FILE"
echo " # or: ./restore-signet-from-backup.sh $OUTPUT_DIR/signet-datadir-latest.tar.gz"
echo ""