<?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: Milton H</title>
    <description>The latest articles on DEV Community by Milton H (@milton_h_107ce42c1ba76290).</description>
    <link>https://dev.to/milton_h_107ce42c1ba76290</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%2F4160600%2Fe7e78ed4-7eaa-47e1-966e-67a9c5d2cfa5.jpg</url>
      <title>DEV Community: Milton H</title>
      <link>https://dev.to/milton_h_107ce42c1ba76290</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/milton_h_107ce42c1ba76290"/>
    <language>en</language>
    <item>
      <title>Análisis de seguridad de TestGenAI con ESLint Security y GitHub Actions</title>
      <dc:creator>Milton H</dc:creator>
      <pubDate>Thu, 08 Oct 2026 01:27:54 +0000</pubDate>
      <link>https://dev.to/milton_h_107ce42c1ba76290/analisis-de-seguridad-de-testgenai-con-eslint-security-y-github-actions-50p7</link>
      <guid>https://dev.to/milton_h_107ce42c1ba76290/analisis-de-seguridad-de-testgenai-con-eslint-security-y-github-actions-50p7</guid>
      <description>&lt;p&gt;Autor: Milton H. Flores Chino&lt;/p&gt;

&lt;p&gt;TestGenAI es nuestro proyecto de Calidad y Pruebas de Software: una aplicación web para organizar requisitos, generar especificaciones y casos de prueba, revisar sus resultados y mantener trazabilidad. En esta revisión incorporé ESLint Security para analizar el código TypeScript con una herramienta distinta de Sonar, Semgrep y Snyk, utilizados en los laboratorios del curso.&lt;/p&gt;

&lt;p&gt;El propósito fue obtener resultados reproducibles, revisar qué significaban las alertas y comprobar que las correcciones conservaban el comportamiento del sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  La aplicación y su arquitectura
&lt;/h2&gt;

&lt;p&gt;El frontend utiliza HTML, CSS y JavaScript modular. El backend expone una API con Express y TypeScript, y conserva la información en PostgreSQL mediante Prisma. El sistema incluye un motor determinista de especificación y diseño de pruebas, además de adaptadores opcionales para Gemini y OpenAI.&lt;/p&gt;

&lt;p&gt;La generación de casos no sustituye la revisión humana. Los requisitos, casos, revisiones, sesiones y ejecuciones se almacenan mediante doce modelos Prisma. El dashboard calcula cobertura de requisitos y distribución de estados a partir de los datos del proyecto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Una herramienta diferente para el análisis estático
&lt;/h2&gt;

&lt;p&gt;ESLint Security incorpora reglas para señalar patrones que pueden requerir revisión: accesos dinámicos a objetos, expresiones regulares potencialmente problemáticas, uso de eval y otras operaciones sensibles de Node.js. La documentación del plugin advierte que muchos resultados son falsos positivos y requieren clasificación humana.&lt;/p&gt;

&lt;p&gt;Fuente: &lt;a href="https://github.com/eslint-community/eslint-plugin-security" rel="noopener noreferrer"&gt;https://github.com/eslint-community/eslint-plugin-security&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instalé el plugin como dependencia de desarrollo y utilicé una configuración separada con el parser TypeScript y las reglas recomendadas. La configuración conserva las alertas; no elimina las reglas que detectaron resultados.&lt;/p&gt;

&lt;p&gt;Comandos reproducibles desde backend:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm ci
npm run prisma:generate
npm run security:scan
npm test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;El alcance del análisis de seguridad es backend/src. Los tests, dependencias instaladas y archivos compilados no se incluyen en ese conteo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué encontró el análisis
&lt;/h2&gt;

&lt;p&gt;El análisis inicial encontró 50 alertas de seguridad: 39 accesos dinámicos a objetos, 10 expresiones regulares señaladas como potencialmente inseguras y un constructor RegExp no literal.&lt;/p&gt;

&lt;p&gt;Estos resultados no equivalen a cincuenta vulnerabilidades confirmadas. Un acceso a un arreglo con un índice controlado o una expresión de longitud limitada pueden activar una regla sin demostrar una ruta explotable. La revisión debe comprobar quién controla la entrada, qué límites existen y cómo se usa el resultado.&lt;/p&gt;

&lt;p&gt;La primera ejecución también reveló tres errores de configuración por comentarios de reglas TypeScript. Corregí la configuración cargando el plugin correspondiente; esos errores no forman parte del conteo de alertas de seguridad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Corrección del patrón de tarjetas
&lt;/h2&gt;

