1. Home
  2. Install
  3. Docker
Docker install guide · updated June 2026

Install Odysseus AI via Docker in five minutes.

The cleanest path for any host — Linux, macOS, Windows, or a NAS. This guide covers the four-step Docker Compose install, connecting to Ollama on the host via host.docker.internal, NVIDIA GPU passthrough, volume persistence, and every error you'll hit along the way.

Time · ~5 min Difficulty · intermediate Hosts · any Docker host Cost · free
Section I

What you need before running compose up.

The Docker install is the simplest path to Odysseus AI, but it has three real prerequisites. Get all three sorted before the install and the rest takes five minutes.

Docker Engine 24+ and Compose v2

On Linux, install Docker Engine and the Compose plugin. On macOS and Windows, Docker Desktop ships both. Verify both are present:

docker --version # 24.x or newer docker compose version # v2.x — note: space, not hyphen

If docker compose (with a space) is unknown but docker-compose works, you're on the legacy v1 binary. Upgrade — Odysseus AI's compose file uses v2 syntax for healthchecks and depends_on.

4 GB RAM dedicated to containers minimum

Odysseus AI itself runs comfortably in 1 GB. The headroom is for model loading — even quantized 7B models need ~5 GB of RAM at inference time. If you also run Ollama in Docker on the same host, double that estimate. On Docker Desktop, raise the memory limit in Settings → Resources before installing.

An accessible Ollama instance (or API keys)

Odysseus AI in Docker can talk to (a) Ollama on the host machine, (b) Ollama in a sibling container, or (c) cloud APIs like OpenAI and Anthropic. The simplest setup is option (a) — install Ollama natively on the host, then bridge from the container. The Ollama bridge section covers the exact configuration.

Section II

The four-step Docker install for Odysseus AI.

These commands are identical on Linux, macOS, and Windows. Open your terminal in a folder where you want the project to live.

I
Confirm Docker is running

If Docker Desktop, make sure the app is open and shows green. On Linux, the daemon should be active.

docker ps # should list containers (even if empty) docker info | head -20

If you see "Cannot connect to the Docker daemon", start the daemon (Linux: sudo systemctl start docker) or launch Docker Desktop.

II
Clone the official Odysseus AI repository

Always clone from pewdiepie-archdaemon/odysseus — the active official repo. Mirror and impostor repos exist; verify before running anything in production.

git clone https://github.com/pewdiepie-archdaemon/odysseus.git cd odysseus
III
Bring up the Odysseus AI stack

The official docker-compose.yml in the repo handles everything — image pull, network, volumes, healthcheck. The -d flag runs detached so your terminal stays free.

docker compose up -d # watch the logs to see the admin password and confirm startup docker compose logs -f odysseus

First boot pulls images (~600 MB) and may take 3–8 minutes on slower connections. Watch for the line "Uvicorn running on http://0.0.0.0:7000" — that's the signal Odysseus AI is ready.

IV
Find the admin password and open Odysseus AI

The admin password is printed in the container logs on first boot. Find it, save it somewhere safe, then open the browser.

docker compose logs odysseus | grep -i "password\|admin"
http://localhost:7000

Log in as admin using the password you just retrieved. The model dropdown will be empty — the next sections wire up Ollama and APIs.

Section III · tool

Generate your docker-compose.yml.

The official compose file works fine, but most users want to customize ports, volumes, GPU access, or the Ollama bridge. This generator outputs a clean, opinionated compose file tailored to your setup.

docker-compose.yml generator

Pick six options and copy a working compose file. All defaults are sensible — change only what you need.

Your docker-compose.yml

Save this as docker-compose.yml in the project folder, then run docker compose up -d.

Section IV

Connect Docker Odysseus AI to host Ollama.

This is the single most common Docker confusion. Inside a container, localhost refers to the container itself — not your host machine. You have to use the special Docker hostname that points back to the host.

On macOS and Windows: works out of the box

Docker Desktop ships with host.docker.internal pre-configured. Just use it as the host in your Ollama URL:

# In Odysseus AI Settings → Providers → OpenAI-compatible Base URL: http://host.docker.internal:11434/v1 API key: ollama

On Linux: you have to add the alias yourself

Linux Docker does not ship host.docker.internal. Without it, Docker Odysseus AI cannot reach the host's Ollama. Add the alias via extra_hosts in your compose file:

services: odysseus: extra_hosts: - "host.docker.internal:host-gateway"

The host-gateway magic value tells Docker to resolve to the host's bridge IP automatically. After adding, run docker compose up -d to recreate the container. Verify connectivity:

docker compose exec odysseus curl http://host.docker.internal:11434/api/tags

If you get JSON back listing your Ollama models, the bridge is working.

Sibling container option

