version: "3.9" services: app: build: context: . dockerfile: Dockerfile container_name: signage-app restart: unless-stopped ports: - "3000:3000" environment: NODE_ENV: production PORT: 3000 DB_HOST: mysql DB_PORT: 3306 DB_NAME: signage DB_USER: signage_user DB_PASSWORD: signage_password REDIS_URL: redis://redis:6379 UPLOAD_DIR: /app/uploads volumes: - uploads:/app/uploads depends_on: mysql: condition: service_healthy redis: condition: service_healthy networks: - signage-net mysql: image: mysql:8.4 container_name: signage-mysql restart: unless-stopped ports: - "3306:3306" environment: MYSQL_DATABASE: signage MYSQL_USER: signage_user MYSQL_PASSWORD: signage_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", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot_password"] interval: 10s timeout: 5s retries: 10 networks: - signage-net redis: image: redis:7-alpine container_name: signage-redis restart: unless-stopped ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 10 networks: - signage-net volumes: mysql_data: redis_data: uploads: networks: signage-net: driver: bridge