Skip to main content
Deploy nao using Docker for easy setup and consistent environments.

View on Docker Hub

Official nao Docker image on Docker Hub

Image Details

  • Image: getnao/nao
  • Tags: latest (stable release) and commit-specific tags
  • Architecture: linux/amd64
  • Base: Python 3.12 (slim) with Node.js 24 and Bun
  • Port: 5005

Quick Start

Pull the image from Docker Hub:
docker pull getnao/nao:latest
Run with your project:
docker run -d \
  --name nao \
  -p 5005:5005 \
  -e NAO_DEFAULT_PROJECT_PATH=/app/project \
  -e OPENAI_API_KEY=sk-... \
  -v /path/to/your/project:/app/project \
  getnao/nao:latest
Or use the example project:
docker run -d \
  --name nao \
  -p 5005:5005 \
  -e NAO_DEFAULT_PROJECT_PATH=/app/example \
  -e OPENAI_API_KEY=sk-... \
  getnao/nao:latest
Access at: http://localhost:5005

Using Docker Compose

Create a docker-compose.yml file:
version: '3.8'

services:
  nao:
    image: getnao/nao:latest
    container_name: nao
    ports:
      - "5005:5005"
    environment:
      - NAO_DEFAULT_PROJECT_PATH=/app/project
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
    volumes:
      - ./my-nao-project:/app/project
    restart: unless-stopped
Start the service:
docker-compose up -d
Access the UI at http://localhost:5005

Mounting Your Project

Mount your nao project directory to make it available to the agent:
docker run -d \
  --name nao \
  -p 5005:5005 \
  -v /path/to/your/nao-project:/app/project \
  -e NAO_DEFAULT_PROJECT_PATH=/app/project \
  -e OPENAI_API_KEY=sk-... \
  getnao/nao:latest
The image includes an example project at /app/example that you can use for testing. Just set NAO_DEFAULT_PROJECT_PATH=/app/example (no volume mount needed).

Option 2: Build Custom Image

Create a custom image with your context baked in:
FROM getnao/nao:latest

# Copy your project
COPY ./my-nao-project /app/project

# Set environment
ENV NAO_DEFAULT_PROJECT_PATH=/app/project
Build and run:
docker build -t my-nao:latest .
docker run -d -p 5005:5005 -e OPENAI_API_KEY=sk-... my-nao:latest

Environment Variables

VariableRequiredDescription
NAO_DEFAULT_PROJECT_PATHYesPath to your nao project (default: /app/example)
OPENAI_API_KEYNo*OpenAI API key
ANTHROPIC_API_KEYNo*Anthropic API key
BETTER_AUTH_SECRETNoSecret key for authentication
DB_URINoPostgreSQL connection string (uses SQLite if not set)
SLACK_BOT_TOKENNoSlack bot token for Slack integration
SLACK_SIGNING_SECRETNoSlack signing secret
*At least one LLM API key is required to make AI queries.

Example with All Variables

docker run -d \
  --name nao \
  -p 5005:5005 \
  -e NAO_DEFAULT_PROJECT_PATH=/app/project \
  -e OPENAI_API_KEY=sk-... \
  -e ANTHROPIC_API_KEY=sk-... \
  -e BETTER_AUTH_SECRET=your-secret-key \
  -e DB_URI=postgresql://user:pass@host:5432/nao \
  -e SLACK_BOT_TOKEN=xoxb-... \
  -e SLACK_SIGNING_SECRET=... \
  -v /path/to/your/project:/app/project \
  getnao/nao:latest

Using an .env File

docker run -d \
  --name nao \
  -p 5005:5005 \
  --env-file .env \
  -v /path/to/your/project:/app/project \
  getnao/nao:latest

Database Options

SQLite (Default)

By default, nao uses SQLite for storing conversation history. No additional configuration needed:
docker run -d \
  --name nao \
  -p 5005:5005 \
  -e NAO_DEFAULT_PROJECT_PATH=/app/project \
  -e OPENAI_API_KEY=sk-... \
  -v /path/to/your/project:/app/project \
  getnao/nao:latest

PostgreSQL

For production use, configure PostgreSQL with the DB_URI environment variable:
docker run -d \
  --name nao \
  -p 5005:5005 \
  -e NAO_DEFAULT_PROJECT_PATH=/app/project \
  -e OPENAI_API_KEY=sk-... \
  -e DB_URI=postgresql://user:password@host:5432/nao \
  -v /path/to/your/project:/app/project \
  getnao/nao:latest

With External Database

Use PostgreSQL for conversation storage:
version: '3.8'

services:
  postgres:
    image: postgres:15
    environment:
      POSTGRES_DB: nao
      POSTGRES_USER: nao
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - postgres-data:/var/lib/postgresql/data
    restart: unless-stopped

  nao:
    image: getnao/nao:latest
    depends_on:
      - postgres
    ports:
      - "5005:5005"
    environment:
      - NAO_DEFAULT_PROJECT_PATH=/app/project
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - DB_URI=postgresql://nao:${POSTGRES_PASSWORD}@postgres:5432/nao
    volumes:
      - ./my-nao-project:/app/project
    restart: unless-stopped

volumes:
  postgres-data:
If DB_URI is not set, nao will use SQLite by default for storing conversation history.

Behind Reverse Proxy

Nginx

server {
    listen 80;
    server_name nao.yourdomain.com;

    location / {
        proxy_pass http://localhost:5005;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Traefik

services:
  nao:
    image: getnao/nao:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nao.rule=Host(`nao.yourdomain.com`)"
      - "traefik.http.routers.nao.entrypoints=websecure"
      - "traefik.http.routers.nao.tls.certresolver=myresolver"

Health Checks

Add health checks to your deployment:
services:
  nao:
    image: getnao/nao:latest
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:5005/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

Logs

View logs:
# Follow logs
docker logs nao -f

# Last 100 lines
docker logs nao --tail 100

# With timestamps
docker logs nao -t

Updates

Update to the latest version:
# Pull new image
docker pull getnao/nao:latest

# Stop and remove old container
docker stop nao
docker rm nao

# Start new container (reuse same docker run command)
docker run -d \
  --name nao \
  -p 5005:5005 \
  -v /path/to/your/project:/app/project \
  -e NAO_DEFAULT_PROJECT_PATH=/app/project \
  -e OPENAI_API_KEY=sk-... \
  getnao/nao:latest
Or with Docker Compose:
docker-compose pull
docker-compose up -d
Check the Docker Hub page for the latest releases and tags.

Troubleshooting

Container Won’t Start

Check logs:
docker logs nao
Common issues:
  • Missing required environment variables
  • Invalid context path
  • Port already in use

Can’t Access UI

Verify container is running:
docker ps | grep nao
Check port mapping:
docker port nao

Context Not Loading

Verify volume mount:
docker inspect nao | grep -A 10 Mounts
Check file permissions:
ls -la /path/to/your/project

What’s Next?

Configuration Guide

Learn about all configuration options