One-click self-hosted NOFX: an AI-powered trading terminal with multi-exchange support, strategy studio, and a conversational agent.
Template repository: render-examples/nofx-render-template
This template deploys NOFX on Render using the official GHCR images from upstream (nofx-backend + nofx-frontend). Same split as upstream docker-compose.prod.yml: private API service, public web UI, SQLite on a persistent disk. No custom Dockerfile in this repo: everything is defined in render.yaml.
Screenshots (from a Render deploy):
- Why deploy NOFX on Render
- What gets deployed
- Quickstart
- Configuration
- Cost breakdown
- Upgrading
- Troubleshooting
- Credits and license
- Official upstream images —
ghcr.io/nofxaios/nofx/nofx-backendandnofx-frontendat:latest(pin tags inrender.yamlfor production). - Blueprint-only deploy —
render.yamldefines services, disk, and secrets; no merge Dockerfile to maintain in this template repo. - Persistent SQLite — 5 GB disk on the backend service at
/app/data/data.db. - Matches upstream layout — Frontend nginx proxies
/api/to the privatenofxbackend on port 8080 (Render private network).
flowchart LR
user["Browser"] --> web["nofx-web (official frontend image)"]
web -->|"/api/ private network"| api["nofx (official backend image)"]
api --> db[("SQLite on disk")]
| Resource | Type | Plan | Purpose |
|---|---|---|---|
nofx |
Private service (image) | Starter | Go API + SQLite disk |
nofx-web |
Web (image) | Starter | React UI + nginx (public URL) |
nofx-data |
Disk 5 GB | — | SQLite at /app/data/data.db |
Region: Oregon (oregon).
Open the nofx-web service URL after deploy (not the private backend).
- Click Deploy to Render. GitHub forks this template into your account.
- Review auto-generated secrets on the
nofxservice:JWT_SECRET,DATA_ENCRYPTION_KEY. - Click Apply. First deploy typically takes 5–10 minutes.
- Open the
nofx-webURL. Create the single admin account on first visit if prompted. - In Config, add AI models and exchange keys, then create a trader or use the Agent tab.
None at Apply time. LLM and exchange keys are set in the UI after login.
| Env var | Purpose |
|---|---|
JWT_SECRET |
Session tokens |
DATA_ENCRYPTION_KEY |
Encrypts sensitive fields at rest |
| Env var | Value |
|---|---|
DB_TYPE |
sqlite |
DB_PATH |
/app/data/data.db |
TZ |
UTC |
TRANSPORT_ENCRYPTION |
false |
AI_MAX_TOKENS |
8000 |
| Resource | Plan | Approx. monthly (USD) |
|---|---|---|
Private service (nofx) |
Starter | ~$7 |
Web service (nofx-web) |
Starter | ~$7 |
| Disk | 5 GB | ~$5 |
| Total | ~$19 |
External LLM and exchange fees are billed by those providers.
- Check NoFxAiOS/nofx releases for new GHCR tags.
- Pin
image.urltags inrender.yamlin your fork (replace:latest). - Manual deploy on Render.
Registration shows "Server error"
Wait for cold start, then retry. Confirm GET /api/health on the nofx-web URL returns 200. If already initialized, use Login.
UI loads but API fails
Ensure the private backend service is named nofx (frontend image proxies to http://nofx:8080). Both services must be in the same Blueprint project.
Data lost after redeploy
Confirm the disk is attached to nofx at /app/data.
- Upstream: NoFxAiOS/nofx (AGPL-3.0)
- Template: render-examples/nofx-render-template (MIT wrapper — see LICENSE)



