version: '3.8' services: frontend: build: context: ./frontend dockerfile: Dockerfile restart: unless-stopped ports: - "3000:3000" depends_on: backend: condition: service_healthy environment: - BACKEND_URL=http://backend:4000 - NODE_ENV=production networks: - app-network healthcheck: test: ["CMD", "wget", "-qO-", "http://localhost:3000"] interval: 30s timeout: 10s retries: 3 backend: build: context: ./backend dockerfile: Dockerfile restart: unless-stopped ports: - "4000:4000" depends_on: mongodb: condition: service_healthy redis: condition: service_healthy env_file: ./backend/.env volumes: - ./uploads:/app/uploads:rw networks: - app-network healthcheck: test: ["CMD", "wget", "-qO-", "http://localhost:4000/health"] interval: 30s timeout: 10s retries: 3 mongodb: image: mongo:7.0 restart: unless-stopped volumes: - mongo-data:/data/db:rw - ./mongo-init:/docker-entrypoint-initdb.d:ro networks: - app-network env_file: ./backend/.env environment: - MONGO_INITDB_ROOT_USERNAME=${MONGO_USER} - MONGO_INITDB_ROOT_PASSWORD=${MONGO_PASSWORD} command: ["--auth", "--bind_ip_all"] healthcheck: test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017 --quiet interval: 30s timeout: 10s retries: 5 redis: image: redis:alpine restart: unless-stopped command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}"] env_file: ./backend/.env volumes: - redis-data:/data:rw networks: - app-network healthcheck: test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"] interval: 30s timeout: 10s retries: 3 networks: app-network: driver: bridge volumes: mongo-data: name: lad-mongo-data redis-data: name: lad-redis-data