This guide covers the most practical ways to run aerotrack beyond local development.
If the goal is a public challenge URL without committing to monthly spend, the best current fit is a single free Render web service for the API demo.
Why this is the best default:
- Render officially supports
freeweb-service instances inrender.yaml - Docker deployments are supported directly from your repository
- the free web tier is enough for a low-traffic portfolio demo
- the tradeoff is that free services can spin down when idle, so it is best for demos, judging, and portfolio review rather than production uptime
Recommended public architecture:
- deploy the FastAPI browser demo only
- make MLflow optional for the public URL
- fetch the chosen checkpoint at startup using
AEROTRACK_MODEL_URL - keep uploads short and demo-oriented
Best for:
- development
- smoke testing
- demo recording
- MLflow experiment review on a single machine
Command:
docker-compose up --buildServices:
- FastAPI API on
localhost:8000 - MLflow UI on
localhost:5001
Best for:
- live challenge demos
- simple hosted inference endpoints
- lightweight portfolio deployments
In this mode, deploy only the API container and point it at:
- a preloaded model path
- an external MLflow tracking server, if you want experiment logging
Good fits:
- Render web service
- Railway service
- Fly.io app
Current recommendation:
- choose Render first for the public demo, because it has an official
freeweb-service plan and native Blueprint support
Best for:
- more serious demos
- shared experiment tracking
- team usage
Recommended split:
- API service deployed separately
- MLflow deployed as its own service
- artifact storage moved to persistent disk or object storage
- model artifacts/versioning managed outside the API filesystem
For the API service:
API_HOST=0.0.0.0
API_PORT=8000
AEROTRACK_MODEL_PATH=/app/models/aerotrack-detector.pt
AEROTRACK_MODEL_URL=https://example.com/path/to/model.pt
AEROTRACK_DEVICE=cpu
AEROTRACK_CONFIDENCE=0.25
AEROTRACK_IOU=0.45
AEROTRACK_OUTPUT_DIR=/app/outputs
MLFLOW_UI_URL=AEROTRACK_MODEL_URL is the key to a free-tier deployment with no persistent disk. On startup, the container downloads the model into AEROTRACK_MODEL_PATH if it is not already present.
For MLflow:
MLFLOW_BACKEND_STORE_URI=sqlite:////mlflow/mlflow.db
MLFLOW_ARTIFACT_ROOT=/mlflow/artifactsThe repository includes render.yaml, which defines a free Render web service for the demo app.
The current Blueprint is tuned for a stable free-tier live demo. It intentionally points the public Render deployment at the lighter yolov8n.pt model so the site stays responsive on CPU. The repo still includes the stronger RTX 4070 Ti-trained checkpoint under models/ for local evaluation, project review, and higher-capacity deployments.
Suggested flow:
- Push the latest repo state to GitHub.
- In Render, create a new Blueprint from the repo.
- Keep the service on the
freeplan. - Leave
AEROTRACK_MODEL_URLblank unless you want the container to fetch a custom checkpoint at startup. - Optionally set
MLFLOW_UI_URLif you want the homepage to link to a hosted MLflow instance. - Deploy and verify
/health,/metadata,/detect, and/track.
Where to host the model file cheaply:
- a GitHub Release asset
- a Hugging Face model repository file
- any public direct-download object URL you control
For the challenge URL, the browser demo matters more than hosting the experiment tracker publicly.
Keeping MLflow out of the first public deployment:
- reduces memory pressure
- avoids managing a persistent backend database
- lowers the risk of free-tier instability
You can still show MLflow locally in recordings and screenshots.
If you want a cheap live demo:
- Deploy the API container first
- Start with CPU inference
- Start with the lighter bundled live model or use
AEROTRACK_MODEL_URLfor a custom checkpoint - Keep request sizes small for demo clips
- Treat MLflow as optional for the public demo if operating two services is too much friction
The container already starts with:
uvicorn api.main:app --host 0.0.0.0 --port ${API_PORT}- expose
/healthfor quick verification - use the browser demo at
/as the primary submission URL - keep one known-good image and one short clip ready for judging
- refresh the deployed checkpoint once the stronger GPU-trained model is ready
If this repo were extended into a more operational system, the next infrastructure upgrades would be:
- move MLflow backend from SQLite to Postgres
- move artifacts to object storage
- bake model weights into an artifact bundle or registry flow
- add structured request logging
- add request size limits and auth in front of the API
- add a background job path for long-running video tracking
Before calling a deployment "demo-ready":
GET /healthreturns200POST /detectworks on a known sample framePOST /trackworks on a known short clip- MLflow UI is reachable if enabled
- Model weights are present and do not require surprise downloads during the demo