<?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: ANA CECILIA ESTEBAN RAMOS</title>
    <description>The latest articles on DEV Community by ANA CECILIA ESTEBAN RAMOS (@ana_ceciliaestebanramos).</description>
    <link>https://dev.to/ana_ceciliaestebanramos</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%2F4162654%2F82c67db5-29b5-4d0d-979c-affdb1256a72.png</url>
      <title>DEV Community: ANA CECILIA ESTEBAN RAMOS</title>
      <link>https://dev.to/ana_ceciliaestebanramos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ana_ceciliaestebanramos"/>
    <language>en</language>
    <item>
      <title>Estrategias de respaldo de bases de datos con PostgreSQL, Django y despliegue automatizado en la nube</title>
      <dc:creator>ANA CECILIA ESTEBAN RAMOS</dc:creator>
      <pubDate>Mon, 05 Oct 2026 02:02:20 +0000</pubDate>
      <link>https://dev.to/ana_ceciliaestebanramos/estrategias-de-respaldo-de-bases-de-datos-con-postgresql-django-y-despliegue-automatizado-en-la-57id</link>
      <guid>https://dev.to/ana_ceciliaestebanramos/estrategias-de-respaldo-de-bases-de-datos-con-postgresql-django-y-despliegue-automatizado-en-la-57id</guid>
      <description>&lt;p&gt;&lt;strong&gt;Autora:&lt;/strong&gt; Ana Cecilia Esteban Ramos&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Proyecto desarrollado con:&lt;/strong&gt; Saúl José Alvarado Urbano&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Repositorio:&lt;/strong&gt; &lt;a href="https://github.com/anaesteban1/database-backup-strategies" rel="noopener noreferrer"&gt;github.com/anaesteban1/database-backup-strategies&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Aplicación en vivo:&lt;/strong&gt; &lt;a href="https://database-backup-strategies.onrender.com" rel="noopener noreferrer"&gt;database-backup-strategies.onrender.com&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Base de datos:&lt;/strong&gt; PostgreSQL&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Cloud / PaaS:&lt;/strong&gt; Render  &lt;/p&gt;


&lt;h2&gt;
  
  
  Resumen
&lt;/h2&gt;

&lt;p&gt;La protección de la información es una responsabilidad fundamental en cualquier sistema que utilice una base de datos. Una eliminación accidental, un error de aplicación, una falla de infraestructura o una operación incorrecta pueden ocasionar pérdida de información si no existe una estrategia adecuada de respaldo y recuperación.&lt;/p&gt;

&lt;p&gt;En este artículo presentamos la implementación práctica de una estrategia de &lt;strong&gt;respaldo y restauración de bases de datos utilizando PostgreSQL&lt;/strong&gt;, evitando Microsoft SQL Server. Para ello desarrollamos una aplicación web con &lt;strong&gt;Python y Django&lt;/strong&gt;, utilizamos &lt;strong&gt;GitHub&lt;/strong&gt; como repositorio público, implementamos respaldos lógicos mediante &lt;code&gt;pg_dump&lt;/code&gt;, documentamos el proceso de recuperación con &lt;code&gt;pg_restore&lt;/code&gt; y publicamos la solución en &lt;strong&gt;Render&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Además, el repositorio se encuentra integrado con Render mediante &lt;strong&gt;Auto-Deploy&lt;/strong&gt;, permitiendo que cada cambio enviado a la rama principal genere automáticamente una nueva versión de la aplicación desplegada en la nube.&lt;/p&gt;

&lt;p&gt;El proyecto permite demostrar que el respaldo de una base de datos y el despliegue automatizado son procesos diferentes, pero complementarios dentro de una solución orientada a disponibilidad, recuperación y continuidad del servicio.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. Arquitectura y stack tecnológico
&lt;/h2&gt;

&lt;p&gt;La solución desarrollada separa la aplicación web, la base de datos, el proceso de respaldo y el flujo de despliegue.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ Usuario ]
     │
     ▼