&lt;p&gt;Una alerta correspondía al patrón empleado para enmascarar números de tarjetas antes de enviar texto a un proveedor de IA. El patrón utilizaba una repetición anidada de bloques de cuatro dígitos.&lt;/p&gt;

&lt;p&gt;Reescribí esa parte enumerando los cuatro grupos y sus separadores opcionales, conservando la alternativa para números de quince dígitos. La transformación elimina la alerta estática de ese patrón y conserva los formatos que la aplicación ya aceptaba. Esto no constituye una demostración de que la expresión original fuera explotable.&lt;/p&gt;

&lt;p&gt;Añadí pruebas para números con espacios, con guiones y de quince dígitos. También comprobé que la función inversa restaura el dato original después del enmascaramiento.&lt;/p&gt;

&lt;p&gt;El análisis posterior informa 49 alertas: 39 accesos dinámicos, 9 expresiones regulares y un RegExp no literal. Las restantes requieren revisión. No presento este resultado como una aplicación libre de vulnerabilidades.&lt;/p&gt;

&lt;h2&gt;
  
  
  La auditoría de dependencias como control complementario
&lt;/h2&gt;

&lt;p&gt;El análisis de código y la auditoría de dependencias responden preguntas diferentes. npm audit identificó inicialmente 12 vulnerabilidades conocidas en el árbol instalado: 3 moderadas, 5 altas y 4 críticas.&lt;/p&gt;

&lt;p&gt;Actualicé Vitest y la herramienta de cobertura a 4.1.11, lint-staged a 17.6.0 y dependencias compatibles. La consulta posterior de npm audit reportó cero vulnerabilidades conocidas. Este resultado se limita al árbol y a la información de la auditoría en el momento de ejecutarla.&lt;/p&gt;

&lt;p&gt;La configuración de CI y Docker ahora utiliza Node.js 24, compatible con las herramientas actualizadas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automatización y evidencia
&lt;/h2&gt;

&lt;p&gt;GitHub Actions ejecuta la instalación reproducible, el análisis de ESLint Security y la auditoría de dependencias. El workflow conserva el JSON del análisis como artefacto y añade un resumen con el número de archivos y alertas.&lt;/p&gt;

&lt;p&gt;Los errores de ejecución provocan fallo. Las alertas de las reglas recomendadas se conservan para revisión y no equivalen automáticamente a un bloqueo del despliegue. Esa distinción evita confundir un job exitoso con la resolución de todos los problemas.&lt;/p&gt;

&lt;p&gt;También corregí errores que impedían el pipeline anterior: la conexión SQLite cuando el backend exige PostgreSQL, el proveedor mock que ya no acepta la configuración y la referencia a un archivo Docker Compose inexistente.&lt;/p&gt;

&lt;p&gt;La suite local posterior pasó 59 pruebas. El reporte de cobertura previo, con 52 pruebas, midió 16,43 % de líneas. La cobertura general sigue siendo limitada; no basta con contar pruebas aprobadas para dar por verificado todo el backend.&lt;/p&gt;

&lt;p&gt;Como control complementario, la ejecución de Semgrep encontró una configuración AES-GCM sin longitud explícita de etiqueta en CryptoVault. Especifiqué authTagLength de 16 bytes tanto en cifrado como en descifrado. Dos pruebas verifican la restauración del texto y el rechazo de etiquetas alteradas o payloads incompletos. La nueva ejecución de Semgrep terminó con cero hallazgos de las reglas JavaScript y TypeScript seleccionadas; esto no resuelve las 49 alertas independientes de ESLint Security.&lt;/p&gt;

&lt;p&gt;SonarQube Community también se ejecutó en un servicio temporal del runner. El primer análisis informó 192 bugs y 14 vulnerabilidades clasificadas por sus reglas. Después de sustituir la fuente de aleatoriedad por primitivas criptográficas y corregir las comprobaciones de longitud del visor de diferencias, reportó 190 bugs y cero vulnerabilidades. Las 190 alertas restantes corresponden a propiedades BDD llamadas then. La inspección de tipos confirmó datos no invocables; conservé la revisión como evidencia de candidatos a falso positivo, sin afirmar que su estado esté cerrado en SonarQube. En ambas consultas se reportaron cero hotspots.&lt;/p&gt;

&lt;h2&gt;
  
  
  Infraestructura y documentación
&lt;/h2&gt;

