orquestador/specs/RUNBOOK.md

74 lines
4.2 KiB
Markdown

# Docker con PostgreSQL externo
## Preparación
Requiere Docker con contenedores Linux y Compose v2. La imagen compila con JDK 21 y ejecuta con JRE 21; no requiere Java/Maven en el anfitrión. PostgreSQL y el proveedor JWT son externos.
1. Crear base y usuario en PostgreSQL 17. Permitir conexión desde Docker según firewall, listen_addresses y pg_hba.conf del servidor.
2. Copiar `.env.example` a `.env`, sin sobrescribir uno ya configurado.
3. Completar DB_URL, DB_USERNAME, DB_PASSWORD, JWT_ISSUER_URI, JWT_JWK_SET_URI y JWT_AUDIENCE.
| Variable | Uso |
|---|---|
| DB_URL | JDBC de la base externa: jdbc:postgresql://db.interna:5432/orquestador |
| DB_USERNAME / DB_PASSWORD | Credenciales del usuario de la base existente |
| JWT_ISSUER_URI | Issuer exacto de los tokens |
| JWT_JWK_SET_URI | Endpoint JWKS correspondiente, accesible desde Docker |
| JWT_AUDIENCE | Audiencia esperada |
| APP_PORT | Puerto publicado; predeterminado 8080 |
| APP_BIND_ADDRESS | Interfaz publicada; predeterminado 127.0.0.1; usar 0.0.0.0 para acceso remoto |
Si PostgreSQL corre en el anfitrión, usar `jdbc:postgresql://host.docker.internal:5432/orquestador`. Compose incluye host-gateway para Linux. `localhost` dentro del contenedor apunta al propio contenedor. La misma consideración aplica al endpoint JWKS; conservar el issuer exacto de los tokens.
Si el proveedor requiere TLS, añadir los parámetros JDBC requeridos, por ejemplo `?sslmode=verify-full`; montar el certificado raíz y configurar `sslrootcert` cuando corresponda. Contraseñas con `$` pueden escribirse entre comillas simples en `.env` para conservar su valor literal.
## Levantar y comprobar
```powershell
Copy-Item .env.example .env
# Editar .env con valores del entorno externo.
docker compose config --quiet
docker compose up --build -d
docker compose ps
docker compose logs -f orquestador
curl.exe --fail http://localhost:8080/actuator/health/readiness
curl.exe --fail http://localhost:8080/actuator/health/liveness
```
En Linux/macOS usar `cp` y `curl`. Compose carga `.env` y pasa explícitamente las variables al contenedor. Las variables exportadas en la sesión tienen precedencia. `.env` está excluido de la imagen.
Salud debe devolver HTTP 200 y status UP. Readiness comprueba PostgreSQL; liveness no depende de proveedores. El healthcheck interno usa 8080 aunque APP_PORT cambie. Otra ruta sin token debe devolver 401. No hay endpoints de negocio implementados todavía.
El build ejecuta `package`, incluyendo pruebas unitarias. La suite de integración se ejecuta fuera del build con `clean verify` y Docker disponible. No se monta el socket Docker dentro del build. Se requiere acceso a Maven Central, Docker Hub y repositorios Ubuntu durante la construcción.
## Operación
```powershell
docker compose up --build -d # Reconstruir tras cambios de código
docker compose up -d # Aplicar cambios en .env
docker compose stop # Detener el servicio
docker compose down # Eliminar contenedor y red de Compose
```
Estos comandos no administran la base externa. Flyway permanece habilitado y aplicará las migraciones incluidas al arrancar; actualmente no existen migraciones SQL de negocio. La base debe existir antes del arranque. La separación de roles de migración/ejecución queda pendiente de T03/T07.
## Ejecución desde el IDE
Configurar JDK 21 y las seis variables DB/JWT en la sesión o Run Configuration. Spring Boot no importa `.env` automáticamente fuera de Compose.
```powershell
.\mvnw.cmd clean verify
.\mvnw.cmd spring-boot:run '-Dspring-boot.run.profiles=local'
```
## Diagnóstico
- Variable faltante: completar el valor requerido en `.env`.
- Conexión rechazada/timeout: revisar DNS, puerto, firewall y acceso desde Docker; no usar localhost para el anfitrión.
- Error de autenticación PostgreSQL: comprobar usuario, contraseña y permisos.
- Readiness DOWN/unhealthy: consultar logs y conectividad PostgreSQL. Un healthcheck fallido marca el estado, no reinicia automáticamente.
- JWT inválido: revisar issuer/audiencia y acceso a JWKS.
- Fallo de build: comprobar acceso a los repositorios de dependencias.
Registrar evidencia en PROGRESS. No considerar verificado el arranque si no se ejecutó contra Docker y PostgreSQL externo.