services: api: container_name: usda-vision-api build: context: ./camera-management-api dockerfile: Dockerfile working_dir: /app restart: unless-stopped # Automatically restart container if it fails or exits healthcheck: test: ["CMD-SHELL", "python3 -c 'import urllib.request; urllib.request.urlopen(\"http://localhost:8000/health\").read()' || exit 1"] interval: 30s timeout: 10s retries: 3 start_period: 60s volumes: - ./camera-management-api:/app - /mnt/nfs_share:/mnt/nfs_share - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro environment: - PYTHONUNBUFFERED=1 - LD_LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib - PYTHONPATH=/app:/app/camera_sdk - TZ=America/New_York - MEDIAMTX_HOST=localhost - MEDIAMTX_RTSP_PORT=8554 command: > sh -lc " set -e # Exit on error # Only install system packages if not already installed (check for ffmpeg) if ! command -v ffmpeg &> /dev/null; then echo 'Installing system dependencies...'; apt-get update && apt-get install -y --no-install-recommends libusb-1.0-0-dev ffmpeg; else echo 'System dependencies already installed'; fi # Install camera SDK if not already installed if [ ! -f /lib/libMVSDK.so ] && [ -f 'camera_sdk/linuxSDK_V2.1.0.49(250108)/install.sh' ]; then echo 'Installing camera SDK...'; cd 'camera_sdk/linuxSDK_V2.1.0.49(250108)'; chmod +x install.sh; ./install.sh || echo 'Warning: Camera SDK installation may have failed'; cd /app; else echo 'Camera SDK already installed or install script not found'; fi; # Install Python dependencies (only if requirements.txt changed or packages missing) if [ -f requirements.txt ]; then pip install --no-cache-dir -r requirements.txt || echo 'Warning: Some Python packages may have failed to install'; else pip install --no-cache-dir -e . || echo 'Warning: Package installation may have failed'; fi; # Start the application with error handling echo 'Starting USDA Vision Camera System...'; python main.py --config config.compose.json || { echo 'Application exited with error code: $?'; echo 'Waiting 5 seconds before exit...'; sleep 5; exit 1; } " network_mode: host web: container_name: usda-vision-web image: node:20-alpine working_dir: /app env_file: - ./management-dashboard-web-app/.env volumes: - ./management-dashboard-web-app:/app environment: - CHOKIDAR_USEPOLLING=true - TZ=America/New_York command: > sh -lc " npm install; npm run dev -- --host 0.0.0.0 --port 8080 " # Ensure the web container can resolve host.docker.internal on Linux extra_hosts: - "host.docker.internal:host-gateway" ports: - "8080:8080" video-remote: container_name: usda-vision-video-remote image: node:20-alpine working_dir: /app environment: - CHOKIDAR_USEPOLLING=true - TZ=America/New_York - VITE_MEDIA_API_URL=http://exp-dash:8090 - VITE_VISION_API_URL=http://exp-dash:8000 volumes: - ./video-remote:/app command: > sh -lc " npm install; npm run dev:watch " extra_hosts: - "host.docker.internal:host-gateway" ports: - "3001:3001" vision-system-remote: container_name: usda-vision-vision-system-remote image: node:20-alpine working_dir: /app environment: - CHOKIDAR_USEPOLLING=true - TZ=America/New_York - VITE_VISION_API_URL=http://exp-dash:8000 volumes: - ./vision-system-remote:/app command: > sh -lc " npm install; npm run dev:watch " extra_hosts: - "host.docker.internal:host-gateway" ports: - "3002:3002" scheduling-remote: container_name: usda-vision-scheduling-remote image: node:20-alpine working_dir: /app env_file: - ./management-dashboard-web-app/.env environment: - CHOKIDAR_USEPOLLING=true - TZ=America/New_York volumes: - ./scheduling-remote:/app command: > sh -lc " npm install; npm run dev:watch " extra_hosts: - "host.docker.internal:host-gateway" ports: - "3003:3003" media-api: container_name: usda-vision-media-api build: context: ./media-api dockerfile: Dockerfile environment: - MEDIA_VIDEOS_DIR=/mnt/nfs_share - MEDIA_THUMBS_DIR=/mnt/nfs_share/.thumbnails - MAX_CONCURRENT_TRANSCODING=2 # Limit concurrent transcoding operations volumes: - /mnt/nfs_share:/mnt/nfs_share ports: - "8090:8090" deploy: resources: limits: cpus: '4' # Limit to 4 CPU cores (adjust based on your system) memory: 2G # Limit to 2GB RAM per container reservations: cpus: '1' # Reserve at least 1 CPU core memory: 512M # Reserve at least 512MB RAM # Alternative syntax for older Docker Compose versions: # cpus: '4' # mem_limit: 2g # mem_reservation: 512m mediamtx: container_name: usda-vision-mediamtx image: bluenviron/mediamtx:latest volumes: - ./mediamtx.yml:/mediamtx.yml:ro - /mnt/nfs_share:/mnt/nfs_share:ro ports: - "8554:8554" # RTSP - "8889:8889" # WebRTC HTTP API - "8189:8189" # WebRTC UDP