&lt;p&gt;La configuración Terraform aprovisiona PostgreSQL y la aplicación mediante Docker dentro de un runner efímero, verifica su funcionamiento y destruye los recursos al terminar. Este entorno permite probar la infraestructura, pero no constituye por sí solo una publicación web persistente.&lt;/p&gt;

&lt;p&gt;La prueba integrada pasó registro, creación de proyecto y requisito y consulta de métricas desde PostgreSQL. También corrigió una brecha de persistencia: la migración original creaba ocho tablas y el código utilizaba doce modelos. Añadí una migración aditiva y el workflow comprobó que el esquema aplicado coincide con Prisma.&lt;/p&gt;

&lt;p&gt;La documentación automática se genera desde el esquema Prisma y el árbol de sintaxis TypeScript: diccionario de datos, entidad relación, clases, componentes, despliegue y detalles de métodos y propiedades. Cada evidencia debe vincularse con la revisión concreta del código analizado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo aprendido
&lt;/h2&gt;

&lt;p&gt;Esta revisión permitió distinguir alertas de código, vulnerabilidades conocidas en dependencias y errores de automatización. Una corrección útil necesita evidencia antes y después y pruebas que preserven el comportamiento esperado.&lt;/p&gt;

&lt;p&gt;El trabajo continúa con la clasificación de las alertas pendientes y la ampliación de la cobertura. Mantener visibles esos límites permite evaluar el proyecto con sus resultados reales.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enlaces del proyecto
&lt;/h2&gt;

&lt;p&gt;Repositorio público autorizado, con una copia del código analizado:&lt;br&gt;
&lt;a href="https://github.com/miltom123/testgenai-sast" rel="noopener noreferrer"&gt;https://github.com/miltom123/testgenai-sast&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aplicación publicada por el equipo:&lt;br&gt;
&lt;a href="https://testgenai-calidad.vercel.app/" rel="noopener noreferrer"&gt;https://testgenai-calidad.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verifiqué su pantalla de inicio de sesión. Esa observación confirma el acceso público al frontend; no acredita el backend ni que Vercel haya desplegado la revisión analizada. La automatización Terraform descrita corresponde a un entorno de prueba efímero.&lt;/p&gt;

&lt;p&gt;Documentación técnica publicada automáticamente en GitHub Pages:&lt;br&gt;
&lt;a href="https://miltom123.github.io/testgenai-sast/" rel="noopener noreferrer"&gt;https://miltom123.github.io/testgenai-sast/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Video del proceso, de menos de cinco minutos, con capturas reales y narración sintética genérica:&lt;br&gt;
&lt;a href="https://youtu.be/uVTdcjrnKI0" rel="noopener noreferrer"&gt;https://youtu.be/uVTdcjrnKI0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ejecución pública ESLint Security:&lt;br&gt;
&lt;a href="https://github.com/miltom123/testgenai-sast/actions/runs/37712519312" rel="noopener noreferrer"&gt;https://github.com/miltom123/testgenai-sast/actions/runs/37712519312&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CI y pruebas de la copia pública:&lt;br&gt;
&lt;a href="https://github.com/miltom123/testgenai-sast/actions/runs/37712519236" rel="noopener noreferrer"&gt;https://github.com/miltom123/testgenai-sast/actions/runs/37712519236&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Semgrep:&lt;br&gt;
&lt;a href="https://github.com/miltom123/testgenai-sast/actions/runs/37712519238" rel="noopener noreferrer"&gt;https://github.com/miltom123/testgenai-sast/actions/runs/37712519238&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Release y verificación Terraform:&lt;br&gt;
&lt;a href="https://github.com/miltom123/testgenai-sast/actions/runs/37712598185" rel="noopener noreferrer"&gt;https://github.com/miltom123/testgenai-sast/actions/runs/37712598185&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Documentación y publicación en Pages:&lt;br&gt;
&lt;a href="https://github.com/miltom123/testgenai-sast/actions/runs/37712519237" rel="noopener noreferrer"&gt;https://github.com/miltom123/testgenai-sast/actions/runs/37712519237&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>security</category>
      <category>testing</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Respaldos de PostgreSQL del entorno local a la nube con Docker y GitHub Actions</title>
      <dc:creator>Milton H</dc:creator>
      <pubDate>Sat, 03 Oct 2026 22:33:14 +0000</pubDate>
      <link>https://dev.to/milton_h_107ce42c1ba76290/respaldos-de-postgresql-del-entorno-local-a-la-nube-con-docker-y-github-actions-24f9</link>
      <guid>https://dev.to/milton_h_107ce42c1ba76290/respaldos-de-postgresql-del-entorno-local-a-la-nube-con-docker-y-github-actions-24f9</guid>
      <description>&lt;p&gt;&lt;strong&gt;Autor: Milton H. Flores Chino&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Proyecto grupal de Base de Datos II, desarrollado junto con Yerry Maycol Tarqui Collatupa.&lt;/p&gt;

