Buscar en la documentación

ADR-0025: Contenedores: gateway de origen único y una sola imagen de Laravel

Contenedores: gateway de origen único y una sola imagen de Laravel

1 min de lecturaVer en GitHub
  • Estado: Aceptada
  • Fecha: 2026-10-31

Contexto

Todo el proyecto debe ejecutarse con Docker: Laravel, Nginx, la base de datos y el frontend. Idealmente, con un solo comando. Además, en la misma máquina pueden convivir otros proyectos.

Alternativas evaluadas

  • Exponer cada servicio en su propio puerto.
  • Un gateway Nginx como única entrada.

Decisión

Servicios:

ServicioFunción
gatewayNginx que enruta /api, / y /ws
appPHP-FPM con la API
frontendBuild de Vue servido por Nginx
mysql, redisBase de datos y caché/colas
worker, scheduler, reverbColas, tareas programadas y tiempo real
mailpitCorreo, solo en local
zapEscaneo de seguridad, en un perfil opcional

Construcción y arranque:

  • Una sola imagen de Laravel sirve a app, worker, scheduler y reverb.
  • Un servicio de inicialización ejecuta las migraciones y los seeders idempotentes.
  • Todos los servicios tienen healthchecks.
  • Los contenedores no corren como root, usan versiones fijas y se construyen en varias etapas.
  • Hay tres archivos de compose: base, override local y producción.

Convivencia con otros proyectos:

  • Nombre de proyecto exclusivo trazo.
  • Redes y volúmenes propios.
  • Un único puerto publicado, configurable.
  • Límites de recursos por contenedor.

Alternativas descartadas

  • Un puerto por servicio: obliga a configurar CORS, aumenta la superficie expuesta y facilita los choques con otros proyectos.

Consecuencias

  • MySQL y Redis nunca se exponen fuera de la red interna.
  • El front y la API comparten origen, así que no hace falta CORS.