<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Juan Carlos Calderón Rodríguez</title>
    <description>The latest articles on DEV Community by Juan Carlos Calderón Rodríguez (@juancalderon1218).</description>
    <link>https://dev.to/juancalderon1218</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4189644%2Fda03087f-2e75-40aa-93da-b71c518933aa.png</url>
      <title>DEV Community: Juan Carlos Calderón Rodríguez</title>
      <link>https://dev.to/juancalderon1218</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/juancalderon1218"/>
    <language>en</language>
    <item>
      <title>BackupManager: Sistema de Gestión y Recuperación de Respaldos en PostgreSQL</title>
      <dc:creator>Juan Carlos Calderón Rodríguez</dc:creator>
      <pubDate>Sat, 17 Oct 2026 00:19:18 +0000</pubDate>
      <link>https://dev.to/juancalderon1218/backupmanager-sistema-de-gestion-y-recuperacion-de-respaldos-en-postgresql-4aj0</link>
      <guid>https://dev.to/juancalderon1218/backupmanager-sistema-de-gestion-y-recuperacion-de-respaldos-en-postgresql-4aj0</guid>
      <description>&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;En el curso de Base de Datos II desarrollé &lt;strong&gt;BackupManager&lt;/strong&gt;, una aplicación web orientada a la gestión de respaldos y recuperación de información almacenada en PostgreSQL.&lt;/p&gt;

&lt;p&gt;El objetivo de este trabajo fue implementar una solución que permitiera realizar respaldos reales de una base de datos, verificar la integridad de los archivos generados y comprobar que la información pudiera recuperarse correctamente.&lt;/p&gt;

&lt;p&gt;Para desarrollar el sistema utilicé Python con FastAPI, PostgreSQL y diferentes servicios en la nube. Además, incorporé herramientas de automatización para que los procesos de respaldo y despliegue pudieran ejecutarse sin depender únicamente de una operación manual.&lt;/p&gt;

&lt;p&gt;Durante el desarrollo pude comprobar el funcionamiento de la aplicación tanto en un entorno local como desde Internet, utilizando una base de datos alojada en Neon y un servicio web publicado en Render.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Tecnologías utilizadas
&lt;/h2&gt;

&lt;p&gt;Para la implementación de BackupManager seleccioné herramientas que permitieran desarrollar una aplicación web, conectar una base de datos PostgreSQL en la nube y automatizar las operaciones de respaldo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabla 1. Tecnologías utilizadas en BackupManager&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tecnología&lt;/th&gt;
&lt;th&gt;Función en el proyecto&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Lenguaje de programación utilizado en el backend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FastAPI&lt;/td&gt;
&lt;td&gt;Desarrollo de la API y lógica del sistema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostgreSQL 18&lt;/td&gt;
&lt;td&gt;Almacenamiento y gestión de la información&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQLAlchemy&lt;/td&gt;
&lt;td&gt;Comunicación entre Python y PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neon&lt;/td&gt;
&lt;td&gt;Alojamiento de PostgreSQL en la nube&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Render&lt;/td&gt;
&lt;td&gt;Despliegue público de la aplicación web&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;Preparación del entorno de ejecución&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;Repositorio público del código fuente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Actions&lt;/td&gt;
&lt;td&gt;Automatización de respaldos, pruebas y despliegues&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;La arquitectura utilizada permite separar la aplicación de la base de datos. Mientras Render ejecuta el backend y la interfaz web, Neon se encarga de almacenar la información de manera independiente.&lt;/p&gt;

&lt;p&gt;Esta separación permite acceder al sistema desde Internet sin necesidad de mantener encendida la computadora utilizada durante el desarrollo.&lt;/p&gt;

&lt;p&gt;El código fuente y la aplicación se encuentran disponibles en los siguientes enlaces:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repositorio GitHub:&lt;/strong&gt; &lt;a href="https://github.com/JuanCalderon1218/BackupManager" rel="noopener noreferrer"&gt;BackupManager - Código fuente&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aplicación desplegada:&lt;/strong&gt; &lt;a href="https://backupmanager.onrender.com" rel="noopener noreferrer"&gt;BackupManager - Aplicación web&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Funcionamiento general del sistema
&lt;/h2&gt;

