Docker Compose
Torsher is one container described in one docker-compose.yml. This page sets it up on a single disk or across several, and explains each line you may want to change.
What you'll get
Torsher running on your server, its data in a folder you chose, and the control panel open in your browser.
Before you start
- Docker with the Compose plugin: Docker Engine on Linux, or Docker Desktop on Windows and macOS. Check with
docker compose version. - Linux gets every feature. Docker Desktop runs Torsher with transcoding on the CPU only, and its file sharing may not keep hard links; see Docker Desktop.
- The commands on this page are for Linux and macOS.
- Disk space for what you watch and keep. See Requirements.
1. Get the install file
mkdir torsher && cd torsher
curl -fsSL https://github.com/torsher-app/torsher/releases/latest/download/docker-compose.yml -o docker-compose.ymlThis is the whole file. Lines starting with # are optional and stay off until you remove the #:
# Copy to docker-compose.yml and adjust the values below.
#
# docker compose up -d # Torsher only
# docker compose --profile prowlarr up -d # Torsher and Prowlarr
#
# Then open http://<host>:8080/panel/ to create the owner account.
services:
torsher:
image: ghcr.io/torsher-app/torsher:latest
container_name: torsher
restart: unless-stopped
ports:
- '8080:8080'
environment:
# Owner of the files in /data on the host (`id -u` and `id -g`)
PUID: 1000
PGID: 1000
TZ: Etc/UTC
# Optional: key that encrypts indexer API keys in the database.
# Without it a key file is created in /data/db. Keep it with your backups
# TORSHER_SECRET: change-me
# Optional: your own TMDB API Read Access Token for the catalog instead
# of the app key built into the image
# TMDB_ACCESS_TOKEN:
# Behind a reverse proxy: its address or subnet, so that sign-in
# attempt limits see real client addresses. Don't set it without a proxy
# TRUST_PROXY: 172.18.0.0/16
volumes:
# One disk (recommended): database, keys, downloads (/data/torrents)
# and the library (/data/library) in one volume. Files you keep are
# hard-linked from downloads to the library and take no extra space
- ./data:/data
# Several disks: keep /data above for the database, mount the big disk
# once and choose /storage/torrents and /storage/library in
# Settings → Storage. Keep both folders in this one volume: two
# volumes, even on one disk, turn hard links into copies
# - /mnt/big:/storage
# Optional: your existing media folders, read-only
# - /path/to/movies:/media/movies:ro
# Optional: hardware transcoding on Intel or AMD graphics (VAAPI)
# devices:
# - /dev/dri:/dev/dri
# Optional: hardware transcoding on an NVIDIA GPU (NVENC). Needs the
# NVIDIA driver and the NVIDIA Container Toolkit on the host
# runtime: nvidia
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: all
# capabilities: [gpu]
# Optional: any Torznab indexer works. Prowlarr starts empty: you add
# the indexers you are allowed to use. The Torsher setup wizard finds it
# at http://prowlarr:9696 and asks only for its API key
prowlarr:
image: lscr.io/linuxserver/prowlarr:latest
container_name: prowlarr
restart: unless-stopped
profiles: [prowlarr]
ports:
- '9696:9696'
environment:
PUID: 1000
PGID: 1000
TZ: Etc/UTC
volumes:
- ./prowlarr:/config2. Set the file owner
Torsher writes files as the user in PUID and PGID. Find your IDs:
id -u && id -gIf they are not 1000 and 1000, change PUID and PGID in docker-compose.yml. Use the same values for Prowlarr.
Set TZ to your time zone, for example Europe/Berlin, so schedules and logs show your local time.
3. Choose where data lives
One disk
The default is fine for most setups: everything lives in ./data next to docker-compose.yml.
volumes:
- ./data:/dataInside, Torsher creates:
| Folder | What's inside |
|---|---|
/data/db | The database, the key files secret.key and session.key, and the log. Back this up |
/data/torrents | Downloads: the watch cache and what is still downloading |
/data/library | What you keep, laid out by title so Jellyfin, Plex and Kodi can read it too |
Several disks
Keep /data on the system disk for the database, and mount the big disk once more as its own volume:
volumes:
# Database and keys, on the system disk
- ./data:/data
# The big disk: downloads and the library together
- /mnt/big:/storage
# Movies and series you already have, read-only
- /mnt/media/movies:/media/movies:roAfter the first start, choose the folders in the panel under Settings → Storage, card Folders (the setup wizard shows the same card): /storage/torrents for Downloads and /storage/library for Library. The folder browser shows free space and whether hard links work between the two.
Add the read-only folders under Library, then Add library, with the path inside the container, for example /media/movies. Torsher indexes them in place and never writes there.
Keep downloads and the library in one volume
Put both folders inside the same mounted volume, as /storage above. Two volumes, even on the same disk, block hard links: every kept file is copied and takes space twice. The folder browser and the storage settings warn when this happens.
When a folder already holds data, the panel asks whether to send only new files to the new folder or move everything there in the background.
4. Start
Torsher alone:
docker compose up -dOr Torsher with Prowlarr, if you don't run an indexer yet. See Indexers.
docker compose --profile prowlarr up -d5. Check that it works
docker compose psThe torsher container should be running, and within a minute healthy. Then open http://<server-address>:8080/panel/ in a browser. The address of the server in your network, on Linux:
hostname -IOn the machine itself, http://localhost:8080/panel/ works too.
The panel asks you to create the owner account and starts the setup wizard.
Update
When a new version is out, the panel shows it on Overview and under Settings → About. To update, run in the folder with docker-compose.yml:
docker compose pulldocker compose up -dSettings, the library and the watch history stay. Before an update that changes the database, the server makes a backup of it first. Details: Update and roll back.
If something went wrong
- The container restarts. Read the log:
docker compose logs torsher. - The data folder is not writable.
PUIDandPGIDdon't match the owner of the folder on the host. Fix them and rundocker compose up -dagain. - Port 8080 is taken. Change the left side of the port mapping, for example
'8081:8080', and open the panel on that port.
More: Troubleshooting.
Next
- Hardware transcoding, if the server has a GPU.
- Setup wizard.