3 minute read

💾 Backup automático de contenedores LXC en Proxmox y subida a MEGA con MegaCMD

📋 Descripción

Este tutorial explica cómo automatizar los backups de tus contenedores LXC en Proxmox y subirlos automáticamente a tu cuenta de MEGA para guardarlos en la nube usando MegaCMD.

Consta de dos scripts:

  1. backup_all_lxc.sh → Hace backups locales de todos los LXC en /raid1/storage/dump

  2. mega_backup.sh → Sube esos backups a tu cuenta de MEGA, sin eliminar nada en Mega (borrado manual)


🧩 Requisitos previos

1. Crear la carpeta donde se guardarán los backups

mkdir -p /raid1/storage/dump
# Adapta la ruta a tu entorno

2. Instalar MegaCMD

  1. Descarga el paquete oficial para Debian/Proxmox:
wget https://mega.nz/linux/MEGAsync/Debian_11.0/amd64/megacmd-xUbuntu_22.04_amd64.deb
sudo dpkg -i megacmd-xUbuntu_22.04_amd64.deb
sudo apt -f install -y  # Para resolver dependencias
  1. Verifica la instalación e inicia sesión:
mega-login

🔹 Nota: Este tutorial usa MegaCMD, no megatools. Con MegaCMD no hay eliminación automática de archivos antiguos.


3. Crear script de backup local de LXC

Guarda este script como /usr/local/bin/backup_all_lxc.sh:

#!/bin/bash
BACKUP_DIR="/raid1/storage/dump"
MAX_BACKUPS=1
LXC_LIST=$(/usr/sbin/pct list | awk 'NR>1 && $1 != 100 {print $1}')
DATE=$(date +%Y-%m-%d_%H-%M-%S)

echo "=== Inicio de backups: $DATE ==="

for CTID in $LXC_LIST; do
    echo "📦 Iniciando backup para CTID $CTID..."

    # Apagar contenedor
    if ! /usr/sbin/pct shutdown $CTID --timeout 30; then
        /usr/sbin/pct stop $CTID
    fi

    # Esperar apagado
    TIMEOUT=10
    WAITED=0
    while /usr/sbin/pct status $CTID | grep -q "status: running"; do
        [ $WAITED -ge $TIMEOUT ] && /usr/sbin/pct stop $CTID && break
        sleep 5
        WAITED=$((WAITED + 5))
    done

    # Backup
    vzdump $CTID --dumpdir $BACKUP_DIR --mode stop --compress zstd

    # Encender contenedor
    /usr/sbin/pct start $CTID
    sleep 5

    # Limitar backups locales
    ls -1t $BACKUP_DIR/vzdump-lxc-${CTID}-*.tar.zst | tail -n +$(($MAX_BACKUPS + 1)) | while read OLD_BACKUP; do
        rm -f "$OLD_BACKUP"
    done

done

echo "✅ Todos los backups completados a $(date +%H:%M:%S)"

Hazlo ejecutable:

chmod +x /usr/local/bin/backup_all_lxc.sh

4. Crear script de subida a MegaCMD

Guarda este script como /usr/local/bin/mega_backup.sh:

#!/bin/bash

LOCAL_DIR="/raid1/storage/dump"       # Cambia según tu entorno
REMOTE_DIR="/proxmox/dump"            # Carpeta en MEGA
LOGFILE="/var/log/mega_backup.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo "[$DATE] === Iniciando subida MEGA ===" >> "$LOGFILE"

# Verificar MegaCMD
if ! command -v mega-put &>/dev/null; then
    echo "[$DATE] ERROR: megacmd no instalado" >> "$LOGFILE"
    exit 1
fi

[ ! -d "$LOCAL_DIR" ] && { echo "[$DATE] ERROR: No existe $LOCAL_DIR" >> "$LOGFILE"; exit 1; }

# Crear carpeta remota si no existe
mega-ls "$REMOTE_DIR" &>/dev/null || mega-mkdir -p "$REMOTE_DIR" >> "$LOGFILE" 2>&1

# Extraer ID de VM/LXC
extract_id() {
    echo "$1" | grep -oP 'vzdump-(lxc|qemu)-\K\d+'
}

# Comparar tamaño para decidir subir
file_needs_upload() {
    local local_file="$1"
    local remote_file="$2"
    local_size=$(stat -c %s "$local_file")
    remote_size=$(mega-ls "$REMOTE_DIR" | grep -F "$remote_file" | awk '{print $2}')
    [ -z "$remote_size" ] && return 0
    [ "$local_size" != "$remote_size" ] && return 0
    return 1
}

# Archivos locales
LOCAL_FILES=($(find "$LOCAL_DIR" -maxdepth 1 -type f \( -name "*.tar" -o -name "*.tar.zst" \) | sort))

for FILE in "${LOCAL_FILES[@]}"; do
    BASENAME=$(basename "$FILE")
    LOCAL_ID=$(extract_id "$BASENAME")
    [ -z "$LOCAL_ID" ] && { echo "[$DATE] ⏭️ Saltando $BASENAME" >> "$LOGFILE"; continue; }

    REMOTE_MATCHES=$(mega-ls "$REMOTE_DIR" | grep -E "vzdump-(lxc|qemu)-${LOCAL_ID}-")
    LATEST=""
    [ -n "$REMOTE_MATCHES" ] && LATEST=$(echo "$REMOTE_MATCHES" | sort | tail -n1)

    UPLOAD=false
    if [ -z "$LATEST" ] || file_needs_upload "$FILE" "$LATEST"; then
        UPLOAD=true
    else
        echo "[$DATE] ⏭️ $BASENAME sin cambios, nada que hacer" >> "$LOGFILE"
    fi

    $UPLOAD && {
        echo "[$DATE] Subiendo $BASENAME..." >> "$LOGFILE"
        mega-put "$FILE" "$REMOTE_DIR/" >> "$LOGFILE" 2>&1 && echo "[$DATE] ✅ Subido $BASENAME" >> "$LOGFILE"
    }

done

echo "[$DATE] === Subida completa (sin eliminar backups antiguos, se hará manualmente) ===" >> "$LOGFILE"
exit 0

Hazlo ejecutable:

chmod +x /usr/local/bin/mega_backup.sh

5. Pruebas manuales

/usr/local/bin/backup_all_lxc.sh
/usr/local/bin/mega_backup.sh
cat /var/log/mega_backup.log

6. Automatización con cron

0 2 * * * /usr/local/bin/backup_all_lxc.sh
0 4 * * * /usr/local/bin/mega_backup.sh

7. Consideraciones finales

  • El script de subida solo sube archivos nuevos o modificados.

  • No elimina ningún backup en MEGA; la limpieza de versiones antiguas es manual.

  • Archivos remotos que no tengan equivalente local permanecen intactos.

Categories:

Updated: