docker compose up -d brings up the API, the background worker, a Postgres database with pgvector preinstalled, and a daily backup service. No external services to wire up.
Already running Postgres or SQL Server you want Ekso to share? Use Docker - bring your own database instead — same code, different install path.
Prerequisites
- Docker Engine 20+ on Linux, Docker Desktop on macOS or Windows
- ~2 GB free disk for first-time image pulls
- A free license. Fetch one at ekso.app/get-started — the site emails you the personalized download link in the same step. Free tier is 3 users, no credit card. Standard and Advanced are flat-rate annual with unlimited users.
- An install URL — the public hostname your users will reach Ekso at, e.g.
https://ekso.acme.com. Used as the OAuth audience and for outbound email links. Doesn’t need to resolve before install — you finalize it during the first run wizard.
Install
Want your AI to run this for you? See Agentic install — same bundle, paste-executed by Claude Code, Cursor, Codex, or ChatGPT in ~2 minutes. Best for evaluation; use the manual steps below for production deployments where you want full control.
-
Download the bundle from the link in your welcome email (
ekso-docker-stack.zip). -
Unzip somewhere persistent — for example
~/ekso/or/srv/ekso/. The zip contains:File Purpose docker-compose.ymlService definitions: app,worker,backup,postgresekso.jsonInstall configuration. JWT signing key is pre-baked per download. See the configuration reference. restore.sh/restore.ps1Recovery scripts for the bundled backupservice. See Data management.README.mdBundle-local quick reference -
Bring it up from the unzipped directory:
On first run, Compose pulls
eksoapp/appandeksoapp/workerfrom Docker Hub, starts apostgrescontainer with pgvector, and the API auto-applies the database schema. Allow 30–60 seconds for everything to settle. -
Open the install URL to land in the first run wizard:
What’s running
Four containers come up:| Service | Image | Role |
|---|---|---|
app | eksoapp/app | REST API + UI on port 6050 |
worker | eksoapp/worker | Background jobs — email, ticketing, vector indexing |
postgres | pgvector/pgvector:pg18 | OLTP + reporting database with pgvector preinstalled |
backup | postgres:18-alpine | Daily snapshots of the database and uploaded files |
docker-compose.yml:
| Folder | What’s in it |
|---|---|
./data/postgres/ | PostgreSQL database files |
./data/storage/ | Uploaded attachments |
./backups/ | Daily snapshots, retained for 14 days |
docker compose down -v reassurance — see Data management.
The bundle is multi-arch — same compose works on
linux/amd64 and linux/arm64 (Apple Silicon, Graviton, etc.). Docker pulls the right variant automatically.Pointing it at a real domain
For anything beyond local evaluation, run Ekso behind a reverse proxy that terminates TLS — Traefik, Caddy, nginx, your existing Cloudflare tunnel. Forward toapp:6050 and use that proxy’s URL as the public URL during the first run wizard.
The ekso.json config file ships with a JWT signing key already pre-baked — you don’t need to edit it for a full-stack install. See Configuration reference if you want to know what every field does or you need to override anything.
Updating
./data/ and ./backups/ folders are untouched. See Upgrading for release cadence, version pinning, and the rollback procedure.
Tearing it down
-v to delete — your database, attachments, and backups all live in the ./data/ and ./backups/ folders next to docker-compose.yml. To genuinely delete data, you’d rm -rf ./data at the OS level. See Data management.