Operate

Deployment

Three supported shapes. Docker compose for solo and small-team installs. Helm for Kubernetes. Source builds for development. Pick whichever matches what you already run.

Docker compose

The bundled deploy/docker-compose.yml runs the API, the admin UI, and a SQLite volume. Postgres, Redis, and an OTLP collector are pre-wired and commented out for when you outgrow SQLite.

cd deploy
cp .env.example .env
docker compose up --build

Adding the chat demo

A self-contained demo (a small .NET backend plus a Vue chat UI) ships under the demo profile. Run alongside the main stack:

docker compose --profile demo up --build

The demo UI lands on :8100.

Switching to Postgres

Uncomment the postgres service in the compose file and set:

Database__Provider=Postgres
Database__ConnectionString=Host=postgres;Database=adaptiveapi;Username=adaptiveapi;Password=...

SQLite remains the right choice for solo and small-team setups. Postgres earns its keep when you need replicas, point-in-time recovery, or shared deployments across nodes.

Adding Redis

Optional. Used for translation cache, rate limits, and route cache. Uncomment the redis service and set Redis__ConnectionString on the API.

Helm

The chart in deploy/helm/ provisions:

helm install adaptiveapi ./deploy/helm \
  --set database.provider=Postgres \
  --set database.existingSecret.name=adaptiveapi-db \
  --set translators.existingSecret=adaptiveapi-translators \
  --set ingress.host=adaptiveapi.yourdomain.com

Full values reference and chart-specific notes live in deploy/helm/README.md.

From source

Two terminals. The API is a .NET 10 minimal API. The admin UI is a Vue 3 Vite app.

# terminal 1: API
cd src/AdaptiveApi.Api
dotnet run --urls http://localhost:5000

# terminal 2: admin UI
cd src/AdaptiveApi.Ui
npm install
npm run dev   # UI on :5173, proxies /api to :5000

Production checklist

Plugins

AdaptiveAPI supports an in-process plugin loader for things you do not want in the open-source repo. Drop a DLL implementing AdaptiveApi.Core.Plugins.IWebPlugin next to the binary, or mount it under /app/plugins/. ConfigureServices runs before builder.Build(), Map after.

The SaaS-only features (organisations, invites, SCIM, Stripe metered billing) are shipped this way. No compile-time coupling.