Skip to content

Instantly share code, notes, and snippets.

@jrgavilanes
Last active March 10, 2025 08:07
Show Gist options
  • Save jrgavilanes/f728714e52cfaacc05e75afe4ac47ba7 to your computer and use it in GitHub Desktop.
Save jrgavilanes/f728714e52cfaacc05e75afe4ac47ba7 to your computer and use it in GitHub Desktop.

Manual de Copias Centralizadas

Este documento detalla el procedimiento para configurar un sistema de copias de seguridad centralizado en la empresa, asegurando la integridad y disponibilidad de los datos.

El proceso de copias centralizadas permite a cada cliente generar y almacenar sus propios respaldos de manera automatizada, garantizando que la información crítica esté protegida. Posteriormente, un servidor centralizado se encarga de recopilar estos backups de forma segura, asegurando su disponibilidad y permitiendo su restauración en caso de necesidad. Este enfoque optimiza el almacenamiento y minimiza los riesgos asociados a la pérdida de datos.

Para lograr este objetivo, se debe crear un usuario específico con permisos reducidos en cada cliente, el cual será responsable de gestionar los backups. Además, se implementará un mecanismo de autenticación basado en claves SSH para permitir una transferencia de datos segura entre los clientes y el servidor central. Finalmente, se configurarán tareas programadas (cron) para garantizar la ejecución automática del proceso, manteniendo un historial de backups sin intervención manual.


Procedimiento

1. Configuración del Cliente

Cada cliente generará automáticamente sus backups antes de que el servidor central los recopile. Para ello, configuramos un usuario dedicado, creamos un script de backup y lo programamos en cron.

1.1 Creación del Usuario backupuser

En cada cliente, ejecutamos el siguiente comando para crear el usuario backupuser con un shell restringido (rbash):

sudo adduser --disabled-password --shell /bin/rbash backupuser

1.2 Creación del Script de Backup

En cada cliente, creamos su script adaptado como /home/backupuser/backup_postgis_and_statics.sh para realizar el respaldo de la base de datos y archivos estáticos:

#!/bin/bash

TIMESTAMP=$(date +"%Y-%m-%d_%H-%M")
BACKUP_DIR="/home/backupuser"
BACKUP_FILE="backup_sig_local_$TIMESTAMP.sql.gz"

# Realizar el backup de la base de datos
docker exec -t teva-gis-fastapi-postgis-1 pg_dump -U janrax -d sig_local | gzip > "$BACKUP_DIR/$BACKUP_FILE"

# Eliminar backups con más de 30 días
find "$BACKUP_DIR" -name "backup_sig_local_*.sql.gz" -type f -mtime +30 -exec rm {} \;

# Copiar imágenes y archivos adjuntos de la aplicación
rsync -a /home/avantgeo/teva-gis-fastapi/app/static "$BACKUP_DIR/"

Asignamos permisos de ejecución:

chmod +x /home/backupuser/backup_postgis_and_statics.sh

1.3 Programación del Backup en cron

Editamos el crontab en el cliente como root:

sudo su -
crontab -e

Agregamos la siguiente línea para ejecutar el backup diariamente a la medianoche:

0 0 * * * /home/backupuser/backup_postgis_and_statics.sh

2. Configuración del Servidor Central

El servidor de copias almacenará todos los backups generados en los clientes, asegurando su disponibilidad y conservación.

2.1 Generación de Clave SSH

Desde el servidor de copias ([email protected]), generamos una clave SSH para facilitar la transferencia segura de los archivos:

ssh-keygen -t ed25519 -f /home/avantgeo/.ssh/backup_key -N ""

2.2 Transferencia de la Clave Pública al Cliente

Desde el servidor central, obtenemos la clave pública con:

cat /home/avantgeo/.ssh/backup_key.pub

Luego, en cada cliente, agregamos la clave pública al usuario backupuser:

echo "ssh-ed25519 AAAAC3..." >> /home/backupuser/.ssh/authorized_keys
chmod 600 /home/backupuser/.ssh/authorized_keys

