Otto Server
A fully self-hosted smart home platform delivered as a Docker Compose stack. Runs on a Raspberry Pi, any Linux server, or Windows via WSL2 โ no cloud subscription required.
Requirements
Otto runs as a Docker Compose stack and is intentionally lightweight.
Minimum Hardware
- CPU4-core ARM64 or x86_64 (e.g. Raspberry Pi 4/5)
- RAM2 GB (4 GB recommended)
- Storage10 GB free (SSD strongly recommended)
- NetworkWired Ethernet recommended
Supported Platforms
- ๐ง Debian 11 / 12
- ๐ง Ubuntu 20.04 / 22.04 / 24.04 LTS
- ๐ Raspberry Pi OS 64-bit (Bookworm)
- ๐ช Windows 10/11 via WSL2
- ๐ณ Any Linux with Docker 24+ already installed
Linux / Raspberry Pi
One command installs Docker (if missing), creates the otto system user, generates secrets, sets up SSL, and starts all services.
curl -fsSL https://ottohome.ai/install.sh | sudo bashThat's it. Once the installer finishes, Otto is available at https://otto.local (or the IP printed at the end).
What the installer does
Detects OS & architecture
arm64 and x86_64. Exits cleanly with a message on unsupported systems.Installs Docker (if needed)
Creates otto system user & directories
/opt/otto. Creates data/ssl, data/hub, data/uploads, data/backups, data/logs.Generates secrets & .env
JWT_SECRET, DB_PASSWORD, and MINIO_ROOT_PASSWORD using openssl rand.Generates a self-signed SSL certificate
otto.local. Used by Nginx for HTTPS.Pulls Docker images & starts services
docker compose -f docker-compose.prod.yml up -d and waits for the health check to pass before exiting.Installs a systemd service
systemctl enable otto.Windows (WSL2)
Otto runs inside WSL2 (Windows Subsystem for Linux). You get a full Linux environment with Docker directly on Windows โ no virtual machine needed.
Enable WSL2
wsl --installInstall Ubuntu from the Microsoft Store
Run the Otto installer inside Ubuntu
curl -fsSL https://ottohome.ai/install.sh | sudo bashAccess Otto
https://localhost from your Windows browser (WSL2 bridges ports automatically).Note: On Windows, Otto stops when WSL2 is shut down. For a always-on installation use a dedicated Linux machine or Raspberry Pi.
Manual Installation
For advanced users who want full control โ bring your own Docker environment.
Clone the repository
git clone https://github.com/OttoHomeAI/otto.git
cd ottoCreate your .env file
cp .env.example .env
nano .envDB_PASSWORD, MINIO_ROOT_PASSWORD, JWT_SECRET, and HUB_HOST.Generate a self-signed SSL certificate
bash scripts/generate-ssl-cert.shdata/ssl/otto.crt and data/ssl/otto.key. Replace with a trusted cert later if desired.Pull images & start the stack
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -dVerify health
docker compose -f docker-compose.prod.yml ps
curl -k https://localhost/api/healthhealthy. The API returns { "ok": true }.What Gets Installed
Otto runs as five Docker containers in an isolated otto-network bridge network. Only Nginx exposes public ports.
Otto Server
:16161 (internal)The core hub โ handles device communication, automations, AI, API, and Docker-based addon management.
Otto UI
:80 (internal)The React-based dashboard SPA โ served as a static bundle from Nginx inside Docker.
Nginx
:80 ยท 443 (public)TLS termination and reverse proxy. Routes /api/* to Otto Server and /* to the UI.
PostgreSQL 16
:5432 (internal only)Primary relational database. Stores devices, automations, users, logs, and all configuration.
MinIO
:9000 (S3 API) ยท 9001 (console)S3-compatible object storage for uploads, camera recordings, backups, and media files.
Browser / App
โ HTTPS :443
โผ
โโโโโโโโโโโโโโโ
โ Nginx โ โ TLS termination
โโโโโโโโฌโโโโโโโ
โ internal (otto-network)
โโโโโโดโโโโโโโโโโโโโโ
โ โ
โผ โผ
/api/* /* (static)
Otto Server Otto UI
โ
โโโ PostgreSQL (data)
โโโ MinIO (files / recordings)Ready to get started?
One command gets you a fully working smart home hub in minutes.