[ Aplicación Django ]
     │
     ▼
[ PostgreSQL ]
     │
     ├────────────► pg_dump
     │                  │
     │                  ▼
     │          [ Archivo de respaldo ]
     │                  │
     │                  ▼
     └────────────► pg_restore
                        │
                        ▼
             [ Base de datos recuperada ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De manera paralela, el despliegue de la aplicación sigue el siguiente flujo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ Desarrollador ]
       │
       │ git push
       ▼
[ GitHub Repository ]
       │
       │ Detecta nuevo commit
       ▼
[ Render Auto-Deploy ]
       │
       ├─► Build
       ├─► Migraciones
       ├─► Deploy
       │
       ▼
[ Aplicación en Producción ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Componentes principales
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python + Django.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Base de datos:&lt;/strong&gt; PostgreSQL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Herramienta de respaldo:&lt;/strong&gt; &lt;code&gt;pg_dump&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Herramienta de restauración:&lt;/strong&gt; &lt;code&gt;pg_restore&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control de versiones:&lt;/strong&gt; Git.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repositorio público:&lt;/strong&gt; GitHub.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plataforma Cloud / PaaS:&lt;/strong&gt; Render.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatización del despliegue:&lt;/strong&gt; Render Auto-Deploy.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Repositorio público del proyecto
&lt;/h2&gt;

&lt;p&gt;Uno de los requisitos principales del proyecto consiste en mantener el código fuente de la aplicación dentro de un repositorio público.&lt;/p&gt;

&lt;p&gt;El proyecto completo se encuentra disponible en GitHub:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Repositorio:&lt;/strong&gt; &lt;a href="https://github.com/anaesteban1/database-backup-strategies" rel="noopener noreferrer"&gt;anaesteban1/database-backup-strategies&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentro del repositorio se encuentran los principales componentes de la solución:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;database-backup-strategies/
│
├── backup_project/
├── backups/
├── scripts/
│   └── backup_postgres.ps1
├── templates/
│   └── backups/
├── manage.py
├── requirements.txt
├── render.yaml
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El repositorio también conserva el historial de commits realizados durante el desarrollo, permitiendo evidenciar las contribuciones realizadas por los integrantes del equipo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Importancia de GitHub:&lt;/strong&gt; además de almacenar el código fuente, permite conservar trazabilidad sobre los cambios realizados y facilita la integración con herramientas de despliegue continuo.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Estrategia de respaldo con PostgreSQL
&lt;/h2&gt;

&lt;p&gt;La estrategia implementada utiliza las herramientas nativas de PostgreSQL para generar respaldos lógicos de la información.&lt;/p&gt;

&lt;p&gt;Se consideraron tres aspectos principales:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Respaldo lógico completo.&lt;/li&gt;
&lt;li&gt;Automatización mediante script.&lt;/li&gt;
&lt;li&gt;Retención de diferentes versiones del respaldo.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  3.1. Respaldo lógico completo con &lt;code&gt;pg_dump&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;PostgreSQL proporciona la herramienta &lt;code&gt;pg_dump&lt;/code&gt;, utilizada para exportar una base de datos y generar un respaldo lógico.&lt;/p&gt;

&lt;p&gt;En PowerShell se puede ejecutar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;pg_dump&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;--dbname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;custom&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;--file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;postgres_backup.dump&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La opción:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--format=custom
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;genera un archivo en formato personalizado de PostgreSQL.&lt;/p&gt;

&lt;p&gt;El resultado será un archivo similar a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgres_backup.dump
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este formato es especialmente útil porque posteriormente puede utilizarse con &lt;code&gt;pg_restore&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flujo del respaldo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ PostgreSQL ]
      │
      ▼
   pg_dump
      │
      ▼
