Don’t want to read all this?
Just drop a link to https://xedant.com/agents/analytics/install.md or to 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 Analytics Agent is a self-hosted web application for fast data analysis and visualization. It deploys as a single Docker container (Docker is a tool that packages an app with everything it needs, so it runs the same way on any server), and keeps all permanent data in the /data volume. Python for Jupyter Notebooks is already built into the image. Reports are plain JSON files: version them in Git and move them by simply copying.
Minimum requirements
Any Linux host with Docker is enough. Everything else is already in the image:
- ASP.NET Core 9 runtime — the application’s web server;
- Python 3 + venv + pip — for running Jupyter Notebooks;
- sqlite3 and other file utilities for working with data.
No database server required: report documents live as files in the volume, and data sources (SQLite, PostgreSQL, ClickHouse) connect as needed through the interface.
Docker Compose
Create a compose.yml file and run docker compose up -d:
services:
analytics-agent:
image: xedant/analytics-agent:latest
container_name: analytics-agent
ports:
- "5010:80"
volumes:
- analytics-agent-data:/data
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://+:80
- ANALYTICS_DATA_PATH=/data
- ANALYTICS_SECRET_KEY=change-me-in-production
- ANALYTICS_ADMIN_LOGIN=admin
- ANALYTICS_ADMIN_PASSWORD={sha256-hash-of-your-password}
restart: unless-stopped
sysctls:
fs.inotify.max_user_watches: "524288"
fs.inotify.max_user_instances: "512"
volumes:
analytics-agent-data:
After launch, the interface is available on port 5010: http://localhost:5010.
The sysctls raise the inotify limits — the file watcher needs them to track changes in report files, so edits are picked up instantly, without a reload. Without these limits, the watcher may miss some changes when there are many documents.
Environment variables
- ANALYTICS_ADMIN_LOGIN — the administrator login (default
adminfrom appsettings). - ANALYTICS_ADMIN_PASSWORD — the SHA-256 hash of the password, not the password itself. Compute it with
echo -n "your-password" | sha256sum. On sign-in the app hashes the entered password and compares it with this value. - ANALYTICS_SECRET_KEY — the key that signs JWT tokens (default
default-secret-key-change-in-production— be sure to replace it in production). - ANALYTICS_DATA_PATH — the data folder (default
/project/data; inside the container,/data). - ANALYTICS_BRAND — brand and interface language:
xedant(English, the default) orpastukhov(Russian). - ANALYTICS_LAKEHOUSE_PATH — the Lakehouse root folder (default
/lakehouse). - ANALYTICS_TEMPLATES_PATH and ANALYTICS_TEMPLATES_RU_PATH — the English and Russian versions of the analysis template library (defaults:
templatesandtemplates_runext to the project; change them only if you move the library). - ANALYTICS_BASE_PATH — when the app lives not at the domain root but in a subfolder (for example,
/analytics): a path with a leading slash and no trailing one. The same result can be achieved with a reverse proxy that passes the folder in theX-Forwarded-Prefixheader. - AGENT_API_URL and AGENT_API_KEY — the URL and API key of Xedant Agent for the AI features. Without them the AI buttons are hidden; everything else works.
Without ANALYTICS_ADMIN_LOGIN and ANALYTICS_ADMIN_PASSWORD set, signing in to the app is impossible. The JWT token lives 90 days (129,600 minutes); the session, 1 hour.
Data storage
All permanent data lives in the /data volume and survives container recreation. The volume is mandatory — without it you will lose your reports and environment settings on the very first docker compose down.
/data/documents/— report documents as JSON files;/data/alerting/— alerting settings: rules, contact points, silences, history;/data/requirements.txt— Python dependencies for Jupyter Notebooks: seeded on first launch, and you can add your own libraries to it;ANALYTICS_LAKEHOUSE_PATH— Lakehouse data files: Parquet, SQLite, Markdown.
First sign-in
Use the login and password set by the ANALYTICS_ADMIN_LOGIN and ANALYTICS_ADMIN_PASSWORD variables (the variable holds the hash; at sign-in you enter the password itself). After signing in you can immediately change the interface language and theme. The home screen shows the “New document” button and the report catalog.
Setup after launch
Data sources — SQLite, PostgreSQL and ClickHouse — are connected in the “Data Sources” section of the web interface: creating, connection checks, schema auto-detection. Details in the Data Sources section.
AI features are enabled with the AGENT_API_URL and AGENT_API_KEY variables: the buttons for adding blocks in plain language and “Fix with AI” appear, plus the “Use this template” button in the analysis template library. The list of AI models comes from the data/models.txt file, and model colors come from Xedant Agent. Details in the agent in the report section.
Docker CLI with a .env file
You can also run Analytics Agent without compose — with a docker run command, keeping the environment variables in a .env file:
# .env
ASPNETCORE_ENVIRONMENT=Production
ASPNETCORE_URLS=http://+:80
ANALYTICS_DATA_PATH=/data
ANALYTICS_SECRET_KEY=a-long-random-string
ANALYTICS_ADMIN_LOGIN=admin
ANALYTICS_ADMIN_PASSWORD=sha256-hash-of-the-password
# optional: AI features via Xedant Agent
# AGENT_API_URL=
# AGENT_API_KEY=
docker run -d \
--name analytics-agent \
--env-file .env \
-p 5010:80 \
-v analytics-agent-data:/data \
--sysctl fs.inotify.max_user_watches=524288 \
--sysctl fs.inotify.max_user_instances=512 \
--restart unless-stopped \
xedant/analytics-agent: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 ANALYTICS_BRAND=xedant.