Files
headscale/headscale_backup_and_restore.sh
Timmy 1410ba6630 Initial commit: Headscale management scripts and configuration
- Add headscale binary and configuration files
- Include management scripts for API keys, nodes, and authentication
- Add Docker setup with docker-compose
- Include backup and restore functionality
- Add example scripts for creating API keys and pre-auth keys

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-03-24 10:08:28 +08:00

60 lines
1.6 KiB
Bash
Executable File

#!/bin/bash
set -e # Stop script if any command fails
# Parameters
BACKUP_SERVER="192.168.42.126"
BACKUP_SERVER_USER="root"
REMOTE_TMP_DIR="/tmp"
REMOTE_TARGET_DIR="/opt/headscale"
cd /opt/headscale
NOW=$(date +"%Y%m%d_%H%M%S")
TARFILE="headscale_backup_$NOW.tar.gz"
echo "1. Stop Headscale Docker service..."
docker compose down
echo "2. Create tar.gz backup..."
tar czvf "/tmp/$TARFILE" .
echo "3. Calculate local checksum (db.sqlite)..."
LOCAL_SUM=$(md5sum /opt/headscale/data/db.sqlite | awk '{print $1}')
echo "4. Start Headscale Docker service again..."
docker compose up -d
echo "5. Copy backup to backup server..."
scp "/tmp/$TARFILE" "$BACKUP_SERVER_USER@$BACKUP_SERVER:$REMOTE_TMP_DIR/"
rm -f "/tmp/$TARFILE"
echo "6. Restore backup and verify checksum on backup server..."
ssh "$BACKUP_SERVER_USER@$BACKUP_SERVER" "bash -s" <<EOF
set -e
START_TIME=\$(date '+%Y%m%d_%H%M%S')
LOGFILE="$REMOTE_TARGET_DIR/backup_restore_check_\$START_TIME.txt"
rm -rf $REMOTE_TARGET_DIR
mkdir -p $REMOTE_TARGET_DIR
cd $REMOTE_TARGET_DIR
tar xzvf $REMOTE_TMP_DIR/$TARFILE
rm -f $REMOTE_TMP_DIR/$TARFILE
REMOTE_SUM=\$(md5sum $REMOTE_TARGET_DIR/data/db.sqlite | awk '{print \$1}')
COMPARE_RESULT="NOT MATCH"
if [ "$LOCAL_SUM" = "\$REMOTE_SUM" ]; then
COMPARE_RESULT="MATCH"
fi
{
echo "=== BACKUP & RESTORE CHECK ==="
echo "Time: \$START_TIME"
echo "Local db.sqlite md5sum: $LOCAL_SUM"
echo "Remote db.sqlite md5sum: \$REMOTE_SUM"
echo "Compare result: \$COMPARE_RESULT"
echo "Status: Finished restore and checksum"
echo "=============================="
} > "\$LOGFILE"
EOF
echo "=== DONE ==="