Skip to content

Infrastructure

Beyond Retrieval v2 runs as a Docker Compose stack with 16 services across multiple profiles.


Docker Compose Architecture

graph TB
    subgraph Core Services
        backend["backend<br/>FastAPI Python 3.12<br/>Port 8000"]
        frontend_build["frontend-build<br/>Vite build → /srv<br/>One-shot"]
        caddy["caddy<br/>Caddy 2 Alpine<br/>Ports 80, 443"]
    end

    subgraph Local Supabase — profile: local
        supabase_db["supabase-db<br/>PostgreSQL 15.8.1<br/>Port 5432"]
        supabase_rest["supabase-rest<br/>PostgREST v12.2.3<br/>Port 3000"]
        supabase_auth["supabase-auth<br/>GoTrue v2.158.1<br/>Port 9999"]
        supabase_kong["supabase-kong<br/>Kong 2.8.1<br/>Port 8000"]
        supabase_storage["supabase-storage<br/>Storage API v1.11.13<br/>Port 5000"]
        supabase_meta["supabase-meta<br/>Postgres Meta v0.83.2"]
        supabase_studio["supabase-studio<br/>Studio Dashboard"]
    end

    subgraph AI Services
        ollama_cpu["ollama-cpu<br/>profile: cpu"]
        ollama_nvidia["ollama-gpu-nvidia<br/>profile: gpu-nvidia"]
        ollama_amd["ollama-gpu-amd<br/>profile: gpu-amd"]
        docling["docling<br/>profile: docling<br/>Port 5001"]
    end

    caddy --> backend
    caddy --> frontend_build
    backend --> supabase_kong
    supabase_kong --> supabase_rest
    supabase_kong --> supabase_auth
    supabase_rest --> supabase_db
    supabase_auth --> supabase_db
    supabase_storage --> supabase_db
    backend --> docling

Deployment Modes

Mode Command Database Ollama Auto-HTTPS
dev python start_services.py dev --build Cloud Supabase No No
local python start_services.py local --gpu cpu --build Docker Supabase Yes No
cloud python start_services.py cloud --build Cloud Supabase No Yes (Caddy)
production python start_services.py production --gpu cpu --build Docker Supabase Yes Yes (Caddy)

Docker Profiles

Profile Services Activated
(default) backend, frontend-build, caddy
local supabase-db, supabase-rest, supabase-auth, supabase-kong, supabase-storage, supabase-meta, supabase-studio
cpu ollama-cpu, ollama-init-cpu
gpu-nvidia ollama-gpu-nvidia, ollama-init-gpu-nvidia
gpu-amd ollama-gpu-amd, ollama-init-gpu-amd
docling docling

Volumes

Volume Purpose
frontend-dist Built React SPA static files
caddy-data Caddy TLS certificates
caddy-config Caddy runtime configuration
ollama-models Downloaded Ollama model weights
supabase-db-data PostgreSQL data directory
supabase-storage-data Supabase Storage file backend
local-documents Local filesystem document storage

Network

All services share a single internal bridge network. No service exposes ports in the base compose file — port mappings are added exclusively via override files, ensuring the base configuration is secure by default.


Caddy Configuration

Caddy serves three virtual hosts:

Virtual Host Purpose
APP_HOSTNAME Main app: static files + /api/* reverse proxy
STUDIO_HOSTNAME Supabase Studio (proxied through Kong)
DOCLING_HOSTNAME Docling Serve API

Optional subdomains default to unreachable hostnames (studio.internal, docling.internal), effectively disabling them unless configured in .env.

Caddy provides automatic HTTPS via Let's Encrypt when APP_HOSTNAME is a public domain. In local mode (APP_HOSTNAME=:80), it serves plain HTTP.


Compose File Structure

File Purpose
docker-compose.yml Base (all services, no exposed ports)
docker-compose.override.private.yml Dev/local port mappings (localhost only)
docker-compose.override.public.yml Production with Caddy HTTPS
docker-compose.override.local.yml Local Supabase profile services
Caddyfile Reverse proxy rules
start_services.py Docker Compose orchestrator CLI

Init Scripts Mount

Docker init-scripts use individual file mounts, NOT directory mounts. A directory mount would replace the image's built-in scripts (98-webhooks, 99-roles, 99-jwt, 99-schema.sql).