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 -fAccede 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:
| Servicio | Puerto | Descripción |
|---|---|---|
| app | 3000 | Aplicación Next.js + Socket.IO |
| db | 5432 | Base de datos PostgreSQL |
| redis | 6379 | Redis para colas y caché |
| worker | - | Workers BullMQ en segundo plano |
| adminer | 8080 | UI 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=+1234567890Archivo 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 -dDetener Servicios
docker compose -f docker/docker-compose.yml downDetener y Eliminar Datos
docker compose -f docker/docker-compose.yml down -vVer 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 workerReiniciar Servicios
docker compose -f docker/docker-compose.yml restartInstalar 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 deployAcceder a la Consola de Base de Datos
docker compose -f docker/docker-compose.yml exec db psql -U postgres -d statuspageConfiguració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: 512MHealth Checks
services:
app:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40sRedes
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/redisEscalado
Escalado Horizontal
Escala el servicio worker para más throughput:
docker compose -f docker/docker-compose.yml up -d --scale worker=3Connection 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=100Solució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-cacheProblemas 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 dbProblemas de Permisos
# Arreglar permisos de volúmenes
sudo chown -R 1000:1000 /data/postgresSin Memoria
Aumenta los recursos de Docker o añade swap:
# Verificar uso de memoria
docker stats
# Limpiar recursos no usados
docker system prune -aBackup y Restauración
Backup de Base de Datos
docker compose -f docker/docker-compose.yml exec db \
pg_dump -U postgres statuspage > backup.sqlRestaurar Base de Datos
docker compose -f docker/docker-compose.yml exec -T db \
psql -U postgres statuspage < backup.sql