If you'd rather run Ollama inside Docker too, the compose generator above includes that option. Both services join the same Docker network, and Odysseus AI talks to Ollama via its service name (ollama) instead of host.docker.internal. The trade-off: sibling Ollama can't share models with native Ollama on the host, so you'll re-pull each model.

Section V

NVIDIA GPU passthrough for Docker.

GPU acceleration in Docker requires one piece of software on the host: the NVIDIA Container Toolkit. After installation, any container can request GPU access via the standard --gpus flag or compose syntax.

Install the NVIDIA Container Toolkit (Linux host)

# Ubuntu / Debian — add the NVIDIA repo and install curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \ sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list sudo apt update sudo apt install -y nvidia-container-toolkit sudo systemctl restart docker

Verify the toolkit sees your GPU

docker run --rm --gpus all nvidia/cuda:12.3.0-base nvidia-smi

If you see your GPU listed, you're set. If not, check the NVIDIA driver version on the host (nvidia-smi directly) — the toolkit needs driver 525+ for CUDA 12.

Request the GPU in the Odysseus AI compose file

The compose generator above adds this automatically when you pick NVIDIA. The relevant snippet:

services: odysseus: deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu]

On macOS, GPU passthrough to Docker containers is not supported — Docker Desktop on Mac runs in a VM that doesn't expose the Metal GPU. Use native install (not Docker) for GPU acceleration on Apple Silicon. On Windows, GPU passthrough works via WSL2 — Docker Desktop with WSL2 backend.

Section VI · tool

Paste your docker logs, get the fix.

The diagnostic matches your error against 12 known Docker-specific Odysseus AI failure patterns and returns the exact command to fix it. Runs entirely in your browser.

Docker error diagnostic

Run docker compose logs odysseus, copy the failing lines, paste below, click match.

Diagnosis

Section VII

Volumes and data persistence.

Docker containers are ephemeral by design — every restart starts from a clean image. Your Odysseus AI chats, settings, uploaded files and API keys live in named volumes that survive container recreation. Get this wrong and you'll lose everything on the first docker compose down -v.

Named volumes (default and recommended)

The official compose file declares two named volumes: odysseus-data for the SQLite database and uploaded files, and odysseus-config for settings and API keys. Docker manages them in /var/lib/docker/volumes/ on Linux, or inside the Docker Desktop VM on macOS / Windows.

# list volumes docker volume ls | grep odysseus # inspect a volume's mount point docker volume inspect odysseus-data # back up a volume to a tarball docker run --rm -v odysseus-data:/data -v $(pwd):/backup \ alpine tar czf /backup/odysseus-backup.tar.gz -C /data .

Bind mounts (when you need filesystem access)

If you want to browse the data directly with your file manager, use a bind mount to a host directory instead. The compose generator above switches to this style when you pick "Bind mount". Trade-off: bind mounts can have permission issues on Linux if the container user UID doesn't match the host directory owner.

The fatal flag: don't use -v with down

docker compose down stops and removes containers but keeps volumes. docker compose down -v also deletes the volumes. The latter wipes your entire Odysseus AI workspace — chats, settings, files, everything. Only run it when you genuinely want to reset.

Section VIII

Deploy on Unraid, Synology, or TrueNAS.

The official Docker setup works on every common NAS platform. Below are platform-specific notes for the three most popular — what to do differently from a generic Linux host.

Unraid

community apps

Add a custom Docker container via the UI, or paste the official compose file into the Compose Manager plugin. Set the container path to /mnt/user/appdata/odysseus for native NVMe cache support.

Network type: bridge Path: /mnt/user/appdata/odysseus Port: 7000 → 7000

Synology DSM 7+

container manager

Use Container Manager (formerly Docker package). Import the compose file via Project → Create → upload docker-compose.yml. Synology assigns containers UID 1000 by default — set the same UID for bind mount directories.

Volume: /volume1/docker/odysseus Project type: docker-compose.yml

TrueNAS Scale

apps / k3s

TrueNAS Scale runs on k3s, not vanilla Docker. The simplest path is a custom app definition that wraps the compose file. Future versions of Scale have native compose support — check your current TrueNAS version's app catalogue.

Dataset: tank/apps/odysseus Storage class: ix-applications

Your Docker install is done when —

// landfall checklist

  • docker compose ps shows odysseus as healthy
  • http://localhost:7000 (or your custom port) opens the login page
  • You logged in as admin with the password from docker compose logs
  • Odysseus AI Settings → Providers shows your Ollama or API connection as green
  • At least one model appears in the chat dropdown
  • Your first test message gets a reply within 30 seconds
  • You ran docker volume ls and confirmed the named volumes exist
Section IX

Six Docker-specific errors and fixes.

These cover about 90% of failed Odysseus AI Docker installs. Match your output against the error message in each card.

