English
Deployment
Docker Compose

Docker Compose Deployment

Deploy ReliaPulse using Docker Compose for a complete local or production setup.

Prerequisites

  • Docker Engine 20.10+
  • Docker Compose v2.0+
  • 2GB RAM minimum
  • 10GB disk space

Quick Start

# Clone the repository
git clone https://github.com/reliapulse/reliapulse.git
cd status-page
 
# Start all services
docker compose -f docker/docker-compose.yml up -d
 
# View logs
docker compose -f docker/docker-compose.yml logs -f

Access the application at http://localhost:3000 (opens in a new tab)

Services Overview

The Docker Compose setup includes the following services:

ServicePortDescription
app3000Next.js application + Socket.IO
db5432PostgreSQL database
redis6379Redis for queues and caching
worker-BullMQ background workers
adminer8080Database administration UI

Configuration

Environment Variables

Create a .env file in the docker/ directory:

# Database
DATABASE_URL=postgresql://postgres:postgres@db:5432/statuspage
POSTGRES_PASSWORD=postgres
 
# Authentication
NEXTAUTH_SECRET=your-secret-key-at-least-32-chars
NEXTAUTH_URL=http://localhost:3000
 
# Redis
REDIS_URL=redis://redis:6379
 
# Optional: Email (Resend)
RESEND_API_KEY=re_xxx
 
# Optional: SMS (Twilio)
TWILIO_ACCOUNT_SID=xxx
TWILIO_AUTH_TOKEN=xxx
TWILIO_PHONE_NUMBER=+1234567890

Docker Compose File

# 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:

Common Operations

Start Services

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

Stop Services

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

Stop and Delete Data

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

View Logs

# All services
docker compose -f docker/docker-compose.yml logs -f
 
# Specific service
docker compose -f docker/docker-compose.yml logs -f app
docker compose -f docker/docker-compose.yml logs -f worker

Restart Services

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

Install Packages

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

Run Database Migrations

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

Access Database Shell

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

Production Configuration

Resource Limits

Add resource constraints for production:

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

Networking

For production, use a reverse proxy like Nginx or 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"

Persistent Storage

Ensure volumes are backed up:

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

Scaling

Horizontal Scaling

Scale the worker service for more throughput:

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

Database Connection Pooling

For high traffic, use PgBouncer:

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

Troubleshooting

Container Won't Start

# Check logs
docker compose -f docker/docker-compose.yml logs app
 
# Check container status
docker compose -f docker/docker-compose.yml ps
 
# Rebuild containers
docker compose -f docker/docker-compose.yml build --no-cache

Database Connection Issues

# Check database health
docker compose -f docker/docker-compose.yml exec db pg_isready
 
# Check network connectivity
docker compose -f docker/docker-compose.yml exec app ping db

Permission Issues

# Fix volume permissions
sudo chown -R 1000:1000 /data/postgres

Out of Memory

Increase Docker resources or add swap:

# Check memory usage
docker stats
 
# Prune unused resources
docker system prune -a

Backup and Restore

Backup Database

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

Restore Database

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

Related