Hestia cp y hetzner copias de seguridad automatizadas

jq debe estar instalado para procesar las respuestas JSON de la API:

para instalarlo:

sudo apt install jq

debemos de crear el script con nano:
nano /usr/local/hestia/bin/heztner_snapshoot.sh

En este caso estamos usando hestiacp.

Debes de crear una api en hetzner de tu servidor, tener el id de la maquina y la url de la api de hetner siempre es la misma por default asique en el archivo heztner_snapshoot.sh
Solo debes de cambiar HETZNER_API_KEY=“TU_CLAVE_API” ------ donde pone TU_CLAVE_API poner la clave generada
y modificar la variable:

SERVER_ID=“TU_ID_DEL_SERVIDOR” en la cual deberas de poner el id del servidor para hacer los backups

Para obtener el SERVER_ID y confirmar la URL base de la API de Hetzner, sigue estos pasos:

  1. Generar una Clave API de Hetzner
    Si aún no tienes una clave API:

Inicia sesión en Hetzner Cloud Console.
Ve a Security > API Tokens.
Crea un nuevo token:
Asigna un nombre.
Selecciona los permisos adecuados (por ejemplo, “Read” y “Write”).
Guarda el token en un lugar seguro.
Este token es lo que se asigna a la variable HETZNER_API_KEY.

  1. Obtener el ID del Servidor (SERVER_ID)
    Usa tu clave API para listar tus servidores y encontrar su ID.

Abre una terminal.

Ejecuta el siguiente comando reemplazando TU_CLAVE_API con tu clave API:

bash
(EN LA URL JUNTAR DESDE EL HTTPS HASTA LOS PUNTOS) SOY NUEVO USUARIO NO PUEDO MAS DE " LINKS

curl -s -X GET “https ://api.hetzner.cloud/v1/servers”
-H “Authorization: Bearer TU_CLAVE_API” | jq
Esto devolverá una lista de servidores con información detallada. Busca el campo “id” correspondiente a tu servidor.
Ejemplo de respuesta:

json:

{
“servers”: [
{
“id”: 1234567,
“name”: “mi-servidor”,
“status”: “running”,

}
]
}
En este caso, el SERVER_ID sería 1234567.

  1. Confirmar la URL Base de la API
    La URL base de la API de Hetzner es siempre:

plaintext:

(Tengo que poner espacios por ser nuevo usuario… ) quita los espacios para que el link funcione correctamente.

https: //api. hetzner .cloud/v1
Esto está documentado en la documentación oficial de la API de Hetzner.

  1. Configurar el Script
    Con estos valores:

Clave API: TU_CLAVE_API
ID del Servidor: 1234567
Modifica las variables en el script:

HETZNER_API_KEY=“TU_CLAVE_API”
SERVER_ID=“1234567”

(QUITAR LOS ESPACIOS)

HETZNER_API_URL=“https ://api. hetzner. cloud/v1”

5 Prueba del Script
Puedes probar si la configuración funciona correctamente ejecutando un comando sencillo para listar imágenes (snapshots existentes):

curl -s -X GET “https://api.hetzner.cloud/v1/images?type=snapshot
-H “Authorization: Bearer TU_CLAVE_API” | jq
Esto debería mostrar una lista de snapshots disponibles en tu cuenta. Si no aparece nada, verifica la clave API y el ID del servidor.

AVECES EL SCRIPT TIENE PROBEMAS DEBIDO A USUARIOS NO EXPERTOS, PARA ELLO CORRIJALOS DE LA SIGUIENTE FORMA:

  1. Verificar la Ruta Actual del Script
    Asegúrate de estar en el directorio correcto. Si el archivo está en el directorio actual, verifica su existencia:

ls -l hetzner_snapshot.sh

Esto mostrará los permisos actuales del archivo. Busca una línea similar a:

-rw-r–r-- 1 user user … hetzner_snapshot.sh

Si no ves una x en los permisos, significa que no es ejecutable. (HAY QUE DARLE LOS PERMISOS DE EJECUCION)

  1. Dar Permisos de Ejecución
    Usa el siguiente comando para otorgar permisos de ejecución:

chmod +x hetzner_snapshot.sh

  1. Ejecutar el Script
    Intenta ejecutarlo nuevamente:

./hetzner_snapshot.sh

  1. Verificar el Intérprete del Script
    Asegúrate de que la primera línea del script especifique el intérprete correcto, como bash:

#!/bin/bash

Si usas sh en lugar de bash, cambia la ejecución a:

sh hetzner_snapshot.sh

  1. Ejecutar con Permisos Elevados (si es necesario)
    Si el script realiza acciones que requieren permisos administrativos, usa sudo:

sudo ./hetzner_snapshot.sh


El script es el siguiente, guardar el siguiente codigo con el nombre:

(-- hetzner_snapshot.sh --)

#!/bin/bash

Ruta al archivo de configuración de HestiaCP

HESTIA_CONFIG=“/usr/local/hestia/conf/hestia.conf”

Cargar configuración de HestiaCP

if [ -f “$HESTIA_CONFIG” ]; then
source “$HESTIA_CONFIG”
else
echo “Archivo de configuración de Hestia no encontrado.”
exit 1
fi

Clave API de Hetzner

HETZNER_API_KEY=“TU_CLAVE_API”

ID del servidor en Hetzner

SERVER_ID=“TU_ID_DEL_SERVIDOR”

URL base de la API de Hetzner

HETZNER_API_URL=“https://api.hetzner.cloud/v1

Máximo de snapshots permitidos

MAX_SNAPSHOTS=10

Crear un nuevo snapshot

create_snapshot() {
local snapshot_name=“snapshot-$(date +‘%Y%m%d-%H%M%S’)”
echo “Creando snapshot con nombre: $snapshot_name”
curl -s -X POST “$HETZNER_API_URL/servers/$SERVER_ID/actions/create_image”
-H “Authorization: Bearer $HETZNER_API_KEY”
-H “Content-Type: application/json”
-d “{"type": "snapshot", "description": "$snapshot_name"}” | jq
}

Listar snapshots del servidor

list_snapshots() {
curl -s -X GET “$HETZNER_API_URL/images?type=snapshot”
-H “Authorization: Bearer $HETZNER_API_KEY” | jq -r ‘.images | “(.id) (.created)”’
}

Eliminar un snapshot por ID

delete_snapshot() {
local snapshot_id=“$1”
echo “Eliminando snapshot con ID: $snapshot_id”
curl -s -X DELETE “$HETZNER_API_URL/images/$snapshot_id”
-H “Authorization: Bearer $HETZNER_API_KEY” | jq
}

Limpiar snapshots antiguos si exceden el máximo permitido

cleanup_snapshots() {
echo “Verificando snapshots…”
local snapshots
snapshots=$(list_snapshots | sort -k2) # Ordenar por fecha de creación

local snapshot_count
snapshot_count=$(echo "$snapshots" | wc -l)

if (( snapshot_count > MAX_SNAPSHOTS )); then
    local snapshots_to_delete
    snapshots_to_delete=$((snapshot_count - MAX_SNAPSHOTS))
    echo "Hay $snapshot_count snapshots, eliminando los $snapshots_to_delete más antiguos..."

    # Eliminar snapshots más antiguos
    echo "$snapshots" | head -n "$snapshots_to_delete" | while read -r snapshot; do
        local snapshot_id
        snapshot_id=$(echo "$snapshot" | awk '{print $1}')
        delete_snapshot "$snapshot_id"
    done
else
    echo "No hay más de $MAX_SNAPSHOTS snapshots. No se requiere limpieza."
fi

}

Crear un snapshot y limpiar si excede el límite

create_and_cleanup() {
create_snapshot
cleanup_snapshots
}

Ejecutar la función principal

create_and_cleanup


  1. Editar el Cron Job
    Abre el archivo de configuración de cron para el usuario actual:

crontab -e

Si es la primera vez que usas crontab, se te pedirá que elijas un editor. Selecciona tu preferido, como nano.

  1. Añadir una Entrada al Cron
    Al final del archivo, agrega la siguiente línea:

0 0 * * * /usr/local/hestia/bin/hetzner_snapshot.sh

Esto ejecutará el script todos los días a la medianoche. Cambia 0 0 a la hora deseada (formato 24 horas). Por ejemplo:

A las 6:30 AM: 30 6 * * *
A las 8:00 PM: 0 20 * * *

  1. Guardar y Salir
    En nano, presiona CTRL + O para guardar, luego ENTER y CTRL + X para salir.

  2. Verificar el Cron Job
    Confirma que el cron job se agregó correctamente:

crontab -l

Esto mostrará la lista de tareas programadas.

  1. Probar el Script
    Ejecuta el script manualmente una vez para asegurarte de que funciona correctamente:

/usr/local/hestia/bin/hetzner_snapshot.sh

¡Listo! Ahora el script se ejecutará automáticamente todos los días según lo programado.

  1. We are an English Website…
  2. Why included the Hetzner API key if it s not used by Hestia… Just keep it outside it…
  3. Use Code tags (```)

I thought I could speak Spanish, but if the problem is that I have to publish in English I will do it.

Hestia cp and Hetzner, it is a project that I have had to do in my work, so I have found it interesting to create a post for people who need this, since there is nothing on the web…