workspace/projects/gamilit/apps/database/FLUJO-CARGA-LIMPIA.md
rckrdmrd a23f31ce8f feat(db): Sincronizar scripts de BD y documentacion de produccion
## Scripts de Base de Datos (12 archivos)
- init-database.sh: Inicializacion completa con usuario y BD
- init-database-v3.sh: Version con dotenv-vault
- reset-database.sh: Reset BD manteniendo usuario
- recreate-database.sh: Recreacion completa
- cleanup-duplicados.sh, fix-duplicate-triggers.sh
- verify-users.sh, verify-missions-status.sh
- load-users-and-profiles.sh, DB-127-validar-gaps.sh

## Scripts de Produccion (5 archivos)
- build-production.sh: Compilar backend y frontend
- deploy-production.sh: Desplegar con PM2
- pre-deploy-check.sh: Validaciones pre-deploy
- repair-missing-data.sh: Reparar datos faltantes
- migrate-missing-objects.sh: Migrar objetos SQL

## Documentacion (7 archivos)
- GUIA-DESPLIEGUE-PRODUCCION-COMPLETA.md
- GUIA-ACTUALIZACION-PRODUCCION.md
- GUIA-VALIDACION-PRODUCCION.md
- GUIA-DEPLOYMENT-AGENTE-PRODUCCION.md
- GUIA-SSL-NGINX-PRODUCCION.md
- GUIA-SSL-AUTOFIRMADO.md
- DIRECTIVA-DEPLOYMENT.md

## Actualizaciones DDL/Seeds
- 99-post-ddl-permissions.sql: Permisos actualizados
- LOAD-SEEDS-gamification_system.sh: Seeds completos

## Nuevos archivos
- PROMPT-AGENTE-PRODUCCION.md: Prompt para agente productivo
- FLUJO-CARGA-LIMPIA.md: Documentacion de carga limpia

Resuelve: Problema de carga de BD entre dev y produccion
Cumple: DIRECTIVA-POLITICA-CARGA-LIMPIA.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 15:01:03 -06:00

209 lines
5.3 KiB
Markdown

