6.2 KiB
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.
- Usar la base externa existente. Actualmente server02:30432/orquestador ejecuta PostgreSQL 9.6.2 y requiere el perfil postgres96; se conserva PostgreSQL 17 como alternativa futura. Permitir conexión desde Docker según firewall, listen_addresses y pg_hba.conf del servidor.
- Copiar
.env.examplea.env, sin sobrescribir uno ya configurado. - 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 |
| SPRING_PROFILES_ACTIVE | postgres96 para la instancia disponible; selecciona PostgreSQLLegacyDialect de Hibernate |
| 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
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
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
Para el servidor actual configurar DB_URL=jdbc:postgresql://server02:30432/orquestador, DB_USERNAME=pgadmin y SPRING_PROFILES_ACTIVE=postgres96; la contraseña sólo en el entorno local. El argumento de perfil local del ejemplo siguiente debe reemplazarse por postgres96 cuando se use PostgreSQL 9.6.
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.
.\mvnw.cmd clean verify
.\mvnw.cmd spring-boot:run '-Dspring-boot.run.profiles=local'
Diagnóstico
Prueba de compatibilidad con PostgreSQL 9.6
Con JDK 21 y las seis variables DB/JWT exportadas, ejecutar:
.\mvnw.cmd clean verify -Ppostgres96-check
La prueba arranca el checkout local en 127.0.0.1 con puerto aleatorio y cierra el contexto al terminar. Fuerza PostgreSQL default_transaction_read_only=on, desactiva el inicializador automático Flyway y SQL init sólo en la prueba, conserva ddl-auto=validate y ejecuta Flyway.validate() sin crear schemas ni migrar. Comprueba versión 9.6, dialecto legacy, health/readiness/liveness UP y 401 sin token. No corre en el build normal ni depende de Docker. No sustituye pruebas de migraciones, DML/concurrencia ni Testcontainers de T03.
Hibernate community-dialects se alinea al BOM (7.4.13.Final). Flyway 12.4.0 detecta 9.6 y valida; informa que esa versión queda fuera de soporte comunitario de Redgate. La compatibilidad verificada se limita al arranque/conexión actual, todavía sin entidades ni migraciones de negocio.
Para automatizar la comprobación del despliegue con JDK 21:
.\mvnw.cmd clean verify -Pdeployment-smoke '-Dsmoke.baseUrl=http://server02:8787'
Son cinco pruebas de sólo lectura; resultados en target/failsafe-reports. El servicio debe estar iniciado con su PostgreSQL externo. La URL es obligatoria; no hay omisión silenciosa por falta de conectividad. El perfil no despliega la aplicación ni cambia la configuración del servidor. El build normal no ejecuta este smoke remoto, para no depender de la red privada desde CI.
- 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.