datris doctor checks a running deployment for the failure modes that are cheap to detect and expensive to miss: a Vault token about to expire, an AI slot secret missing so the server won’t boot after an upgrade, an embedding model that was never pulled, a disk about to fill, data sitting on an anonymous Docker volume, a container still running with an old .env, a mixed-version stack. Every finding names the command that fixes it. Doctor never changes anything.
Where it runs
The server-side report is also available at
GET /api/v1/doctor for scripts. It is not a public endpoint — it names environment keys, Vault paths and model ids — so an API key with config:read is required when API keys are on.
The checks
Checks below the line run only from the CLI on the machine running Docker; the UI and MCP surfaces report them as not applicable. Secret values never appear in any output — only key names.
CLI
docker-compose.yml and .env, or point it there with --project-dir (and --compose-file for the standalone file). Unlike the other CLI commands, doctor talks to the server directly rather than through the MCP server — a dead MCP server is itself a finding. Set DATRIS_URL if the server is not on http://localhost:8080, and DATRIS_API_KEY when API keys are on.
Exit codes make it scriptable:
Skipped checks (Docker not on this machine, a service not running) never affect the exit code.
Before an upgrade
--remove-orphans could drop it. When nothing is at error level it prints the upgrade command. See Upgrading.
Report format
All surfaces produce the same JSON:status is one of ok, warn, error, skip; surface is server, host, or cli.
Turning off the boot-time lines
The startup subset only logs; it never blocks a start. To silence it, setDOCTOR_ONSTARTUP=false in the datris service environment. The on-demand surfaces are unaffected.