name: mai-fpv x-fpv-env: &fpv-env FPV_MODEL_PATH: /app/best.pt FPV_SOURCE: ${FPV_SOURCE:-/data/input/source.mp4} FPV_SOURCE_MODE: ${FPV_SOURCE_MODE:-file} FPV_VIDEO_REALTIME: ${FPV_VIDEO_REALTIME:-1} FPV_SHOW_OUTPUT: ${FPV_SHOW_OUTPUT:-0} FPV_SAVE_INFER_VIDEO: ${FPV_SAVE_INFER_VIDEO:-1} FPV_OUT_VIDEO_PATH: ${FPV_OUT_VIDEO_PATH:-/data/out/out_infer.mp4} FPV_ARCHIVE_RECORD_MODE: ${FPV_ARCHIVE_RECORD_MODE:-fragments} FPV_DETECTION_CLIP_MAX_GAP_SEC: ${FPV_DETECTION_CLIP_MAX_GAP_SEC:-15} FPV_UI_FRAME_EXPORT_ENABLE: ${FPV_UI_FRAME_EXPORT_ENABLE:-1} FPV_UI_FRAME_EXPORT_PATH: ${FPV_UI_FRAME_EXPORT_PATH:-/dev/shm/fpv-latest.jpg} FPV_UI_FRAME_EXPORT_EVERY: ${FPV_UI_FRAME_EXPORT_EVERY:-1} FPV_UI_FRAME_EXPORT_JPEG_QUALITY: ${FPV_UI_FRAME_EXPORT_JPEG_QUALITY:-82} FPV_UI_FRAME_EXPORT_MAX_FPS: ${FPV_UI_FRAME_EXPORT_MAX_FPS:-50} FPV_REALTIME_SKIP_STALE_FRAMES: ${FPV_REALTIME_SKIP_STALE_FRAMES:-1} FPV_REALTIME_MAX_SKIP_FRAMES: ${FPV_REALTIME_MAX_SKIP_FRAMES:-8} FPV_REALTIME_PREVIEW_SKIPPED_FRAMES: ${FPV_REALTIME_PREVIEW_SKIPPED_FRAMES:-1} FPV_REALTIME_ANALYSIS_EVERY: ${FPV_REALTIME_ANALYSIS_EVERY:-2} FPV_GUIDANCE_EXPORT_ENABLE: ${FPV_GUIDANCE_EXPORT_ENABLE:-1} FPV_GUIDANCE_EXPORT_PATH: ${FPV_GUIDANCE_EXPORT_PATH:-/data/guidance/guidance_state.json} FPV_ERROR_OUTPUT_ENABLE: ${FPV_ERROR_OUTPUT_ENABLE:-1} FPV_ERROR_OUTPUT_PROTOCOL: ${FPV_ERROR_OUTPUT_PROTOCOL:-guidance_v1} FPV_ERROR_OUTPUT_HOST: ${FPV_ERROR_OUTPUT_HOST:-host.docker.internal} FPV_ERROR_OUTPUT_PORT: ${FPV_ERROR_OUTPUT_PORT:-5010} FPV_ERROR_OUTPUT_OBJECT_ID: ${FPV_ERROR_OUTPUT_OBJECT_ID:-1} FPV_ERROR_OUTPUT_UNITS: ${FPV_ERROR_OUTPUT_UNITS:-px} FPV_ERROR_OUTPUT_EVERY: ${FPV_ERROR_OUTPUT_EVERY:-1} FPV_ERROR_OUTPUT_HFOV_DEG: ${FPV_ERROR_OUTPUT_HFOV_DEG:-90} FPV_ERROR_OUTPUT_VFOV_DEG: ${FPV_ERROR_OUTPUT_VFOV_DEG:-60} FPV_ERROR_OUTPUT_RANGE_M: ${FPV_ERROR_OUTPUT_RANGE_M:-1} FPV_AUTOPILOT_ENABLE: ${FPV_AUTOPILOT_ENABLE:-1} FPV_AUTOPILOT_BACKEND: ${FPV_AUTOPILOT_BACKEND:-json} FPV_AUTOPILOT_JSON_PATH: ${FPV_AUTOPILOT_JSON_PATH:-/data/autopilot/autopilot_cmd.json} FPV_PROTO_UDP_ENABLE: ${FPV_PROTO_UDP_ENABLE:-1} FPV_PROTO_UDP_HOST: ${FPV_PROTO_UDP_HOST:-192.168.1.10} FPV_PROTO_UDP_PORT: ${FPV_PROTO_UDP_PORT:-5005} services: fpv-tracker: profiles: ["standalone"] build: context: . dockerfile: Dockerfile args: PYTORCH_INDEX_URL: ${PYTORCH_INDEX_URL:-https://download.pytorch.org/whl/cu128} image: ${FPV_IMAGE:-fpv-tracker:cu128-offline} init: true gpus: all restart: "no" environment: *fpv-env volumes: - type: bind source: . target: /app - type: bind source: ${FPV_DATA_DIR:-./runtime-data} target: /data - type: bind source: ${FPV_INPUT_FILE:-./runtime-data/input/source.mp4} target: /data/input/source.mp4 read_only: true - type: bind source: ${FPV_MODEL_FILE:-./best.pt} target: /app/best.pt read_only: true command: > sh -c "python3 main.py 2>&1 | tee /data/logs/main.log" fpv-ui: image: ${FPV_IMAGE:-fpv-tracker:cu128-offline} init: true gpus: all restart: unless-stopped command: ["python3", "ui_server.py"] environment: <<: *fpv-env FPV_DATA_DIR: /data FPV_UI_HOST: ${FPV_UI_HOST:-0.0.0.0} FPV_UI_PORT: 8080 FPV_UI_LOG_PATH: /data/logs/main.log FPV_UI_FRAME_PATH: ${FPV_UI_FRAME_PATH:-/dev/shm/fpv-latest.jpg} FPV_UI_GUIDANCE_PATH: /data/guidance/guidance_state.json FPV_UI_OUT_DIR: /data/out FPV_UI_INPUT_DIR: /data/input FPV_CAMERA_BRIDGE_URL: ${FPV_CAMERA_BRIDGE_URL:-http://host.docker.internal:8091/stream.mjpg} volumes: - type: bind source: . target: /app - type: bind source: ${FPV_DATA_DIR:-./runtime-data} target: /data - type: bind source: ${FPV_MODEL_FILE:-./best.pt} target: /app/best.pt read_only: true ports: - "${FPV_UI_BIND:-127.0.0.1}:${FPV_UI_PORT:-8080}:8080/tcp"