Skip to main content

Dónde vive la configuración

Toda la configuración que el operador controla se define en el archivo docker-compose.yml, bajo la clave environment de cada servicio. Los valores allí declarados sobreescriben los valores por defecto del código.
# docker-compose.yml (extracto)
services:
  db:
    environment:
      POSTGRES_DB: caducidadesdb
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres

  backend:
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://host.docker.internal:5432/caducidadesdb
      - SPRING_DATASOURCE_USERNAME=postgres
      - SPRING_DATASOURCE_PASSWORD=postgres
      - SPRING_JPA_HIBERNATE_DDL_AUTO=none
Nunca guardes contraseñas en texto plano en un repositorio público. En producción, usa secretos de Docker o un archivo .env fuera del control de versiones.

Conexión a la base de datos

Estas cuatro variables deben ser coherentes entre sí: el nombre de la base de datos, el usuario y la contraseña que crea el servicio db deben coincidir exactamente con los que usa el backend para conectarse.
VariableServicioValor por defectoDescripción
POSTGRES_DBdbcaducidadesdbNombre de la base de datos que PostgreSQL crea al arrancar por primera vez.
POSTGRES_USERdbpostgresUsuario administrador de PostgreSQL.
POSTGRES_PASSWORDdbpostgresContraseña del usuario administrador.
SPRING_DATASOURCE_URLbackendjdbc:postgresql://host.docker.internal:5432/caducidadesdbURL JDBC completa. Incluye host, puerto y nombre de base de datos.
SPRING_DATASOURCE_USERNAMEbackendpostgresUsuario con el que el backend se autentica en PostgreSQL.
SPRING_DATASOURCE_PASSWORDbackendpostgresContraseña del usuario de la base de datos.

Por qué el backend usa host.docker.internal

El docker-compose.yml configura el backend para llegar a la base de datos a través de host.docker.internal (el gateway hacia el host). Esto permite que el servicio db sea accesible desde el contenedor del backend como si estuviera en la máquina anfitriona. La línea extra_hosts del servicio backend crea esta ruta:
backend:
  extra_hosts:
    - "host.docker.internal:host-gateway"
Para cambiar la base de datos por una instancia externa (por ejemplo, en RDS o en otro servidor), solo tienes que actualizar SPRING_DATASOURCE_URL:
- SPRING_DATASOURCE_URL=jdbc:postgresql://mi-servidor-db.ejemplo.com:5432/caducidadesdb

Esquema de la base de datos (DDL_AUTO)

La variable SPRING_JPA_HIBERNATE_DDL_AUTO controla qué hace la aplicación con el esquema de la base de datos al arrancar.
ValorComportamientoCuándo usarlo
noneNo modifica el esquema. La aplicación asume que las tablas ya existen.Producción. Protege los datos ante reinicios accidentales.
updateAgrega columnas o tablas nuevas si el modelo ha cambiado, pero nunca elimina columnas existentes.Desarrollo activo cuando se añaden entidades nuevas.
createElimina y recrea todas las tablas en cada arranque. Borra todos los datos existentes.Tests o demostraciones con datos de prueba desechables.
El docker-compose.yml usa none por defecto para proteger los datos en entornos con datos reales:
- SPRING_JPA_HIBERNATE_DDL_AUTO=none
No uses create en un entorno con datos reales. Cada reinicio del backend borrará completamente el contenido de todas las tablas.
Si despliegas por primera vez y la base de datos está vacía, usa update para que la aplicación cree el esquema automáticamente. Una vez que el esquema esté estable, cámbialo a none.

Configuración de puertos

Los puertos se mapean en docker-compose.yml con el formato "HOST:CONTENEDOR". Cambia el puerto del host (la parte izquierda) si necesitas evitar conflictos.

Backend (por defecto: 8080)

backend:
  ports:
    - "8080:8080"   # HOST:CONTENEDOR
Para usar el puerto 9090 en el host:
    - "9090:8080"

Frontend (por defecto: 3000)

frontend:
  ports:
    - "3000:80"   # HOST:CONTENEDOR — Nginx escucha internamente en el 80
Para usar el puerto 8000 en el host:
    - "8000:80"
El puerto interno del contenedor (CONTENEDOR) no debe modificarse. Nginx siempre escucha en el 80 y el backend en el 8080. Solo cambia el puerto del host.

Proxy de API del frontend

El frontend enruta todas las peticiones que empiezan por /api/ directamente al backend. Esta lógica vive en frontend-vite/nginx.conf y no requiere ninguna variable de entorno:
location /api/ {
    proxy_pass http://backend:8080/api/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}
Nginx resuelve el hostname backend usando la red interna de Docker Compose. Gracias a esto, el navegador siempre habla con el frontend (localhost:3000) y el frontend reenvía las llamadas a la API al backend de forma transparente, sin exponer el puerto 8080 directamente al usuario final. Si cambias el puerto interno del backend (no recomendado), deberás actualizar también la directiva proxy_pass en nginx.conf y reconstruir la imagen del frontend:
docker-compose up --build frontend