version: '3.8' services: app: # or use # image: mingxuangame/osu-lazer-api:latest build: context: . dockerfile: Dockerfile container_name: osu_api_server ports: - "8000:8000" environment: - MYSQL_HOST=mysql - MYSQL_PORT=3306 - REDIS_URL=redis://redis:6379/0 env_file: - .env depends_on: mysql: condition: service_healthy redis: condition: service_healthy volumes: - ./replays:/app/replays - ./storage:/app/storage - ./static:/app/static - ./logs:/app/logs restart: unless-stopped networks: - osu-network mysql: image: mysql:8.0 container_name: osu_api_mysql environment: - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - MYSQL_DATABASE=${MYSQL_DATABASE} - MYSQL_USER=${MYSQL_USER} - MYSQL_PASSWORD=${MYSQL_PASSWORD} volumes: - mysql_data:/var/lib/mysql - ./mysql-init:/docker-entrypoint-initdb.d healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10 interval: 10s start_period: 40s restart: unless-stopped networks: - osu-network spectator: image: ghcr.io/googuteam/osu-server-spectator:master pull_policy: never environment: - REPLAY_UPLOAD_THREADS=${REPLAY_UPLOAD_THREADS:-1} - TRACK_BUILD_USER_COUNTS=${TRACK_BUILD_USER_COUNTS:-} - SERVER_PORT=${SERVER_PORT:-80} - REDIS_HOST=redis - SENTRY_DSN=${SENTRY_DSN:-} - SHARED_INTEROP_DOMAIN=http://app:8000 - SHARED_INTEROP_SECRET=${SHARED_INTEROP_SECRET:-} - MYSQL_HOST=mysql - MYSQL_PORT=3306 env_file: - .env depends_on: - app - mysql - redis restart: unless-stopped networks: - osu-network nginx: image: nginx:1.25-alpine ports: - "8000:80" volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro restart: unless-stopped networks: - osu-network redis: image: redis:7-alpine container_name: osu_api_redis volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] timeout: 5s retries: 5 interval: 10s start_period: 10s restart: unless-stopped networks: - osu-network command: redis-server --appendonly yes volumes: mysql_data: redis_data: networks: osu-network: driver: bridge