<?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: FRANCO TEDDY MANGO PUMA</title>
    <description>The latest articles on DEV Community by FRANCO TEDDY MANGO PUMA (@franco_teddymangopuma_e).</description>
    <link>https://dev.to/franco_teddymangopuma_e</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%2F4189674%2Fde49df43-0531-4c3f-bbeb-28febdfd15b0.png</url>
      <title>DEV Community: FRANCO TEDDY MANGO PUMA</title>
      <link>https://dev.to/franco_teddymangopuma_e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/franco_teddymangopuma_e"/>
    <language>en</language>
    <item>
      <title>BackupManager: Automatización de Respaldos mediante GitHub Actions</title>
      <dc:creator>FRANCO TEDDY MANGO PUMA</dc:creator>
      <pubDate>Sat, 17 Oct 2026 00:55:39 +0000</pubDate>
      <link>https://dev.to/franco_teddymangopuma_e/automatizacion-y-recuperacion-de-respaldos-postgresql-mediante-github-actions-1m45</link>
      <guid>https://dev.to/franco_teddymangopuma_e/automatizacion-y-recuperacion-de-respaldos-postgresql-mediante-github-actions-1m45</guid>
      <description>&lt;p&gt;Autor: Franco Mango Puma&lt;br&gt;
Curso: Base de Datos II&lt;br&gt;
Universidad: Universidad Privada de Tacna&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Introducción&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La información almacenada en una base de datos representa uno de los recursos más importantes de cualquier sistema informático. Una eliminación accidental, una falla del servidor o una modificación incorrecta pueden ocasionar pérdidas de información que afectan directamente la continuidad de una aplicación.&lt;/p&gt;

&lt;p&gt;Ante esta problemática, una estrategia de respaldo no debe limitarse a generar archivos de seguridad. También debe permitir verificar su integridad, comprobar que los datos pueden restaurarse y conservar las copias en un entorno adecuado.&lt;/p&gt;

&lt;p&gt;En este artículo se presenta la automatización de respaldos implementada en BackupManager, un sistema web desarrollado con Python y FastAPI que utiliza PostgreSQL como motor de base de datos.&lt;/p&gt;

&lt;p&gt;El proyecto incorpora GitHub Actions para ejecutar respaldos automáticos, verificar su recuperación en una base temporal, cifrar los archivos generados y mantener un historial de ejecuciones. Además, utiliza Neon para alojar PostgreSQL y Render para publicar la aplicación en la nube.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Objetivo del proyecto&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El objetivo principal es implementar y demostrar una estrategia automatizada de respaldo y recuperación de PostgreSQL mediante herramientas de desarrollo y servicios en la nube.&lt;/p&gt;

&lt;p&gt;Esta propuesta busca reducir la dependencia de procedimientos manuales y comprobar que un respaldo puede utilizarse realmente para recuperar la información.&lt;/p&gt;

&lt;p&gt;La solución integra varias tecnologías con responsabilidades específicas.&lt;/p&gt;

&lt;p&gt;Tecnología&lt;/p&gt;

&lt;p&gt;Función dentro del proyecto&lt;/p&gt;

&lt;p&gt;Python y FastAPI&lt;/p&gt;

&lt;p&gt;Desarrollo de la aplicación y sus funcionalidades&lt;/p&gt;

&lt;p&gt;PostgreSQL 18&lt;/p&gt;

&lt;p&gt;Almacenamiento de los registros&lt;/p&gt;

&lt;p&gt;Neon&lt;/p&gt;

&lt;p&gt;Alojamiento de la base de datos en la nube&lt;/p&gt;

&lt;p&gt;GitHub&lt;/p&gt;

&lt;p&gt;Repositorio público del código fuente&lt;/p&gt;

&lt;p&gt;GitHub Actions&lt;/p&gt;

&lt;p&gt;Automatización de respaldos, pruebas y despliegue&lt;/p&gt;

&lt;p&gt;Docker&lt;/p&gt;

&lt;p&gt;Entorno de ejecución con herramientas PostgreSQL&lt;/p&gt;

&lt;p&gt;Render&lt;/p&gt;

&lt;p&gt;Publicación de la aplicación web&lt;/p&gt;

&lt;p&gt;OpenSSL&lt;/p&gt;

&lt;p&gt;Cifrado de los archivos de respaldo&lt;/p&gt;

&lt;p&gt;La combinación de estas herramientas permite demostrar un proceso que abarca desde el almacenamiento de datos hasta su protección y recuperación.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Arquitectura de la solución&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La arquitectura de BackupManager integra una aplicación web, una base de datos administrada y dos procesos automatizados en GitHub Actions.&lt;/p&gt;

&lt;p&gt;Los usuarios acceden a la aplicación desplegada en Render, mientras que los registros se almacenan en PostgreSQL mediante Neon.&lt;/p&gt;

&lt;p&gt;De manera independiente, GitHub Actions se conecta a la base de datos utilizando credenciales almacenadas como secretos del repositorio. Desde este entorno se ejecuta la creación de respaldos y la verificación de restauración.&lt;/p&gt;

&lt;p&gt;Esta separación resulta importante porque permite probar la recuperación de información sin modificar directamente la base de datos de producción.&lt;/p&gt;

&lt;p&gt;Figura 1. Arquitectura general de BackupManager.&lt;/p&gt;

&lt;p&gt;Insertar aquí la imagen de arquitectura o una captura del proyecto.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Implementación del respaldo automatizado&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Uno de los componentes principales del proyecto es el archivo postgres-backup.yml, ubicado en .github/workflows.&lt;/p&gt;

&lt;p&gt;Este archivo define un flujo de trabajo de GitHub Actions que puede ejecutarse manualmente o mediante una programación diaria.&lt;/p&gt;

&lt;p&gt;La programación utiliza la expresión 0 7 * * *, correspondiente a una ejecución prevista todos los días a las 07:00 UTC.&lt;/p&gt;

&lt;p&gt;El proceso de respaldo se desarrolla mediante las siguientes etapas:&lt;/p&gt;

&lt;p&gt;Validación de configuración: verifica la existencia de los secretos necesarios y comprueba que se utiliza una conexión directa a PostgreSQL.&lt;/p&gt;

&lt;p&gt;Generación del respaldo: ejecuta pg_dump con formato personalizado para obtener una copia de la estructura y los datos.&lt;/p&gt;

&lt;p&gt;Prueba de restauración: utiliza pg_restore para recuperar el contenido en una instancia temporal e independiente de PostgreSQL.&lt;/p&gt;

&lt;p&gt;Comprobación de datos: consulta la tabla records restaurada para verificar que el proceso terminó correctamente.&lt;/p&gt;

&lt;p&gt;Cifrado del archivo: protege el respaldo mediante OpenSSL antes de almacenarlo como artefacto.&lt;/p&gt;

&lt;p&gt;Conservación temporal: publica el archivo cifrado y su comprobación SHA-256 como artefactos de GitHub Actions, con una retención configurada de siete días.&lt;/p&gt;

&lt;p&gt;La automatización permite repetir el procedimiento sin necesidad de ejecutar manualmente cada comando desde una computadora personal.&lt;/p&gt;

&lt;p&gt;Figura 2. Configuración del workflow de respaldo.&lt;/p&gt;

&lt;p&gt;Insertar la captura del archivo postgres-backup.yml.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generación de respaldos con pg_dump&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PostgreSQL dispone de la herramienta pg_dump, utilizada para generar copias de seguridad lógicas de una base de datos.&lt;/p&gt;

&lt;p&gt;En BackupManager se emplea el formato personalizado, conocido como custom, que permite trabajar posteriormente con pg_restore.&lt;/p&gt;

