Infrastructure

Running Bosca locally with Docker Compose, deploying to Kubernetes with the CLI, and understanding the downstream systems.

Local Development (Docker Compose)

The full dependency stack runs via Docker Compose:

bash

Services

ServiceImagePortPurpose
PostgreSQLpostgres:18.1-alpine5433Primary database
PostgreSQL (Warehouse)postgres:18.1-alpine5434Analytics warehouse
NATSnats4222Messaging, pub/sub, job queues
Redis-compatibledragonflydb/dragonfly6380Cache, distributed locks
Meilisearchgetmeili/meilisearch:v1.39.07701Full-text search
S3Proxyandrewgaul/s3proxy:3.0.08000S3-compatible local object storage
Trinotrinodb/trino:4798089Distributed SQL / Iceberg analytics
Jaegerjaegertracing/jaeger:2.13.016686Distributed tracing (OTEL)
Text Extractorghcr.io/sowers-io/bosca/text-extractor8083Document text extraction (PDF, DOCX, etc.)

Then start the server and runner:

bash

Downstream Systems

Required

SystemRoleConfig
PostgreSQLPrimary database — all models, permissions, workflow stateDATABASE_URL, DATABASE_USER, DATABASE_PASSWORD
Redis-compatibleCache, distributed locks, job queues (when configured)REDIS_HOST, REDIS_PORT
NATSMessaging, pub/sub, job queues, distributed locks, cache (when configured)NATS_HOST, NATS_TOKEN
S3 / GCSObject storage for content files, Git pack files, LFS objectsSTORAGE_TYPE, STORAGE_BUCKET, STORAGE_ENDPOINT, STORAGE_ACCESS_KEY_ID, STORAGE_ACCESS_KEY_SECRET
MeilisearchFull-text search for content and codeMEILISEARCH_URL, MEILISEARCH_API_KEY

Optional / Analytics

SystemRole
TrinoDistributed SQL for analytics queries over Iceberg/lakehouse data
JaegerDistributed tracing via OpenTelemetry (OTLP on 4317/4318)
Text ExtractorExtracts text from PDFs, DOCX, and other document formats

Integrations

SystemRole
MuxVideo upload, transcoding, and streaming
HubSpotCRM contact sync
SendGridTransactional email
CrowdinLocalization / translation management
Google OAuth2 / TTS / GenAIAuthentication, text-to-speech, AI features
OpenAI / AnthropicAI model providers for chat, agents, and tools
PostHogProduct analytics and experimentation

Configurable Backends

Several infrastructure services are swappable at startup via environment variables:

ConcernEnv VarOptions
CacheCACHE_TYPEredis (default), nats
Pub/SubPUBSUB_TYPEnats (default), redis
Job QueueJOB_QUEUE_FACTORYredis (default), nats
Distributed LocksDISTRIBUTED_LOCK_TYPEnats (default), redis
Object StorageSTORAGE_TYPEs3 (default), gcs

Kubernetes Deployment

The Bosca CLI generates Kubernetes manifests using cdk8s (Cloud Development Kit for Kubernetes). There are no Helm charts — manifests are generated programmatically from a bosca.yaml config file.

bash

Generated manifests

The CLI generates layered manifests:

  1. 00-bosca-config.yaml — ConfigMaps and Secrets
  2. 01-bosca-operators.yaml — CloudNativePG, cert-manager
  3. 02-bosca-storage.yaml — PersistentVolumeClaims
  4. 03-bosca-dependencies.yaml — PostgreSQL, NATS, Redis, Meilisearch, S3Proxy, Trino, Jaeger
  5. 04-bosca.yaml — Application services (server, runner, admin, collector, Git server, etc.)
  6. 05-bosca-gateway.yaml — Ingress / Gateway configuration

Feature flags

The Kubernetes config supports feature flags to enable/disable optional services:

bash

Key Environment Variables

Configuration is loaded from application.yaml with $VAR:default substitution:

Essential variables