Axiom Urban is a traffic-corridor analysis platform that combines FastAPI workflows, a gRPC physics engine, and report generation into a single operator-facing system.
backend/- FastAPI API, worker, orchestration, migrations, testsphysics/- gRPC simulation servicesfrontend/- React/Vite UInginx/- ingress configurationscripts/- startup, deployment, monitoring, smoke scriptsdocs/- architecture, deployment, developer and testing documentationdocker-compose*.yml- dev/prod/test compose files
docker compose -f docker-compose.yml up -d --build
docker compose -f docker-compose.yml psExpected dev services:
postgresredisphysicsmigrate(one-shot, exits0)apiworkerfrontendnginx
curl -f http://localhost:3080/api/v1/health/live
curl -f http://localhost:3080/api/v1/healthNote (Windows PowerShell): use curl.exe to avoid the curl alias to Invoke-WebRequest.
Use the built-in smoke runner:
bash scripts/compose_smoke_test.shThe smoke flow waits for health, creates an analysis job, polls until terminal status, then verifies results and PDF endpoints.
Production smoke (local TLS, self-signed cert is OK):
COMPOSE_FILE=docker-compose.prod.yml \
COMPOSE_PROFILES=local-redis \
BASE_URL=https://localhost \
CURL_INSECURE=1 \
bash scripts/compose_smoke_test.sh- Backend:
cd backend && uvicorn app.main:app --reload - Physics:
cd physics && python -m app.server - Frontend:
cd frontend && npm run dev
- Ingress:
nginx - API and async worker split:
api+worker - Queue/cache: Redis
- Primary DB: PostgreSQL/PostGIS
- Simulation: gRPC calls to
physics - Migrations: one-shot
migrate - Production ingress behavior:
nginxproxies/api/*toapiand/tofrontend. - Frontend assets are served by
frontendcontainer behind nginx.
/shows the branded landing page.- Landing page
DASHBOARDbutton navigates to/dashboard. /301is maintained as a compatibility path and is resolved to dashboard routing.
docker compose -f docker-compose.prod.yml --profile local-redis up -d --build
docker compose -f docker-compose.prod.yml --profile local-redis psHealth (local TLS uses self-signed fallback cert by default):
curl -k -f https://localhost/api/v1/health/live
curl -k -f https://localhost/api/v1/healthNote (Windows PowerShell): use curl.exe (and keep -k for self-signed local TLS).
URL behavior:
https://localhost/loads the frontend apphttps://localhost/301is treated as an SPA path and should return app HTML (200)http://localhost/*redirects to HTTPS (301)
Canonical architecture doc: docs/ARCHITECTURE.md
pytest backend/tests/deployment -q
pytest backend/tests/smoke/test_startup.py -q
docker compose -f docker-compose.test.yml run --rm api-test python -m pytest -q /app/backend/tests- Architecture:
docs/ARCHITECTURE.md - Deployment:
docs/DEPLOYMENT.md - Developer Guide:
docs/DEVELOPER.md - Testing Guide:
docs/TESTING.md - Oracle Cloud (override):
docker-compose.oracle.ymlandscripts/deploy-oracle.sh(archived guide:docs/archive/root_ORACLE_CLOUD_DEPLOYMENT_GUIDE.md)