Files
edh-stats/docker-compose.yml
Michael Skrynski 1fdc55afa1 Add max user registration limit
- Parse MAX_USERS from env in registrationConfig
- Count total users with new UserRepository.countUsers()
- Enforce registration cap in the signup flow
- Expose MAX_USERS in docker-compose and env example
- Bump frontend version to 2.1.2
2026-01-18 16:42:42 +01:00

124 lines
3.1 KiB
YAML

# Docker Compose configuration for EDH Stats Tracker
services:
# PostgreSQL database service
postgres:
image: postgres:16-alpine
container_name: edh-stats-postgres
environment:
- POSTGRES_USER=${DB_USER:-postgres}
- POSTGRES_PASSWORD=${DB_PASSWORD:-edh_password}
- POSTGRES_DB=${DB_NAME:-edh_stats}
volumes:
- ./postgres_data:/var/lib/postgresql/data
- ./scripts:/scripts:ro
- ./backups:/backups
healthcheck:
test:
[
'CMD-SHELL',
'PGPASSWORD=${DB_PASSWORD:-edh_password} pg_isready -U postgres -h localhost'
]
interval: 10s
timeout: 5s
retries: 5
networks:
- edh-stats-network
restart: unless-stopped
# Database migration service - runs once on startup
db-migrate:
build:
context: ./backend
dockerfile: Dockerfile
target: production
container_name: edh-stats-db-migrate
depends_on:
postgres:
condition: service_healthy
environment:
- NODE_ENV=${NODE_ENV:-development}
- DB_HOST=${DB_HOST:-postgres}
- DB_NAME=${DB_NAME:-edh_stats}
- DB_USER=${DB_USER:-postgres}
- DB_PASSWORD=${DB_PASSWORD:-edh_password}
# Set DB_SEED=true to automatically seed database with sample data after migrations
- DB_SEED=${DB_SEED:-false}
command: node src/database/migrate.js migrate
networks:
- edh-stats-network
restart: 'no'
# Backend API service
backend:
build:
context: ./backend
dockerfile: Dockerfile
target: production
container_name: edh-stats-backend
ports:
- '3002:3000'
depends_on:
db-migrate:
condition: service_completed_successfully
environment:
- NODE_ENV=${NODE_ENV:-development}
- DB_HOST=${DB_HOST:-postgres}
- DB_NAME=${DB_NAME:-edh_stats}
- DB_USER=${DB_USER:-postgres}
- DB_PASSWORD=${DB_PASSWORD:-edh_password}
- JWT_SECRET=${JWT_SECRET:-dev-jwt-secret-key-change-in-production}
- CORS_ORIGIN=${CORS_ORIGIN:-http://localhost}
- LOG_LEVEL=${LOG_LEVEL:-info}
- ALLOW_REGISTRATION=${ALLOW_REGISTRATION:-true}
- MAX_USERS=${MAX_USERS:-}
volumes:
- ./backend/src:/app/src
restart: unless-stopped
healthcheck:
test:
[
'CMD',
'wget',
'--no-verbose',
'--tries=1',
'--spider',
'http://localhost:3000/api/health'
]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
- edh-stats-network
# Frontend web server
frontend:
image: nginx:alpine
container_name: edh-stats-frontend
ports:
- '8081:80'
depends_on:
- backend
volumes:
- ./frontend/nginx.conf:/etc/nginx/nginx.conf:ro
- ./frontend/public:/usr/share/nginx/html:ro
restart: unless-stopped
healthcheck:
test:
- CMD
- curl
- http://localhost:80/health
interval: 10s
timeout: 5s
retries: 5
networks:
- edh-stats-network
volumes:
postgres_data:
driver: local
networks:
edh-stats-network:
driver: bridge