Skip to main content

Docker

Every release publishes the image, so you don't need to build anything. The package is public, so pulling it doesn't require a 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

Reaper uses one path, /data, to hold its own database. Your media stays where it is.

A named volume works without any setup and stays put even when you update or recreate things, so the examples above use one.

If you want to see and copy your files, bind-mount a host directory instead with ./data:/data. This is what you'll want on a NAS. It makes backing up the three files a plain file copy instead of a trip through docker volume. Reaper's own Settings, Backup works either way.

You don't need chown either way. The container starts as root to take ownership of the folder, then drops to an unprivileged user before it opens the database. Set PUID and PGID to choose that user. If you want to skip the root phase entirely, pin user: "1000:1000" and create the folder owned by 1000 yourself.

Windows

When you use Docker on Windows, it runs Linux containers inside a small VM using Docker Desktop on the WSL 2 backend. You can follow Microsoft's WSL install guide to turn 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. Seeds the first run only; Settings, Logs owns it afterwards.
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.

If you want to publish Reaper on a different host port, you don't need a variable. Just change the left side of 8420:8420 and leave the right side 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.

Put ghcr.io/scythe-labs/reaper:dev in your compose file to run the dev channel. Dev builds change often, so use Releases if you want a steadier channel.

Updating

docker compose pull
docker compose up -d

Migrations run every time you start the app, before it accepts a connection.

Building from source

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

docker compose up -d --build

Next

Follow the First run steps in order. The first account that signs in claims the install, so make sure you know who's doing it.