Running on your own machine instead? Use Docker - full stack for the bundled Postgres path or Docker - bring your own database if you already have a Postgres / SQL Server you want Ekso to share. The Render path is a separate target — same code, different operational shape.
Why this differs from the Docker bundles
The Docker bundles mount a shared host folder for uploaded attachments — theapp and worker containers both read and write the same directory. Render’s persistent disks are bound to a single service, so that pattern doesn’t work there.
This install path uses Ekso’s S3 storage backend instead: attachments live in your bucket, the app and worker services read and write it independently, and durability is delegated to your bucket provider’s versioning and lifecycle rules. The trade-off is one extra moving part (the bucket) for the cloud-platform shape that Render’s pricing model is built around.
Prerequisites
- A Render account with billing set up. The smallest viable shape is one Starter web service + one Starter worker + Basic-1gb Postgres — roughly $37–43/month at current pricing (table below).
- A GitHub account to push
render.yamlto a repo Render can read. - An S3-compatible bucket with an access key. Cloudflare R2 is the recommended default — zero egress fees, S3-compatible, and what
render.yamldefaults to. AWS S3, Backblaze B2, and MinIO all work too. See bucket setup below. - A free Ekso license. Fetch one at ekso.app/get-started. Free tier is 3 users, no credit card.
Install
Two ways to start. Both produce the same Render Blueprint and end at the same place — pick whichever fits your situation.| Path | When to pick it |
|---|---|
| Automatic | One-click via Render’s Deploy button. Fastest path; Render reads the Blueprint from Ekso’s public repo. Best for evaluation and quick spin-ups. |
| Manual | Download the Blueprint and push it to your own GitHub repo. You own the YAML — Ekso’s future updates don’t reach your install unless you re-download. Best for production deploys you’ll manage long-term. |
Automatic
- Click the button above. Render takes you to its Blueprint preview screen, with the source set to
EksoApp/Deploy-to-Render(the public canonical mirror ofrender.yaml). - Sign in to Render if you aren’t already, then approve.
- Continue with the shared steps below.
Heads-up: when you use the automatic path, your install tracks Ekso’s public Blueprint. If we update
render.yaml (e.g. to bump a Postgres tier or pin a new image version), Render will sync the change on your next redeploy. That’s usually a feature (security patches, plan-name fixes — like the starter → basic-1gb rename Render did in late 2025), but if you’d rather pin, use the manual path instead.Manual
-
Download
ekso-render.zip. It contains:File Purpose render.yamlThe Blueprint: Postgres + web + worker + env-var config README.mdBundle-local quick reference (frozen at download time) -
Push
render.yamlto a GitHub repo you own: - In Render: New + → Blueprint → connect the repo from step 2.
- Continue with the shared steps below.
After Render connects
Both paths converge here.-
No prompts to fill. The Blueprint declares no
sync: falseenv vars —Secrets__JwtKeyandSecrets__EncryptionKeyauto-mint at first deploy viagenerateValue: true, andDatabase__TransactConnection/Database__MartConnectionare wired from the Postgres resource viafromDatabase. Click Apply Blueprint and Render goes straight to provisioning. -
Wait ~2 minutes. Render provisions the database first (web + worker depend on it), then builds and starts both services in parallel. The Blueprint progress page shows resources moving from queued (⏳) to deployed (✓):

-
Open
https://<your-api>.onrender.com/startupto land in the first-run wizard. -
Configure storage and email post-install. Once you’re logged in as admin:
- Settings → System → Storage — pick S3-compatible, paste your bucket details. See Configure storage and email for provider-specific recipes (R2 is the recommended default — zero egress, S3-compatible).
- Settings → Mail → Outbound — pick Resend (paste API key) or SMTP (host + credentials + from-address). Required before any email-dependent flow (password reset, two-factor login, new-user invitations) will succeed.
Secrets__EncryptionKey, so they never appear in the Render dashboard environment panel.
What’s running
Three Render resources come up:| Resource | Type | Role |
|---|---|---|
ekso-api | Web Service (Docker image eksoapp/app:latest) | REST API + UI behind Render’s HTTPS edge |
ekso-worker | Background Worker (Docker image eksoapp/worker:latest) | Background jobs — email, ticketing, vector indexing |
ekso-db | Managed Postgres 18 with pgvector | OLTP + reporting database |
Local and S3 storage backends, see Data management.
Bucket setup
Configure the bucket post-install via Settings → System → Storage in the running app. Provider-specific recipes (Cloudflare R2 — recommended default, AWS S3, Backblaze B2, MinIO) and the wrong-page warning for R2 token creation are in Configure storage and email.Recommended bucket settings (any provider)
- Versioning enabled — recovers a deleted or overwritten object. Equivalent to the Docker bundles’ 14-day storage snapshots, but at object granularity.
- Lifecycle rule auto-expiring non-current versions after 30 or 90 days so versioned data doesn’t accumulate forever.
Cost shape
Approximate, at the time of writing — check Render pricing for canonical numbers:| Resource | Plan | Approx / month |
|---|---|---|
| Postgres | Basic-1gb | $23.50 |
Web service (ekso-api) | Starter | $7 |
Background worker (ekso-worker) | Starter | $7 |
| Cloudflare R2 storage | First 10 GB free | $0–5 |
| Cloudflare R2 egress | Free, all tiers | $0 |
| Total | ~$37–43 |
Backups
Render Postgres takes daily automatic backups with point-in-time recovery on every paid plan — there’s nothing to wire up. Restore from the Render dashboard: Database → Recovery → pick a timestamp. Attachment durability is your bucket provider’s job. Configure versioning plus a lifecycle rule (above), and you’re covered for the same kinds of mistakes the Docker bundle’sbackup sidecar covers — accidental deletes, overwrites, ransomware. See Data management → S3 storage.
Pointing it at a real domain
Render assigns each service a<service>.onrender.com hostname with HTTPS terminated at the edge — fine for evaluation. For production, add a custom domain in the Render dashboard: Service → Settings → Custom Domain. Render auto-provisions a Let’s Encrypt certificate.
Use that domain as the public URL during the first-run wizard.
Updating
Render redeploys when you push to yourrender.yaml repo, or you can trigger a manual redeploy from the dashboard to pull the latest eksoapp/app:latest and eksoapp/worker:latest images.
To pin a specific version, change the image.url in render.yaml from docker.io/eksoapp/app:latest to docker.io/eksoapp/app:1.X and push. Same for eksoapp/worker.
Release cadence and version pinning: Upgrading.
Tearing it down
In the Render dashboard, deleting the Blueprint deletes all three resources (web, worker, database). Your bucket is in your own cloud account — Render can’t touch it; delete it yourself if you don’t need the data.See also
- Configure storage and email — admin-UI walkthrough for the S3 bucket + Resend/SMTP setup that lands post-install
- Configuration reference —
ekso.json(Secrets + Database) and the env-var override mechanisms Render uses - Data management → S3 storage — backup and restore patterns when attachments live in a bucket
- First-run wizard — what to expect at
/startupon first boot - Upgrading — release cadence, version pinning, rollback