Docker
Every release publishes the image, so there is nothing to build. The package is public, so the pull needs no login.
Installation
- Docker Compose
- Docker CLI
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
docker run -d \
--name reaper \
--restart unless-stopped \
-p 8420:8420 \
-v reaper-data:/data \
-e REAPER_DESTRUCTIVE_ACTIONS_ENABLED=false \
-e REAPER_LOG_LEVEL=INFO \
ghcr.io/scythe-labs/reaper:latest
Reaper then 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
| Variable | Default | What it does |
|---|---|---|
REAPER_DESTRUCTIVE_ACTIONS_ENABLED | false | Whether a brand new install comes up able to delete. Seeds the first run only. |
REAPER_LOG_LEVEL | INFO | Set DEBUG when you are chasing something. |
REAPER_LOG_JSON | false | One JSON object per line, for a log collector. |
PUID / PGID | 1000 | Which user the app runs as. Unraid wants 99 / 100. |
REAPER_TIMEZONE | host's zone | First-run default only. Settings, General owns it afterwards. |
REAPER_PORT | 8420 | The port inside the container. Moving it moves the healthcheck too. |
REAPER_SECRET_KEY | generated | See 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
| Tag | Follows |
|---|---|
:latest | the newest release. Use this. |
:dev | the 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
- Docker CLI
docker compose pull
docker compose up -d
docker stop reaper
docker rm reaper
docker pull ghcr.io/scythe-labs/reaper:latest
# then run the same command you installed with
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.