Skip to main content

Installation

O.D.I.N. runs as a single Docker container. Use a Docker-capable Linux or macOS host with network access to your printers.

Prerequisites​

RequirementMinimum
Docker Engine20.10+
Docker Composev2+
RAM2 GB (typical runtime ~256 MB)
Disk10 GB
info

O.D.I.N. supports amd64 and arm64 architectures. It runs natively on Raspberry Pi 4/5, Intel NUCs, and cloud VMs.

Install​

Create a directory, add the Docker Compose file, and start the container:

mkdir odin && cd odin

Create a docker-compose.yml with the following contents:

services:
odin:
image: ghcr.io/hughkantsime/odin:latest
container_name: odin
restart: unless-stopped
ports:
- "8000:8000" # Web UI + API
- "8555:8555/tcp" # WebRTC camera media
- "8555:8555/udp" # WebRTC camera media
volumes:
- ./odin-data:/data
- ./odin-data/go2rtc:/app/go2rtc
environment:
- ENCRYPTION_KEY=${ENCRYPTION_KEY:-}
- JWT_SECRET_KEY=${JWT_SECRET_KEY:-}
- API_KEY=${API_KEY:-}
- DATABASE_URL=sqlite:////data/odin.db
- CORS_ORIGINS=http://localhost:8000
- ODIN_HOST_IP=${ODIN_HOST_IP:-}
- TZ=${TZ:-America/New_York}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health/ready"]
interval: 30s
timeout: 5s
retries: 3
start_period: 60s

Then start the container:

docker compose up -d

That's it. The container handles everything else on first boot -- generating secrets, initializing the database, and starting the application services.

Post-Install​

Open your browser and navigate to:

http://your-server-ip:8000

You'll be greeted by the setup wizard. See First Login & Setup for the walkthrough.

Ports​

PortServicePurpose
8000Web UI / APIMain application
8555 TCP/UDPWebRTCCamera media when used
warning

Allow the web application only from the networks that need it. Use HTTPS through your reverse proxy for remote access. Allow port 8555 TCP/UDP when using WebRTC camera media. Do not expose port 1984: the internal go2rtc API is bound to loopback inside the container, and camera requests use ODIN's authenticated routes. Printer control and file-transfer connections are outbound from the ODIN host/container and need separate routing and firewall rules.

Updating​

Updates can migrate the database. Before updating, record the running image tag or digest and take a recoverable backup of the entire data volume, including the database, uploads, license, installation identity and encryption/signing keys. Stop the service for a consistent full-volume/VM snapshot. ODIN's built-in backup covers the database only; it does not replace the required backup of uploads, license, installation identity and keys. Preserve the Compose configuration and any separately supplied environment secrets too.

Read the target release's notes and choose its published image tag. If support asks you to use a particular version, set image: to that exact tag in your existing Compose file first. Pulling latest does not select a versioned update that has not been promoted to latest.

For the example service named odin:

docker compose pull odin
docker compose up -d odin

Keep the existing mounts, keys, ports and environment. Do not rerun first-time setup or delete the data volume. Check /health for the expected version and /health/ready for ready: true, then sign in and confirm your users, printers and license remain present. If the setup wizard unexpectedly appears, stop and check the original volume mount.

If the upgrade fails, preserve the error and restore the matching pre-upgrade image and full data backup together. Do not run an older image against a database already migrated by a newer release.

For connection checks after upgrading, see Guided diagnostics.

Uninstalling​

Stop the container and remove it:

docker compose down

To remove all data, delete the odin-data directory. This is irreversible.