&lt;p&gt;BackupManager cuenta con una interfaz web organizada en cuatro apartados principales: &lt;strong&gt;Resumen, Registros, Respaldos e Historial&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Cada apartado permite acceder a las diferentes funcionalidades implementadas para administrar información y realizar operaciones de respaldo.&lt;/p&gt;

&lt;p&gt;En la sección Resumen se presenta el estado general de la aplicación, incluyendo el motor de base de datos utilizado, la cantidad de registros existentes y los respaldos completos que han sido generados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8q7xih3nlfjmnzafdn89.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8q7xih3nlfjmnzafdn89.png" alt=" " width="799" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figura 1. Panel principal y estado general de BackupManager.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;En la Figura 1 se observa el panel principal del sistema, donde se presenta información sobre su funcionamiento. La interfaz muestra la conexión activa con PostgreSQL, ocho registros almacenados y un respaldo completo generado. También se encuentran disponibles las opciones para crear nuevas copias de seguridad y consultar el historial de operaciones.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1. Gestión de registros
&lt;/h3&gt;

&lt;p&gt;En el módulo de registros se pueden agregar, consultar, modificar y eliminar datos. Estas operaciones permiten trabajar con información almacenada directamente en PostgreSQL.&lt;/p&gt;

&lt;p&gt;Para comprobar la conexión con la base de datos, ingresé ocho registros de prueba desde BackupManager. Posteriormente, accedí al panel de Neon y consulté la tabla &lt;code&gt;records&lt;/code&gt; para verificar que la información se hubiera almacenado correctamente.&lt;/p&gt;

&lt;p&gt;Los datos registrados contenían información relacionada con servidores, estaciones de trabajo y dispositivos de red.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpiv3tu6ox9g0g3uugke.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmpiv3tu6ox9g0g3uugke.png" alt=" " width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figura 2. Registros almacenados en PostgreSQL mediante Neon.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;En la Figura 2 se visualiza la información almacenada en la tabla &lt;code&gt;records&lt;/code&gt; de PostgreSQL. Se pueden observar los identificadores de cada registro, sus nombres, categorías, cantidades y fechas de creación. Esta comprobación permitió confirmar que los datos ingresados desde BackupManager se encontraban almacenados correctamente en la base de datos alojada en Neon.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2. Estructura de la base de datos
&lt;/h3&gt;

&lt;p&gt;La aplicación utiliza diferentes tablas para administrar los registros y mantener información relacionada con las operaciones realizadas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabla 2. Tablas principales de BackupManager&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tabla&lt;/th&gt;
&lt;th&gt;Descripción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;records&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Almacena los registros administrados desde la aplicación&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;audit_events&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Registra información relacionada con las operaciones realizadas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;full_backups&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Almacena los metadatos de los respaldos completos generados&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Estas tablas permiten separar los datos principales del sistema de la información relacionada con su administración y los respaldos.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Estrategias de respaldo de bases de datos
&lt;/h2&gt;

&lt;p&gt;Un respaldo o &lt;em&gt;backup&lt;/em&gt; consiste en conservar una copia de la información para que pueda recuperarse ante una eliminación accidental, un fallo del sistema o cualquier situación que comprometa la disponibilidad de los datos.&lt;/p&gt;

&lt;p&gt;Contar con una estrategia de respaldo es importante porque permite reducir el impacto de estos incidentes y facilita la recuperación de la información.&lt;/p&gt;

&lt;p&gt;Existen diferentes tipos de respaldos, entre los cuales destacan los completos, incrementales y diferenciales.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabla 3. Comparación de estrategias de respaldo&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Estrategia&lt;/th&gt;
&lt;th&gt;Características&lt;/th&gt;
&lt;th&gt;Estado en BackupManager&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Completo&lt;/td&gt;
&lt;td&gt;Conserva el esquema y los datos de la base de datos&lt;/td&gt;
&lt;td&gt;Implementado con &lt;code&gt;pg_dump&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parcial&lt;/td&gt;
&lt;td&gt;Conserva información específica de una tabla&lt;/td&gt;
&lt;td&gt;Implementado mediante JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incremental&lt;/td&gt;
&lt;td&gt;Respalda los cambios posteriores a una copia anterior&lt;/td&gt;
&lt;td&gt;No implementado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diferencial&lt;/td&gt;
&lt;td&gt;Respalda los cambios desde el último respaldo completo&lt;/td&gt;
&lt;td&gt;No implementado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;En esta versión de BackupManager se implementaron dos modalidades: la exportación parcial de registros en JSON y el respaldo lógico completo de PostgreSQL.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1. Respaldo parcial en formato JSON
&lt;/h3&gt;

