Docker Compose is the fastest and most reliable way to run Riven TS. The stack is three containers — Riven itself, a PostgreSQL 17 database (Documentation Index
Fetch the complete documentation index at: https://mintlify.com/rivenmedia/riven-ts/llms.txt
Use this file to discover all available pages before exploring further.
riven-db), and a Redis 8 cache (riven-cache) — wired together with a single Compose file. The only host-level prerequisite beyond Docker is a FUSE mount point, which lets Riven’s virtual file system be visible outside the container so your media server can read it.
Prefer to skip Docker entirely? See Running from Source.
Prerequisites
Before you begin, confirm that you have:- A Linux host with FUSE support and
/dev/fuseavailable - Docker Engine 24+ with Compose V2 (
docker compose, notdocker-compose) - A debrid service account (Real-Debrid, AllDebrid, TorBox, or another provider supported by StremThru)
- A running media server — Plex or Jellyfin
- A TMDB API key (free at themoviedb.org)
Installation
Prepare the host mount point
Riven mounts the VFS inside its container and propagates it back to the host through a bind mount. For this to work, the host mount point must use shared propagation — otherwise the FUSE mount created inside the container is invisible outside it.A systemd unit is the most reliable way to guarantee the propagation mode survives reboots:Create the directory, reload systemd, and start the unit:Confirm the propagation mode is
/etc/systemd/system/riven-mount.service
shared before continuing:Create data directories
Riven writes logs and its generated ranking config to mounted volumes. The container runs as UID/GID 1000; the directories must be owned by that user or Riven will fail to write on startup:
Create your environment files
The stack uses two environment files. Create a Then create Replace every
.env file for host-level variables (the VFS mount path, UID/GID, and database password):.env
.env.riven for Riven’s own settings — the RIVEN_SETTING__* and RIVEN_PLUGIN_SETTING__* variables:.env.riven
CHANGEME and placeholder value before starting. The DATABASE_PASSWORD in .env must match the password embedded in RIVEN_SETTING__databaseUrl in .env.riven. See Configuration for the full list of core settings, and Plugins for per-plugin options.Create docker-compose.yml
Create a
docker-compose.yml in the same directory. The rshared volume flag on the mount path is required — it tells Docker to propagate the FUSE mount bidirectionally:docker-compose.yml
There is no
latest image tag. Use :main to track the current build, or pin a released semver tag such as :1.2.3.Start Riven
Bring up the stack in detached mode and tail the Riven logs to watch the bootstrap sequence:Riven connects to PostgreSQL and Redis, runs any pending database migrations, registers its plugins, mounts the FUSE VFS, and starts the GraphQL API server on port 3000. Confirm it is reachable:
Point your media server at the VFS
Add
/mnt/riven as a library root in your media server:- Plex
- Jellyfin
- Open Plex Web → Settings → Libraries
- Click Add Library, choose Movies or TV Shows
- Under Add folders, click Browse for media folder and select
/mnt/riven - Click Add Library
If your media server also runs in Docker, mount the same path into that container using
rslave propagation — for example /mnt/riven:/media:rslave — and update the plugin’s plexLibraryPath or jellyfinLibraryPath to the container-side path.What’s next?
Configure plugins
Set up your content sources, debrid provider, and media server integrations in detail.
Production deployment
Reverse proxy setup, TLS, update strategies, and health monitoring.
Troubleshooting
Solutions for common FUSE, networking, and permission issues.
Running from source
Skip Docker and run Riven directly on your host with Node.js and pnpm.