&lt;p&gt;Una estrategia de respaldo debe permitir recuperar información y ejecutarse con regularidad. En nuestro proyecto trabajamos ese ciclo con PostgreSQL: preparación de datos, generación de copias, restauración en otra base y automatización de respaldos de una instancia en la nube.&lt;/p&gt;

&lt;p&gt;En este artículo presento el recorrido del proyecto y mi análisis de las decisiones que tomamos. Utilizamos PostgreSQL, Docker, PowerShell, FastAPI, Render y GitHub Actions.&lt;/p&gt;
&lt;h2&gt;
  
  
  Enlaces del proyecto
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Yerrytc/TG1-Database-Backup-Strategies-" rel="noopener noreferrer"&gt;Repositorio público con el código y la documentación&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tg1-database-backup-strategies.onrender.com/docs" rel="noopener noreferrer"&gt;Aplicación pública y documentación Swagger en Render&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtu.be/TPO5GbbXwqQ" rel="noopener noreferrer"&gt;Video de construcción y demostración&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Preparar un entorno reproducible
&lt;/h2&gt;

&lt;p&gt;Comenzamos configurando PostgreSQL en Docker Compose. Separamos las credenciales del código mediante variables de entorno; el repositorio incluye una plantilla &lt;code&gt;.env.example&lt;/code&gt; para facilitar la preparación de otra instalación.&lt;/p&gt;

&lt;p&gt;Después creamos las tablas y cargamos datos de prueba con un script SQL. Estos datos nos dieron una referencia para comprobar que la aplicación podía consultar PostgreSQL y que una restauración recuperaba la información esperada.&lt;/p&gt;

&lt;p&gt;Docker nos permitió organizar la base de datos y la aplicación en servicios. Para levantar el entorno del proyecto se utiliza:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Generar el respaldo y comprobar la recuperación
&lt;/h2&gt;

&lt;p&gt;Implementamos un script de PowerShell para producir respaldos locales con &lt;code&gt;pg_dump&lt;/code&gt;. Luego configuramos el Programador de tareas de Windows para ejecutar el script de forma periódica. La automatización local depende de que el equipo esté disponible en el horario previsto.&lt;/p&gt;

&lt;p&gt;PostgreSQL permite generar un respaldo lógico en formato personalizado con &lt;code&gt;-Fc&lt;/code&gt; y recuperarlo mediante &lt;code&gt;pg_restore&lt;/code&gt;. Estos comandos ilustran el procedimiento; las variables de conexión deben configurarse para cada entorno:&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;--dbname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$DATABASE_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-Fc&lt;/span&gt; &lt;span class="nt"&gt;--no-owner&lt;/span&gt; &lt;span class="nt"&gt;--no-privileges&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; backup.dump
pg_restore &lt;span class="nt"&gt;--dbname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$RESTORE_DATABASE_URL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--no-owner&lt;/span&gt; &lt;span class="nt"&gt;--no-privileges&lt;/span&gt; backup.dump
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La base de destino debe existir y ser independiente de la base de trabajo. Así se puede evaluar la recuperación sin sobrescribir los datos originales. En el desarrollo documentamos la selección del respaldo, su copia al contenedor, la creación de la base de destino y la restauración.&lt;/p&gt;

&lt;p&gt;Según la &lt;a href="https://www.postgresql.org/docs/16/backup-dump.html" rel="noopener noreferrer"&gt;documentación de PostgreSQL&lt;/a&gt;, un archivo de formato personalizado se restaura con &lt;code&gt;pg_restore&lt;/code&gt;. Además, &lt;code&gt;pg_dump&lt;/code&gt; respalda una base individual; los roles y otros objetos globales requieren un tratamiento adicional.&lt;/p&gt;

&lt;p&gt;Mi principal conclusión de esta etapa es que guardar un archivo es solo una parte del proceso. La prueba de recuperación debe comprobar las tablas, los registros y las consultas que necesita la aplicación.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consultar los datos desde FastAPI
&lt;/h2&gt;

