version: '3.8' services: # Database Service db: image: postgres:15-alpine container_name: controlpatente-db environment: POSTGRES_USER: ${DB_USER:-postgres} POSTGRES_PASSWORD: ${DB_PASSWORD:-postgres} POSTGRES_DB: ${DB_NAME:-controlpatente} volumes: - db_data:/var/lib/postgresql/data ports: - "5432:5432" networks: - backend-net restart: unless-stopped healthcheck: test: [ "CMD-SHELL", "pg_isready -U postgres" ] interval: 5s timeout: 5s retries: 5 # Backend Service (Node.js) backend: build: ./backend container_name: controlpatente-backend environment: - DATABASE_URL=postgresql://${DB_USER:-postgres}:${DB_PASSWORD:-postgres}@db:5432/${DB_NAME:-controlpatente} - PORT=3000 ports: - "3000:3000" depends_on: db: condition: service_healthy networks: - backend-net restart: unless-stopped volumes: - ./backend:/app - /app/node_modules # ALPR Component (Python + OpenCV) alpr-service: build: ./alpr-service container_name: controlpatente-alpr ports: - "5001:5001" # Permite acceder al stream de video desde el nave environment: - BACKEND_URL=http://backend:3000 # On Mac, you usually cannot pass /dev/video0 directly. # We might need to use a stream or just test with a file for now if direct access fails. # For Linux/Raspberry Pi, the device mapping below is correct. devices: - "/dev/video0:/dev/video0" networks: - backend-net depends_on: - backend restart: unless-stopped # Add privilege for hardware access privileged: true deploy: resources: limits: cpus: '2.0' # Frontend Service (React) frontend: build: ./frontend container_name: controlpatente-frontend ports: - "5173:5173" networks: - backend-net restart: unless-stopped volumes: - ./frontend:/app - /app/node_modules environment: - VITE_API_URL= - VITE_ALPR_STREAM_URL= networks: backend-net: driver: bridge volumes: db_data: