Configuración de Docker Compose para Next.js 14 + PostgreSQL + Redis Cache
docker-compose.yml
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
restart: unless-stopped
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?schema=public
- REDIS_URL=redis://:${REDIS_PASSWORD}@redis:6379
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
networks:
- internal-net
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5
networks:
- internal-net
redis:
image: redis:7-alpine
restart: unless-stopped
command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}"]
volumes:
- redisdata:/data
healthcheck:
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
interval: 5s
timeout: 5s
retries: 5
networks:
- internal-net
volumes:
pgdata:
redisdata:
networks:
internal-net:
driver: bridge
Cuándo usar esta combinación
Ideal para aplicaciones web de alto rendimiento (SaaS, e-commerce, dashboards) que aprovechan el Server-Side Rendering (SSR) y Server Actions de Next.js 14. Se utiliza cuando requieres integridad relacional y transaccional estricta en la base de datos (PostgreSQL), pero necesitas mitigar latencias y descargar el tráfico de lectura mediante Redis, usándolo para cachear consultas frecuentes, manejar sesiones distribuidas y sincronizar el Incremental Static Regeneration (ISR) entre múltiples réplicas del frontend.
Variables de entorno críticas para producción
POSTGRES_PASSWORD: Credencial del usuario de la base de datos. Debe ser una cadena de alta entropía (mínimo 32 caracteres alfanuméricos) generada criptográficamente.REDIS_PASSWORD: Clave de autenticación para el comando--requirepass. Redis opera completamente en memoria y sin clave es vulnerable a ataques de inyección remota y exfiltración inmediata.DATABASE_URL(oAPP_SECRET/NEXTAUTH_SECRET): La cadena de conexión de Next.js que consolida el usuario, host y contraseña cifrada, evitando apuntar a valores residuales de desarrollo (localhosto credenciales predeterminadas).
Consejo de Arquitectura y Rendimiento
Aislamiento de red y compilación Standalone:
No expongas los puertos 5432 (Postgres) ni 6379 (Redis) al host (ports:); comunícalos exclusivamente mediante la red interna de Docker (internal-net) para evitar exposición accidental a internet. En Next.js, activa la directiva output: 'standalone' en next.config.js y utiliza una imagen base node:alpine multi-etapa ejecutada bajo un usuario sin privilegios (non-root / USER nextjs), reduciendo el tamaño de la imagen final de ~1GB a menos de 120MB y limitando drásticamente la superficie de ataque.
Checklist de Seguridad antes de desplegar
- Cambiar las contraseñas por defecto en el archivo .env
- Mapear volúmenes persistentes en el VPS
- Configurar las reglas de firewall para los puertos requeridos