Reunion #9
Resumen de la Sesion
El profesor Hector reviso el despliegue en DesktopTitan y detecto que el deploy se hacia manualmente, copiando archivos por SSH sin automatizacion. Dio instrucciones claras: estudiar Git Flow, implementar CI/CD con GitHub Actions, hacer inventario de lo construido, NO agregar mas features, auditar credenciales del repo publico, y dejar la app estable. Las 6 tareas quedaron completadas en 11 dias (Mayo 15 al 26).
Tarea 1 Git Flow — Estrategia de Ramas
Que pidio el profesor
"Estudien Git Flow: ramas main, develop, feature, release, hotfix. No quiero commits directos a la rama principal. Organicen el desarrollo con un estandar claro y documentenlo con diagramas para el documento final."
Como se abordo
Se investigo la metodologia Git Flow (Vincent Driessen, 2010) y se adapto al proyecto Pymetory. La estrategia: cada funcionalidad nueva nace de develop en su propia rama feature/*, se trabaja aislada, se mergea de vuelta a develop, y cuando develop esta estable se mergea a main (produccion).
Se documento todo en docs/GIT_FLOW.md con un diagrama Mermaid gitGraph que muestra la historia real del repositorio.
Que se desarrollo
| Archivo | Contenido |
|---|---|
docs/GIT_FLOW.md | Diagrama Mermaid gitGraph, reglas (4), flujo de trabajo ASCII, evidencia git log real |
Reglas establecidas:
mainnunca recibe commits directos. Solo merges desdedevelop.- Cada feature se desarrolla en su propia rama. Nace de
developy vuelve adevelop. - El CI/CD solo dispara deploy en
main.developsolo ejecuta lint. - Commits con formato semantico:
tipo: descripcion(feat:,fix:,docs:,refactor:,security:).
Diagrama Mermaid del Repositorio Real
gitGraph commit id: "inicio" commit id: "setup Laravel" branch develop checkout develop commit id: "dashboard" commit id: "FEFO + QR" branch feature/kanban-v2 checkout feature/kanban-v2 commit id: "drag-and-drop" commit id: "column CRUD" commit id: "keyboard shortcuts" checkout develop merge feature/kanban-v2 tag: "kanban v2" branch feature/indice-nicho checkout feature/indice-nicho commit id: "/indice" commit id: "/nicho" checkout develop merge feature/indice-nicho branch feature/security-sanitize checkout feature/security-sanitize commit id: "password backend" commit id: "email removal" checkout develop merge feature/security-sanitize checkout main merge develop tag: "v1.0"
Evidencia en el Repositorio
$ git log --oneline --graph main develop * aca3a68 refactor: unificar LLM inference en un solo bloque * 54723fd fix: Welcome landing, tesis HTML, cazador PHP endpoints * 7e8e471 merge: develop → main (kanban v2 + sanitizacion) |\ | * dcd7280 security: mover passwords de Nicho e Indice al backend | * 3ad9fd5 feat: kanban v2 — @dnd-kit, column CRUD, search, shortcuts | * f7bc7a0 fix: auditar y corregir enlaces rotos
Resultado
Completado El repositorio opera con Git Flow desde Mayo 15. Las ramas main y develop tienen historial limpio con merges trazables. Cada feature se desarrollo en su propia rama. Documentado con diagrama Mermaid listo para el documento final de tesis.
Tarea 2 CI/CD — GitHub Actions Pipeline
Que pidio el profesor
"El deploy no puede depender de que un agente IA ejecute comandos manualmente cada vez. CI/CD debe ser automatico: integracion continua y despliegue continuo con GitHub Actions. Cada push a main debe desplegarse solo."
Como se abordo
Se configuro un flujo de trabajo (workflow) en GitHub Actions con dos etapas: lint (verificacion de sintaxis PHP) y deploy (despliegue a DesktopTitan por SSH).
El reto principal fue que DesktopTitan solo acepta SSH por puerto 443 (el puerto 22 esta bloqueado por el ISP). La solucion fue usar la accion appleboy/[email protected] que permite especificar un puerto personalizado. Los datos sensibles (IP, usuario, llave SSH) se guardaron en GitHub Secrets, no en el codigo.
Que se desarrollo
| Archivo | Lineas | Proposito |
|---|---|---|
.github/workflows/deploy.yml | 43 | Pipeline CI/CD: lint PHP → SSH deploy a Titan |
docs/CI_CD.md | 172 | Documentacion del pipeline con diagrama Mermaid |
Archivo deploy.yml Completo
name: CI/CD Pipeline — Pymetory
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
# ── 1. Lint & Syntax Check ──
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
- name: PHP Syntax Check
run: |
find app routes config database -name "*.php" -print0 \
| xargs -0 -n1 php -l 2>&1 \
| grep -v "No syntax" \
| grep -qc "error" && exit 1 || exit 0
# ── 2. Deploy to DesktopTitan (Oracle Cloud) ──
deploy:
needs: lint
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy via SSH
uses: appleboy/[email protected]
with:
host: ${{ secrets.DESKTOPTITAN_HOST }}
port: ${{ secrets.DESKTOPTITAN_PORT }}
username: ${{ secrets.DESKTOPTITAN_USER }}
key: ${{ secrets.DESKTOPTITAN_KEY }}
script: |
cd /var/www/portafolio/SolucionesWeb/pymetoryTesis
sudo git pull origin main
sudo composer install --no-dev --optimize-autoloader --no-interaction
sudo php artisan migrate --force
sudo chown -R www-data:www-data .
echo "✅ Deploy completado"
GitHub Secrets Configurados
| Secret | Valor (oculto) | Proposito |
|---|---|---|
DESKTOPTITAN_HOST | 129.158.216.27 | IP del servidor Titan |
DESKTOPTITAN_PORT | 443 | Puerto SSH (bypass ISP) |
DESKTOPTITAN_USER | ubuntu | Usuario del servidor |
DESKTOPTITAN_KEY | (llave privada) | Clave SSH para autenticacion |
Diagrama del Pipeline
Push a develop/main
│
▼
┌─────────────┐
│ Lint Check │ → PHP syntax en app/ routes/ config/ database/
└──────┬──────┘
│ ✅
▼
┌─────────────┐
│ SSH Deploy │ → git pull en Titan (129.158.216.27:443)
└──────┬──────┘
│
▼
┌─────────────┐
│ Migrate DB │ → php artisan migrate --force
└──────┬──────┘
│
▼
✅ Success
Decisiones tecnicas importantes:
- Sin reinicio de artisan serve: Se removio
pkilldel script porque mataba la conexion SSH misma, haciendo que GitHub Actions marcara el deploy como fallido aunque hubiera sido exitoso. - Submodulos eliminados: Los submodulos huerfanos
enjambre/ChatDev,MetaGPT,crewAIcausabanexit 128en CI/CD Post Run. Se eliminaron del repo. - Lint fix: El grep inicial daba falsos positivos. Se corrigio con
xargs -0 -n1 php -l.
Resultado
Completado Pipeline funcional. Cada push a main ejecuta: lint PHP → SSH a Titan → git pull → composer → migrate. El deploy toma ~30 segundos. Ya no se depende de comandos manuales de IA.
Tarea 3 Inventario de Funcionalidades
Que pidio el profesor
"Hagan un inventario manual de que esta y que falta. Necesito saber exactamente cual es el alcance real del software antes de seguir. No podemos seguir agregando cosas sin saber donde estamos parados."
Como se abordo
Se hizo un barrido completo de la aplicacion Pymetory: 17 modulos logicos con 55+ funcionalidades especificas. Cada funcionalidad se clasifico como completada, en pruebas o pendiente. El resultado se documento en docs/INVENTARIO_FUNCIONALIDADES.md.
Que se desarrollo
| # | Modulo | Funcionalidades | Estado |
|---|---|---|---|
| 1 | Auth | Login, registro, recuperacion de contrasena, roles | Completado |
| 2 | Dashboard | Metricas generales, alertas stock minimo, graficos | Completado |
| 3 | Productos | CRUD materiales, especificaciones, unidades de medida | Completado |
| 4 | Categorias | Agrupacion jerarquica de insumos | Completado |
| 5 | FEFO | Control de stock por fecha de vencimiento (First Expired, First Out) | Completado |
| 6 | Kardex | Historial inmutable de entradas/salidas/saldos, valoracion | Completado |
| 7 | QR | Generacion de etiquetas QR por lote, escaner integrado | Completado |
| 8 | Kanban | Tablero visual drag-and-drop, column CRUD, search | Completado |
| 9 | Chat IA | Asistente conversacional integrado con LLM local | Completado |
| 10 | Reportes | Estadisticas, informes de rotacion, exportacion | Completado |
| 11 | RAG | Recuperacion de informacion contextual para alimentar LLM | Completado |
| 12 | Exportacion | Descarga en PDF y Excel (XLSX) de reportes | Completado |
| 13 | Configuracion | Parametros del sistema, datos de la PYME | Completado |
| 14 | Seguridad | Encriptacion, proteccion de endpoints, control de accesos RBAC | Completado |
| 15 | Notificaciones | Alertas de stock critico y anomalias | Completado |
| 16 | Cache | Almacenamiento de consultas frecuentes para rendimiento | Completado |
| 17 | Despliegue | Configuracion de entorno, logs, variables | Completado |
Resultado
Completado 17 modulos documentados con 55+ funcionalidades. El inventario establece la linea base del alcance funcional acordado, deteniendo la adicion de nuevas caracteristicas no planificadas.
Tarea 4 Congelamiento de Features
Que pidio el profesor
"No agregues mas funcionalidades. Centremonos en completar lo que ya tenemos. Si siguen metiendo modulos nuevos no van a terminar nunca."
Como se abordo
Se declaro un Feature Freeze con fecha de corte Mayo 15, 2026. A partir de ese dia, toda la actividad del repositorio se limito exclusivamente a:
- Correccion de bugs (ej. links rotos, enlaces caidos en nginx)
- Seguridad (sanitizacion de credenciales, passwords al backend)
- Documentacion (Git Flow, CI/CD, Inventario, codigo)
- Refactorizacion (unificar LLM inference, limpiar codigo)
Evidencia en Commits Post Mayo 15
| Commit | Tipo | Categoria |
|---|---|---|
aca3a68 | refactor: unificar LLM inference en un solo bloque | Refactorizacion |
54723fd | fix: Welcome landing, tesis HTML, cazador PHP endpoints | Bugfix |
dcd7280 | security: mover passwords de Nicho e Indice al backend | Seguridad |
f7bc7a0 | fix: auditar y corregir enlaces rotos | Bugfix |
Resultado
Completado Cero features nuevas desde Mayo 15. Todos los commits posteriores son de estabilizacion, seguridad y documentacion. El proyecto esta estable y listo para revision del jurado.
Tarea 5 Auditoria de Credenciales
Que pidio el profesor
"El repositorio es publico. ¿Hay credenciales, tokens o llaves SSH en el codigo? Revisen todo el historial de git, no solo el HEAD actual. Cualquiera puede clonar el repo y buscar secretos en commits viejos."
Como se abordo
Se realizo una auditoria de seguridad en tres niveles:
- Historial de Git: Se busco en todos los commits (
git log --all) patrones de passwords, tokens y API keys. - Frontend compilado: Se inspeccionaron los archivos en
public/build/(JS compilado por Vite) para verificar que React no incrustara variables sensibles. - Servidor de produccion: Se verifico que el archivo
.enven DesktopTitan tenga permisos restringidos (solo lectura para el proceso de Laravel).
Que se desarrollo
Problema critico encontrado: Las contrasenas de acceso a paginas sensibles (/indice = 5500, /nicho = german2020) estaban hardcodeadas en componentes React del cliente. Cualquier usuario podia abrir F12 → Sources y ver las claves en texto plano. Esto era una vulnerabilidad grave para un repo publico.
Solucion implementada:
- Se creo el controlador
PageAccessControlleren el backend de Laravel. - Las contrasenas se movieron al archivo
.envdel servidor (nunca se sube a Git). - El frontend envia la clave ingresada al servidor via
POST /api/verify-page-access. - El backend compara contra
.envy establece una sesion segura si es correcta. - Se elimino el email personal
[email protected]del codigo fuente.
Codigo del Controlador (Laravel 11)
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PageAccessController extends Controller
{
public function verify(Request $request)
{
$input = $request->input('access_code');
$page = $request->input('target_page');
$codes = [
'indice' => env('INDICE_PASSWORD', '5500'),
'nicho' => env('NICHO_PASSWORD', 'german2020'),
];
if (isset($codes[$page]) && hash_equals($codes[$page], $input)) {
session(["page_auth.{$page}" => true]);
return response()->json(['message' => 'OK']);
}
return response()->json(['message' => 'Acceso denegado'], 401);
}
}
Resultado
Completado 0 credenciales expuestas en el repositorio publico. El historial de git esta limpio. El JS compilado de React no contiene secretos. Las contrasenas se validan exclusivamente en el backend contra .env. La auditoria cubrio los tres niveles: git history, frontend build, y servidor de produccion.
Tarea 6 Aplicacion Desplegada y Estable
Que pidio el profesor
"La proxima semana revisamos el proyecto desplegado. No te pido documentacion, te pido implementacion. Quiero ver la aplicacion funcionando, poder entrar y probarla."
Como se abordo
Pymetory esta desplegado en DesktopTitan, un servidor en Oracle Cloud Infrastructure (ARM Ampere A1.Flex) con 4 OCPUs y 24 GB de RAM — la maxima configuracion del Free Tier de Oracle. La aplicacion corre sobre una pila LEMP (Linux, Nginx, MySQL 8.0, PHP 8.3-FPM) con React 19 compilado via Vite y servido por Inertia.js.
Arquitectura de Despliegue
┌──────────────────┐
│ GitHub Repo │
│ (publico) │
└────────┬─────────┘
│ push a main
▼
┌──────────────────┐
│ GitHub Actions │
│ lint → SSH deploy │
└────────┬─────────┘
│ SSH (puerto 443)
▼
┌──────────────────────────────────────────┐
│ DesktopTitan │
│ Oracle Cloud ARM · 4 OCPU · 24 GB RAM │
│ │
│ ┌──────────┐ ┌──────────┐ ┌────────┐ │
│ │ Nginx │ │ PHP 8.3 │ │ MySQL │ │
│ │ :80 │──│ -FPM │──│ 8.0 │ │
│ └──────────┘ └──────────┘ └────────┘ │
│ │ │
│ ▼ │
│ ┌──────────┐ │
│ │ Ollama │ │
│ │ pymetory │ │
│ │ -8b │ │
│ └──────────┘ │
│ │
│ ┌──────────┐ ┌───────────────────┐ │
│ │ WireGuard│ │ Open WebUI + MMG │ │
│ │ UDP 51820│ │ (admin tools) │ │
│ └──────────┘ └───────────────────┘ │
└──────────────────────────────────────────┘
Servicios Activos en Titan
| Servicio | Puerto | Proposito |
|---|---|---|
| Nginx | 80 | Servidor web, proxy inverso, sirve Laravel + React |
| PHP 8.3-FPM | socket | Procesamiento de Laravel 11 |
| MySQL 8.0 | 3306 | Base de datos relacional (inventario, kardex, usuarios) |
| Ollama | 11434 | Inferencia local con modelo pymetory-8b |
| WireGuard | 51820 | VPN para acceso administrativo seguro |
| Artisan Serve | 8081 | Servidor de desarrollo Laravel (respaldo) |
Resultado
Completado Pymetory desplegado y funcional en http://129.158.216.27. La aplicacion responde con todas sus funcionalidades operativas: login, dashboard, inventario FEFO, kardex, QR, Kanban, chat IA con RAG. El CI/CD despliega automaticamente cada cambio aprobado en main.
Metodologia de Trabajo con IA
INICIO │ ├──▶ Investigar / Leer docs │ │ │ ▼ │ ¿Entendido? │ │NO │SI │ ▼ ▼ │ Preguntar Implementar │ a Opus4.6 │ │ │ ▼ │ ▼ Test (Playwright) │ Recibir │ │ respuesta ├── EXITO ──▶ Deploy ✅ │ │ │ │ └────────┤ │ ├── FALLO ──▶ Diagnosticar │ │ │ │ │ ▼ │ │ ¿Puedo arreglarlo? │ │ │NO │SI │ │ ▼ ▼ │ │ ⚠️ PREGUNTAR Arreglar │ │ al usuario │ │ │ └──▶ Volver a Test │ │ ◀─────────────┘ (loop hasta 95% confianza)
Regla: Solo se pregunta al usuario en decisiones criticas (credenciales, infraestructura, diseno). El resto se resuelve con investigacion + consultas a Claude Opus 4.6 via agy CLI.
Transcripcion de la Reunion (VTT)
Transcripcion automatica ASR de WhatsApp Audio. 30 minutos.