datris-platform skill. For the interactive install a person runs, see Installation.
Prerequisites
- Docker with the Compose v2 plugin (
docker compose versionanswers), and a running daemon (docker infosucceeds). The installer stops with an error if any of these is missing. - curl, plus openssl (or
/dev/urandomandxxd). The installer uses them to fetch files and to generate the tap runner token. - A POSIX shell on macOS or Linux. The installer is a
shscript. On Windows, use the single-file Compose path instead. - Memory: 4 GB available to Docker for a minimal install, about 8 GB for the full stack with the bundled embedding server. See Installation → Minimal install.
- At least one AI provider key in the environment:
ANTHROPIC_API_KEY,OPENAI_API_KEY,XAI_API_KEY, the Azure OpenAI trio, orAI_PROVIDER=bedrock. See Without an AI key for why. - Free host ports. The stack publishes 8080 (API), 4200 (UI), 3000 (MCP server), 61616 and 8161 (ActiveMQ), 9000 and 9001 (MinIO), 27017 (MongoDB) and 8200 (Vault); also 5432 (Postgres) unless
DATRIS_POSTGRESisexternalornone, and 11434 (bundled embedding server) unlessDATRIS_EMBEDDINGisopenaiornone. Opt-in profiles publish more. See Installation → Services.
Install without a terminal
The installer reads its prompts only from the controlling terminal (/dev/tty), never from stdin. When it cannot open a terminal it skips every prompt, prints Non-interactive — using the detected key(s). when it finds a key, and takes its answers from environment variables. Redirecting stdin is not enough: a process that still has a controlling terminal is prompted, and waits.
If your agent’s shell tool already runs without a controlling terminal, the plain piped command is prompt-free. To make sure, start the shell in a new session, which detaches it from any terminal.
setsid, so the macOS form uses a short Python wrapper that makes the same system call, waits for the installer and returns its exit code. That form was run, launched from inside a terminal, and asked nothing. The Linux form uses setsid from util-linux (-w waits for the installer and returns its exit code); it was not run for this page.
To keep the installer’s output for later, add > install.log 2>&1 at the end of either command.
Environment variables
The installer reads these on a fresh install. Values you pass are written to<install dir>/.env, which is kept at permissions 600.
What a run without a terminal chooses
When a variable above is unset, the installer takes these defaults:
It also generates a random
TAP_RUNNER_TOKEN in .env.
Which chat provider the install uses
One provider handles chat and CodeGen. The installer writes it to.env as AI_PROVIDER, next to the keys:
When several provider keys are set, say which one handles chat and CodeGen with
AI_PROVIDER. If you leave it unset, a run without a terminal takes the first configured provider in the order anthropic, openai, azure, grok, and prints Several AI providers configured with the provider it chose. That order is a tie-break kept so existing automated installs behave as before. A run in a terminal asks instead.
The AI settings are seeded into Vault on the first start only; after that, change the chat provider from the Configuration tab in the UI.
Anthropic does not offer an embeddings API, and neither does xAI. DATRIS_EMBEDDING accepts openai, tei (the bundled local server) and none.
Without an AI key
The stack cannot start without an AI provider, so a fresh install with none stops before it pulls anything, witherror: No AI provider key set, and Datris cannot start without one. Set one of the provider variables above and run it again.
With DATRIS_NO_START=1 the installer still writes the files and exits 0, and warns that Datris will not start until a provider key is added to .env.
Running it again
If<install dir>/.env already exists, the installer runs in upgrade mode: no prompts, .env is left exactly as it is, and provider keys and the selection variables above are ignored. It refreshes the runtime files and, without DATRIS_NO_START=1, pulls the images and recreates the containers. When the datris CLI is installed it first runs datris doctor --pre-upgrade and stops on an error-level finding (DATRIS_SKIP_DOCTOR=1 bypasses it). See Upgrading.
A fresh run that stops with an error before it finishes writing .env removes that partial file and prints Install stopped before finishing — removed the partial, so the next run is a fresh install again and reads the corrected variables. A .env that existed before the run is never removed.
A second install on the same Docker host
Every Datris container has a fixed name (datris, mcp-server, vault, postgres and so on). Before it pulls anything, the installer checks for containers with those names that belong to a different Compose project, including stopped ones. If it finds any, it lists them and stops with container name conflict — resolve the above and re-run. Either install into the existing directory (an upgrade), or remove the old installation first with docker compose --profile "*" down in its directory. Plain down keeps named data volumes; down -v deletes them. This check is skipped under DATRIS_NO_START=1.
An agent must ask the user before removing an existing installation. Volume names come from the install directory’s name, so reinstalling into a directory with the same name (after a plain down) reuses the earlier Vault volume: the earlier AI settings are kept and newly exported provider keys are not seeded. Change them from the Configuration tab in the UI.
Adding vector stores
pgvector comes with the bundled Postgres and needs nothing else. For a bundled Qdrant, Weaviate or Chroma, name it inDATRIS_PROFILES; for a store you already run, set its _HOST variable. Both are written to .env on a run without a terminal. Milvus is external only. To add a store after the install, see Installation.
Single-file Compose alternative
A single self-contained Compose file with the init scripts and config inlined. It needs Docker Compose 2.23 or later and has no prompts at all, so it needs no detaching:.env next to the file instead; Compose reads it automatically. This path does not write an AI_PROVIDER pin. When several provider keys are present and AI_PROVIDER is unset, first-boot seeding picks OpenAI, so set AI_PROVIDER=anthropic or AI_PROVIDER=openai to choose. With OPENAI_API_KEY set, the file uses OpenAI embeddings; add TEI_ENABLED=0 to skip the bundled embedding server and its model download. See Installation for the full description.
Check that it is up
The installer’s exit code does not prove the stack is up. After starting the containers it polls for up to five minutes, prints a warning if the server has not answered, and exits 0 either way. Poll the two public endpoints yourself. Neither needs an API key.GET /api/v1/versionreturns the server version and settings such asuseApiKeys.GET /api/v1/health/servicesreturns astatusfor each store. A store you chose not to install reportsnot_configured; one that is configured but unreachable reportsdownwith a message.docker compose psin the install directory (add-f docker-compose.standalone.ymlfor the single file) shows each container’s state and health.
datris CLI (pip install datris-mcp-server or brew install datris/tap/datris) and run datris doctor from the install directory. It checks Vault, the AI slots, disk, data volumes, the .env and whether the MCP server answers. Exit codes: 0 ok, 1 warnings, 2 errors, 3 server unreachable. When API keys are on, set DATRIS_API_KEY first.
Connect the MCP server
The stack runs the MCP server in themcp-server container, serving SSE at http://localhost:3000/sse. Most MCP clients connect through the mcp-remote bridge (needs Node.js):
USE_API_KEYS=false), so no key is needed. When they are on, append "--header", "x-api-key:<your-key>" to args. Issue keys from Configuration → API-Keys in the UI.
To run the server over stdio instead, use the PyPI package datris-mcp-server (needs uv):
"DATRIS_API_KEY": "<your-key>" to env.
The mcp-server container runs the Docker image datrisai/datris-mcp-server. To run that image on its own against a Datris server, set DATRIS_API_URL; the image starts the SSE transport on port 3000.
Client-specific steps are in Configuring Claude and Configuring OpenClaw. Transports, environment variables and authentication are in MCP Server.
Install the skill
Thedatris-platform skill tells a coding agent when and how to use Datris during project work. Copy it into the project’s skills folder:
