Español
Despliegue
Docker Compose

Despliegue con Docker Compose

Despliega ReliaPulse usando Docker Compose para una configuración local o de producción completa.

Requisitos Previos

  • Docker Engine 20.10+
  • Docker Compose v2.0+
  • Mínimo 2GB RAM
  • 10GB de espacio en disco

Inicio Rápido

# Clonar el repositorio
git clone https://github.com/reliapulse/reliapulse.git
cd status-page
 
# Iniciar todos los servicios
docker compose -f docker/docker-compose.yml up -d
 
# Ver logs
docker compose -f docker/docker-compose.yml logs -f

Accede a la aplicación en http://localhost:3000 (opens in a new tab)

Descripción de Servicios

La configuración de Docker Compose incluye los siguientes servicios:

ServicioPuertoDescripción
app3000Aplicación Next.js + Socket.IO
db5432Base de datos PostgreSQL
redis6379Redis para colas y caché
worker-Workers BullMQ en segundo plano
adminer8080UI de administración de base de datos

Configuración

Variables de Entorno

Crea un archivo .env en el directorio docker/:

# Base de datos
DATABASE_URL=postgresql://postgres:postgres@db:5432/statuspage
POSTGRES_PASSWORD=postgres
 
# Autenticación
NEXTAUTH_SECRET=tu-clave-secreta-al-menos-32-chars
NEXTAUTH_URL=http://localhost:3000
 
# Redis
REDIS_URL=redis://redis:6379
 
# Opcional: Email (Resend)
RESEND_API_KEY=re_xxx
 
# Opcional: SMS (Twilio)
TWILIO_ACCOUNT_SID=xxx
TWILIO_AUTH_TOKEN=xxx
TWILIO_PHONE_NUMBER=+1234567890

Archivo Docker Compose

# docker/docker-compose.yml
version: "3.8"
 
services:
  app:
    build:
      context: ..
      dockerfile: docker/Dockerfile
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgresql://postgres:postgres@db:5432/statuspage
      - REDIS_URL=redis://redis:6379
      - NEXTAUTH_SECRET=${NEXTAUTH_SECRET}
      - NEXTAUTH_URL=${NEXTAUTH_URL:-http://localhost:3000}
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    restart: unless-stopped
 
  worker:
    build:
      context: ..
      dockerfile: docker/Dockerfile
    command: npm run worker
    environment:
      - DATABASE_URL=postgresql://postgres:postgres@db:5432/statuspage
      - REDIS_URL=redis://redis:6379
    depends_on:
      - db
      - redis
    restart: unless-stopped
 
  db:
    image: postgres:16-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=statuspage
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-postgres}
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5
    restart: unless-stopped
 
  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
    restart: unless-stopped
 
  adminer:
    image: adminer
    ports:
      - "8080:8080"
    depends_on:
      - db
 
volumes:
  postgres_data:
  redis_data:

Operaciones Comunes

Iniciar Servicios

docker compose -f docker/docker-compose.yml up -d

Detener Servicios

docker compose -f docker/docker-compose.yml down

Detener y Eliminar Datos

docker compose -f docker/docker-compose.yml down -v

Ver Logs

# Todos los servicios
docker compose -f docker/docker-compose.yml logs -f
 
# Servicio específico
docker compose -f docker/docker-compose.yml logs -f app
docker compose -f docker/docker-compose.yml logs -f worker

Reiniciar Servicios

docker compose -f docker/docker-compose.yml restart

Instalar Paquetes

docker compose -f docker/docker-compose.yml exec app npm install <paquete>

Ejecutar Migraciones de Base de Datos

docker compose -f docker/docker-compose.yml exec app npx prisma migrate deploy

Acceder a la Consola de Base de Datos

docker compose -f docker/docker-compose.yml exec db psql -U postgres -d statuspage

Configuración de Producción

Límites de Recursos

Agrega restricciones de recursos para producción:

services:
  app:
    deploy:
      resources:
        limits:
          cpus: "2"
          memory: 2G
        reservations:
          cpus: "0.5"
          memory: 512M

Health Checks

services:
  app:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

Redes

Para producción, usa un proxy inverso como Nginx o Traefik:

services:
  traefik:
    image: traefik:v2.10
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik:/etc/traefik
 
  app:
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.statuspage.rule=Host(`status.example.com`)"
      - "traefik.http.routers.statuspage.tls=true"
      - "traefik.http.routers.statuspage.tls.certresolver=letsencrypt"

Almacenamiento Persistente

Asegura que los volúmenes tengan respaldo:

volumes:
  postgres_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /data/postgres
 
  redis_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /data/redis

Escalado

Escalado Horizontal

Escala el servicio worker para más throughput:

docker compose -f docker/docker-compose.yml up -d --scale worker=3

Connection Pooling de Base de Datos

Para alto tráfico, usa PgBouncer:

services:
  pgbouncer:
    image: edoburu/pgbouncer
    environment:
      - DATABASE_URL=postgresql://postgres:postgres@db:5432/statuspage
      - POOL_MODE=transaction
      - MAX_CLIENT_CONN=100

Solución de Problemas

El Contenedor No Inicia

# Revisar logs
docker compose -f docker/docker-compose.yml logs app
 
# Revisar estado del contenedor
docker compose -f docker/docker-compose.yml ps
 
# Reconstruir contenedores
docker compose -f docker/docker-compose.yml build --no-cache

Problemas de Conexión a Base de Datos

# Verificar salud de la base de datos
docker compose -f docker/docker-compose.yml exec db pg_isready
 
# Verificar conectividad de red
docker compose -f docker/docker-compose.yml exec app ping db

Problemas de Permisos

# Arreglar permisos de volúmenes
sudo chown -R 1000:1000 /data/postgres

Sin Memoria

Aumenta los recursos de Docker o añade swap:

# Verificar uso de memoria
docker stats
 
# Limpiar recursos no usados
docker system prune -a

Backup y Restauración

Backup de Base de Datos

docker compose -f docker/docker-compose.yml exec db \
  pg_dump -U postgres statuspage > backup.sql

Restaurar Base de Datos

docker compose -f docker/docker-compose.yml exec -T db \
  psql -U postgres statuspage < backup.sql

Relacionado