&lt;p&gt;Este procedimiento tiene una ventaja importante: el respaldo no se limita a exportar una tabla específica, sino que puede incluir la estructura y los datos de la base seleccionada.&lt;/p&gt;

&lt;p&gt;Durante las pruebas del proyecto se generó desde la aplicación un archivo .dump de aproximadamente 6,2 KB, correspondiente a los datos utilizados en la demostración.&lt;/p&gt;

&lt;p&gt;El sistema también permitió comprobar la integridad del archivo mediante SHA-256 y revisar su estructura utilizando las herramientas de PostgreSQL.&lt;/p&gt;

&lt;p&gt;Es importante distinguir que verificar un archivo con SHA-256 y comprobar su estructura no equivale a restaurarlo. Por este motivo, el proyecto incorpora una prueba de recuperación independiente.&lt;/p&gt;

&lt;p&gt;Figura 3. Respaldo PostgreSQL generado y verificado.&lt;/p&gt;

&lt;p&gt;Insertar la captura del archivo .dump creado en BackupManager.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verificación de recuperación con pg_restore&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Una de las decisiones más importantes del proyecto fue incluir una restauración de prueba dentro de la automatización.&lt;/p&gt;

&lt;p&gt;Generar un archivo de respaldo no garantiza por sí solo que pueda utilizarse para recuperar información. Un archivo incompleto, una incompatibilidad de herramientas o un problema de restauración podrían detectarse demasiado tarde.&lt;/p&gt;

&lt;p&gt;Para reducir ese riesgo, el workflow utiliza un contenedor con PostgreSQL 18 que funciona como destino temporal.&lt;/p&gt;

&lt;p&gt;En este entorno se ejecuta pg_restore, sin restaurar directamente sobre la base original alojada en Neon.&lt;/p&gt;

&lt;p&gt;Después se realiza una consulta SQL para comprobar que la tabla records está disponible y que puede recuperarse su número de registros.&lt;/p&gt;

&lt;p&gt;La ejecución de GitHub Actions finalizó correctamente, mostrando el estado Success en las etapas de creación, restauración y cifrado del respaldo.&lt;/p&gt;

&lt;p&gt;Esta evidencia demuestra que el proyecto no solamente genera copias, sino que también comprueba su recuperación mediante una ejecución real.&lt;/p&gt;

&lt;p&gt;Figura 4. Prueba exitosa de restauración en GitHub Actions.&lt;/p&gt;

&lt;p&gt;Insertar la captura del workflow con los pasos pg_dump, pg_restore y cifrado finalizados correctamente.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Protección del respaldo mediante cifrado&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La seguridad de los archivos generados constituye otro aspecto importante de la solución.&lt;/p&gt;

&lt;p&gt;Una copia de seguridad puede contener información que no debería quedar expuesta. Por ello, el workflow cifra el archivo antes de conservarlo como artefacto.&lt;/p&gt;

&lt;p&gt;BackupManager utiliza OpenSSL con AES-256-CBC y derivación de clave PBKDF2, configurada con 250 000 iteraciones.&lt;/p&gt;

&lt;p&gt;La contraseña utilizada para el cifrado se almacena como un secreto de GitHub Actions denominado BACKUP_ENCRYPTION_PASSWORD.&lt;/p&gt;

&lt;p&gt;Adicionalmente, se genera una suma SHA-256 del archivo cifrado para detectar posibles modificaciones.&lt;/p&gt;

&lt;p&gt;La contraseña no se incorpora al repositorio ni se publica junto con el respaldo.&lt;/p&gt;

&lt;p&gt;Es importante señalar que el cifrado protege la confidencialidad del archivo, mientras que el mecanismo SHA-256 permite realizar una comprobación de integridad. Ambas funciones responden a necesidades distintas.&lt;/p&gt;

