#!/bin/bash ################################################################################ # Script de Preparación de Entrega en USB - Proyecto GAMILIT # Fecha: 16 de noviembre de 2025 # Versión: v1.0.0 ################################################################################ set -e # Salir si hay algún error # Colores para output GREEN='\033[0;32m' BLUE='\033[0;34m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color # Configuración PROJECT_ROOT="/home/isem/workspace/workspace-gamilit/gamilit/projects/gamilit" USB_PATH="${1:-/media/usb/GAMILIT_ENTREGA_2025-11-16}" DELIVERY_DATE="2025-11-16" echo -e "${BLUE}═══════════════════════════════════════════════════════════════${NC}" echo -e "${BLUE} PREPARACIÓN DE ENTREGA USB - PROYECTO GAMILIT v1.0.0${NC}" echo -e "${BLUE}═══════════════════════════════════════════════════════════════${NC}" echo "" # Función de ayuda show_help() { echo "Uso: $0 [RUTA_USB]" echo "" echo "Ejemplo:" echo " $0 /media/usb/GAMILIT_ENTREGA" echo " $0 /mnt/usb/ENTREGA" echo "" echo "Si no se especifica ruta, se usa: $USB_PATH" exit 0 } if [ "$1" == "-h" ] || [ "$1" == "--help" ]; then show_help fi echo -e "${YELLOW}📁 Destino: $USB_PATH${NC}" echo -e "${YELLOW}📦 Origen: $PROJECT_ROOT${NC}" echo "" # Verificar que existe el directorio del proyecto if [ ! -d "$PROJECT_ROOT" ]; then echo -e "${RED}❌ Error: No se encuentra el directorio del proyecto${NC}" exit 1 fi # Preguntar confirmación echo -e "${YELLOW}⚠️ Este script creará la estructura de entrega en:${NC}" echo -e "${YELLOW} $USB_PATH${NC}" echo "" read -p "¿Continuar? (s/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Ss]$ ]]; then echo -e "${RED}Cancelado por el usuario${NC}" exit 1 fi ################################################################################ # PASO 1: Crear estructura de carpetas ################################################################################ echo "" echo -e "${GREEN}[1/6] Creando estructura de carpetas...${NC}" mkdir -p "$USB_PATH"/{01-DOCUMENTOS-ENTREGA,02-CODIGO-FUENTE,03-DOCUMENTACION-PLANEACION,04-BASE-DATOS/{DDL,SEEDS,SCRIPTS,BACKUP},05-MANUALES} echo -e "${GREEN}✅ Estructura creada${NC}" ################################################################################ # PASO 2: Copiar documentos de entrega ################################################################################ echo "" echo -e "${GREEN}[2/6] Copiando documentos de entrega...${NC}" if [ -d "$PROJECT_ROOT/docs/finiquito" ]; then # Copiar solo archivos .docx principales (excluir scripts y markdown) cp "$PROJECT_ROOT/docs/finiquito"/*.docx "$USB_PATH/01-DOCUMENTOS-ENTREGA/" 2>/dev/null || true # Copiar también la guía de entrega cp "$PROJECT_ROOT/docs/finiquito/GUIA_ENTREGA_USB.md" "$USB_PATH/" 2>/dev/null || true echo -e "${GREEN}✅ $(ls -1 "$USB_PATH/01-DOCUMENTOS-ENTREGA"/*.docx 2>/dev/null | wc -l) documentos copiados${NC}" else echo -e "${YELLOW}⚠️ No se encontró la carpeta de finiquito${NC}" fi ################################################################################ # PASO 3: Copiar código fuente (sin node_modules, .git, etc.) ################################################################################ echo "" echo -e "${GREEN}[3/6] Copiando código fuente (esto puede tardar varios minutos)...${NC}" # Verificar si rsync está disponible if command -v rsync &> /dev/null; then rsync -av --progress \ --exclude 'node_modules' \ --exclude '.git' \ --exclude 'dist' \ --exclude 'build' \ --exclude '.cache' \ --exclude '.env' \ --exclude '*.log' \ --exclude '.turbo' \ --exclude 'coverage' \ --exclude '.next' \ "$PROJECT_ROOT/" \ "$USB_PATH/02-CODIGO-FUENTE/gamilit/" echo -e "${GREEN}✅ Código fuente copiado con rsync${NC}" else # Fallback a cp si no hay rsync echo -e "${YELLOW}⚠️ rsync no disponible, usando cp (más lento)${NC}" cp -r "$PROJECT_ROOT" "$USB_PATH/02-CODIGO-FUENTE/gamilit/" # Limpiar manualmente find "$USB_PATH/02-CODIGO-FUENTE/gamilit/" -type d -name "node_modules" -exec rm -rf {} + 2>/dev/null || true find "$USB_PATH/02-CODIGO-FUENTE/gamilit/" -type d -name ".git" -exec rm -rf {} + 2>/dev/null || true find "$USB_PATH/02-CODIGO-FUENTE/gamilit/" -type d -name "dist" -exec rm -rf {} + 2>/dev/null || true find "$USB_PATH/02-CODIGO-FUENTE/gamilit/" -type f -name "*.log" -delete 2>/dev/null || true echo -e "${GREEN}✅ Código fuente copiado con cp${NC}" fi ################################################################################ # PASO 4: Copiar documentación de planeación ################################################################################ echo "" echo -e "${GREEN}[4/6] Copiando documentación de planeación...${NC}" if [ -d "$PROJECT_ROOT/docs" ]; then cp -r "$PROJECT_ROOT/docs" "$USB_PATH/03-DOCUMENTACION-PLANEACION/" echo -e "${GREEN}✅ Documentación copiada${NC}" else echo -e "${YELLOW}⚠️ No se encontró carpeta docs/${NC}" fi if [ -d "$PROJECT_ROOT/orchestration" ]; then cp -r "$PROJECT_ROOT/orchestration" "$USB_PATH/03-DOCUMENTACION-PLANEACION/" echo -e "${GREEN}✅ Orchestration copiada${NC}" fi ################################################################################ # PASO 5: Base de datos ################################################################################ echo "" echo -e "${GREEN}[5/6] Preparando base de datos...${NC}" # Copiar DDL if [ -d "$PROJECT_ROOT/apps/database/ddl" ]; then cp -r "$PROJECT_ROOT/apps/database/ddl"/* "$USB_PATH/04-BASE-DATOS/DDL/" 2>/dev/null || true echo -e "${GREEN}✅ DDL copiados${NC}" fi # Copiar Seeds if [ -d "$PROJECT_ROOT/apps/database/seeds" ]; then cp -r "$PROJECT_ROOT/apps/database/seeds"/* "$USB_PATH/04-BASE-DATOS/SEEDS/" 2>/dev/null || true echo -e "${GREEN}✅ Seeds copiados${NC}" fi # Copiar scripts if [ -d "$PROJECT_ROOT/apps/database/scripts" ]; then cp -r "$PROJECT_ROOT/apps/database/scripts"/* "$USB_PATH/04-BASE-DATOS/SCRIPTS/" 2>/dev/null || true echo -e "${GREEN}✅ Scripts copiados${NC}" fi # Crear backup de base de datos echo "" echo -e "${YELLOW}¿Desea crear un backup de la base de datos actual? (s/N):${NC}" read -p "" -n 1 -r echo if [[ $REPLY =~ ^[Ss]$ ]]; then if command -v pg_dump &> /dev/null; then echo -e "${GREEN}Creando backup de base de datos...${NC}" export PGPASSWORD='3RZ2uYhCnJBXQqEwPPbZK3NFfk4T4W4Q' pg_dump -h localhost -U gamilit_user -d gamilit_platform \ --clean --if-exists --create \ -f "$USB_PATH/04-BASE-DATOS/BACKUP/dump_gamilit_${DELIVERY_DATE}.sql" \ && echo -e "${GREEN}✅ Backup creado exitosamente${NC}" \ || echo -e "${YELLOW}⚠️ No se pudo crear el backup (verificar que la BD esté corriendo)${NC}" unset PGPASSWORD else echo -e "${YELLOW}⚠️ pg_dump no disponible${NC}" fi else echo -e "${YELLOW}⏭️ Backup omitido${NC}" fi ################################################################################ # PASO 6: Crear archivos de configuración y README ################################################################################ echo "" echo -e "${GREEN}[6/6] Creando archivos de configuración...${NC}" # Copiar manuales de usuario echo -e "${GREEN}Copiando manuales de usuario...${NC}" cp "$PROJECT_ROOT/docs/finiquito/"Manual*.docx "$USB_PATH/05-MANUALES/" 2>/dev/null || true # Crear .env.template cat > "$USB_PATH/05-MANUALES/.env.template" << 'EOF' # ═══════════════════════════════════════════════════════════════ # CONFIGURACIÓN - PROYECTO GAMILIT # IMPORTANTE: Renombrar a .env y completar con valores reales # ═══════════════════════════════════════════════════════════════ # Backend Configuration NODE_ENV=production PORT=3006 # Database DB_HOST=localhost DB_PORT=5432 DB_NAME=gamilit_platform DB_USER=gamilit_user DB_PASSWORD=***CAMBIAR_POR_PASSWORD_SEGURO*** # JWT (Generar nueva clave secreta) JWT_SECRET=***GENERAR_CLAVE_ALEATORIA_SEGURA*** JWT_EXPIRES_IN=1h # Frontend VITE_API_URL=http://localhost:3006 # CORS CORS_ORIGIN=http://localhost:5173 # ═══════════════════════════════════════════════════════════════ # Para generar JWT_SECRET seguro, usar: # node -e "console.log(require('crypto').randomBytes(64).toString('hex'))" # ═══════════════════════════════════════════════════════════════ EOF # Crear README principal cat > "$USB_PATH/README.txt" << 'EOF' ═══════════════════════════════════════════════════════════════════ PROYECTO GAMILIT - PLATAFORMA DE GAMIFICACIÓN EDUCATIVA Entrega Final - 16 de noviembre 2025 ═══════════════════════════════════════════════════════════════════ VERSIÓN: v1.0.0 COMMIT: 2a578a2 FECHA: 16/11/2025 CONTENIDO DE ESTA ENTREGA: ────────────────────────────────────────────────────────────────── 📁 01-DOCUMENTOS-ENTREGA/ → Documentos legales (Acta, Anexos, Convenio) → Revisar y firmar según corresponda 📁 02-CODIGO-FUENTE/ → Código fuente completo → Backend: NestJS + TypeScript → Frontend: React 19 + TypeScript + Vite → Base de Datos: PostgreSQL 16.x 📁 03-DOCUMENTACION-PLANEACION/ → Historias de usuario → Especificaciones técnicas → Documentación de requerimientos 📁 04-BASE-DATOS/ → Scripts DDL (estructura) → Seeds (datos iniciales) → Backup completo 📁 05-MANUALES/ → Instrucciones de instalación → Templates de configuración REQUISITOS: ────────────────────────────────────────────────────────────────── - Node.js 18.x o superior - PostgreSQL 16.x - npm 9.x o superior INICIO RÁPIDO: ────────────────────────────────────────────────────────────────── 1. Leer GUIA_ENTREGA_USB.md 2. Instalar requisitos 3. Configurar base de datos (usar scripts en 04-BASE-DATOS/) 4. Configurar .env (usar template en 05-MANUALES/) 5. npm install (en backend y frontend) 6. npm run dev ═══════════════════════════════════════════════════════════════════ NOTA: Esta entrega NO incluye historial de Git Enfocada en documentación de planeación y código funcional ═══════════════════════════════════════════════════════════════════ Desarrollador: Adrián Flores Cortés EOF echo -e "${GREEN}✅ Archivos de configuración creados${NC}" ################################################################################ # Resumen final ################################################################################ echo "" echo -e "${BLUE}═══════════════════════════════════════════════════════════════${NC}" echo -e "${BLUE} ✅ ENTREGA PREPARADA ${NC}" echo -e "${BLUE}═══════════════════════════════════════════════════════════════${NC}" echo "" echo -e "${GREEN}📁 Ubicación: $USB_PATH${NC}" echo "" echo -e "${YELLOW}Contenido:${NC}" du -sh "$USB_PATH"/* 2>/dev/null | while read size path; do echo -e " ${GREEN}$size${NC}\t$(basename "$path")" done echo "" echo -e "${YELLOW}Tamaño total:${NC}" du -sh "$USB_PATH" 2>/dev/null echo "" echo -e "${GREEN}✅ Proceso completado exitosamente${NC}" echo "" echo -e "${YELLOW}Siguiente paso:${NC}" echo -e " 1. Verificar contenido en: $USB_PATH" echo -e " 2. Revisar README.txt" echo -e " 3. Copiar a USB físico si es necesario" echo -e " 4. Verificar que NO hay credenciales reales" echo "" echo -e "${BLUE}═══════════════════════════════════════════════════════════════${NC}"