Para las agencias de WordPress que gestionan sitios web de varios clientes, es esencial contar con una sólida estrategia de copias de seguridad. En caso de interrupción inesperada, fallo de un plugin o error humano, las copias de seguridad garantizan que los datos puedan restaurarse rápidamente, minimizando el tiempo de inactividad y reduciendo el riesgo para el cliente.

En Kinsta, entendemos el papel fundamental que desempeñan las copias de seguridad, por eso ofrecemos seis opciones de copia de seguridad: automática diaria, opcional cada hora (y cada seis horas), manual, generada por el sistema, descargable y copias de seguridad externas enviadas directamente a Amazon S3 o Google Cloud Storage.

Aunque gestionar estas copias de seguridad es sencilla a través del panel MyKinsta, la API de Kinsta ofrece grandes posibilidades para automatizar procesos repetitivos.

Imagina simplemente escribir un comando en Slack o configurar un cron job para activar copias de seguridad de todos tus sitios de WordPress en tu cuenta de agencia Kinsta sin tener que navegar de forma manual por decenas o incluso cientos de paneles de control de sitios.

Esta flexibilidad es una de las muchas ventajas de utilizar un alojamiento que prioriza las necesidades de sus clientes proporcionándoles las herramientas para crear soluciones personalizadas que les ahorren tiempo.

Esta guía explica cómo aprovechar la API de Kinsta para automatizar las copias de seguridad de varios sitios. Tanto si te integras con tu stack preferido, como si utilizas herramientas como Slack o estableces programaciones automatizadas, esta guía te proporciona los conocimientos necesarios para agilizar tu proceso de copia de seguridad y mejorar tu flujo de trabajo.

Implementar copias de seguridad para todos los sitios y para sitios seleccionados

Antes de sumergirte en la programación, es importante que primero entiendas cómo activar copias de seguridad para todos los sitios de tu cuenta Kinsta y cómo seleccionar sitios o entornos específicos utilizando la API Kinsta.

Una vez que tengamos la base para crear copias de seguridad, podemos integrar fácilmente la programación para automatizar el proceso.

Activar copias de seguridad para todos los sitios de una cuenta de Kinsta

Como ocurre con todas las API, no siempre hay un endpoint para hacer todo lo que necesitas — a menudo tienes que combinar varios — para lograr el resultado deseado.

La API Kinsta no es diferente. Aunque hay endpoints específicos para gestionar las copias de seguridad, estos endpoints requieren ciertos parámetros, como los ID de entorno, que obtienes haciendo peticiones adicionales a otros endpoints.

Por ejemplo, para activar una copia de seguridad manual de un sitio, necesitas el ID de entorno de ese entorno concreto. Para obtener el ID del entorno, primero necesitas el ID del sitio. Esto significa que debes hacer varias llamadas a la API: una para obtener el ID del sitio, otra para recuperar el ID del entorno y, por último, una solicitud para activar la copia de seguridad.

Paso 1: Recuperar todos los sitios WordPress con la API de Kinsta

El primer paso es recuperar una lista de todos los sitios asociados a tu cuenta de Kinsta. La API de Kinsta proporciona un endpoint para obtener estos datos, que incluyen IDs de sitios, nombres y otros detalles relevantes. Utilizando el endpoint GET /sites, puedes obtener una lista de todos los sitios bajo la cuenta de tu empresa.

Aquí tienes un ejemplo usando Node.js y Fetch API:

require('dotenv').config();

const KINSTA_API_URL = 'https://api.kinsta.com/v2';
const API_KEY = process.env.KINSTA_API_KEY;

async function getAllSites() {
    const response = await fetch(`${KINSTA_API_URL}/sites`, {
        headers: {
            Authorization: `Bearer ${API_KEY}`
        }
    });
    const data = await response.json();
    return data.company.sites; // Returns array of all sites
}

Esta función devuelve un array de todos los sitios de tu cuenta. Cada sitio contiene información como su ID, nombre y entorno(s).