&lt;p&gt;En esta implementación educativa, los artefactos se conservan durante siete días. Para una solución de producción sería necesario incorporar políticas de retención más amplias y almacenamiento externo persistente.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Despliegue automatizado mediante GitHub Actions y Render&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Además de automatizar respaldos, el proyecto incorpora un segundo workflow orientado a las pruebas del software y su despliegue.&lt;/p&gt;

&lt;p&gt;Este flujo está definido en el archivo ci-deploy.yml.&lt;/p&gt;

&lt;p&gt;Cuando se ejecuta, GitHub Actions prepara un entorno con Python 3.12, instala las dependencias del proyecto y ejecuta las pruebas automatizadas de FastAPI mediante pytest.&lt;/p&gt;

&lt;p&gt;Si las pruebas terminan correctamente, y la ejecución corresponde a un evento permitido para desplegar, el workflow solicita un nuevo despliegue en Render utilizando un deploy hook.&lt;/p&gt;

&lt;p&gt;La dirección del deploy hook se almacena como secreto del repositorio, evitando publicarla dentro del código fuente.&lt;/p&gt;

&lt;p&gt;Durante las pruebas se obtuvo una ejecución exitosa de GitHub Actions. También se verificó que la aplicación estaba desplegada y respondía correctamente desde Render.&lt;/p&gt;

&lt;p&gt;Esta automatización permite establecer un proceso básico de integración y despliegue continuo, donde las pruebas se ejecutan antes de solicitar la publicación de cambios.&lt;/p&gt;

&lt;p&gt;Figura 5. Workflow de pruebas y despliegue exitoso.&lt;/p&gt;

&lt;p&gt;Insertar la captura de GitHub Actions con el estado Success.&lt;/p&gt;

&lt;p&gt;Figura 6. Aplicación publicada en Render.&lt;/p&gt;

&lt;p&gt;Insertar la captura del despliegue exitoso y los registros de ejecución.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Resultados obtenidos&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La implementación permitió comprobar el funcionamiento conjunto de las herramientas utilizadas.&lt;/p&gt;

&lt;p&gt;Prueba realizada&lt;/p&gt;

&lt;p&gt;Resultado observado&lt;/p&gt;

&lt;p&gt;Conexión a Neon PostgreSQL 18&lt;/p&gt;

&lt;p&gt;Correcta&lt;/p&gt;

&lt;p&gt;Almacenamiento de ocho registros de prueba&lt;/p&gt;

&lt;p&gt;Correcto&lt;/p&gt;

&lt;p&gt;Generación de respaldo .dump&lt;/p&gt;

&lt;p&gt;Correcta&lt;/p&gt;

&lt;p&gt;Verificación de integridad y estructura&lt;/p&gt;

&lt;p&gt;Correcta&lt;/p&gt;

&lt;p&gt;Restauración en PostgreSQL temporal&lt;/p&gt;

&lt;p&gt;Exitosa&lt;/p&gt;

&lt;p&gt;Cifrado del archivo&lt;/p&gt;

&lt;p&gt;Exitoso&lt;/p&gt;

&lt;p&gt;Almacenamiento temporal en GitHub Actions&lt;/p&gt;

&lt;p&gt;Correcto&lt;/p&gt;

&lt;p&gt;Pruebas automatizadas de FastAPI&lt;/p&gt;

&lt;p&gt;Exitosas&lt;/p&gt;

&lt;p&gt;Solicitud automatizada de despliegue&lt;/p&gt;

&lt;p&gt;Exitosa&lt;/p&gt;

&lt;p&gt;Aplicación disponible en Render&lt;/p&gt;

&lt;p&gt;Verificada&lt;/p&gt;

&lt;p&gt;Estos resultados permiten demostrar una estrategia de respaldo que incluye generación, verificación, recuperación y protección de archivos.&lt;/p&gt;

&lt;p&gt;También evidencian la utilidad de automatizar tareas repetitivas mediante herramientas de integración continua.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Limitaciones y oportunidades de mejora&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aunque BackupManager cumple los objetivos de la práctica, su implementación tiene algunas limitaciones que deben considerarse.&lt;/p&gt;

&lt;p&gt;La versión gratuita de Render utiliza almacenamiento efímero. Por esta razón, los respaldos generados dentro del servidor web deben descargarse para evitar perderlos durante reinicios o nuevas implementaciones.&lt;/p&gt;

&lt;p&gt;Asimismo, GitHub Actions conserva los respaldos cifrados durante siete días, por lo que estos artefactos no constituyen una estrategia definitiva de almacenamiento histórico.&lt;/p&gt;

&lt;p&gt;Como mejoras futuras, sería conveniente incorporar un servicio de almacenamiento externo persistente, notificaciones de fallos, políticas de retención configurables y pruebas periódicas de recuperación.&lt;/p&gt;

&lt;p&gt;También podrían evaluarse estrategias como respaldos incrementales y recuperación a un punto en el tiempo, que no forman parte de la implementación actual.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Conclusiones&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;El desarrollo de BackupManager permitió demostrar que la automatización de respaldos es una parte importante de la administración de bases de datos.&lt;/p&gt;

&lt;p&gt;La integración de PostgreSQL, GitHub Actions y OpenSSL hizo posible establecer un procedimiento que genera una copia, comprueba su restauración y protege el archivo antes de almacenarlo temporalmente.&lt;/p&gt;

&lt;p&gt;Asimismo, el uso de Neon y Render permitió desplegar la solución y comprobar su funcionamiento en servicios de nube.&lt;/p&gt;

&lt;p&gt;El principal aprendizaje es que un respaldo no debe considerarse confiable únicamente por existir: también debe verificarse su integridad y probarse su recuperación.&lt;/p&gt;

&lt;p&gt;BackupManager constituye una implementación educativa funcional que puede ampliarse con mecanismos de almacenamiento permanente y controles adicionales de seguridad.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enlaces del proyecto&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Repositorio público de GitHub:&lt;br&gt;
&lt;a href="https://github.com/JuanCalderon1218/BackupManager" rel="noopener noreferrer"&gt;https://github.com/JuanCalderon1218/BackupManager&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Ejecución exitosa del respaldo automatizado:&lt;br&gt;
&lt;a href="https://github.com/JuanCalderon1218/BackupManager/actions/runs/38982198297" rel="noopener noreferrer"&gt;https://github.com/JuanCalderon1218/BackupManager/actions/runs/38982198297&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ejecución exitosa de pruebas y despliegue:&lt;br&gt;
&lt;a href="https://github.com/JuanCalderon1218/BackupManager/actions/runs/38982525820" rel="noopener noreferrer"&gt;https://github.com/JuanCalderon1218/BackupManager/actions/runs/38982525820&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Video de demostración:&lt;br&gt;
Agregar el enlace público de YouTube cuando esté publicado.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Referencias técnicas&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PostgreSQL Global Development Group. (s. f.). pg_dump. &lt;a href="https://www.postgresql.org/docs/current/app-pgdump.html" rel="noopener noreferrer"&gt;https://www.postgresql.org/docs/current/app-pgdump.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PostgreSQL Global Development Group. (s. f.). pg_restore. &lt;a href="https://www.postgresql.org/docs/current/app-pgrestore.html" rel="noopener noreferrer"&gt;https://www.postgresql.org/docs/current/app-pgrestore.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub. (s. f.). GitHub Actions documentation. &lt;a href="https://docs.github.com/en/actions" rel="noopener noreferrer"&gt;https://docs.github.com/en/actions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neon. (s. f.). Neon documentation. &lt;a href="https://neon.com/docs" rel="noopener noreferrer"&gt;https://neon.com/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Render. (s. f.). Render documentation. &lt;a href="https://render.com/docs" rel="noopener noreferrer"&gt;https://render.com/docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>cloud</category>
      <category>database</category>
    </item>
  </channel>
</rss>