2.3 Verificación de la Conexión SSH

En el servidor central, verificamos que podemos conectarnos al cliente sin necesidad de ingresar una contraseña:

ssh -i /home/avantgeo/.ssh/backup_key [email protected]

Si la conexión es exitosa, el proceso de autenticación está correctamente configurado.


3. Configuración del Script para Recopilación de Backups

Una vez establecida la conexión, creamos un script en el servidor central para descargar automáticamente los backups de los clientes.

3.1 Creación del Script de Descarga

Creamos un script, adaptado al cliente, como /home/avantgeo/backup_gisteva/trae_ficheros.sh:

#!/bin/bash

TODAY=$(date +"%Y-%m-%d")
BACKUP_DIR="/home/avantgeo/backup_gisteva"

# Sincroniza la base de datos
rsync -az --progress -e "ssh -i /home/avantgeo/.ssh/backup_key" \
    --include="backup_sig_local_$TODAY_*.sql.gz" --exclude="*" \
    [email protected]:/home/backupuser/ "$BACKUP_DIR/" \
    >> "$BACKUP_DIR/backup_$(date +"%Y%m").log" 2>&1

# Sincroniza los archivos estáticos
rsync -av -e "ssh -i /home/avantgeo/.ssh/backup_key" \
    [email protected]:/home/backupuser/static "$BACKUP_DIR/" \
    >> "$BACKUP_DIR/backup_$(date +"%Y%m").log" 2>&1

# Borrar backups de base de datos de más de 30 días
find "$BACKUP_DIR/" -name "backup_sig_local_*.sql.gz" -type f -mtime +30 -exec rm {} \;

# Borrar logs de más de 1 año (365 días)
find "$BACKUP_DIR/" -name "backup_*.log" -type f -mtime +365 -exec rm {} \;

Asignamos permisos de ejecución al script y realizamos una prueba manual:

chmod +x /home/avantgeo/backup_gisteva/trae_ficheros.sh
./home/avantgeo/backup_gisteva/trae_ficheros.sh

4. Programación Automática de la Recopilación de Backups

Para asegurar la ejecución automática del script, configuramos cron en el servidor central.

4.1 Configuración en el Servidor Central

Accedemos como avantgeo y editamos el crontab:

crontab -e

Agregamos la siguiente línea para ejecutar el script todos los días a la 1:00 AM:

0 1 * * * /home/avantgeo/backup_gisteva/trae_ficheros.sh

5. Conclusión

Con este procedimiento, logramos un sistema de copias centralizado y automatizado, donde:

  1. Cada cliente genera su backup diariamente.
  2. El servidor central recopila estos backups automáticamente.
  3. Se eliminan archivos antiguos para evitar el uso excesivo de espacio en disco.

Este enfoque garantiza seguridad, disponibilidad y facilidad de gestión de los datos en toda la empresa.

Anexo I. Restaurar BD

Para restaurar la base de datos, es necesario finalizar todas las conexiones activas y eliminar la base de datos existente antes de crear una nueva instancia limpia. Esto garantiza que no haya sesiones en uso que puedan interferir con el proceso y permite restablecer la estructura desde cero sin inconsistencias.

docker exec -it teva-gis-fastapi-postgis-1 psql -U janrax -d postgres -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'sig_local';"
docker exec -it teva-gis-fastapi-postgis-1 psql -U janrax -d postgres -c "DROP DATABASE sig_local;"
docker exec -it teva-gis-fastapi-postgis-1 psql -U janrax -d postgres -c "CREATE DATABASE sig_local WITH OWNER = janrax;"
gunzip -c backup_sig_local.sql.gz | docker exec -i teva-gis-fastapi-postgis-1 psql -U janrax -d sig_local

Anexo 2. Bastionar puertos de servidores en la nube

En en siguiente enlace indicamos como aplicar el firewall en DigitalOcean y OVH.

https://docs.google.com/document/d/1jzs0NCDBh0KzJVjuRCFhboBN33mDk0_ShsNKz35CMFA/edit?usp=sharing

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment