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.
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
.
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
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
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
El servidor de copias almacenará todos los backups generados en los clientes, asegurando su disponibilidad y conservación.
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 ""
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
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.
Una vez establecida la conexión, creamos un script en el servidor central para descargar automáticamente los backups de los clientes.
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
Para asegurar la ejecución automática del script, configuramos cron
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
Con este procedimiento, logramos un sistema de copias centralizado y automatizado, donde:
- Cada cliente genera su backup diariamente.
- El servidor central recopila estos backups automáticamente.
- 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.
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
En en siguiente enlace indicamos como aplicar el firewall en DigitalOcean y OVH.
https://docs.google.com/document/d/1jzs0NCDBh0KzJVjuRCFhboBN33mDk0_ShsNKz35CMFA/edit?usp=sharing