← Volver al Generador Principal

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

  1. 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.
  2. 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.
  3. DATABASE_URL (o APP_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 (localhost o 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