Paso 2: Obtén los ID de entorno de cada sitio de WordPress

Cada sitio puede tener varios entornos (como producción o staging), y las copias de seguridad se activan por entorno. Para recuperar los ID de entorno de cada sitio, haz otra llamada a la API al endpoint GET /sites/{site_id}/environments.

Aquí tienes una función de ejemplo que recupera los entornos de un sitio específico:

async function getSiteEnvironments(siteId) {
    const response = await fetch(`${KINSTA_API_URL}/sites/${siteId}/environments`, {
        headers: {
            Authorization: `Bearer ${API_KEY}`
        }
    });
    const data = await response.json();
    return data.site.environments;
}

Paso 3: Activar copias de seguridad para cada entorno

Una vez que tengas los ID de entorno, puedes activar copias de seguridad para cada entorno utilizando el endpoint POST /sites/environments/{env_id}/manual-backups. La API te permite crear una copia de seguridad manual proporcionando un ID de entorno y una etiqueta opcional para identificar la copia de seguridad.

A continuación se explica cómo activar una copia de seguridad para un entorno determinado:

async function createBackup(environmentId, tag) {
    const response = await fetch(`${KINSTA_API_URL}/sites/environments/${environmentId}/manual-backups`, {
        method: 'POST',
        headers: {
            Authorization: `Bearer ${API_KEY}`,
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({ tag })
    });

    if (response.ok) {
        console.log(`Backup created for environment ${environmentId} with tag: ${tag}`);
    } else {
        console.error(`Failed to create backup for environment ${environmentId}`);
    }
}

Esta función activa una copia de seguridad manual para el ID de entorno dado. También puedes etiquetar la copia de seguridad para identificarla más fácilmente.

Paso 4: Automatizar las copias de seguridad de todos los centros

Ahora que tienes funciones para obtener todos los sitios, recuperar los ID de entorno y activar las copias de seguridad, puedes combinarlas para crear un script que automatice las copias de seguridad de todos los sitios de tu cuenta de Kinsta.

Así es como puedes unirlo todo:

async function backupAllSites() {
    const sites = await getAllSites();

    for (const site of sites) {
        const environments = await getSiteEnvironments(site.id);

        for (const environment of environments) {
            await createBackup(environment.id, `Backup-${new Date().toISOString()}`);
        }
    }

    console.log('Backups for all sites have been triggered.');
}

Esta función recorre todos los sitios, recupera sus entornos y activa las copias de seguridad de cada entorno con una etiqueta con fecha y hora.

Ahora, cuando ejecutes backupAllSites(), se activará una copia de seguridad para cada entorno de tu cuenta Kinsta.

Ejemplo de comando Slack

Puedes integrar este proceso de copia de seguridad en un comando Slack para facilitar aún más la gestión. Con la configuración de una aplicación Slack, los usuarios pueden activar copias de seguridad en todos los sitios con un único comando como /backup_all_sites.

Aquí tienes un ejemplo rápido de cómo podría funcionar:

app.command('/backup_all_sites', async ({ ack, say }) => {
    await ack();
    await backupAllSites();
    say('Backups for all sites have been triggered.');
});

Activar copias de seguridad de sitios seleccionados utilizando IDs de entornos

En algunos casos, puede que quieras activar copias de seguridad sólo para sitios o entornos específicos, en lugar de para todos los sitios de tu cuenta Kinsta. Esto puede ser útil si te interesa hacer copias de seguridad sólo de entornos de producción o de determinados sitios de alta prioridad.

Utilizando la API de Kinsta, podemos automatizar las copias de seguridad de entornos seleccionados pasando un array de IDs de entornos. Veamos cómo hacerlo.

Paso 1: Pasar IDs de entornos

Cuando quieras activar las copias de seguridad de los sitios seleccionados, necesitarás los IDs de entorno de esos sitios. Puedes codificar estos IDs, recuperarlos de la API de Kinsta o pasarlos dinámicamente (por ejemplo, a través de un argumento de la línea de comandos, un comando de Slack, etc.).

Aquí tienes una función que acepta un array de IDs de entorno y activa copias de seguridad para cada uno de ellos:

async function backupSelectedEnvironments(environmentIds, tag) {
    for (const envId of environmentIds) {
        await createBackup(envId, tag);
    }
}

La función anterior recibe un array de identificadores de entorno de los que quieres hacer una copia de seguridad (environmentIds). La función createBackup(envId, tag) activa la copia de seguridad de cada entorno del array mediante la función createBackup() (explicada en el Paso 2).

Paso 2: Activar la copia de seguridad

Para activar la copia de seguridad real de cada entorno, utiliza el endpointPOST /sites/environments/{env_id}/manual-backups de la API de Kinsta, como hicimos para todos los sitios. Así es como funciona:

async function createBackup(environmentId, tag) {
    const response = await fetch(`${KINSTA_API_URL}/sites/environments/${environmentId}/manual-backups`, {
        method: 'POST',
        headers: {
            Authorization: `Bearer ${API_KEY}`,
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({ tag })
    });

    if (response.ok) {
        console.log(`Backup created for environment ${environmentId} with tag: ${tag}`);
    } else {
        console.error(`Failed to create backup for environment ${environmentId}: ${response.statusText}`);
    }
}

Paso 3: Ejecutar las copias de seguridad de los entornos seleccionados

Ahora que tenemos funciones para activar copias de seguridad y manejar múltiples entornos, podemos combinarlas para hacer copias de seguridad de entornos específicos. Este ejemplo supone que ya tenemos los IDs de los entornos de los que queremos hacer copias de seguridad.

const selectedEnvironments = ['12345', '67890']; // Replace with actual environment IDs
backupSelectedEnvironments(selectedEnvironments, 'Manual Backup');

En este caso

  • El array selectedEnvironments contiene los ID de entorno de los que quieres hacer una copia de seguridad.
  • La función backupSelectedEnvironments() recorre cada ID y activa la copia de seguridad con la etiqueta «Copia de seguridad manual».

Ejemplo de comando Slack

Si utilizas una aplicación Slack o una interfaz de línea de comandos, también puedes permitir que los usuarios especifiquen de qué entornos quieren hacer una copia de seguridad.

A continuación te explicamos cómo podrías implementar esto en una aplicación Slack:

app.command('/backup_selected_envs', async ({ command, ack, say }) => {
    await ack();
    const [tag, ...envIds] = command.text.split(' ');  // First part is the tag, rest are env IDs
    await backupSelectedEnvironments(envIds, tag);
    say(`Backups triggered for selected environments with tag ${tag}.`);
});

El usuario introduce un comando como /backup_selected_envs Backup-Tag 12345 67890, donde Backup-Tag es la etiqueta, y 12345, 67890 son los IDs de los entornos.

El texto del comando se divide y los IDs de los entornos se pasan a la función backupSelectedEnvironments().

Tras activar las copias de seguridad, la aplicación responde al usuario confirmando la copia de seguridad.

Programar copias de seguridad para tus sitios de WordPress

Uno de los aspectos más potentes de la automatización es la posibilidad de programar tareas en momentos concretos sin intervención manual.

Ahora que hemos visto cómo activar las copias de seguridad de todos los sitios y de los sitios seleccionados, el siguiente paso es automatizar estos procesos añadiendo la programación.

Tanto si quieres programar las copias de seguridad localmente, en una plataforma alojada como Kinsta, o dinámicamente a través de Slack, hay varias formas de hacerlo.

Comprender las expresiones cron

Antes de explorar los distintos enfoques para programar copias de seguridad, es importante comprender las expresiones cron, que se utilizan para especificar el momento de las tareas programadas en distintas plataformas y herramientas.

Las expresiones cron definen cuándo debe ejecutarse una tarea. Se utilizan en muchas bibliotecas y servicios de programación, como node-cron, node-schedule, e incluso en tareas cron del servidor, como las disponibles en la plataforma de Alojamiento de Aplicaciones de Kinsta.

Las expresiones cron constan de cinco campos, cada uno de los cuales controla un aspecto específico de cuándo debe ejecutarse la tarea. Una expresión cron típica tiene este aspecto

* * * * *
| | | | |
| | | | └─── Day of the week (0 - 7) (Sunday to Saturday, 0 and 7 represent Sunday)
| | | └────── Month (1 - 12)
| | └──────── Day of the month (1 - 31)
| └────────── Hour (0 - 23)
└──────────── Minute (0 - 59)

Vamos a desglosar lo que representa cada campo:

  • Minute: El minuto de la hora en que debe ejecutarse la tarea (0 – 59).
  • Hour: La hora del día en que debe ejecutarse la tarea (0 – 23).
  • Day of the month: El día concreto del mes en que debe ejecutarse la tarea (1 – 31).
  • Month: El mes del año para ejecutar la tarea (1 – 12).
  • Day of the week: El día concreto de la semana para ejecutar la tarea (0 – 7, donde 0 y 7 representan el domingo).

Puedes utilizar valores específicos, caracteres comodín (*) o rangos en cada campo para definir la programación.

Ejemplos de expresiones cron:

  • 0 0 * * *: Todos los días a medianoche (00:00)
  • 0 3 * * 1: Todos los lunes a las 3 de la madrugada
  • */10 * * * *: Cada 10 minutos
  • 0 9-18 * * *: Cada hora entre las 9 h y las 18 h.

Con una sólida comprensión de las expresiones cron, ahora podemos pasar a los distintos métodos para programar copias de seguridad de tus sitios de WordPress utilizando la API de Kinsta.

Método 1: Programar localmente con node-cron

El paquete node-cron de Node.js puede ejecutar tareas programadas basadas en una sintaxis similar a cron. Es ideal para ejecutar tareas automatizadas en aplicaciones Node.js locales o independientes, y es una opción popular para programar copias de seguridad, enviar correos electrónicos o ejecutar otras tareas recurrentes.

En node-cron, defines una tarea (como tu función de copia de seguridad) y utilizas una expresión cron para especificar cuándo debe ejecutarse la tarea. La expresión cron consta de cinco campos que definen el minuto, la hora, el día del mes, el mes y el día de la semana en que debe ejecutarse la tarea.

Primero, instala node-cron en tu proyecto:

npm install node-cron

Supongamos que quieres programar una copia de seguridad diaria de todos los sitios a medianoche utilizando node-cron. Así es como puedes hacerlo:

const cron = require('node-cron');
const { backupAllSites } = require('./app');  // Import the backup function

// Schedule to run backups for all sites at midnight every day
cron.schedule('0 0 * * *', () => {
  console.log('Running scheduled backup for all sites at midnight...');
  backupAllSites();
});

Del mismo modo, si quieres hacer una copia de seguridad de entornos seleccionados todos los días a las 2 de la madrugada, podrías programarlo así:

cron.schedule('0 2 * * *', () => {
  const environmentIds = ['env12345', 'env67890']; // Specific environments to back up
  console.log('Running scheduled backup for selected environments...');
  backupSelectedEnvironments(environmentIds, 'Scheduled Backup');
});

Método 2: Utilizar cron jobs en el alojamiento en la nube (como Kinsta)

Cuando despliegues tu aplicación Node.js en una plataforma como la de Kinsta, puedes aprovechar la funcionalidad de cron job integrada en la plataforma para programar tareas como las copias de seguridad. Sin embargo, la configuración de cron job en entornos en la nube requiere una estructura ligeramente diferente a la de las herramientas de programación locales como node-cron.

Cuando despliegas tu aplicación en Kinsta, debe tener un proceso web en ejecución (aunque no esté sirviendo tráfico web).

Para asegurarte de que tu proyecto se ejecuta correctamente y no llama automáticamente a funciones de copia de seguridad, puedes crear un archivo que ejecute un servidor web simple. Este archivo actúa como un proceso web «ficticio», mientras que los cron jobs se encargan de la lógica de la copia de seguridad.

Puedes añadir este código:

require('http').createServer((req, res) => {
    res.writeHead(302, { Location: 'https://www.google.com' });
    res.end();
}).listen(process.env.PORT);

De esta forma, puedes configurar el comando script para distinguir entre el proceso web (start) y el proceso de cron job (cron).

  "scripts": {
    "start": "node index.js",  // Web process
    "cron": "node app.js"  // Cron job process
  },

Por último, configura el cron job en Kinsta para que llame a tu función de copia de seguridad a la hora especificada. Mediante la configuración del cron job, puedes definir el comando para ejecutar la copia de seguridad.

En la pestaña Procesos de las aplicaciones del panel de MyKinsta, establece el comando para el proceso web:

npm run start

Y configura el comando del cron job como:

npm run cron

Para ejecutar el cron job a una hora determinada (todos los días a las 11:30 a.m.), establece la expresión cron de la siguiente manera:

30 11 * * *

Este comando activará la función backupAllSites() todos los días a las 11:30 de la mañana.

Configurar un cron job en el Alojamiento de Aplicaciones de Kinsta.
Configurar un cron job en el Alojamiento de Aplicaciones de Kinsta.

Método 3: Programación con node-schedule

Otra biblioteca de Node.js, node-schedule, puede programar tareas utilizando el formato cron y también admite programaciones más complejas.

Aquí tienes un ejemplo que permite a los usuarios programar copias de seguridad a través de Slack utilizando el formato cron de node-schedule:

const schedule = require('node-schedule');
const { backupAllSites } = require('./app');

// Slack command to schedule backups dynamically
app.command('/schedule_backup', async ({ command, ack, say }) => {
    await ack();

    // Extract hour and minute from the command (expects HH:MM format)
    const [hour, minute] = command.text.split(':');

    // Validate input
    if (!hour || !minute) {
        say('Please specify the time in HH:MM format.');
        return;
    }

    // Schedule the backup using node-schedule's cron-like format
    const job = schedule.scheduleJob(`${minute} ${hour} * * *`, () => {
        console.log(`Running scheduled backup at ${hour}:${minute}`);
        backupAllSites();  // This triggers the backup for all sites
    });

    say(`Backup scheduled at ${hour}:${minute} successfully.`);
});

Por ejemplo, un usuario podría ejecutar el siguiente comando de Slack para programar una copia de seguridad para las 11:30 de la noche:

/schedule_backup 23:30

Después de ejecutar este comando, la copia de seguridad se programará para que se ejecute a las 11:30 p.m. todos los días. La respuesta de Slack podría ser la siguiente:

Backup scheduled at 23:30 successfully.

Este enfoque permite a los usuarios programar copias de seguridad dinámicamente desde Slack, simplemente especificando la hora sin necesidad de interactuar con el servidor o el código de la aplicación. Es una forma flexible y potente de gestionar tareas programadas, como las copias de seguridad, de forma sencilla para el usuario.

Resumen

Programar copias de seguridad en varios sitios de WordPress es muy útil para las agencias que gestionan numerosos sitios web de clientes. Automatizar estas copias de seguridad no sólo ahorra tiempo, sino que también garantiza la coherencia, reduce el riesgo de error humano y proporciona tranquilidad.

¿Beneficiaría esta solución a tu agencia? Nos encantaría conocer tu opinión. Compártelas en la sección de comentarios más abajo

Joel Olawanle Kinsta

Joel es un desarrollador Frontend que trabaja en Kinsta como Editor Técnico. Es un formador apasionado enamorado del código abierto y ha escrito más de 200 artículos técnicos, principalmente sobre JavaScript y sus frameworks.