[ Archivo .dump ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3.2. Identificación de respaldos mediante fecha y hora
&lt;/h2&gt;

&lt;p&gt;Si todos los respaldos utilizaran exactamente el mismo nombre, una nueva ejecución podría reemplazar una copia anterior.&lt;/p&gt;

&lt;p&gt;Para evitarlo se utiliza una marca de tiempo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yyyy-MM-dd_HH-mm-ss"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$backupFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postgres_backup_&lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="s2"&gt;.dump"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto permite generar archivos como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;postgres_backup_2026-10-03_18-30-15.dump
postgres_backup_2026-10-04_09-15-32.dump
postgres_backup_2026-10-04_18-40-22.dump
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De esta manera se pueden conservar diferentes versiones e identificar fácilmente cuándo fue generado cada respaldo.&lt;/p&gt;




&lt;h2&gt;
  
  
  3.3. Automatización del respaldo
&lt;/h2&gt;

&lt;p&gt;Realizar respaldos únicamente de manera manual puede representar un riesgo, debido a que el proceso depende de que una persona recuerde ejecutarlo.&lt;/p&gt;

&lt;p&gt;Por esta razón se implementó el script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scripts/backup_postgres.ps1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El flujo del script es el siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ Inicio ]
    │
    ▼
¿Existe DATABASE_URL?
    │
    ▼
¿Está disponible pg_dump?
    │
    ▼
Generar timestamp
    │
    ▼
Ejecutar pg_dump
    │
    ▼
Crear archivo .dump
    │
    ▼
Verificar resultado
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una parte esencial del script es:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Write-Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Falta la variable DATABASE_URL."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"yyyy-MM-dd_HH-mm-ss"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$backupFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Join-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;$OutputDirectory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"postgres_backup_&lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="s2"&gt;.dump"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;pg_dump&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;--dbname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;custom&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;--file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$backupFile&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El script permite estandarizar el proceso de respaldo y puede integrarse posteriormente con un mecanismo de programación de tareas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; el proyecto implementa el script necesario para automatizar el proceso. La periodicidad puede definirse posteriormente mediante un programador de tareas, un flujo CI/CD o un servicio especializado de automatización.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4. Estrategia de retención
&lt;/h2&gt;

&lt;p&gt;Generar un respaldo no es suficiente. También es necesario determinar durante cuánto tiempo deberían conservarse las diferentes copias.&lt;/p&gt;

&lt;p&gt;Una posible política de retención podría ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Respaldos diarios    → 7 días
Respaldos semanales  → 4 semanas
Respaldos mensuales  → 12 meses
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Estos tiempos son únicamente un ejemplo de política y deben adaptarse a las necesidades reales de cada organización.&lt;/p&gt;

&lt;p&gt;En el proyecto, la utilización de fecha y hora en el nombre de cada archivo constituye la base necesaria para conservar múltiples versiones.&lt;/p&gt;

&lt;p&gt;En un entorno productivo también sería recomendable almacenar las copias importantes en una ubicación diferente del servidor principal.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Buena práctica:&lt;/strong&gt; mantener la aplicación y todos sus respaldos en el mismo servidor puede provocar que una sola falla afecte tanto a los datos originales como a sus copias.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  5. Restauración mediante &lt;code&gt;pg_restore&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Un respaldo solamente resulta útil si puede utilizarse para recuperar la información.&lt;/p&gt;

&lt;p&gt;Los archivos generados mediante &lt;code&gt;pg_dump&lt;/code&gt; en formato personalizado pueden restaurarse utilizando &lt;code&gt;pg_restore&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;pg_restore&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;--dbname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;postgres_backup.dump&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El proceso completo puede representarse así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ PostgreSQL ]
      │
      ▼
   pg_dump
      │
      ▼
[ Backup .dump ]
      │
      ▼
  pg_restore
      │
      ▼
