# TrustGraph TypeScript — Full Stack # Usage: docker compose up -d # Observability UI: http://localhost:3030 (Grafana) networks: trustgraph: driver: bridge volumes: nats-data: falkordb-data: qdrant-data: ollama-models: prometheus-data: loki-data: tempo-data: grafana-data: librarian-data: services: # --------------------------------------------------------------------------- # Infrastructure # --------------------------------------------------------------------------- nats: image: nats:2.10-alpine command: ["--jetstream", "--http_port", "8222", "--store_dir", "/data"] ports: - "4222:4222" # Client connections - "8222:8222" # Monitoring / metrics volumes: - nats-data:/data networks: - trustgraph healthcheck: test: ["CMD", "wget", "--spider", "-q", "http://localhost:8222/healthz"] interval: 10s timeout: 5s retries: 3 start_period: 5s restart: unless-stopped falkordb: image: falkordb/falkordb:latest ports: - "6380:6379" - "${FALKORDB_BROWSER_PORT:-6381}:3000" environment: - ENCRYPTION_KEY=${FALKORDB_BROWSER_ENCRYPTION_KEY:-0000000000000000000000000000000000000000000000000000000000000000} - NEXTAUTH_SECRET=${FALKORDB_BROWSER_NEXTAUTH_SECRET:-trustgraph-falkordb-browser-local-demo} volumes: - falkordb-data:/var/lib/falkordb/data networks: - trustgraph healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 3 start_period: 5s restart: unless-stopped qdrant: image: qdrant/qdrant:latest ports: - "6333:6333" # REST API - "6334:6334" # gRPC volumes: - qdrant-data:/qdrant/storage networks: - trustgraph healthcheck: test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/6333'"] interval: 10s timeout: 5s retries: 3 start_period: 5s restart: unless-stopped ollama: image: ollama/ollama:latest ports: - "11434:11434" volumes: - ollama-models:/root/.ollama networks: - trustgraph restart: unless-stopped # --------------------------------------------------------------------------- # Observability # --------------------------------------------------------------------------- prometheus: image: prom/prometheus:latest ports: - "9090:9090" volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro - prometheus-data:/prometheus command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" - "--storage.tsdb.retention.time=7d" - "--web.enable-remote-write-receiver" - "--enable-feature=exemplar-storage" networks: - trustgraph healthcheck: test: ["CMD", "wget", "--spider", "-q", "http://localhost:9090/-/healthy"] interval: 10s timeout: 5s retries: 3 start_period: 10s restart: unless-stopped loki: image: grafana/loki:3.0.0 user: "0" ports: - "3100:3100" volumes: - ./loki/loki-config.yml:/etc/loki/local-config.yaml:ro - loki-data:/tmp/loki command: ["-config.file=/etc/loki/local-config.yaml"] networks: - trustgraph healthcheck: test: ["CMD", "wget", "--spider", "-q", "http://localhost:3100/ready"] interval: 10s timeout: 5s retries: 5 start_period: 15s restart: unless-stopped tempo: image: grafana/tempo:2.6.1 user: "0" ports: - "3200:3200" # Tempo API volumes: - ./tempo/tempo-config.yml:/etc/tempo/config.yml:ro - tempo-data:/var/tempo command: ["-config.file=/etc/tempo/config.yml"] networks: - trustgraph healthcheck: test: ["CMD", "wget", "--spider", "-q", "http://localhost:3200/ready"] interval: 10s timeout: 5s retries: 5 start_period: 15s restart: unless-stopped otel-collector: image: otel/opentelemetry-collector-contrib:latest ports: - "4327:4317" # OTLP gRPC (apps send traces/metrics here) - "4328:4318" # OTLP HTTP - "8889:8889" # Prometheus exporter (scraped by Prometheus) volumes: - ./otel-collector/config.yml:/etc/otelcol-contrib/config.yaml:ro depends_on: tempo: condition: service_healthy networks: - trustgraph restart: unless-stopped grafana: image: grafana/grafana:latest ports: - "3030:3000" volumes: - ./grafana/provisioning/datasources.yml:/etc/grafana/provisioning/datasources/datasources.yml:ro - ./grafana/provisioning/dashboards.yml:/etc/grafana/provisioning/dashboards/dashboards.yml:ro - ./grafana/dashboards:/var/lib/grafana/dashboards:ro - grafana-data:/var/lib/grafana environment: - GF_SECURITY_ADMIN_PASSWORD=${GF_SECURITY_ADMIN_PASSWORD:-admin} - GF_AUTH_ANONYMOUS_ENABLED=true - GF_AUTH_ANONYMOUS_ORG_ROLE=Editor - GF_AUTH_DISABLE_LOGIN_FORM=false - GF_USERS_DEFAULT_THEME=dark - GF_EXPLORE_ENABLED=true - GF_USERS_VIEWERS_CAN_EDIT=true - GF_FEATURE_TOGGLES_ENABLE=traceqlEditor tempoSearch tempoServiceGraph depends_on: prometheus: condition: service_healthy loki: condition: service_healthy tempo: condition: service_healthy networks: - trustgraph healthcheck: test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000/api/health"] interval: 10s timeout: 5s retries: 3 start_period: 15s restart: unless-stopped # --------------------------------------------------------------------------- # TrustGraph Application Services # --------------------------------------------------------------------------- gateway: image: trustgraph-ts:local build: context: ../ dockerfile: Containerfile command: ["node", "entrypoints/gateway.mjs"] ports: - "${GATEWAY_PORT:-8088}:8088" environment: - NATS_URL=nats://nats:4222 - GATEWAY_PORT=8088 - GATEWAY_SECRET=${GATEWAY_SECRET:-} depends_on: nats: condition: service_healthy networks: - trustgraph restart: unless-stopped config-service: image: trustgraph-ts:local command: ["node", "entrypoints/config.mjs"] environment: - NATS_URL=nats://nats:4222 depends_on: nats: condition: service_healthy networks: - trustgraph restart: unless-stopped text-completion: image: trustgraph-ts:local command: ["node", "entrypoints/text-completion-openai.mjs"] environment: - NATS_URL=nats://nats:4222 - OPENAI_TOKEN=${OPENAI_TOKEN:-} - OPENAI_BASE_URL=${OPENAI_BASE_URL:-} depends_on: nats: condition: service_healthy networks: - trustgraph restart: unless-stopped prompt: image: trustgraph-ts:local command: ["node", "entrypoints/prompt.mjs"] environment: - NATS_URL=nats://nats:4222 depends_on: nats: condition: service_healthy networks: - trustgraph restart: unless-stopped embeddings: image: trustgraph-ts:local command: ["node", "entrypoints/embeddings.mjs"] environment: - NATS_URL=nats://nats:4222 - OLLAMA_URL=http://ollama:11434 depends_on: nats: condition: service_healthy ollama: condition: service_started networks: - trustgraph restart: unless-stopped workbench: build: context: ../ dockerfile: packages/workbench/Containerfile ports: - "${WORKBENCH_PORT:-3001}:80" depends_on: - gateway networks: - trustgraph restart: unless-stopped agent: image: trustgraph-ts:local command: ["node", "entrypoints/agent.mjs"] environment: - NATS_URL=nats://nats:4222 depends_on: nats: condition: service_healthy networks: - trustgraph restart: unless-stopped mcp-tool: image: trustgraph-ts:local command: ["node", "entrypoints/mcp-tool.mjs"] environment: - NATS_URL=nats://nats:4222 depends_on: nats: condition: service_healthy networks: - trustgraph restart: unless-stopped librarian: image: trustgraph-ts:local command: ["node", "entrypoints/librarian.mjs"] environment: - NATS_URL=nats://nats:4222 volumes: - librarian-data:/app/data depends_on: nats: condition: service_healthy networks: - trustgraph restart: unless-stopped flow-manager: image: trustgraph-ts:local command: ["node", "entrypoints/flow-manager.mjs"] environment: - NATS_URL=nats://nats:4222 depends_on: nats: condition: service_healthy networks: - trustgraph restart: unless-stopped knowledge-cores: image: trustgraph-ts:local command: ["node", "entrypoints/cores.mjs"] environment: - NATS_URL=nats://nats:4222 depends_on: nats: condition: service_healthy networks: - trustgraph restart: unless-stopped # --------------------------------------------------------------------------- # Document Processing Pipeline # --------------------------------------------------------------------------- pdf-decoder: image: trustgraph-ts:local command: ["node", "entrypoints/pdf-decoder.mjs"] environment: - NATS_URL=nats://nats:4222 depends_on: nats: condition: service_healthy networks: - trustgraph restart: unless-stopped chunker: image: trustgraph-ts:local command: ["node", "entrypoints/chunker.mjs"] environment: - NATS_URL=nats://nats:4222 depends_on: nats: condition: service_healthy networks: - trustgraph restart: unless-stopped extractor: image: trustgraph-ts:local command: ["node", "entrypoints/extractor.mjs"] environment: - NATS_URL=nats://nats:4222 depends_on: nats: condition: service_healthy networks: - trustgraph restart: unless-stopped triples-store: image: trustgraph-ts:local command: ["node", "entrypoints/triples-store.mjs"] environment: - NATS_URL=nats://nats:4222 - FALKORDB_URL=redis://falkordb:6379 depends_on: nats: condition: service_healthy falkordb: condition: service_healthy networks: - trustgraph restart: unless-stopped graph-embeddings-store: image: trustgraph-ts:local command: ["node", "entrypoints/graph-embeddings-store.mjs"] environment: - NATS_URL=nats://nats:4222 - QDRANT_URL=http://qdrant:6333 depends_on: nats: condition: service_healthy qdrant: condition: service_healthy networks: - trustgraph restart: unless-stopped # --------------------------------------------------------------------------- # Query Services # --------------------------------------------------------------------------- triples-query: image: trustgraph-ts:local command: ["node", "entrypoints/triples-query.mjs"] environment: - NATS_URL=nats://nats:4222 - FALKORDB_URL=redis://falkordb:6379 depends_on: nats: condition: service_healthy falkordb: condition: service_healthy networks: - trustgraph restart: unless-stopped graph-embeddings-query: image: trustgraph-ts:local command: ["node", "entrypoints/graph-embeddings-query.mjs"] environment: - NATS_URL=nats://nats:4222 - QDRANT_URL=http://qdrant:6333 depends_on: nats: condition: service_healthy qdrant: condition: service_healthy networks: - trustgraph restart: unless-stopped doc-embeddings-query: image: trustgraph-ts:local command: ["node", "entrypoints/doc-embeddings-query.mjs"] environment: - NATS_URL=nats://nats:4222 - QDRANT_URL=http://qdrant:6333 depends_on: nats: condition: service_healthy qdrant: condition: service_healthy networks: - trustgraph restart: unless-stopped # --------------------------------------------------------------------------- # Retrieval Services # --------------------------------------------------------------------------- graph-rag: image: trustgraph-ts:local command: ["node", "entrypoints/graph-rag.mjs"] environment: - NATS_URL=nats://nats:4222 depends_on: nats: condition: service_healthy networks: - trustgraph restart: unless-stopped document-rag: image: trustgraph-ts:local command: ["node", "entrypoints/document-rag.mjs"] environment: - NATS_URL=nats://nats:4222 depends_on: nats: condition: service_healthy networks: - trustgraph restart: unless-stopped # --------------------------------------------------------------------------- # Alternative LLM Providers (uncomment one to use instead of text-completion) # --------------------------------------------------------------------------- # text-completion-ollama: # image: trustgraph-ts:local # command: ["node", "entrypoints/text-completion-ollama.mjs"] # environment: # - NATS_URL=nats://nats:4222 # - OLLAMA_URL=http://ollama:11434 # - OLLAMA_MODEL=${OLLAMA_MODEL:-gemma3:4b} # depends_on: # nats: # condition: service_healthy # ollama: # condition: service_started # networks: # - trustgraph # restart: unless-stopped # text-completion-claude: # image: trustgraph-ts:local # command: ["node", "entrypoints/text-completion-claude.mjs"] # environment: # - NATS_URL=nats://nats:4222 # - CLAUDE_KEY=${CLAUDE_KEY:-} # depends_on: # nats: # condition: service_healthy # networks: # - trustgraph # restart: unless-stopped # text-completion-azure-openai: # image: trustgraph-ts:local # command: ["node", "entrypoints/text-completion-azure-openai.mjs"] # environment: # - NATS_URL=nats://nats:4222 # - AZURE_TOKEN=${AZURE_TOKEN:-} # - AZURE_ENDPOINT=${AZURE_ENDPOINT:-} # - AZURE_MODEL=${AZURE_MODEL:-gpt-4o} # - AZURE_API_VERSION=${AZURE_API_VERSION:-2024-02-15-preview} # depends_on: # nats: # condition: service_healthy # networks: # - trustgraph # restart: unless-stopped # text-completion-openai-compatible: # image: trustgraph-ts:local # command: ["node", "entrypoints/text-completion-openai-compatible.mjs"] # environment: # - NATS_URL=nats://nats:4222 # - OPENAI_COMPAT_URL=${OPENAI_COMPAT_URL:-http://localhost:1234/v1} # - OPENAI_COMPAT_MODEL=${OPENAI_COMPAT_MODEL:-default} # - OPENAI_COMPAT_KEY=${OPENAI_COMPAT_KEY:-} # depends_on: # nats: # condition: service_healthy # networks: # - trustgraph # restart: unless-stopped # text-completion-mistral: # image: trustgraph-ts:local # command: ["node", "entrypoints/text-completion-mistral.mjs"] # environment: # - NATS_URL=nats://nats:4222 # - MISTRAL_TOKEN=${MISTRAL_TOKEN:-} # - MISTRAL_MODEL=${MISTRAL_MODEL:-ministral-8b-latest} # depends_on: # nats: # condition: service_healthy # networks: # - trustgraph # restart: unless-stopped