127 lines
No EOL
4.7 KiB
Bash
127 lines
No EOL
4.7 KiB
Bash
#!/bin/bash
|
|
set -e
|
|
|
|
# Author: hhf Adil Makmur
|
|
# GitHub: https://github.com/hhfadil
|
|
|
|
# This script performs backup and restore operations for Docker volumes within Proxmox LXC containers.
|
|
|
|
# Requirements:
|
|
# - Ensure that `sshpass` is installed. For installation instructions, visit: https://www.cyberciti.biz/faq/noninteractive-shell-script-ssh-password-provider/
|
|
# - Root login with a password must be enabled on the Proxmox host. Follow these steps:
|
|
# 1. Edit the `/etc/ssh/sshd_config` file and apply the following configuration settings:
|
|
# - ListenAddress 0.0.0.0
|
|
# - PasswordAuthentication yes
|
|
# - PermitRootLogin yes
|
|
# 2. Restart the SSH service using the command: `systemctl restart sshd`
|
|
|
|
# Usage:
|
|
# - To backup a volume: `./proxmox.sh backup --host <host> --user <user> --lxc <lxc_number> --volume <volume> --path <path>`
|
|
# - To restore a volume: `./proxmox.sh restore --host <host> --user <user> --lxc <lxc_number> --volume <volume> --path <path>`
|
|
# - Parameters:
|
|
# - `host`: Proxmox host IP address or hostname
|
|
# - `user`: Proxmox host username
|
|
# - `lxc`: LXC container number
|
|
# - `volume`: Name of the Docker volume
|
|
# - `path`: Path for the backup location
|
|
|
|
# Example:
|
|
# - To backup: `./proxmox.sh backup --host 192.168.0.100 --user root --lxc 100 --volume hhf_data --path /Users/hhf/backup`
|
|
# > The backup file will be saved to `/Users/hhf/backup/hhf_data-backup.tar.gz`.
|
|
# - To restore: `./proxmox.sh restore --host 192.168.0.100 --user root --lxc 100 --volume hhf_data --path /Users/hhf/backup`
|
|
# > The backup file will be restored from `/Users/hhf/backup/hhf_data-backup.tar.gz`, so please ensure that the file exists. This action will overwrite existing files within the Docker volume.
|
|
|
|
# ----------------------------
|
|
# Script starts here
|
|
# ----------------------------
|
|
# Function to prompt for SSH password securely
|
|
prompt_password() {
|
|
read -sp "Enter SSH password: " SSH_PASS
|
|
echo
|
|
}
|
|
# Function to perform backup
|
|
backup() {
|
|
PROXMOX_HOST=$1
|
|
PROXMOX_USER=$2
|
|
LXC_NUMBER=$3
|
|
DOCKER_VOLUME=$4
|
|
BACKUP_PATH=$5
|
|
echo "Starting backup from Proxmox host: $PROXMOX_HOST, LXC: $LXC_NUMBER, Docker volume: $DOCKER_VOLUME"
|
|
prompt_password
|
|
|
|
# Create backup directory if it doesn't exist
|
|
mkdir -p "$BACKUP_PATH"
|
|
|
|
# Perform the backup
|
|
sshpass -p "$SSH_PASS" ssh "$PROXMOX_USER@$PROXMOX_HOST" "mkdir -p /backup"
|
|
sshpass -p "$SSH_PASS" ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct exec $LXC_NUMBER -- docker run --rm -v $DOCKER_VOLUME:/mnt/data -v /backup:/backup alpine tar czf /backup/$DOCKER_VOLUME-backup.tar.gz -C /mnt/data ."
|
|
sshpass -p "$SSH_PASS" ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct pull $LXC_NUMBER /backup/$DOCKER_VOLUME-backup.tar.gz /backup/$DOCKER_VOLUME-backup.tar.gz"
|
|
sshpass -p "$SSH_PASS" scp "$PROXMOX_USER@$PROXMOX_HOST:/backup/$DOCKER_VOLUME-backup.tar.gz" "$BACKUP_PATH/"
|
|
|
|
echo "Backup completed and saved to $BACKUP_PATH"
|
|
}
|
|
# Function to perform restore
|
|
restore() {
|
|
PROXMOX_HOST=$1
|
|
PROXMOX_USER=$2
|
|
LXC_NUMBER=$3
|
|
DOCKER_VOLUME=$4
|
|
BACKUP_PATH=$5
|
|
echo "Starting restore to Proxmox host: $PROXMOX_HOST, LXC: $LXC_NUMBER, Docker volume: $DOCKER_VOLUME"
|
|
prompt_password
|
|
|
|
# Perform the restore
|
|
sshpass -p "$SSH_PASS" ssh "$PROXMOX_USER@$PROXMOX_HOST" "mkdir -p /backup"
|
|
sshpass -p "$SSH_PASS" scp "$BACKUP_PATH/$DOCKER_VOLUME-backup.tar.gz" "$PROXMOX_USER@$PROXMOX_HOST:/backup/"
|
|
sshpass -p "$SSH_PASS" ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct push $LXC_NUMBER /backup/$DOCKER_VOLUME-backup.tar.gz /backup/$DOCKER_VOLUME-backup.tar.gz"
|
|
sshpass -p "$SSH_PASS" ssh "$PROXMOX_USER@$PROXMOX_HOST" "pct exec $LXC_NUMBER -- docker run --rm -v $DOCKER_VOLUME:/mnt/data -v /backup:/backup alpine tar xzf /backup/$DOCKER_VOLUME-backup.tar.gz -C /mnt/data"
|
|
|
|
echo "Restore completed from $BACKUP_PATH"
|
|
}
|
|
# Main script logic
|
|
if [ $# -lt 1 ]; then
|
|
echo "Usage: $0 {backup|restore} --host <host> --user <user> --lxc <lxc_number> --volume <volume> --path <path>"
|
|
exit 1
|
|
fi
|
|
COMMAND=$1
|
|
shift
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
--host)
|
|
PROXMOX_HOST=$2
|
|
shift 2
|
|
;;
|
|
--user)
|
|
PROXMOX_USER=$2
|
|
shift 2
|
|
;;
|
|
--lxc)
|
|
LXC_NUMBER=$2
|
|
shift 2
|
|
;;
|
|
--volume)
|
|
DOCKER_VOLUME=$2
|
|
shift 2
|
|
;;
|
|
--path)
|
|
BACKUP_PATH=$2
|
|
shift 2
|
|
;;
|
|
*)
|
|
echo "Invalid parameter $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
case "$COMMAND" in
|
|
backup)
|
|
backup "$PROXMOX_HOST" "$PROXMOX_USER" "$LXC_NUMBER" "$DOCKER_VOLUME" "$BACKUP_PATH"
|
|
;;
|
|
restore)
|
|
restore "$PROXMOX_HOST" "$PROXMOX_USER" "$LXC_NUMBER" "$DOCKER_VOLUME" "$BACKUP_PATH"
|
|
;;
|
|
*)
|
|
echo "Invalid command $COMMAND"
|
|
exit 1
|
|
;;
|
|
esac |