&lt;p&gt;Esta función permite exportar la información de la tabla &lt;code&gt;records&lt;/code&gt; y conservarla en un archivo JSON.&lt;/p&gt;

&lt;p&gt;Su principal utilidad es recuperar un conjunto específico de registros sin necesidad de restaurar todas las tablas de la base de datos.&lt;/p&gt;

&lt;p&gt;La aplicación permite generar y descargar estos archivos. También incorpora una operación de restauración parcial, mediante la cual se puede recuperar el contenido de la tabla respaldada.&lt;/p&gt;

&lt;p&gt;Esta modalidad es adecuada para trabajar con conjuntos pequeños de información, aunque no reemplaza un respaldo completo de PostgreSQL.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2. Respaldo completo de PostgreSQL
&lt;/h3&gt;

&lt;p&gt;Para implementar los respaldos completos se utilizó &lt;code&gt;pg_dump&lt;/code&gt;, una herramienta de PostgreSQL que permite realizar exportaciones lógicas del esquema y los datos de una base de datos.&lt;/p&gt;

&lt;p&gt;El comando básico utilizado sigue la siguiente estructura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pg_dump &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;custom &lt;span class="nt"&gt;--no-owner&lt;/span&gt; &lt;span class="nt"&gt;--no-acl&lt;/span&gt; &lt;span class="nt"&gt;--file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;respaldo.dump
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La opción &lt;code&gt;--format=custom&lt;/code&gt; genera un archivo de respaldo en formato personalizado, que posteriormente puede procesarse mediante &lt;code&gt;pg_restore&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Durante la prueba de recuperación se utilizaron las opciones &lt;code&gt;--no-owner&lt;/code&gt; y &lt;code&gt;--no-acl&lt;/code&gt; de &lt;code&gt;pg_restore&lt;/code&gt; para evitar restablecer los propietarios y privilegios originales. Esto facilitó la restauración del respaldo en una base de datos temporal e independiente.&lt;/p&gt;

&lt;p&gt;En BackupManager, los parámetros de conexión se obtienen mediante variables de entorno privadas para evitar almacenar las credenciales directamente en el código fuente.&lt;/p&gt;

&lt;p&gt;Durante las pruebas ejecuté la generación de un respaldo desde la aplicación y obtuve un archivo &lt;code&gt;.dump&lt;/code&gt; de aproximadamente &lt;strong&gt;6.2 KB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;El archivo se generó correctamente y pudo descargarse desde la interfaz web.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F96cw1yi2m7k23s1ualf7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F96cw1yi2m7k23s1ualf7.png" alt=" " width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figura 3. Generación y registro de un respaldo completo de PostgreSQL.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;En la Figura 3 se observa el módulo de respaldos de BackupManager, donde se encuentra registrado el archivo generado mediante &lt;code&gt;pg_dump&lt;/code&gt;. El sistema muestra información sobre el identificador del respaldo, su fecha de creación y su tamaño. Además, permite descargar el archivo y verificar su integridad mediante las funciones disponibles en la interfaz.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3. Verificación de integridad
&lt;/h3&gt;

&lt;p&gt;Después de generar el respaldo, utilicé la opción &lt;strong&gt;Verificar&lt;/strong&gt;, implementada en BackupManager.&lt;/p&gt;

&lt;p&gt;Esta función realiza dos comprobaciones principales.&lt;/p&gt;

&lt;p&gt;La primera consiste en calcular el valor SHA-256 del archivo y compararlo con el registrado cuando se creó el respaldo. Esto permite detectar si su contenido ha cambiado.&lt;/p&gt;

&lt;p&gt;La segunda comprobación utiliza &lt;code&gt;pg_restore --list&lt;/code&gt; para verificar que PostgreSQL pueda reconocer la estructura interna del archivo.&lt;/p&gt;

&lt;p&gt;Durante las pruebas, ambas comprobaciones finalizaron correctamente.&lt;/p&gt;

&lt;p&gt;Sin embargo, la verificación de integridad no garantiza por sí sola que los datos puedan recuperarse. Por esta razón, también fue necesario implementar una prueba de restauración.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Automatización de respaldos con GitHub Actions
&lt;/h2&gt;

