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:
Access the UI at http://localhost:5005
Mounting Your Project
Option 1: Volume Mount (Recommended)
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
Variable Required Description NAO_DEFAULT_PROJECT_PATHYes Path to your nao project (default: /app/example) OPENAI_API_KEYNo* OpenAI API key ANTHROPIC_API_KEYNo* Anthropic API key BETTER_AUTH_SECRETNo Secret key for authentication DB_URINo PostgreSQL connection string (uses SQLite if not set) SLACK_BOT_TOKENNo Slack bot token for Slack integration SLACK_SIGNING_SECRETNo Slack 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
Troubleshooting
Container Won’t Start
Check logs:
Common issues:
Missing required environment variables
Invalid context path
Port already in use
Can’t Access UI
Verify container is running:
Check port mapping:
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