diff --git a/.gitignore b/.gitignore index 6889f72..9fbbbfe 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,10 @@ services/lms-service/dev_keys/ # --- SSH Keys --- *.pem ubuntu.pem + +# --- TLS/ACME secrets (never commit) --- +nginx/certs-data/** +*.key +*.csr +*.crt +*.cer diff --git a/DESPLIEGUE.md b/DESPLIEGUE.md index 63b88a5..e253e9e 100644 --- a/DESPLIEGUE.md +++ b/DESPLIEGUE.md @@ -64,6 +64,21 @@ https://learning.norteamericano.com (LMS/Estudiantes) ## Requisitos Previos +### Seguridad de certificados (git) + +Nunca versionar material de certificados o cuentas ACME del servidor. + +Rutas sensibles (ejemplos): + +```bash +nginx/certs-data/ +*.key +*.csr +*.crt +``` + +Estas rutas deben permanecer ignoradas por git y gestionarse solo en el servidor/volumen de runtime. + ### 1. Configurar DNS Antes de ejecutar `deploy.sh`, configura los registros DNS en tu proveedor de dominio: @@ -129,6 +144,31 @@ docker logs nginx-proxy --tail 20 docker logs acme-companion --tail 50 ``` +### Validacion rapida de LMS (post-deploy) + +Despues de desplegar, valida que el backend LMS realmente levanto en `3002` y que no quedo con una URL de DB local invalida dentro de Docker. + +```bash +# Health interno desde la red Docker +docker exec openccb-studio node -e "fetch('http://experience:3002/health').then(async r=>{console.log(r.status);console.log(await r.text())})" + +# Ver variables activas en experience +docker exec openccb-experience sh -lc 'echo DATABASE_URL=$DATABASE_URL; echo LMS_DATABASE_URL=$LMS_DATABASE_URL' +``` + +Valores esperados en Docker: + +```bash +DATABASE_URL=postgresql://user:@db:5432/openccb_lms +LMS_DATABASE_URL=postgresql://user:@db:5432/openccb_lms +``` + +Si aparece `localhost:5433` en el contenedor `openccb-experience`, recrea el servicio con la variable correcta: + +```bash +LMS_DATABASE_URL='postgresql://user:password@db:5432/openccb_lms' docker compose up -d --force-recreate experience +``` + ### Reiniciar servicios ```bash # Reiniciar todo @@ -173,6 +213,36 @@ docker logs nginx-proxy --tail 20 sudo docker compose restart ``` +### LMS inicia pero API no responde en `3002` + +**Sintoma comun:** el frontend en `3003` carga, pero `/lms-api/*` falla y en logs aparece `PoolTimedOut`. + +**Causa comun:** `openccb-experience` arranco con `DATABASE_URL` o `LMS_DATABASE_URL` apuntando a `localhost:5433` (invalido dentro del contenedor). + +**Solucion:** + +```bash +docker logs openccb-experience --tail 80 +docker exec openccb-experience sh -lc 'echo DATABASE_URL=$DATABASE_URL; echo LMS_DATABASE_URL=$LMS_DATABASE_URL' +LMS_DATABASE_URL='postgresql://user:password@db:5432/openccb_lms' docker compose up -d --force-recreate experience +``` + +### Smoke test de permisos de audio (admin/instructor/student) + +Existe un script para validar reglas de acceso de evaluaciones de audio en LMS: + +```bash +./scripts/smoke_audio_roles.sh +``` + +El script crea fixtures temporales, ejecuta validaciones y limpia automaticamente. + +Para debug sin limpiar datos: + +```bash +KEEP_FIXTURES=1 ./scripts/smoke_audio_roles.sh +``` + ### Certificados SSL no se generan **Síntomas:** diff --git a/ManualDeConfiguracion.md b/ManualDeConfiguracion.md index bdb319a..a0dce38 100644 --- a/ManualDeConfiguracion.md +++ b/ManualDeConfiguracion.md @@ -613,20 +613,44 @@ docker volume rm openccb_db_data ./install.sh ``` +### Seguridad de certificados + +No subas a git claves privadas ni artefactos ACME. + +```bash +nginx/certs-data/ +*.key +*.csr +*.crt +``` + +Si necesitas respaldar certificados, hazlo fuera del repositorio. + ### Logs y Debugging ```bash # Ver logs de servicios -docker-compose logs -f cms -docker-compose logs -f lms -docker-compose logs -f studio -docker-compose logs -f experience +docker compose logs -f studio +docker compose logs -f experience +docker compose logs -f db # Logs con filtro -docker-compose logs -f cms | grep -i error +docker compose logs -f experience | grep -i error # Acceder a DB -docker exec -it openccb-db-1 psql -U user -d openccb_cms +docker exec -it openccb-db psql -U user -d openccb_cms + +# Verificar health LMS interno (desde red Docker) +docker exec openccb-studio node -e "fetch('http://experience:3002/health').then(async r=>{console.log(r.status);console.log(await r.text())})" + +# Verificar variables activas en experience +docker exec openccb-experience sh -lc 'echo DATABASE_URL=$DATABASE_URL; echo LMS_DATABASE_URL=$LMS_DATABASE_URL' +``` + +Si `openccb-experience` queda con `localhost:5433` en `DATABASE_URL`/`LMS_DATABASE_URL`, recrear con DB interna Docker: + +```bash +LMS_DATABASE_URL='postgresql://user:password@db:5432/openccb_lms' docker compose up -d --force-recreate experience ``` ### Comandos Útiles @@ -646,12 +670,15 @@ curl http://localhost:3002/health ./diagnose_auth.sh # Ver usuarios -docker exec openccb-db-1 psql -U user -d openccb_cms \ +docker exec openccb-db psql -U user -d openccb_cms \ -c "SELECT email, role FROM users;" # Ver organizaciones -docker exec openccb-db-1 psql -U user -d openccb_cms \ +docker exec openccb-db psql -U user -d openccb_cms \ -c "SELECT name, api_key FROM organizations;" + +# Smoke test de permisos de audio LMS +./scripts/smoke_audio_roles.sh ``` ---