&lt;p&gt;Una de las funcionalidades principales de BackupManager es la automatización de los respaldos mediante GitHub Actions.&lt;/p&gt;

&lt;p&gt;Para implementar este procedimiento configuré un archivo YAML dentro de la carpeta &lt;code&gt;.github/workflows&lt;/code&gt; del repositorio.&lt;/p&gt;

&lt;p&gt;El workflow permite ejecutar respaldos manualmente y también dispone de una programación diaria.&lt;/p&gt;

&lt;p&gt;El proceso está organizado en diferentes etapas, desde la conexión con la base de datos hasta el almacenamiento del archivo cifrado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabla 4. Etapas del proceso automatizado de respaldo&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Etapa&lt;/th&gt;
&lt;th&gt;Operación realizada&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Conexión&lt;/td&gt;
&lt;td&gt;Acceso a PostgreSQL alojado en Neon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Exportación&lt;/td&gt;
&lt;td&gt;Generación del respaldo mediante &lt;code&gt;pg_dump&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Restauración&lt;/td&gt;
&lt;td&gt;Recuperación del respaldo utilizando &lt;code&gt;pg_restore&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Comprobación&lt;/td&gt;
&lt;td&gt;Consulta de la tabla restaurada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Cifrado&lt;/td&gt;
&lt;td&gt;Protección del archivo mediante AES-256&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Almacenamiento&lt;/td&gt;
&lt;td&gt;Conservación del artefacto cifrado durante siete días&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  4.1. Prueba de restauración
&lt;/h3&gt;

&lt;p&gt;Para comprobar la recuperación de la información, el workflow utiliza una base PostgreSQL temporal e independiente.&lt;/p&gt;

&lt;p&gt;En este entorno se ejecuta &lt;code&gt;pg_restore&lt;/code&gt;, lo que permite reconstruir el contenido del respaldo sin modificar los datos de la base de producción.&lt;/p&gt;

&lt;p&gt;Después de realizar la restauración, el proceso consulta la tabla &lt;code&gt;records&lt;/code&gt; para verificar que está disponible y que puede obtenerse su cantidad de registros.&lt;/p&gt;

&lt;p&gt;La ejecución finalizó correctamente, lo que permitió comprobar que el archivo generado pudo restaurarse en el entorno de prueba.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbqbx13igh86xs8c0jtnv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbqbx13igh86xs8c0jtnv.png" alt=" " width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figura 4. Ejecución satisfactoria del respaldo automatizado y la prueba de restauración.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;En la Figura 4 se muestra el resultado de la ejecución del workflow configurado en GitHub Actions. El proceso finalizó con estado &lt;strong&gt;Success&lt;/strong&gt;, después de completar las operaciones de generación del respaldo, restauración en PostgreSQL y cifrado del archivo. Esta evidencia confirma que el procedimiento de recuperación pudo ejecutarse correctamente en un entorno independiente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidencia del proceso:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/JuanCalderon1218/BackupManager/actions/runs/38982198297" rel="noopener noreferrer"&gt;Ver ejecución del respaldo y restauración en GitHub Actions&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2. Cifrado de los archivos de respaldo
&lt;/h3&gt;

&lt;p&gt;Después de realizar la restauración de prueba, el workflow cifra el archivo generado utilizando AES-256-CBC con derivación de clave mediante PBKDF2.&lt;/p&gt;

&lt;p&gt;Esta operación agrega una medida de protección para evitar que el contenido del respaldo quede almacenado directamente como un archivo sin cifrar.&lt;/p&gt;

&lt;p&gt;Posteriormente, el archivo cifrado se conserva como artefacto en GitHub Actions durante siete días.&lt;/p&gt;

&lt;p&gt;Aunque este procedimiento permite demostrar el almacenamiento temporal de respaldos, en un entorno de producción sería necesario utilizar un servicio de almacenamiento externo con políticas de seguridad y conservación más completas.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Despliegue de BackupManager en la nube
&lt;/h2&gt;

&lt;p&gt;Para publicar BackupManager utilicé Render, conectándolo con el repositorio público del proyecto en GitHub.&lt;/p&gt;