&lt;p&gt;Creamos una API con FastAPI para consultar los datos. Durante el desarrollo local comprobamos el estado del servicio, la conexión con PostgreSQL, el listado de productos y la documentación interactiva.&lt;/p&gt;

&lt;p&gt;Los endpoints del proyecto son:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Propósito&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Consultar el estado general de la API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/health&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Comprobar la conexión con PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/productos&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Consultar los productos almacenados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/docs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Explorar la documentación Swagger&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;La API ayuda a evaluar el sistema desde el punto de vista de quien consume los datos. Tras una recuperación, verificar consultas representativas permite detectar problemas que el tamaño del archivo de respaldo no revela.&lt;/p&gt;

&lt;h2&gt;
  
  
  Publicar en la nube y automatizar el despliegue
&lt;/h2&gt;

&lt;p&gt;Publicamos el código en GitHub y desplegamos PostgreSQL y FastAPI en Render. La entrega incluye la dirección pública de Swagger para que se puedan revisar los endpoints.&lt;/p&gt;

&lt;p&gt;También configuramos el despliegue automático: Render toma los cambios de la rama &lt;code&gt;main&lt;/code&gt; del repositorio y genera un nuevo despliegue cuando se envían commits. En el informe registramos la modificación de la aplicación, el envío de los cambios y la verificación del proceso.&lt;/p&gt;

&lt;p&gt;Este flujo permite mantener una relación clara entre la versión del código y la aplicación publicada. La automatización del despliegue y la automatización del respaldo resuelven necesidades distintas: una actualiza el servicio y la otra conserva una copia de los datos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Respaldar PostgreSQL en Render con GitHub Actions
&lt;/h2&gt;

&lt;p&gt;Para la instancia en la nube implementamos un workflow de GitHub Actions y un repositorio privado dedicado a los respaldos. De esta manera, la ejecución programada puede realizarse aunque nuestra computadora esté apagada.&lt;/p&gt;

&lt;p&gt;El flujo genera una copia con &lt;code&gt;pg_dump&lt;/code&gt;, comprueba que el archivo tenga contenido, lo cifra mediante OpenSSL y almacena el resultado con extensión &lt;code&gt;.dump.enc&lt;/code&gt;. Las credenciales de conexión y la frase de cifrado se gestionan mediante GitHub Secrets.&lt;/p&gt;

&lt;p&gt;La programación documentada utiliza &lt;code&gt;17 10 * * *&lt;/code&gt;: corresponde a las 10:17 UTC, es decir, a las 5:17 a. m. en Perú. El workflow también permite una ejecución manual para verificar su funcionamiento. El informe incluye evidencias de la ejecución manual, de una ejecución programada y de los archivos cifrados generados.&lt;/p&gt;

&lt;p&gt;En el repositorio público puede consultarse una &lt;a href="https://github.com/Yerrytc/TG1-Database-Backup-Strategies-/blob/main/docs/backup-render.example.yml" rel="noopener noreferrer"&gt;versión de ejemplo del workflow&lt;/a&gt;. Las copias reales permanecen en el repositorio privado destinado a respaldos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué mejoraría en una siguiente versión
&lt;/h2&gt;

&lt;p&gt;Para ampliar esta solución propondría definir una política de retención, alertas de fallo y pruebas periódicas de restauración. También mediría el tiempo necesario para recuperar el servicio y la cantidad de información que se podría perder entre dos respaldos.&lt;/p&gt;

&lt;p&gt;Estas son mejoras propuestas, no funcionalidades que doy por implementadas en esta entrega. La comprobación de que un archivo existe y tiene contenido ayuda a detectar errores básicos, pero debe complementarse con una recuperación real. Asimismo, conviene conservar la clave de descifrado por separado y mantener copias en más de un destino.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aprendizaje del proyecto
&lt;/h2&gt;

&lt;p&gt;Este trabajo nos permitió conectar la administración de PostgreSQL con una aplicación desplegada y con procesos automáticos. Desde mi perspectiva, el valor de una estrategia de respaldo está en poder repetir la recuperación y demostrar que los datos vuelven a ser utilizables.&lt;/p&gt;

&lt;p&gt;El código público, la aplicación en Render y el video enlazados al inicio reúnen los recursos de esta implementación. El desarrollo técnico es grupal y esta explicación corresponde a mi artículo individual sobre el proyecto.&lt;/p&gt;

</description>
      <category>postgres</category>
    </item>
  </channel>
</rss>
