Skip to main content

Docker

Every release publishes the image, so there is nothing to build. The package is public, so the pull needs no login.

Installation

services:
reaper:
image: ghcr.io/scythe-labs/reaper:latest
container_name: reaper
restart: unless-stopped
ports:
- "8420:8420"
volumes:
- reaper-data:/data
environment:
REAPER_DESTRUCTIVE_ACTIONS_ENABLED: "false"
REAPER_LOG_LEVEL: INFO
# PUID: "1000"
# PGID: "1000"
# REAPER_TIMEZONE: "America/New_York"

volumes:
reaper-data:

Then:

docker compose up -d # serves on http://localhost:8420

The volume

One path, /data, holding Reaper's own database. Your media stays where it is.

A named volume works with no setup and persists across updates and recreation, which is why the examples above use one.

Bind-mount a host directory instead, with ./data:/data, when you want the files somewhere you can see and copy. That is what you want on a NAS, and it makes backing up the three files a plain file copy rather than a trip through docker volume. Reaper's own Settings, Backup works either way.

No chown needed either way: the container starts as root, takes ownership of the folder, then drops to an unprivileged user before it opens the database. Set PUID and PGID to choose that user. To skip the root phase entirely, pin user: "1000:1000" and create the folder owned by 1000 yourself.

Windows

Docker on Windows runs Linux containers inside a small VM, through Docker Desktop on the WSL 2 backend. Microsoft's WSL install guide covers turning WSL on.

Common settings

VariableDefaultWhat it does
REAPER_DESTRUCTIVE_ACTIONS_ENABLEDfalseWhether a brand new install comes up able to delete. Seeds the first run only.
REAPER_LOG_LEVELINFOSet DEBUG when you are chasing something.
REAPER_LOG_JSONfalseOne JSON object per line, for a log collector.
PUID / PGID1000Which user the app runs as. Unraid wants 99 / 100.
REAPER_TIMEZONEhost's zoneFirst-run default only. Settings, General owns it afterwards.
REAPER_PORT8420The port inside the container. Moving it moves the healthcheck too.
REAPER_SECRET_KEYgeneratedSee the encryption key.

Publishing Reaper on a different host port needs no variable. Change the left side of 8420:8420 and leave the right alone.

The full list is in Configuration.

Which tag

TagFollows
:latestthe newest release. Use this.
:devthe dev branch, refreshed on every change, for testing what is coming.

These two are the only tags to put in a compose file.

To run the dev channel, put ghcr.io/scythe-labs/reaper:dev in the compose file instead. Dev builds change often. Releases are the steadier channel.

Updating

docker compose pull
docker compose up -d

Migrations run on every start, before the app accepts a connection. A half-migrated schema must never serve traffic for a tool that deletes media.

Building from source

Uncomment build: in docker-compose.yml and run:

docker compose up -d --build

Next

First run, in order. The first account to sign in claims the install, so it matters who does it.