Docker daemon not running

Cannot connect to the Docker daemon at unix:///var/run/docker.sock

The Docker daemon isn't running. On Linux, start it via systemd. On macOS or Windows, launch the Docker Desktop app.

# Linux sudo systemctl start docker sudo systemctl enable docker # auto-start at boot # Verify docker info

Permission denied on Docker socket

permission denied while trying to connect to the Docker daemon socket

Your user isn't in the docker group on Linux. Either add the user, or prefix every command with sudo (not recommended for daily use).

# add yourself to the docker group sudo usermod -aG docker $USER # log out and back in for it to take effect # then verify docker ps

GPU driver not selectable

could not select device driver "" with capabilities: [[gpu]]

NVIDIA Container Toolkit isn't installed on the Docker host. Without it, Docker can't talk to the NVIDIA driver no matter how new the GPU is.

sudo apt install -y nvidia-container-toolkit sudo systemctl restart docker # verify docker run --rm --gpus all nvidia/cuda:12.3.0-base nvidia-smi

Port already allocated

Bind for 0.0.0.0:7000 failed: port is already allocated

Another process — often a previous Odysseus AI container that didn't stop cleanly — is holding the port. Find it and free it, or change the port mapping in the compose file.

# find what's holding port 7000 sudo lsof -i :7000 # Linux/macOS netstat -ano | findstr :7000 # Windows # or just change the host port in compose ports: - "7860:7000" # host:container

Container OOMKilled

container exited with code 137 / OOMKilled: true

The container hit its memory limit. Either no limit was set and the host ran out, or you set a limit that's too low for the model in use.

# inspect what the container saw before death docker inspect odysseus --format='{{.State}}' # raise Docker Desktop memory: # Settings → Resources → Memory → 12 GB+ # or set a higher mem_limit in compose: deploy: resources: limits: memory: 16g

No space left on device

no space left on device / write disk quota exceeded

Docker's storage area is full — common after pulling many images and downloading models. Prune unused data.

# check Docker disk usage docker system df # remove unused images, containers, networks, build cache docker system prune -a # also prune unused volumes (CAREFUL — verify no Odysseus AI volume listed) docker volume ls docker volume prune # only if you've reviewed the list
Appendix

Docker install FAQ.

How do I connect Odysseus AI in Docker to Ollama on the host?
Use base URL http://host.docker.internal:11434/v1 in Odysseus AI Settings → Providers. On macOS and Windows that hostname works out of the box. On Linux Docker, you must add extra_hosts: - "host.docker.internal:host-gateway" to the compose file because Linux Docker doesn't ship this alias by default.
Can I run Odysseus AI on Unraid, Synology, or TrueNAS?
Yes. The official docker-compose.yml works on all three. Mount your appdata or applications path appropriately — see the NAS deployment section above for platform-specific notes. The most common gotcha is UID mismatch on bind mounts; use named volumes if you don't need direct filesystem access.
How do I update Odysseus AI in Docker?
Run git pull in the project folder, then docker compose pull (if you're using a registry image) or docker compose build (if building from source), followed by docker compose up -d. Your volumes survive, so all chat history and settings are preserved.
Why does docker compose fail on Apple Silicon Macs?
Some base images don't ship ARM64 variants. Odysseus AI's official image is multi-arch and includes ARM64, but if you see "exec format error" or "no matching manifest", the upstream image you depend on isn't ARM-ready. Pull explicitly: docker pull --platform linux/amd64 image:tag as a fallback — it'll run via Rosetta emulation, slower but functional.
How do I expose Odysseus AI behind a reverse proxy?
In the compose file, remove the ports: mapping so the container is only reachable on the internal Docker network. Add Traefik labels (or join an Nginx Proxy Manager network). The compose generator above offers a "behind reverse proxy" toggle that produces the right configuration for Traefik out of the box.
Can I run multiple Odysseus AI instances on the same host?
Yes — give each instance a unique project name with docker compose -p name1 up -d and map them to different ports. The volumes and networks are namespaced by project name so they don't collide. Useful for testing upgrades or running separate workspaces for different teams.
How do I back up my Odysseus AI Docker data?
Stop the container, archive the named volumes to a tarball, and store the tarball off-host. docker run --rm -v odysseus-data:/data -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz -C /data . creates a portable backup. Restore by extracting the tarball into a new volume before starting the container.
Why is Odysseus AI slow in Docker compared to native install?
For chat with API providers, there's no difference. For local models via Ollama, the only meaningful cost is the network hop between containers — single-digit milliseconds, not noticeable. If you see real slowness, the cause is almost always memory pressure (Docker Desktop memory limit too low) or filesystem performance (bind mounts to a slow drive on macOS).
Continue

Your next step.