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 -fAccess the application at http://localhost:3000 (opens in a new tab)
Services Overview
The Docker Compose setup includes the following services:
| Service | Port | Description |
|---|---|---|
| app | 3000 | Next.js application + Socket.IO |
| db | 5432 | PostgreSQL database |
| redis | 6379 | Redis for queues and caching |
| worker | - | BullMQ background workers |
| adminer | 8080 | Database 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=+1234567890Docker 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 -dStop Services
docker compose -f docker/docker-compose.yml downStop and Delete Data
docker compose -f docker/docker-compose.yml down -vView 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 workerRestart Services
docker compose -f docker/docker-compose.yml restartInstall 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 deployAccess Database Shell
docker compose -f docker/docker-compose.yml exec db psql -U postgres -d statuspageProduction Configuration
Resource Limits
Add resource constraints for production:
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: 40sNetworking
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/redisScaling
Horizontal Scaling
Scale the worker service for more throughput:
docker compose -f docker/docker-compose.yml up -d --scale worker=3Database 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=100Troubleshooting
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-cacheDatabase 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 dbPermission Issues
# Fix volume permissions
sudo chown -R 1000:1000 /data/postgresOut of Memory
Increase Docker resources or add swap:
# Check memory usage
docker stats
# Prune unused resources
docker system prune -aBackup and Restore
Backup Database
docker compose -f docker/docker-compose.yml exec db \
pg_dump -U postgres statuspage > backup.sqlRestore Database
docker compose -f docker/docker-compose.yml exec -T db \
psql -U postgres statuspage < backup.sql