Free & Open Source

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.

bash
curl -fsSL https://ottohome.ai/install.sh | sudo bash

That's it. Once the installer finishes, Otto is available at https://otto.local (or the IP printed at the end).

What the installer does

1

Detects OS & architecture

Supports Debian/Ubuntu/Raspberry Pi OS on arm64 and x86_64. Exits cleanly with a message on unsupported systems.
2

Installs Docker (if needed)

Uses the official Docker convenience script. Skipped if Docker is already installed.
3

Creates otto system user & directories

Installs to /opt/otto. Creates data/ssl, data/hub, data/uploads, data/backups, data/logs.
4

Generates secrets & .env

Auto-generates JWT_SECRET, DB_PASSWORD, and MINIO_ROOT_PASSWORD using openssl rand.
5

Generates a self-signed SSL certificate

10-year RSA 4096 certificate for otto.local. Used by Nginx for HTTPS.
6

Pulls Docker images & starts services

Runs docker compose -f docker-compose.prod.yml up -d and waits for the health check to pass before exiting.
7

Installs a systemd service

Otto starts automatically on boot via 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.

1

Enable WSL2

Open PowerShell as Administrator and run:
powershell
wsl --install
Restart your PC when prompted.
2

Install Ubuntu from the Microsoft Store

Open the Microsoft Store, search for Ubuntu 24.04 LTS, and install it. Launch Ubuntu once to create your UNIX username and password.
3

Run the Otto installer inside Ubuntu

In your Ubuntu terminal:
bash
curl -fsSL https://ottohome.ai/install.sh | sudo bash
4

Access Otto

Once installed, Otto is available at 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.

1

Clone the repository

bash
git clone https://github.com/OttoHomeAI/otto.git
cd otto
2

Create your .env file

Copy the template and fill in your secrets:
bash
cp .env.example .env
nano .env
At minimum you must set DB_PASSWORD, MINIO_ROOT_PASSWORD, JWT_SECRET, and HUB_HOST.
3

Generate a self-signed SSL certificate

bash
bash scripts/generate-ssl-cert.sh
This writes data/ssl/otto.crt and data/ssl/otto.key. Replace with a trusted cert later if desired.
4

Pull images & start the stack

bash
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -d
5

Verify health

bash
docker compose -f docker-compose.prod.yml ps
curl -k https://localhost/api/health
All services should show healthy. 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.

Network topology
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.