# FLUJO DE CARGA LIMPIA - GAMILIT DATABASE
**Fecha:** 2025-12-18
**Version:** 1.0
**Cumple con:** DIRECTIVA-POLITICA-CARGA-LIMPIA.md
---
## RESUMEN
Este documento describe los 3 escenarios de inicializacion de base de datos y que script usar en cada caso.
---
## ESCENARIOS Y SCRIPTS
### Escenario 1: INSTALACION NUEVA (Usuario y BD no existen)
**Usar:** `init-database.sh` o `init-database-v3.sh`
**Ubicacion:** `apps/database/scripts/`
```bash
cd /home/isem/workspace/projects/gamilit/apps/database/scripts
# Opcion A: Con password manual
./init-database.sh --env dev --password "tu_password_seguro"
# Opcion B: Con dotenv-vault (recomendado para produccion)
./manage-secrets.sh generate --env prod
./manage-secrets.sh sync --env prod
./init-database-v3.sh --env prod
```
**Que hace:**
1. Crea usuario PostgreSQL `gamilit_user`
2. Crea base de datos `gamilit_platform`
3. Ejecuta todos los DDL (16 fases)
4. Carga todos los Seeds (38+ archivos)
5. Genera archivo de credenciales
6. Actualiza .env de backend/frontend
---
### Escenario 2: RECREACION COMPLETA (Usuario existe, BD se resetea)
**Usar:** `drop-and-recreate-database.sh`
**Ubicacion:** `apps/database/`
```bash
cd /home/isem/workspace/projects/gamilit/apps/database
# Con DATABASE_URL
export DATABASE_URL="postgresql://gamilit_user:password@localhost:5432/gamilit_platform"
./drop-and-recreate-database.sh
# O pasando como argumento
./drop-and-recreate-database.sh "postgresql://gamilit_user:password@localhost:5432/gamilit_platform"
```
**Que hace:**
1. Desconecta usuarios activos
2. DROP DATABASE gamilit_platform
3. CREATE DATABASE gamilit_platform
4. Llama a `create-database.sh` automaticamente
---
### Escenario 3: SOLO DDL + SEEDS (BD limpia ya existe)
**Usar:** `create-database.sh`
**Ubicacion:** `apps/database/`
```bash
cd /home/isem/workspace/projects/gamilit/apps/database
export DATABASE_URL="postgresql://gamilit_user:password@localhost:5432/gamilit_platform"
./create-database.sh
```
**Que hace:**
1. Habilita extensiones (pgcrypto, uuid-ossp)
2. Ejecuta DDL en 16 fases ordenadas
3. Carga Seeds de produccion (38+ archivos)
4. Genera reporte de objetos creados
---
## DIAGRAMA DE DECISION
```
¿Existe el usuario gamilit_user?
├── NO ──► Escenario 1: ./scripts/init-database.sh --env dev
└── SI ──► ¿Necesitas eliminar TODOS los datos?
├── SI ──► Escenario 2: ./drop-and-recreate-database.sh
└── NO ──► ¿La BD esta vacia (recien creada)?
├── SI ──► Escenario 3: ./create-database.sh
└── NO ──► Escenario 2: ./drop-and-recreate-database.sh
```
---
## COMANDOS RAPIDOS POR AMBIENTE
### Desarrollo (primera vez)
```bash
cd apps/database/scripts
./init-database.sh --env dev --password "dev_password_123"
```
### Desarrollo (recrear BD)
```bash
cd apps/database
export DATABASE_URL="postgresql://gamilit_user:dev_password_123@localhost:5432/gamilit_platform"
./drop-and-recreate-database.sh
```
### Produccion (primera vez)
```bash
cd apps/database/scripts
./manage-secrets.sh generate --env prod
./manage-secrets.sh sync --env prod
./init-database-v3.sh --env prod
```
### Produccion (recrear BD)
```bash
cd apps/database
export DATABASE_URL="postgresql://gamilit_user:$DB_PASSWORD@localhost:5432/gamilit_platform"
./drop-and-recreate-database.sh
```
---
## VALIDACION POST-CARGA
Despues de cualquier escenario, validar con:
```bash
# Verificar conteo de objetos
psql "$DATABASE_URL" -c "
SELECT
(SELECT COUNT(*) FROM information_schema.schemata WHERE schema_name NOT IN ('pg_catalog','information_schema','pg_toast')) as schemas,
(SELECT COUNT(*) FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog','information_schema')) as tables,
(SELECT COUNT(*) FROM pg_type WHERE typcategory = 'E') as enums
;"
# Verificar datos criticos
psql "$DATABASE_URL" -c "
SELECT 'tenants' as tabla, COUNT(*) FROM auth_management.tenants
UNION ALL SELECT 'users', COUNT(*) FROM auth.users
UNION ALL SELECT 'modules', COUNT(*) FROM educational_content.modules
UNION ALL SELECT 'maya_ranks', COUNT(*) FROM gamification_system.maya_ranks
UNION ALL SELECT 'feature_flags', COUNT(*) FROM system_configuration.feature_flags;
"
```
**Valores esperados:**
- Schemas: 15+
- Tablas: 60+
- ENUMs: 35+
- Tenants: 14+
- Users: 20+
- Modules: 5
- Maya Ranks: 5
- Feature Flags: 26+
---
## SCRIPTS DISPONIBLES
| Script | Ubicacion | Proposito |
|--------|-----------|-----------|
| `init-database.sh` | scripts/ | Crear usuario + BD + DDL + Seeds |
| `init-database-v3.sh` | scripts/ | Igual pero con dotenv-vault |
| `drop-and-recreate-database.sh` | ./ | Drop BD + Recrear + DDL + Seeds |
| `create-database.sh` | ./ | Solo DDL + Seeds (BD debe existir) |
| `reset-database.sh` | scripts/ | Reset BD (mantiene usuario) |
| `recreate-database.sh` | scripts/ | Drop completo (usuario + BD) |
| `manage-secrets.sh` | scripts/ | Gestionar passwords con vault |
---
## CUMPLIMIENTO DE DIRECTIVA
Este flujo cumple con DIRECTIVA-POLITICA-CARGA-LIMPIA.md:
- ✅ DDL es fuente de verdad
- ✅ BD es resultado de ejecutar DDL
- ✅ No se usan migrations
- ✅ Recreacion completa en cualquier momento
- ✅ Un comando = BD lista
---
**Ultima actualizacion:** 2025-12-18