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
| Requirement | Minimum |
|---|---|
| Docker Engine | 20.10+ |
| Docker Compose | v2+ |
| RAM | 2 GB (typical runtime ~256 MB) |
| Disk | 10 GB |
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
| Port | Service | Purpose |
|---|---|---|
| 8000 | Web UI / API | Main application |
| 8555 TCP/UDP | WebRTC | Camera media when used |
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.