[ PostgreSQL restaurado ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Además de generar respaldos, una estrategia correcta debería realizar periódicamente pruebas de recuperación.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Principio importante:&lt;/strong&gt; la existencia de un archivo de respaldo no garantiza por sí sola que la información pueda recuperarse. La restauración también debe ser comprobada.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  6. Despliegue automatizado con GitHub y Render
&lt;/h2&gt;

&lt;p&gt;Otro requisito del proyecto consiste en desplegar la aplicación mediante un mecanismo automatizado.&lt;/p&gt;

&lt;p&gt;Para ello se conectó directamente el repositorio de GitHub con &lt;strong&gt;Render&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;El flujo implementado es:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ Proyecto local ]
       │
       ▼
git add .
       │
       ▼
git commit
       │
       ▼
git push origin main
       │
       ▼
[ GitHub ]
       │
       ▼
[ Render Auto-Deploy ]
       │
       ├─► Construcción
       ├─► Instalación de dependencias
       ├─► Migraciones
       └─► Deploy
       │
       ▼
[ Aplicación Live ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para comprobar el funcionamiento se realizó el siguiente commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;commit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Verifica despliegue automatico desde GitHub"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después del &lt;code&gt;push&lt;/code&gt;, Render detectó automáticamente el nuevo commit y generó un nuevo despliegue.&lt;/p&gt;

&lt;p&gt;El historial de Render mostró:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Verifica despliegue automatico desde GitHub

Trigger: Auto-Deploy
Estado: Live
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto permitió verificar experimentalmente el requisito de &lt;strong&gt;Deploy through automation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Posteriormente, un commit realizado por Saúl Alvarado para documentar el proceso de restauración también activó un nuevo Auto-Deploy.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Publicación en nube pública
&lt;/h2&gt;

&lt;p&gt;La aplicación fue desplegada públicamente utilizando &lt;strong&gt;Render&lt;/strong&gt;, una plataforma como servicio que permite alojar aplicaciones web.&lt;/p&gt;

&lt;p&gt;La aplicación está disponible en:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Producción:&lt;/strong&gt; &lt;a href="https://database-backup-strategies.onrender.com" rel="noopener noreferrer"&gt;https://database-backup-strategies.onrender.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En la interfaz se muestra el estado actual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Aplicación activa ✅
Despliegue automático GitHub → Render ✅
Motor actual: POSTGRESQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La aplicación permite registrar información de prueba que posteriormente puede formar parte de los respaldos realizados sobre la base de datos.&lt;/p&gt;

&lt;p&gt;Con esto se cumplen dos de los requisitos principales del proyecto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✅ Aplicación publicada en nube pública
✅ Uso de PostgreSQL en lugar de Microsoft SQL Server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Variables de entorno y protección de credenciales
&lt;/h2&gt;

&lt;p&gt;Debido a que el repositorio es público, las credenciales de la base de datos no deben almacenarse directamente dentro del código fuente.&lt;/p&gt;

&lt;p&gt;La aplicación utiliza variables de entorno:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DATABASE_URL
SECRET_KEY
DEBUG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;DATABASES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;default&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dj_database_url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sqlite:///&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE_DIR&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;db.sqlite3&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;conn_max_age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;conn_health_checks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La variable &lt;code&gt;DATABASE_URL&lt;/code&gt; permite proporcionar la conexión de PostgreSQL desde el entorno cloud sin publicar directamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Usuario
Contraseña
Host
Puerto
Nombre de la base de datos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Buena práctica:&lt;/strong&gt; las credenciales y secretos nunca deberían almacenarse directamente dentro de un repositorio público.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  9. Diferencia entre respaldo y Auto-Deploy
&lt;/h2&gt;

&lt;p&gt;Durante el desarrollo también fue importante diferenciar dos conceptos que pueden confundirse: &lt;strong&gt;respaldo de base de datos&lt;/strong&gt; y &lt;strong&gt;despliegue automatizado&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Auto-Deploy
&lt;/h3&gt;

&lt;p&gt;Protege y automatiza el proceso de entrega del software:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Nuevo código
    │
    ▼
GitHub
    │
    ▼
Render
    │
    ▼
Nueva versión de la aplicación
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Backup
&lt;/h3&gt;

&lt;p&gt;Protege la información almacenada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Datos
  │
  ▼
PostgreSQL
  │
  ▼
pg_dump
  │
  ▼
Archivo de respaldo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El Auto-Deploy permite publicar nuevas versiones de la aplicación, pero &lt;strong&gt;no reemplaza un respaldo de la base de datos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Una solución confiable debe considerar ambos procesos.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Resultado final
&lt;/h2&gt;

&lt;p&gt;Al finalizar la implementación se obtuvo el siguiente resultado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repositorio público:&lt;/strong&gt; ✅ GitHub.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aplicación web:&lt;/strong&gt; ✅ Django.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Base de datos:&lt;/strong&gt; ✅ PostgreSQL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft SQL Server:&lt;/strong&gt; ❌ No utilizado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respaldo lógico:&lt;/strong&gt; ✅ &lt;code&gt;pg_dump&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restauración:&lt;/strong&gt; ✅ &lt;code&gt;pg_restore&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Script de respaldo:&lt;/strong&gt; ✅ PowerShell.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud público:&lt;/strong&gt; ✅ Render.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Despliegue automático:&lt;/strong&gt; ✅ GitHub → Render.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aplicación pública:&lt;/strong&gt; ✅ Online.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La solución completa queda representada de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌──────────────────────┐
                    │    Desarrollador     │
                    └──────────┬───────────┘
                               │
                            git push
                               │
                               ▼
                    ┌──────────────────────┐
                    │        GitHub        │
                    └──────────┬───────────┘
                               │
                         Auto-Deploy
                               │
                               ▼
                    ┌──────────────────────┐
                    │        Render        │
                    │       Django         │
                    └──────────┬───────────┘
                               │
                               ▼
                    ┌──────────────────────┐
                    │     PostgreSQL       │
                    └──────────┬───────────┘
                               │
                   ┌───────────┴───────────┐
                   │                       │
                   ▼                       ▼
               pg_dump                pg_restore
                   │                       │
                   ▼                       ▼
             Backup .dump             Recuperación
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  11. Demostración en video
&lt;/h2&gt;

&lt;p&gt;Como parte de la actividad se realizará un video público de una duración máxima de &lt;strong&gt;5 minutos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;En el video se mostrará:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El repositorio público del proyecto.&lt;/li&gt;
&lt;li&gt;La estructura de la aplicación Django.&lt;/li&gt;
&lt;li&gt;La utilización de PostgreSQL.&lt;/li&gt;
&lt;li&gt;El script de respaldo.&lt;/li&gt;
&lt;li&gt;El uso de &lt;code&gt;pg_dump&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;El proceso de restauración mediante &lt;code&gt;pg_restore&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;El Auto-Deploy desde GitHub.&lt;/li&gt;
&lt;li&gt;El servicio desplegado en Render.&lt;/li&gt;
&lt;li&gt;La aplicación funcionando públicamente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🎥 &lt;strong&gt;Video de demostración:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;PENDIENTE - AGREGAR ENLACE DE YOUTUBE&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Esta URL se agregará antes de realizar la publicación definitiva del artículo.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  12. Lecciones aprendidas y buenas prácticas
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Un respaldo debe ser recuperable:&lt;/strong&gt; generar archivos de respaldo no es suficiente; también debe comprobarse el proceso de restauración.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;La automatización reduce errores humanos:&lt;/strong&gt; utilizar scripts permite ejecutar procedimientos repetibles y disminuye la dependencia de acciones manuales.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Los respaldos necesitan retención:&lt;/strong&gt; conservar distintas versiones facilita recuperar información de diferentes momentos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Las credenciales deben permanecer fuera del repositorio:&lt;/strong&gt; las variables de entorno permiten proteger información sensible cuando el código fuente es público.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Backup y deployment cumplen objetivos diferentes:&lt;/strong&gt; el despliegue automatizado actualiza el software, mientras que los respaldos protegen los datos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;La trazabilidad es importante:&lt;/strong&gt; Git y GitHub permiten mantener evidencia de los cambios realizados durante todo el desarrollo.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;La implementación permitió demostrar una estrategia práctica de respaldo utilizando &lt;strong&gt;PostgreSQL&lt;/strong&gt;, evitando Microsoft SQL Server según las condiciones establecidas para la actividad.&lt;/p&gt;

&lt;p&gt;El uso de &lt;code&gt;pg_dump&lt;/code&gt; permite generar respaldos lógicos de la información, mientras que &lt;code&gt;pg_restore&lt;/code&gt; proporciona el mecanismo necesario para recuperar archivos generados en formatos compatibles.&lt;/p&gt;

&lt;p&gt;Asimismo, la utilización de marcas de fecha y hora proporciona una base para mantener diferentes versiones de los respaldos y aplicar posteriormente políticas de retención.&lt;/p&gt;

&lt;p&gt;La integración entre &lt;strong&gt;GitHub y Render&lt;/strong&gt; permitió automatizar el despliegue de la aplicación, verificando que un cambio enviado mediante &lt;code&gt;git push&lt;/code&gt; puede producir automáticamente una nueva versión disponible públicamente.&lt;/p&gt;

&lt;p&gt;Finalmente, este proyecto demuestra que una solución completa debe proteger tanto el &lt;strong&gt;código fuente&lt;/strong&gt; como los &lt;strong&gt;datos almacenados&lt;/strong&gt;. El control de versiones, los respaldos, la restauración, las variables de entorno y el despliegue automatizado constituyen prácticas complementarias para mejorar la confiabilidad de una aplicación.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recursos y enlaces
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Código fuente completo:&lt;/strong&gt; &lt;a href="https://github.com/anaesteban1/database-backup-strategies" rel="noopener noreferrer"&gt;GitHub - anaesteban1/database-backup-strategies&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aplicación en vivo (Producción):&lt;/strong&gt; &lt;a href="https://database-backup-strategies.onrender.com" rel="noopener noreferrer"&gt;https://database-backup-strategies.onrender.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentación oficial de PostgreSQL:&lt;/strong&gt; &lt;a href="https://www.postgresql.org/docs/" rel="noopener noreferrer"&gt;https://www.postgresql.org/docs/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentación de &lt;code&gt;pg_dump&lt;/code&gt;:&lt;/strong&gt; &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;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentación de &lt;code&gt;pg_restore&lt;/code&gt;:&lt;/strong&gt; &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;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backup y Restore en PostgreSQL:&lt;/strong&gt; &lt;a href="https://www.postgresql.org/docs/current/backup.html" rel="noopener noreferrer"&gt;https://www.postgresql.org/docs/current/backup.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentación oficial de Django:&lt;/strong&gt; &lt;a href="https://docs.djangoproject.com/" rel="noopener noreferrer"&gt;https://docs.djangoproject.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Despliegue de Django en Render:&lt;/strong&gt; &lt;a href="https://render.com/docs/deploy-django" rel="noopener noreferrer"&gt;https://render.com/docs/deploy-django&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentación de Deploys en Render:&lt;/strong&gt; &lt;a href="https://render.com/docs/deploys" rel="noopener noreferrer"&gt;https://render.com/docs/deploys&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video de demostración:&lt;/strong&gt; &lt;code&gt;PENDIENTE - AGREGAR ENLACE DE YOUTUBE&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Autora
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Ana Cecilia Esteban Ramos&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Universidad Privada de Tacna&lt;br&gt;&lt;br&gt;
Escuela Profesional de Ingeniería de Sistemas&lt;br&gt;&lt;br&gt;
Curso: Base de Datos II&lt;/p&gt;

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