&lt;p&gt;Previamente configuré una base PostgreSQL en Neon y comprobé su conexión desde la aplicación ejecutada localmente.&lt;/p&gt;

&lt;p&gt;Una vez verificado el funcionamiento, preparé el despliegue mediante Docker y configuré las variables de entorno necesarias para conectar la aplicación con PostgreSQL.&lt;/p&gt;

&lt;p&gt;Durante el procedimiento fue necesario actualizar las herramientas cliente de PostgreSQL a la versión 18, debido a que inicialmente algunos archivos estaban configurados para una versión anterior.&lt;/p&gt;

&lt;p&gt;Después de completar la configuración, BackupManager quedó disponible desde una dirección pública.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1. Automatización del despliegue
&lt;/h3&gt;

&lt;p&gt;Además del respaldo automático, configuré un segundo workflow en GitHub Actions para ejecutar las pruebas del backend y solicitar nuevos despliegues en Render.&lt;/p&gt;

&lt;p&gt;El procedimiento comienza cuando se envían cambios a la rama principal del repositorio o cuando se ejecuta manualmente.&lt;/p&gt;

&lt;p&gt;Primero se instalan las dependencias y se realizan las pruebas automatizadas de la aplicación.&lt;/p&gt;

&lt;p&gt;Si estas pruebas finalizan correctamente, GitHub Actions utiliza un &lt;em&gt;deploy hook&lt;/em&gt; para solicitar la actualización del servicio en Render.&lt;/p&gt;

&lt;p&gt;De esta manera, los cambios enviados al repositorio pueden pasar por un proceso de comprobación antes de solicitar su publicación.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F585yqo698kcd17e04nmh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F585yqo698kcd17e04nmh.png" alt=" " width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figura 5. Ejecución correcta del proceso automatizado de pruebas y despliegue.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;En la Figura 5 se observa el resultado del workflow encargado de ejecutar las pruebas del backend y solicitar el despliegue de BackupManager en Render. El proceso finalizó correctamente, lo que permitió comprobar la integración entre el repositorio de GitHub, las pruebas automatizadas y el mecanismo de despliegue configurado para la aplicación.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evidencia del proceso:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/JuanCalderon1218/BackupManager/actions/runs/38982525820" rel="noopener noreferrer"&gt;Ver ejecución de CI y despliegue en GitHub Actions&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Pruebas y resultados obtenidos
&lt;/h2&gt;

&lt;p&gt;Después de completar el desarrollo y la configuración de los servicios, realicé diferentes pruebas para comprobar el funcionamiento de BackupManager.&lt;/p&gt;

&lt;p&gt;Estas incluyeron la conexión con PostgreSQL, el almacenamiento de registros, la generación de respaldos, la verificación de integridad y la recuperación automatizada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabla 5. Resultados de las pruebas funcionales&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prueba realizada&lt;/th&gt;
&lt;th&gt;Resultado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Conexión de FastAPI con PostgreSQL en Neon&lt;/td&gt;
&lt;td&gt;Correcto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Registro de información desde BackupManager&lt;/td&gt;
&lt;td&gt;Correcto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comprobación de ocho registros en Neon&lt;/td&gt;
&lt;td&gt;Correcto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generación de respaldo completo &lt;code&gt;.dump&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Correcto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Descarga del archivo de respaldo&lt;/td&gt;
&lt;td&gt;Correcto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verificación de integridad SHA-256&lt;/td&gt;
&lt;td&gt;Correcto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restauración en una base PostgreSQL temporal&lt;/td&gt;
&lt;td&gt;Correcto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ejecución automatizada del respaldo&lt;/td&gt;
&lt;td&gt;Correcto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pruebas automatizadas del backend&lt;/td&gt;
&lt;td&gt;Correcto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solicitud de despliegue mediante GitHub Actions&lt;/td&gt;
&lt;td&gt;Correcto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publicación de BackupManager en Render&lt;/td&gt;
&lt;td&gt;Correcto&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Los resultados permitieron comprobar que la aplicación trabaja con una base de datos PostgreSQL real y que las operaciones de respaldo y recuperación pueden ejecutarse satisfactoriamente.&lt;/p&gt;

&lt;p&gt;Una de las pruebas más importantes fue la restauración automatizada, debido a que permitió verificar el contenido del respaldo en una base temporal sin afectar la información original.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.1. Limitaciones identificadas
&lt;/h3&gt;

