services: db: image: mysql:8.4 command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci environment: MYSQL_DATABASE: ${MYSQL_DATABASE:-tennis_training_hub} MYSQL_USER: ${MYSQL_USER:-tennis} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-tennis_password} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-change-this-root-password} volumes: - db-data:/var/lib/mysql ports: - "127.0.0.1:3306:3306" healthcheck: test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p$$MYSQL_ROOT_PASSWORD --silent"] interval: 10s timeout: 5s retries: 12 restart: unless-stopped migrate: build: context: . dockerfile: Dockerfile target: build env_file: - .env environment: DATABASE_URL: mysql://${MYSQL_USER:-tennis}:${MYSQL_PASSWORD:-tennis_password}@db:3306/${MYSQL_DATABASE:-tennis_training_hub} command: ["pnpm", "exec", "drizzle-kit", "migrate"] depends_on: db: condition: service_healthy restart: "no" app: build: context: . dockerfile: Dockerfile env_file: - .env environment: PORT: 3000 DATABASE_URL: mysql://${MYSQL_USER:-tennis}:${MYSQL_PASSWORD:-tennis_password}@db:3306/${MYSQL_DATABASE:-tennis_training_hub} MEDIA_SERVICE_URL: http://media:8081 LOCAL_STORAGE_DIR: /data/app/storage NODE_ENV: production ports: - "127.0.0.1:3002:3000" - "8302:3000" volumes: - app-data:/data/app depends_on: db: condition: service_healthy migrate: condition: service_completed_successfully media: condition: service_started restart: unless-stopped media: build: context: ./media dockerfile: Dockerfile environment: MEDIA_ADDR: ":8081" MEDIA_DATA_DIR: /data/media MEDIA_EMBEDDED_WORKER: "0" ports: - "127.0.0.1:8081:8081" volumes: - media-data:/data/media restart: unless-stopped media-worker: build: context: ./media dockerfile: Dockerfile command: ["media-service"] environment: MEDIA_MODE: worker MEDIA_DATA_DIR: /data/media volumes: - media-data:/data/media depends_on: - media restart: unless-stopped app-worker: build: context: . dockerfile: Dockerfile command: ["node", "dist/worker.js"] env_file: - .env environment: DATABASE_URL: mysql://${MYSQL_USER:-tennis}:${MYSQL_PASSWORD:-tennis_password}@db:3306/${MYSQL_DATABASE:-tennis_training_hub} MEDIA_SERVICE_URL: http://media:8081 LOCAL_STORAGE_DIR: /data/app/storage NODE_ENV: production volumes: - app-data:/data/app depends_on: db: condition: service_healthy migrate: condition: service_completed_successfully media: condition: service_started restart: unless-stopped volumes: app-data: db-data: media-data: