Skip to main content

Descripción general

La aplicación se compone de tres servicios orquestados por Docker Compose:
ServicioNombre del contenedorImagen / BuildPuerto expuestoDescripción
dbperecederos-dbpostgres:155432:5432Base de datos PostgreSQL
backendperecederos-backendBuild desde ./backend8080:8080API REST en Spring Boot (Java 17)
frontendperecederos-frontendBuild desde ./frontend-vite3000:80Aplicación React servida por Nginx
El contenedor frontend depende de backend (depends_on). Docker Compose garantiza que el backend se inicie antes de arrancar el frontend.

Requisitos previos

  • Docker Engine 24 o superior
  • Docker Compose v2 (incluido en Docker Desktop y en docker-compose-plugin)
Verifica las versiones instaladas:
docker --version
docker compose version

Inicio rápido

1

Clona el repositorio

git clone https://github.com/BrianSilenT/MejoraReciboCaducidades.git
cd MejoraReciboCaducidades
2

Construye y levanta los servicios

docker-compose up --build
La primera vez tarda varios minutos porque Maven compila el backend y npm genera el build del frontend. Las ejecuciones posteriores son más rápidas gracias a la caché de capas.
3

Verifica que todo funciona

Abre otra terminal y comprueba los tres servicios:
# Frontend
curl -I http://localhost:3000

# Backend (health implícito: el endpoint raíz devuelve 404 si la API no tiene ruta raíz, pero confirma que el proceso escucha)
curl -I http://localhost:8080

# Base de datos
docker exec perecederos-db pg_isready -U postgres
Para ejecutar en segundo plano agrega la opción -d:
docker-compose up --build -d

Detener y reiniciar servicios

# Detener todos los servicios (conserva los contenedores y volúmenes)
docker-compose stop

# Detener y eliminar los contenedores
docker-compose down

# Eliminar también los volúmenes (borra los datos de la base de datos)
docker-compose down -v

# Reiniciar un servicio específico sin reconstruir
docker-compose restart backend
docker-compose down -v elimina permanentemente el volumen de la base de datos. Haz una copia de seguridad antes de ejecutarlo en un entorno con datos reales.

Ver registros (logs)

# Seguir los logs del backend en tiempo real
docker-compose logs -f backend

# Ver los últimos 100 líneas del frontend
docker-compose logs --tail=100 frontend

# Ver los logs de todos los servicios a la vez
docker-compose logs -f

Detalles de cada servicio

Base de datos (db)

Usa la imagen oficial postgres:15. Las credenciales y el nombre de la base de datos se configuran mediante variables de entorno en docker-compose.yml. El puerto 5432 queda expuesto en el host para conexiones directas con herramientas como psql o DBeaver.

Backend (backend)

Se construye en dos etapas: primero Maven compila el JAR con eclipse-temurin:17, luego el artefacto se copia a una imagen de runtime más ligera. Escucha en el puerto 8080 y se conecta a la base de datos usando host.docker.internal para alcanzar el servicio db del host.

Frontend (frontend)

Se construye con Node 18 y Vite, y el resultado estático se sirve con Nginx Alpine. El puerto interno 80 se mapea al 3000 del host. Nginx actúa además como proxy inverso: las peticiones a /api/ se redirigen automáticamente al backend.

Red interna

Todos los contenedores comparten la red por defecto creada por Docker Compose. El frontend se comunica con el backend usando el nombre de servicio backend como hostname (http://backend:8080).

Solución de problemas frecuentes

El backend intenta conectarse a la base de datos durante el inicio. Si la base de datos aún no está lista, el pool de conexiones agota el tiempo de espera. Esto puede ocurrir la primera vez que se levanta el stack.Solución: Vuelve a iniciar solo el backend tras unos segundos:
docker-compose restart backend
El docker-compose.yml no incluye un healthcheck en el servicio db, por lo que depends_on no garantiza que PostgreSQL esté aceptando conexiones, solo que el contenedor haya arrancado.
Otro proceso en el host ocupa el puerto. Identifícalo y detenlo, o cambia el mapeo de puertos en docker-compose.yml (ver Configuración de puertos).
# Identificar qué proceso usa el puerto 8080
sudo lsof -i :8080
Sin la opción --build, Docker Compose reutiliza las imágenes existentes. Fuerza la reconstrucción:
docker-compose up --build
El docker-compose.yml actual no define un volumen nombrado para PostgreSQL. Los datos se almacenan en una capa de escritura del contenedor y se pierden con docker-compose down.Para persistir los datos, agrega un volumen en docker-compose.yml:
services:
  db:
    image: postgres:15
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata: