# Requirements

> What a self-hosted Nodaro needs: Docker 24+ with Compose v2, a Supabase database, S3-compatible storage, ports and a provider key or a Nodaro Cloud connection.

Source: https://nodaro.ai/docs/self-hosting/requirements

A self-hosted Nodaro has five **requirements**: Docker, a database with sign-in, S3-compatible object storage, Redis, and at least one model provider. The community compose stack bundles the database, the storage and Redis, so on a single server you only need Docker and a model provider. Everything else on this page is optional or for production.

## What you need

| Requirement | Bundled in the compose stack | Or bring your own |
| --- | --- | --- |
| **Docker 24+** and **Docker Compose v2** | — | Required. Call it as `docker compose`, not `docker-compose`. |
| **Database and sign-in** | Supabase Postgres, GoTrue and PostgREST. Migrations apply on boot. Sign-up with email and password. | A managed Supabase project. The free tier is enough. You need its project URL, service-role key and anon key, and you apply the migrations yourself. |
| **Object storage** | MinIO, with the media on your disk | Any S3-compatible store. Tested: Cloudflare R2 (recommended, no egress fees), AWS S3, MinIO and Backblaze B2. |
| **Queues** | Redis 7 | Your own Redis, including a cluster or Sentinel endpoint |
| **A model provider** | — | At least one provider key, or a Nodaro Cloud connection |

Media must be readable by your users' browsers without a sign-in, because Nodaro hands public media URLs to the browser. The bundled MinIO does this through the app's own address, under `/storage/`. With your own bucket, see [Configure object storage](https://nodaro.ai/docs/self-hosting/install#4-configure-object-storage).

## Model providers

Nodes that call an AI model need a provider. Without one, the install starts and the demo opens, but no model node can run. Add at least one of these keys, on the `/setup` page or in `.env`:

| Variable | What it gives you |
| --- | --- |
| `KIE_API_KEY` | The broadest model coverage: image, video, audio and text models |
| `REPLICATE_API_TOKEN` | An alternative provider with its own catalog |
| `ANTHROPIC_API_KEY` | Claude models for the text nodes |
| `ELEVENLABS_API_KEY` | Voice features: text to speech, dubbing, voice changer and forced alignment |
| `FAL_KEY` | Optional. Models such as [Sync Lipsync v3](https://nodaro.ai/docs/models/video/sync-lipsync-v3). Without it, those models are unavailable and the rest of the app is unaffected. |

Instead of keys, you can connect the install to a Nodaro Cloud account: see [Connect to Nodaro Cloud](https://nodaro.ai/docs/self-hosting/cloud-connect). The full list of keys, including the ones used by specific nodes, is in [Provider keys](https://nodaro.ai/docs/self-hosting/provider-keys).

## Optional

- **Node.js 22 or later**, to run the API or the workers outside Docker, for development. The command-line probe and the key generator in `tools/` also run with Node.js.
- **A domain name and a TLS certificate**, for production. See [Reverse proxy and HTTPS](https://nodaro.ai/docs/self-hosting/reverse-proxy).

## Ports

| Port | What uses it | Published by the compose file |
| --- | --- | --- |
| `3000` | The app: editor, API, media and sign-in, all on one origin | Yes |
| `9001` | The MinIO console, for troubleshooting | Yes, on `127.0.0.1` only |
| `80` and `443` | Your reverse proxy, for HTTPS | Not by Nodaro |
| `9000` | The API inside the container. MCP clients must reach it directly. | No. See [MCP](https://nodaro.ai/docs/self-hosting/mcp). |

Redis and the database are internal to the compose network and never use a port on your machine. If `3000` or `9001` is taken, change the host side of that mapping in `docker-compose.community.yml`.

## Disk

- **The image.** The first boot downloads about 2.4 GB.
- **The volumes.** `db-data` holds the database, `minio-data` the media, `redis-data` the queues and `app-data` the instance encryption key. The media volume grows with every result, because Nodaro never deletes stored media by itself. Add a lifecycle rule to your bucket if you want old media to expire. See [Scaling](https://nodaro.ai/docs/self-hosting/scaling#storage-lifecycle).

## Machine size

The default layout runs everything in one container, which is fine for up to about 5 active users. Rendering is the heaviest work: the render worker runs a headless Chrome and is limited by CPU, so plan for one or two render workers per machine. For more users, split the workers over several containers. See [Scaling](https://nodaro.ai/docs/self-hosting/scaling).

The app image has builds for `amd64` and `arm64` machines.

## Windows

On Windows, run the backup and restore scripts from **Git Bash**, the shell that Git for Windows installs, not from PowerShell or WSL. See [Backups and restore](https://nodaro.ai/docs/self-hosting/backups).

## Frequently asked questions

### Which Docker version does self-hosted Nodaro need?

Docker 24 or later with Docker Compose v2, which you call as docker compose, not docker-compose.

### Do I need a Supabase account to self-host Nodaro?

No. The community compose stack bundles Supabase Postgres, GoTrue and PostgREST and applies the migrations for you. A managed Supabase project is an option, not a requirement.

### Which object storage works with Nodaro?

The bundled MinIO, or any S3-compatible store. Cloudflare R2, AWS S3, MinIO and Backblaze B2 are tested, and Cloudflare R2 is recommended because it has no egress fees.

### Does the Nodaro image run on ARM servers?

Yes. The app image has an arm64 build as well as an amd64 build.

### How many users can one container serve?

The single-container layout is fine for up to about 5 active users. Beyond that, split the workers into separate containers.