&lt;p&gt;Aunque el sistema cumple con las funcionalidades principales de esta práctica, existen algunos aspectos que podrían mejorarse.&lt;/p&gt;

&lt;p&gt;Uno de ellos es el almacenamiento de los respaldos. En el plan gratuito de Render, los archivos guardados localmente no tienen persistencia garantizada después de reinicios o nuevos despliegues.&lt;/p&gt;

&lt;p&gt;Por esta razón, los respaldos deben conservarse fuera del servidor. En esta implementación se utilizó GitHub Actions para almacenar temporalmente copias cifradas.&lt;/p&gt;

&lt;p&gt;Para una implementación de mayor alcance sería conveniente incorporar almacenamiento externo permanente, políticas de retención, monitoreo de errores y mecanismos de recuperación a un punto específico en el tiempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  6.2. Demostración audiovisual de BackupManager
&lt;/h2&gt;

&lt;p&gt;Como evidencia complementaria del proyecto, se elaboró un video de demostración donde se presenta la arquitectura, el desarrollo y el funcionamiento de BackupManager.&lt;/p&gt;

&lt;p&gt;En la presentación se explica la integración de FastAPI con PostgreSQL en Neon, la generación de respaldos, la verificación de integridad, las pruebas de restauración, la automatización mediante GitHub Actions y el despliegue en Render.&lt;/p&gt;

&lt;p&gt;La exposición fue desarrollada por Juan Carlos Calderón Rodríguez y Franco Mango Puma, integrantes del proyecto del curso de Base de Datos II.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/5JBOF-gZRds" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enlace al video:&lt;/strong&gt; &lt;a href="https://youtu.be/5JBOF-gZRds" rel="noopener noreferrer"&gt;Demostración de BackupManager en YouTube&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Conclusiones
&lt;/h2&gt;

&lt;p&gt;El desarrollo de BackupManager me permitió aplicar conceptos relacionados con la protección y recuperación de bases de datos mediante el uso de PostgreSQL.&lt;/p&gt;

&lt;p&gt;Durante el trabajo pude comprobar que generar una copia de seguridad no es suficiente para garantizar la recuperación de información. También resulta necesario verificar la integridad de los archivos y realizar pruebas de restauración.&lt;/p&gt;

&lt;p&gt;Otro aspecto importante fue la automatización. Mediante GitHub Actions fue posible ejecutar procesos de respaldo y comprobación de manera programada, reduciendo la necesidad de intervención manual.&lt;/p&gt;

&lt;p&gt;Además, la integración de FastAPI, Neon y Render permitió publicar una aplicación funcional que trabaja con una base de datos PostgreSQL alojada en la nube.&lt;/p&gt;

&lt;p&gt;Finalmente, BackupManager constituye una implementación práctica de respaldo, verificación y recuperación de datos. Aunque todavía puede ampliarse con otras estrategias y mecanismos de almacenamiento, permitió comprobar el funcionamiento de herramientas reales utilizadas en la administración de bases de datos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL Global Development Group. &lt;em&gt;pg_dump — PostgreSQL 18&lt;/em&gt;. &lt;a href="https://www.postgresql.org/docs/18/app-pgdump.html" rel="noopener noreferrer"&gt;https://www.postgresql.org/docs/18/app-pgdump.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PostgreSQL Global Development Group. &lt;em&gt;pg_restore — PostgreSQL 18&lt;/em&gt;. &lt;a href="https://www.postgresql.org/docs/18/app-pgrestore.html" rel="noopener noreferrer"&gt;https://www.postgresql.org/docs/18/app-pgrestore.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub. &lt;em&gt;GitHub Actions Documentation&lt;/em&gt;. &lt;a href="https://docs.github.com/en/actions" rel="noopener noreferrer"&gt;https://docs.github.com/en/actions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Neon. &lt;em&gt;Neon Documentation&lt;/em&gt;. &lt;a href="https://neon.com/docs" rel="noopener noreferrer"&gt;https://neon.com/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Render. &lt;em&gt;Render Documentation&lt;/em&gt;. &lt;a href="https://render.com/docs" rel="noopener noreferrer"&gt;https://render.com/docs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>postgres</category>
      <category>database</category>
      <category>githubactions</category>
      <category>python</category>
    </item>
  </channel>
</rss>
