---
title: "Docker Setup"
id: "1706"
type: "page"
slug: "docker"
published_at: "2026-09-20T20:36:17+00:00"
modified_at: "2026-09-21T01:36:28+00:00"
url: "https://xedant.com/agents/multiagent/docker"
markdown_url: "https://xedant.com/agents/multiagent/docker.md"
excerpt: "Xedant MultiAgent is the central control panel for a fleet of AI workers. It runs…"
---

# Docker Setup

[https://xedant.com/agents/multiagent/docker.md](https://xedant.com/agents/multiagent/docker.md)

Don’t want to read all this? Just drop a link to [https://xedant.com/agents/multiagent/docker.md](https://xedant.com/agents/multiagent/docker.md)
 or to [https://xedant.com/llms.txt](https://xedant.com/llms.txt)
 into any AI chat (Claude, ChatGPT, etc.) and ask it to generate the config files and commands. It will read the docs, ask you a few questions about your setup, and hand you a ready-to-use configuration. Save time — let the model do the reading for you.

 You can also reach me on Telegram — I’m always glad to help. And that’s not just politeness — I genuinely enjoy talking to like-minded people, especially if you love coding as much as I do.

 Xedant MultiAgent is the central control panel for a fleet of AI workers. It runs as a single Docker container, and the servers it manages connect over SSH: MultiAgent installs Docker and everything else on them by itself. Nothing needs to be configured on those servers by hand. Each server’s apps are served from subfolders of one domain — for example, `https://your-domain/agent1/`, `https://your-domain/research/` — thanks to an Nginx container (`agents-nginx`) on the server itself: no separate domains, certificates or web servers per app (see [Nginx Routing](/agents/multiagent/docs/routes)
).

## Minimum Requirements

The MultiAgent container itself is light: by default it uses the built-in SQLite, and PostgreSQL can be attached optionally through an environment variable. Any Docker host with 1 GB of RAM is enough.

Each managed server needs:

- Linux (Ubuntu/Debian) with SSH access;
- root or sudo access — MultiAgent installs Docker and the dependencies itself;
- password or private PEM key authentication.

## Docker Compose

Create a `compose.yml` file and run `docker compose up -d`:

```
services:
  multiagent:
    image: xedant/multiagent:min-latest
    container_name: agents-multiagent
    ports:
      - "3990:80"
    volumes:
      - multiagent-data:/data
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - ASPNETCORE_URLS=http://+:80
      - MULTIAGENT_DATA=/data
# optional: own agent (Own Agent) and the machine API
# - AGENT_API_URL=https://agents.example.com/my-agent
# - AGENT_API_KEY=your-agent-key
# - MULTIAGENT_API_KEY=<sha256 hex of the same key>
# optional: analytics archive in ClickHouse
# - MULTIAGENT_CLICKHOUSE_URL=http://clickhouse:8123
    restart: unless-stopped

volumes:
  multiagent-data:
```

After the start, the interface is available on port `3990`: `http://localhost:3990`.

## Environment Variables

- **MULTIAGENT_DATABASE** — path to the SQLite file, or a PostgreSQL connection string. Default `/data/data.db`. If the string starts with `Host=` or `Server=`, PostgreSQL is used.
- **MULTIAGENT_DATA** — root of the persistent data (default `/data`): the database, encryption keys, license, tool templates.
- **MULTIAGENT_BRAND** — interface branding: `xedant` for the English version (the default in the image).
- **MULTIAGENT_BASE_PATH** — the subfolder MultiAgent lives in (for example, `/multiagent`) when the proxy above passes the path through unchanged. Only needed for subfolder hosting; leave empty to serve from the domain root. The second way is the `X-Forwarded-Prefix` header from the proxy, when the proxy manages the subfolder itself (see [Nginx Routing](/agents/multiagent/docs/routes) ).
- **AGENT_LICENSE** — license key, read by the same mechanism the agents use. A 30-day trial is already built into the image.
- **AGENT_API_URL** / **AGENT_API_KEY** — wiring up the own assistant (Own Agent): the base address of an external Xedant Agent and the key the agent accepts as `X-API-Key`.
- **MULTIAGENT_API_KEY** — key for the machine API `/api/agent/*` (Agent API): the lowercase SHA-256 fingerprint of the key.
- **AGENT_TOOLS** — folder of the tool template library. Default `/project/tools`; use `/data/tools` so the library survives container recreation.
- **AGENT_PRODUCTS** — folder of the product catalog (default `/project/products`): ready-made templates for Research, Analytics, Data, Proxy and MultiAgent itself, plus chatbots, Telegram, UI and CRM.
- **MULTIAGENT_ERROR_REPORTING** — sending errors to Sentry. Set `0` to disable.
- **ASPNETCORE_URLS** — the port inside the container (default `http://+:80`).
- **MULTIAGENT_CLICKHOUSE_URL** — optional ClickHouse address for the analytics archive (see [Analytics](/agents/multiagent/docs/analytics) ). When set, chat stats are appended to the archive once a minute, and a “Backfill ClickHouse Stats” button appears at the bottom of the report.

## Own Agent

MultiAgent can keep its own assistant — an external Xedant Agent attached with a pair of environment variables. Its interface is built into every page: a block in the sidebar, a global chat panel, a prompt queue and voice input. The setup is only the variables — no settings screen in the interface and nothing in the database:

- **AGENT_API_URL** / **AGENT_API_KEY** — the outbound direction (MultiAgent → agent): the built-in chat works through them (MultiAgent forwards requests to the agent and relays chat events). The key is attached only on the server and never reaches the browser;
- **MULTIAGENT_API_KEY** — the inbound direction (agent → MultiAgent): the key for the machine API `/api/agent/*`, through which the assistant manages servers, agents and tools.

The two directions work independently. When MultiAgent itself is deployed as a product, both variable pairs are filled in automatically (see [Products](/agents/multiagent/docs/products)
). Details are on the [Own Agent](/agents/multiagent/docs/own-agent)
 page.

## Data Storage

All persistent data lives in the `/data` volume and survives container recreation. The volume is mandatory — without it you lose the database, the encryption keys and the activated license on the first `docker compose down`.

- `/data/data.db` — the SQLite database (when PostgreSQL is not used);
- `/data/keys/` — the JWT encryption and signing key;
- `/data/auth/` — ASP.NET Data Protection keys;
- `/data/tools/` — tool templates (with `AGENT_TOOLS=/data/tools`);
- `/data/<brand>/license.txt` — the activated license.

## First Login

Unlike Xedant Agent, the login and password are not something you must set in environment variables upfront. The first user registers right in the web interface: open `http://localhost:3990` and click “Register” on the login page. Further accounts are created the same way — in the interface. (For automation, `MULTIAGENT_LOGIN` / `MULTIAGENT_PASSWORD` can provision the account at boot — that is what the Windows installer uses.) Authentication works through JWT tokens that last 90 days, so you will rarely need to sign in again.

## Adding the First Server

After logging in, add the first server: name, host, SSH port, user, and a password or private key. MultiAgent will check the connection, offer to install Docker and walk the server through the onboarding checks. Details are in the [Servers](/agents/multiagent/docs/servers)
 section.

## Windows Installation

MultiAgent installs on Windows with the `XedantMultiAgent-Setup-<version>.exe` setup wizard: the app runs locally at `http://localhost:3990` and connects to your remote Linux servers over SSH — no Docker, WSL or SSH tools needed on that computer. The data is stored in the `%LOCALAPPDATA%\Xedant\MultiAgent\data` folder (the SQLite database, keys, certificates, license); the .NET runtime is not required. Details are on the [Windows Installation](/agents/multiagent/docs/windows)
 page.

## Docker CLI with a .env File

You can also run MultiAgent without compose — with a `docker run` command, keeping the environment variables in a `.env` file:

```
# .env
ASPNETCORE_ENVIRONMENT=Production
ASPNETCORE_URLS=http://+:80
MULTIAGENT_DATA=/data
# optional: own agent (Own Agent) and the machine API
# AGENT_API_URL=https://agents.example.com/my-agent
# AGENT_API_KEY=your-agent-key
# MULTIAGENT_API_KEY=<sha256 hex of the same key>
# optional: product catalog
# AGENT_PRODUCTS=/data/products
# optional: subfolder hosting (when the proxy passes the path through unchanged)
# MULTIAGENT_BASE_PATH=/multiagent
# optional: PostgreSQL instead of the built-in SQLite
# MULTIAGENT_DATABASE=Host=postgres;Port=5432;User Id=multiagent;Password=secret;Database=multiagent;
# optional: analytics archive in ClickHouse
# MULTIAGENT_CLICKHOUSE_URL=http://clickhouse:8123
# optional: license key, if you have one
# AGENT_LICENSE=
```

```
docker run -d \
  --name agents-multiagent \
  --env-file .env \
  -p 3990:80 \
  -v multiagent-data:/data \
  --restart unless-stopped \
  xedant/multiagent:min-latest
```

The `--env-file` flag reads all the variables from the file. Individual values can be overridden with extra `-e` flags after it, for example `-e AGENT_LICENSE=your-key`.

[← Back to the MultiAgent section home](/agents/multiagent)
