Netbird/scripts/restore-netbird.sh

135 lines
3.7 KiB
Bash
Raw Normal View History

#!/bin/bash
set -e
# ============================================
# CONFIG
# ============================================
BASE_DIR="/home/Dejan/Docker/Netbird-compose"
BACKUP_DIR="${BASE_DIR}/backup"
cd "$BASE_DIR"
# ============================================
# SELECT BACKUP FILE
# ============================================
if [[ -n "$1" ]]; then
BACKUP_FILE="$1"
# If a relative path is passed, prepend BACKUP_DIR if file not found
if [[ ! -f "$BACKUP_FILE" ]]; then
if [[ -f "${BACKUP_DIR}/$BACKUP_FILE" ]]; then
BACKUP_FILE="${BACKUP_DIR}/$BACKUP_FILE"
fi
fi
else
# Auto-select latest backup
BACKUP_FILE=$(ls -1t "${BACKUP_DIR}"/netbird_backup_*.tar.gz 2>/dev/null | head -n 1 || true)
fi
if [[ -z "$BACKUP_FILE" || ! -f "$BACKUP_FILE" ]]; then
echo "ERROR: Backup file not found."
echo "Usage: $0 [path/to/netbird_backup_*.tar.gz]"
exit 1
fi
echo "[*] Using backup file: $BACKUP_FILE"
# ============================================
# PREPARE TEMP DIR
# ============================================
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
TEMP_DIR="/tmp/netbird_restore_${TIMESTAMP}"
echo "[*] Creating temp directory: $TEMP_DIR"
mkdir -p "$TEMP_DIR"
echo "[*] Extracting backup archive..."
tar -xzf "$BACKUP_FILE" -C "$TEMP_DIR"
# ============================================
# STOP CURRENT STACK
# ============================================
echo "[*] Stopping current NetBird stack (if running)..."
docker compose down || true
# ============================================
# RESTORE DOCKER VOLUMES
# ============================================
VOLUMES=(
"netbird_zdb_data"
"netbird_management"
"netbird_zitadel_certs"
)
for VOL in "${VOLUMES[@]}"; do
VOL_ARCHIVE="${TEMP_DIR}/${VOL}.tar.gz"
if [[ ! -f "$VOL_ARCHIVE" ]]; then
echo "[!] WARNING: Volume archive not found for ${VOL} at ${VOL_ARCHIVE}, skipping..."
continue
fi
echo "[*] Ensuring Docker volume exists: $VOL"
if ! docker volume ls -q | grep -q "^${VOL}$"; then
docker volume create "$VOL" >/dev/null
fi
echo "[*] Restoring volume: $VOL"
docker run --rm \
-v "${VOL}:/volume" \
-v "${TEMP_DIR}:/backup" \
alpine sh -c "cd /volume && tar -xzf /backup/$(basename "$VOL_ARCHIVE")"
done
# ============================================
# RESTORE CONFIG FILES
# ============================================
echo "[*] Restoring configuration files to ${BASE_DIR}..."
# docker-compose.yml
if [[ -f "${TEMP_DIR}/docker-compose.yml" ]]; then
cp -a "${TEMP_DIR}/docker-compose.yml" "${BASE_DIR}/"
fi
# *.env files
if ls "${TEMP_DIR}"/*.env >/dev/null 2>&1; then
cp -a "${TEMP_DIR}"/*.env "${BASE_DIR}/"
fi
# management.json
if [[ -f "${TEMP_DIR}/management.json" ]]; then
cp -a "${TEMP_DIR}/management.json" "${BASE_DIR}/"
fi
# turnserver.conf
if [[ -f "${TEMP_DIR}/turnserver.conf" ]]; then
cp -a "${TEMP_DIR}/turnserver.conf" "${BASE_DIR}/"
fi
# machinekey directory
if [[ -d "${TEMP_DIR}/machinekey" ]]; then
rm -rf "${BASE_DIR}/machinekey"
cp -a "${TEMP_DIR}/machinekey" "${BASE_DIR}/"
fi
# traefik-stack directory (if present in backup)
if [[ -d "${TEMP_DIR}/traefik-stack" ]]; then
rm -rf "${BASE_DIR}/traefik-stack"
cp -a "${TEMP_DIR}/traefik-stack" "${BASE_DIR}/"
fi
# ============================================
# CLEAN UP TEMP
# ============================================
echo "[*] Cleaning up temporary directory..."
rm -rf "$TEMP_DIR"
# ============================================
# START STACK
# ============================================
echo "[*] Starting NetBird stack..."
docker compose up -d
echo "=========================================================="
echo "Restore completed from: $BACKUP_FILE"
echo "NetBird + Zitadel stack should now be running again."
echo "=========================================================="