version: "3.9" services: webui: build: context: . dockerfile: Dockerfile container_name: signage-webui restart: unless-stopped ports: - "3000:3000" environment: NODE_ENV: ${NODE_ENV:-production} WEB_PORT: ${WEB_PORT:-3000} DB_HOST: ${DB_HOST:-mysql} DB_PORT: ${DB_PORT:-3306} DB_NAME: ${DB_NAME:-signage} DB_USER: ${DB_USER:-signage_user} DB_PASSWORD: ${DB_PASSWORD:-signage_password} PLAYER_INTERNAL_BASE_URL: ${PLAYER_INTERNAL_BASE_URL:-http://player:3001} PLAYER_PUBLIC_BASE_URL: ${PLAYER_PUBLIC_BASE_URL:-http://localhost:3001} UPLOAD_DIR: ${UPLOAD_DIR:-/app/uploads} volumes: - uploads:/app/uploads command: ["npm", "run", "start:webui"] depends_on: mysql: condition: service_healthy networks: - signage-net player: build: context: . dockerfile: Dockerfile container_name: signage-player restart: unless-stopped ports: - "3001:3001" environment: NODE_ENV: ${NODE_ENV:-production} PLAYER_PORT: ${PLAYER_PORT:-3001} DB_HOST: ${DB_HOST:-mysql} DB_PORT: ${DB_PORT:-3306} DB_NAME: ${DB_NAME:-signage} DB_USER: ${DB_USER:-signage_user} DB_PASSWORD: ${DB_PASSWORD:-signage_password} UPLOAD_DIR: ${UPLOAD_DIR:-/app/uploads} volumes: - uploads:/app/uploads command: ["npm", "run", "start:player"] depends_on: mysql: condition: service_healthy networks: - signage-net mysql: image: mysql:8.4 container_name: signage-mysql restart: unless-stopped ports: - "3306:3306" environment: MYSQL_DATABASE: ${DB_NAME:-signage} MYSQL_USER: ${DB_USER:-signage_user} MYSQL_PASSWORD: ${DB_PASSWORD:-signage_password} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root_password} command: - --default-authentication-plugin=mysql_native_password - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci volumes: - mysql_data:/var/lib/mysql healthcheck: test: ["CMD-SHELL", "mysqladmin ping -h localhost -uroot -p$$MYSQL_ROOT_PASSWORD"] interval: 10s timeout: 5s retries: 10 networks: - signage-net volumes: mysql_data: uploads: networks: signage-net: driver: bridge