added scipt for restore and create backup
This commit is contained in:
parent
31b6850b9c
commit
3360921bae
49
scripts/backup-netbird.sh
Normal file
49
scripts/backup-netbird.sh
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
BACKUP_DIR="/home/Dejan/Docker/Netbird-compose/backup"
|
||||||
|
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
|
||||||
|
BACKUP_FILE="${BACKUP_DIR}/netbird_backup_${TIMESTAMP}.tar.gz"
|
||||||
|
|
||||||
|
echo "[*] Creating backup directory..."
|
||||||
|
mkdir -p "$BACKUP_DIR"
|
||||||
|
|
||||||
|
echo "[*] Stopping NetBird stack..."
|
||||||
|
docker compose down
|
||||||
|
|
||||||
|
echo "[*] Backing up Docker volumes..."
|
||||||
|
VOLUMES=(
|
||||||
|
"netbird_zdb_data"
|
||||||
|
"netbird_management"
|
||||||
|
"netbird_zitadel_certs"
|
||||||
|
)
|
||||||
|
|
||||||
|
TEMP_DIR="/tmp/netbird_backup_${TIMESTAMP}"
|
||||||
|
mkdir -p "$TEMP_DIR"
|
||||||
|
|
||||||
|
for VOL in "${VOLUMES[@]}"; do
|
||||||
|
echo "[*] Exporting volume: $VOL"
|
||||||
|
docker run --rm -v ${VOL}:/volume -v $TEMP_DIR:/backup \
|
||||||
|
alpine tar -czf /backup/${VOL}.tar.gz -C /volume .
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "[*] Backing up configuration files..."
|
||||||
|
tar -czf "$BACKUP_FILE" \
|
||||||
|
docker-compose.yml \
|
||||||
|
*.env \
|
||||||
|
management.json \
|
||||||
|
turnserver.conf \
|
||||||
|
machinekey \
|
||||||
|
traefik-stack \
|
||||||
|
backup-netbird.sh \
|
||||||
|
$TEMP_DIR/*.tar.gz
|
||||||
|
|
||||||
|
echo "[*] Cleaning temporary files..."
|
||||||
|
rm -rf "$TEMP_DIR"
|
||||||
|
|
||||||
|
echo "[*] Starting NetBird stack again..."
|
||||||
|
docker compose up -d
|
||||||
|
|
||||||
|
echo "======================================================"
|
||||||
|
echo "Backup created: $BACKUP_FILE"
|
||||||
|
echo "======================================================"
|
||||||
252
scripts/readme.md
Normal file
252
scripts/readme.md
Normal file
|
|
@ -0,0 +1,252 @@
|
||||||
|
# NetBird Backup & Restore Scripts
|
||||||
|
|
||||||
|
Comprehensive backup and restore solution for NetBird Docker deployments with Zitadel integration.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
These scripts provide automated backup and restore functionality for your NetBird installation, including:
|
||||||
|
- Docker volumes (database, management data, certificates)
|
||||||
|
- Configuration files (docker-compose, environment variables)
|
||||||
|
- Traefik reverse proxy configuration
|
||||||
|
- Zitadel authentication data
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Docker and Docker Compose installed
|
||||||
|
- NetBird deployed via Docker Compose
|
||||||
|
- Sufficient disk space for backups
|
||||||
|
- Root or sudo access for Docker operations
|
||||||
|
|
||||||
|
## Files
|
||||||
|
|
||||||
|
### 1. `backup-netbird.sh`
|
||||||
|
Creates timestamped backups of your complete NetBird installation.
|
||||||
|
|
||||||
|
### 2. `restore-netbird.sh`
|
||||||
|
Restores NetBird from a backup archive.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
1. Place both scripts in your NetBird installation directory:
|
||||||
|
```bash
|
||||||
|
/home/Dejan/Docker/Netbird-compose/
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Make scripts executable:
|
||||||
|
```bash
|
||||||
|
chmod +x backup-netbird.sh restore-netbird.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Ensure the backup directory exists:
|
||||||
|
```bash
|
||||||
|
mkdir -p /home/Dejan/Docker/Netbird-compose/backup
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Creating a Backup
|
||||||
|
|
||||||
|
Run the backup script from your NetBird directory:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /home/Dejan/Docker/Netbird-compose
|
||||||
|
./backup-netbird.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
**What happens during backup:**
|
||||||
|
1. Creates backup directory if it doesn't exist
|
||||||
|
2. Stops the NetBird Docker stack
|
||||||
|
3. Exports all Docker volumes to compressed archives
|
||||||
|
4. Archives configuration files
|
||||||
|
5. Restarts the NetBird stack
|
||||||
|
6. Creates a timestamped backup file: `netbird_backup_YYYY-MM-DD_HH-MM-SS.tar.gz`
|
||||||
|
|
||||||
|
**Backup includes:**
|
||||||
|
- Docker volumes: `netbird_zdb_data`, `netbird_management`, `netbird_zitadel_certs`
|
||||||
|
- Configuration: `docker-compose.yml`, `*.env` files
|
||||||
|
- NetBird config: `management.json`, `turnserver.conf`
|
||||||
|
- Authentication: `machinekey` directory
|
||||||
|
- Reverse proxy: `traefik-stack` directory
|
||||||
|
- The backup script itself
|
||||||
|
|
||||||
|
### Restoring from Backup
|
||||||
|
|
||||||
|
#### Option 1: Restore latest backup (automatic)
|
||||||
|
```bash
|
||||||
|
cd /home/Dejan/Docker/Netbird-compose
|
||||||
|
./restore-netbird.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Option 2: Restore specific backup
|
||||||
|
```bash
|
||||||
|
./restore-netbird.sh netbird_backup_2024-11-24_14-30-00.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
Or with full path:
|
||||||
|
```bash
|
||||||
|
./restore-netbird.sh /home/Dejan/Docker/Netbird-compose/backup/netbird_backup_2024-11-24_14-30-00.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
**What happens during restore:**
|
||||||
|
1. Validates backup file exists
|
||||||
|
2. Extracts backup to temporary directory
|
||||||
|
3. Stops current NetBird stack
|
||||||
|
4. Restores all Docker volumes
|
||||||
|
5. Restores configuration files
|
||||||
|
6. Cleans up temporary files
|
||||||
|
7. Starts NetBird stack with restored data
|
||||||
|
|
||||||
|
## Backup Schedule
|
||||||
|
|
||||||
|
### Manual Backups
|
||||||
|
Run before major changes:
|
||||||
|
- System updates
|
||||||
|
- Configuration modifications
|
||||||
|
- Docker Compose upgrades
|
||||||
|
|
||||||
|
### Automated Backups (Recommended)
|
||||||
|
|
||||||
|
Add to crontab for automatic daily backups:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
crontab -e
|
||||||
|
```
|
||||||
|
|
||||||
|
Add this line for daily backup at 2 AM:
|
||||||
|
```cron
|
||||||
|
0 2 * * * /home/Dejan/Docker/Netbird-compose/backup-netbird.sh >> /var/log/netbird-backup.log 2>&1
|
||||||
|
```
|
||||||
|
|
||||||
|
For weekly backups (Sunday at 3 AM):
|
||||||
|
```cron
|
||||||
|
0 3 * * 0 /home/Dejan/Docker/Netbird-compose/backup-netbird.sh >> /var/log/netbird-backup.log 2>&1
|
||||||
|
```
|
||||||
|
|
||||||
|
## Backup Management
|
||||||
|
|
||||||
|
### View Available Backups
|
||||||
|
```bash
|
||||||
|
ls -lh /home/Dejan/Docker/Netbird-compose/backup/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Delete Old Backups
|
||||||
|
Keep only last 7 backups:
|
||||||
|
```bash
|
||||||
|
cd /home/Dejan/Docker/Netbird-compose/backup
|
||||||
|
ls -1t netbird_backup_*.tar.gz | tail -n +8 | xargs rm -f
|
||||||
|
```
|
||||||
|
|
||||||
|
### Backup Retention Script
|
||||||
|
Create `cleanup-old-backups.sh`:
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
BACKUP_DIR="/home/Dejan/Docker/Netbird-compose/backup"
|
||||||
|
KEEP_LAST=7
|
||||||
|
cd "$BACKUP_DIR"
|
||||||
|
ls -1t netbird_backup_*.tar.gz | tail -n +$((KEEP_LAST + 1)) | xargs -r rm -f
|
||||||
|
echo "Cleaned up old backups, kept last $KEEP_LAST"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Backup Script Fails
|
||||||
|
- **Insufficient disk space**: Check available space with `df -h`
|
||||||
|
- **Docker not running**: Start Docker service: `sudo systemctl start docker`
|
||||||
|
- **Permission denied**: Run with sudo: `sudo ./backup-netbird.sh`
|
||||||
|
|
||||||
|
### Restore Script Fails
|
||||||
|
- **Backup file not found**: Verify path and filename
|
||||||
|
- **Volume restore fails**: Check Docker is running and volumes are accessible
|
||||||
|
- **Stack won't start**: Check logs: `docker compose logs`
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
**Stack doesn't start after restore:**
|
||||||
|
```bash
|
||||||
|
# Check container logs
|
||||||
|
docker compose logs -f
|
||||||
|
|
||||||
|
# Verify volumes exist
|
||||||
|
docker volume ls | grep netbird
|
||||||
|
|
||||||
|
# Try manual restart
|
||||||
|
docker compose down
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
**Configuration mismatch:**
|
||||||
|
```bash
|
||||||
|
# Verify restored files
|
||||||
|
ls -la /home/Dejan/Docker/Netbird-compose/
|
||||||
|
|
||||||
|
# Check environment variables
|
||||||
|
cat .env
|
||||||
|
```
|
||||||
|
|
||||||
|
## Important Notes
|
||||||
|
|
||||||
|
- **Downtime**: Both backup and restore scripts stop the NetBird stack temporarily
|
||||||
|
- **Backup size**: Varies based on database size and user count (typically 100MB-1GB)
|
||||||
|
- **Storage**: Ensure adequate backup storage space
|
||||||
|
- **Testing**: Test restore process in a development environment first
|
||||||
|
- **Security**: Backup files contain sensitive data - secure appropriately
|
||||||
|
|
||||||
|
## Backup Security
|
||||||
|
|
||||||
|
Protect your backups:
|
||||||
|
|
||||||
|
1. **Restrict permissions:**
|
||||||
|
```bash
|
||||||
|
chmod 700 /home/Dejan/Docker/Netbird-compose/backup
|
||||||
|
chmod 600 /home/Dejan/Docker/Netbird-compose/backup/*.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Encrypt backups (optional):**
|
||||||
|
```bash
|
||||||
|
gpg --symmetric --cipher-algo AES256 netbird_backup_*.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Off-site backup:**
|
||||||
|
```bash
|
||||||
|
# Example: rsync to remote server
|
||||||
|
rsync -avz backup/ user@backup-server:/backups/netbird/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Migration Guide
|
||||||
|
|
||||||
|
To migrate NetBird to a new server:
|
||||||
|
|
||||||
|
1. **On old server:** Create backup
|
||||||
|
```bash
|
||||||
|
./backup-netbird.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Transfer backup file:**
|
||||||
|
```bash
|
||||||
|
scp backup/netbird_backup_*.tar.gz user@new-server:/tmp/
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **On new server:** Install Docker, Docker Compose, and NetBird structure
|
||||||
|
|
||||||
|
4. **Restore backup:**
|
||||||
|
```bash
|
||||||
|
./restore-netbird.sh /tmp/netbird_backup_*.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
5. **Update DNS/IP** if necessary
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
For issues or questions:
|
||||||
|
- Check NetBird documentation: https://docs.netbird.io
|
||||||
|
- Review Docker Compose logs: `docker compose logs`
|
||||||
|
- Verify volume integrity: `docker volume inspect <volume_name>`
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
|
||||||
|
- **v1.0** - Initial backup and restore scripts with full volume and config support
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Created for NetBird deployment at:** `/home/Dejan/Docker/Netbird-compose/`
|
||||||
|
**Last updated:** November 2024
|
||||||
134
scripts/restore-netbird.sh
Normal file
134
scripts/restore-netbird.sh
Normal file
|
|
@ -0,0 +1,134 @@
|
||||||
|
#!/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 "=========================================================="
|
||||||
Loading…
Reference in a new issue