#!/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 "=========================================================="