Skip to main content

Self-host Nora on your own infrastructure

Run Nora on your own infrastructure with the one-line installer or Docker Compose. Covers system requirements, install paths, and opening the dashboard.
Nora is self-hosted by design. You run the full stack — Nginx, Next.js frontends, Express API, PostgreSQL, and Redis — on infrastructure you control. This page covers system requirements, the two install paths, and how to reach the dashboard once the stack is running.

System requirements

Before you install, make sure your host meets the following requirements.
RequirementDetails
Operating systemmacOS 12+, Linux (Ubuntu 20.04+, Debian 11+, Fedora 38+), or Windows 10+ with WSL2
PermissionsAdmin or sudo access for initial setup
DockerDocker Engine with Compose v2+ (the installer can install Docker if it is missing)
GitGit (the installer can install Git if it is missing)
OpenSSLOpenSSL (used to generate secrets; the installer can install it if missing)
The setup script checks for Docker, Docker Compose, Git, and OpenSSL and installs any that are missing before proceeding.
The installer script is the fastest path to a running Nora instance. It handles dependency checks, secret generation, access mode configuration, optional admin account creation, local port selection, and stack startup in one interactive pass.
1

Run the installer

Open a terminal and run the command for your platform.
curl -fsSL https://raw.githubusercontent.com/solomon2773/nora/master/setup.sh | bash
2

Follow the interactive prompts

The installer walks you through each configuration decision in order:
  1. Verify or install Docker, Docker Compose, Git, and OpenSSL
  2. Clone the repository (if running via the curl pipe)
  3. Generate or preserve secrets for JWTs, AES encryption, managed backups, Agent Hub keys, and the database
  4. Choose platform mode: self-hosted (operator-defined resource limits) or PaaS (Stripe billing)
  5. Choose whether to keep the GA Docker backend enabled. Kubernetes clusters are registered after setup in Admin -> Kubernetes. Proxmox is planned but release-blocked in the current release, so setup does not enable it.
  6. Choose access mode: local only (http://localhost:8080), public domain behind a proxy, or public domain with TLS at Nginx
  7. Optionally create a bootstrap admin account
  8. Start the stack; after login, add your LLM provider key in Settings
When the installer finishes, it writes .env and starts the stack with docker compose up -d.
In local mode, setup checks host ports before startup. If 8080 is busy, it offers a free web port such as 8081 and updates NEXTAUTH_URL. If 127.0.0.1:4100 is busy, it offers a free backend API port and writes BACKEND_API_PORT.
3

Open the dashboard

The installer prints the base URL it configured. For local mode, the default is:
http://localhost:8080
If setup selected a different port, use the printed URL instead. If you skipped the bootstrap admin account, go to /signup on that origin to create your operator account.

Reconfigure vs clean reinstall

If you run setup again from an existing checkout, it asks which maintenance mode you want:
ModeWhat it preservesWhen to use it
Update code only.env, Docker volumes, and provisioned agentsPull the latest Nora code without changing local configuration
Reconfigure installDocker volumes and provisioned agentsChange limits, access mode, enabled runtimes, or ports while keeping local data
Clean reinstallNothing local; compose volumes and local Nora agent containers are removedStart over with a brand-new local database
Reconfigure mode intentionally preserves the existing DB_PASSWORD from .env because the Postgres Docker volume is already initialized with that password. If you manually replace .env with a different DB_PASSWORD while keeping volumes, the backend cannot sign up or log in users until the password is restored or the volume is recreated.

Manual setup

Use manual setup when you want full control over every configuration value before the stack starts.
1

Clone the repository

git clone https://github.com/solomon2773/nora.git
cd nora
2

Run the setup script from inside the repo

Running bash setup.sh from inside a cloned repo skips the clone step and takes you through the same interactive configuration flow as the one-line installer.
bash setup.sh
If you prefer to configure everything by hand, copy the example environment file instead and edit it directly:
cp .env.example .env
3

Start the stack

Once .env is configured, start all services in the background:
docker compose up -d
Docker Compose pulls and starts all Nora services: the reverse proxy, frontend dashboards, backend API, database, and queue.
Do not start the stack with placeholder values for JWT_SECRET or ENCRYPTION_KEY. Generate each with openssl rand -hex 32 before running docker compose up -d.
4

Open the dashboard

Once the stack is up, open your browser to http://localhost:8080. Create your operator account at /signup if you did not pre-seed a bootstrap admin.

Kubernetes (Helm)

Run Nora itself on a Kubernetes cluster with the official chart in infra/helm/nora. The chart deploys the full control plane (nginx edge, the three frontends, backend API, provisioner and backup workers) with in-chart PostgreSQL and Redis by default, or external data stores via values.
git clone https://github.com/solomon2773/nora.git && cd nora
helm install nora ./infra/helm/nora \
  --namespace nora --create-namespace \
  --set secrets.jwtSecret="$(openssl rand -hex 32)" \
  --set secrets.encryptionKey="$(openssl rand -hex 32)" \
  --set secrets.backupEncryptionKey="$(openssl rand -hex 32)" \
  --set secrets.apiKeyHashSecret="$(openssl rand -hex 32)" \
  --set secrets.dbPassword="$(openssl rand -hex 24)"
kubectl -n nora port-forward svc/nora-nginx 8080:80
The chart refuses to install without real secrets — there are no insecure defaults. For a public deployment set publicUrl, enable ingress.*, and terminate TLS at your Ingress controller.
A cluster-hosted control plane deploys agents to Kubernetes targets only (ENABLED_BACKENDS=k8s): pods have no Docker socket, so the Docker deploy target is unavailable. Register agent clusters under Admin → Kubernetes and mount their kubeconfigs with kubeconfigs.existingSecret. In-place release upgrades from the Admin UI are a Docker Compose feature — upgrade with helm upgrade instead.
See the chart README for all values, design notes, and the local Kind smoke test.

Accessing the dashboard

After installation, the following URLs are available in local mode. Public-domain mode uses the same paths on your configured origin.
URLWhat it opens
http://localhost:8080Marketing and entry page
http://localhost:8080/loginLog in to your operator account
http://localhost:8080/signupCreate a new operator account
http://localhost:8080/app/dashboardSystem overview and agent status
http://localhost:8080/app/deployDeploy your first agent runtime
If you configured a public domain (for example https://app.example.com), replace http://localhost:8080 with your domain in all of the paths above.
Nora dashboard immediately after the stack comes up

What happens next

Once you can reach the dashboard, the next steps are:
  1. Go to Settings and add an LLM provider key (Anthropic, OpenAI, Google, or another supported provider).
  2. Go to Deploy, name your agent, choose a runtime mode, set resource limits, and click Confirm & Deploy Agent.
  3. Open the agent detail page to verify it is running, test Chat, inspect Logs, and open Terminal.
Settings — LLM provider keys section with masked entries See the quick start for a full walkthrough of the first 15 minutes with Nora.

Useful Docker Compose commands

# Start all services in the background
docker compose up -d

# Stream logs from the backend API
docker compose logs -f backend-api

# Rebuild and restart a single service after a change
docker compose up -d --build backend-api

# Stop everything
docker compose down