Skip to content

Architecture

Databús is a distributed transit data platform composed of Django apps and Celery workers, all deployed as Docker Compose services. The sections below unpack the system from every angle.

flowchart TD
    subgraph Ingestion
        api([REST API])
        mqtt_in([MQTT])
    end

    subgraph Brokers
        telemetry_broker(("telemetry-broker\n(NanoMQ)"))
        message_broker(("message-broker\n(RabbitMQ)"))
    end

    subgraph Django["orchestrator (Django)"]
        direction TB
        api_app[api]
        runs_app[runs]
        schedule_engine_app[schedule_engine]
        feed_app[feed]
        ops_app[operations]
        website_app[website]
        messages_app[messages]
    end

    subgraph realtime_worker["realtime-engine (Celery worker)"]
        mqtt_bootstep[MQTT bootstep]
        re_tasks[process_position_update\nrun_lifecycle_event\nscan_stale_runs]
    end

    subgraph schedule_worker["schedule-engine (Celery worker)"]
        se_tasks[build_vehicle_positions\nbuild_trip_updates\nbuild_alerts]
    end

    scheduler_node(("scheduler\n(Celery Beat)"))

    subgraph State
        redis_node(("state\n(Redis)"))
    end

    subgraph Persistence
        pg_node(("database\n(PostgreSQL/PostGIS)"))
    end

    subgraph Outputs
        gtfs_rt[/GTFS-RT files/]
        ws[/WebSocket/]
    end

    analytics_engine(("analytics-engine\n(Prefect)"))
    flower(("task-monitoring\n(Flower)"))

    api --> Django
    mqtt_in --> telemetry_broker
    telemetry_broker -- MQTT --> mqtt_bootstep
    mqtt_bootstep --> re_tasks
    re_tasks -- "HSET" --> redis_node
    re_tasks -- "lifecycle events" --> message_broker
    Django -- "ORM" --> pg_node
    Django -- "commands" --> message_broker
    message_broker -- "tasks" --> realtime_worker
    message_broker -- "tasks" --> schedule_worker
    scheduler_node --> message_broker
    redis_node -- "snapshots" --> se_tasks
    se_tasks --> gtfs_rt
    se_tasks --> ws
    pg_node --> analytics_engine
    message_broker --> flower
Page What it covers
System overview Six-layer model: Ingestion → Projection
Services & mandates Per-service role, responsibilities, and boundaries
Messaging model Commands, observations, assertions; AMQP exchange layout
State & persistence Redis (authoritative) vs PostgreSQL (durable)
Deployment topology Compose services, queue routing, dev vs prod