udb 0.3.0

Universal Data Broker — a Rust gRPC broker over multiple databases (Postgres, MySQL, SQLite, MongoDB, ClickHouse, Cassandra, MSSQL, Redis, Qdrant, S3, Neo4j, …) with per-tenant RLS, 2PC, sagas, and CDC.
Documentation
name: udb-acme-billing-python-example

services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: udb
      POSTGRES_USER: udb
      POSTGRES_PASSWORD: udb
    ports:
      - "${UDB_POSTGRES_PORT:-55432}:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U udb -d udb"]
      interval: 5s
      timeout: 3s
      retries: 20

  redis:
    image: redis:7-alpine
    ports:
      - "${UDB_REDIS_PORT:-56379}:6379"
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 20

  qdrant:
    image: qdrant/qdrant:v1.13.4
    ports:
      - "${UDB_QDRANT_PORT:-56333}:6333"

  minio:
    image: minio/minio:RELEASE.2025-01-20T14-49-07Z
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123
    ports:
      - "${UDB_MINIO_PORT:-59000}:9000"
      - "${UDB_MINIO_CONSOLE_PORT:-59001}:9001"

  minio-init:
    image: minio/mc:latest
    depends_on:
      - minio
    entrypoint: >
      /bin/sh -c "
      until mc alias set local http://minio:9000 minio minio123; do sleep 2; done;
      mc mb --ignore-existing local/acme-billing-documents;
      "

  udb-cli:
    image: buildpack-deps:noble-curl
    profiles: ["cli"]
    user: "0:0"
    working_dir: /workspace
    entrypoint: ["/bin/sh", "/workspace/scripts/run-udb-linux.sh"]
    environment:
      UDB_CLI_URL: ${UDB_CLI_URL:-https://github.com/fahara02/udb/releases/latest/download/udb-proto-parser-linux-amd64}
      UDB_DB_OPS_ROOT: /workspace/db_ops
      UDB_PG_DSN: postgres://udb:udb@postgres:5432/udb
      UDB_CACHE_DSN: redis://redis:6379
      UDB_REDIS_DSN: redis://redis:6379
      UDB_QDRANT_URL: http://qdrant:6333
      UDB_MINIO_ENDPOINT: http://minio:9000
      UDB_MINIO_ACCESS_KEY: minio
      UDB_MINIO_SECRET_KEY: minio123
      AWS_ACCESS_KEY_ID: minio
      AWS_SECRET_ACCESS_KEY: minio123
      UDB_ABAC_DEFAULT_ALLOW: "true"
      UDB_ALLOW_DEGRADED_BACKENDS: "false"
    volumes:
      - ./:/workspace

  udb-broker:
    image: buildpack-deps:noble-curl
    entrypoint: ["/bin/sh", "/workspace/scripts/run-udb-linux.sh"]
    command: ["serve", "/workspace/proto", "", "0.0.0.0:50051"]
    environment:
      UDB_CLI_URL: ${UDB_CLI_URL:-https://github.com/fahara02/udb/releases/latest/download/udb-proto-parser-linux-amd64}
      UDB_PG_DSN: postgres://udb:udb@postgres:5432/udb
      UDB_CACHE_DSN: redis://redis:6379
      UDB_REDIS_DSN: redis://redis:6379
      UDB_QDRANT_URL: http://qdrant:6333
      UDB_MINIO_ENDPOINT: http://minio:9000
      UDB_MINIO_ACCESS_KEY: minio
      UDB_MINIO_SECRET_KEY: minio123
      AWS_ACCESS_KEY_ID: minio
      AWS_SECRET_ACCESS_KEY: minio123
      UDB_DB_OPS_ROOT: /workspace/db_ops
      UDB_ENCRYPTION_KEY: "00000000000000000000000000000000"
      UDB_ABAC_DEFAULT_ALLOW: "true"
      UDB_ALLOW_HEADER_SCOPES: "true"
      UDB_TLS_REQUIRED: "false"
      UDB_MTLS_REQUIRED: "false"
      UDB_ALLOW_DEGRADED_BACKENDS: "false"
      UDB_RATE_LIMIT_ENABLED: "false"
      RUST_LOG: info
    ports:
      - "${UDB_GRPC_PORT:-50051}:50051"
      - "${UDB_METRICS_PORT:-50052}:50052"
    volumes:
      - ./:/workspace
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
      qdrant:
        condition: service_started
      minio-init:
        condition: service_completed_successfully

  smoke:
    image: python:3.12-bookworm
    profiles: ["smoke"]
    working_dir: /workspace
    depends_on:
      udb-broker:
        condition: service_started
    environment:
      UDB_TARGET: udb-broker:50051
      UV_SYSTEM_PYTHON: "1"
    volumes:
      - ./:/workspace
    command:
      - /bin/sh
      - -lc
      - |
        python -m pip install --no-cache-dir uv
        uv sync
        for i in $(seq 1 30); do
          uv run python acme_billing.py && exit 0
          sleep 2
        done
        exit 1