-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
71 lines (69 loc) Β· 3.32 KB
/
Copy pathdocker-compose.yml
File metadata and controls
71 lines (69 loc) Β· 3.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# Example Docker Compose for Transpondarr.
#
# THE ONE RULE THAT MAKES IMPORT WORK: mount your shared media/downloads volume
# into this container at the SAME path qBittorrent uses, and put the library and
# the torrent downloads under it. Import hardlinks the finished file from the
# path qBittorrent reports, so that path must exist here and be on the same
# filesystem as the library (a hardlink can't cross filesystems). This is the
# standard *arr / TRaSH single-mount layout:
#
# /data
# βββ torrents <- qBittorrent's download dir
# βββ media <- your Shows library (Jellyfin/Plex reads here) -> TRANSPONDARR_LIBRARY_DIR
# βββ media-movies <- your Movies library -> TRANSPONDARR_LIBRARY_MOVIES_DIR
#
# Add this service to your existing stack (qBittorrent, Jackett/Prowlarr, media
# server) so it shares their network and volume, or run it standalone as below.
services:
transpondarr:
build: # or drop this block for: image: ghcr.io/matthewdias/transpondarr:latest
context: .
args:
VERSION: "${VERSION:-dev}"
container_name: transpondarr
ports:
- "9797:9797"
environment:
# Match your media stack's user so hardlinks land with the right ownership
# and the container can write into /data/media. The container starts as
# root, fixes /config ownership, then drops to this uid:gid before serving.
PUID: "${PUID:-1000}"
PGID: "${PGID:-1000}"
# --- server ---
TRANSPONDARR_API_KEY: "${TRANSPONDARR_API_KEY:?set a long random string}"
# --- qBittorrent (reachable from THIS container: compose service name, or host:port) ---
TRANSPONDARR_QBIT_URL: "http://qbittorrent:8080"
TRANSPONDARR_QBIT_USER: "${QBIT_USER}"
TRANSPONDARR_QBIT_PASSWORD: "${QBIT_PASSWORD}"
# --- indexer (Prowlarr aggregate or a Jackett feed) ---
TRANSPONDARR_TORZNAB_URL: "${TORZNAB_URL}"
TRANSPONDARR_TORZNAB_APIKEY: "${TORZNAB_APIKEY}"
# Newznab category IDs narrowing every search and the recent feed; anime is
# usually 5070. Empty = no filter.
TRANSPONDARR_TORZNAB_CATEGORIES: "${TORZNAB_CATEGORIES:-}"
# --- library import (must live under the shared /data mount) ---
TRANSPONDARR_LIBRARY_DIR: "/data/media"
# Films place here instead; unset = movies do not import.
TRANSPONDARR_LIBRARY_MOVIES_DIR: "/data/media-movies"
TRANSPONDARR_IMPORT_MODE: "auto" # auto | hardlink | copy
volumes:
- ./config:/config # SQLite DB + state (ownership is fixed automatically on start)
- "${DATA_DIR:-/data}:/data" # SAME host path qBittorrent mounts, at the SAME container path
# Hardening: the app only ever writes under /config and /data (both mounted
# writable above), needs no capabilities, and never escalates privileges.
read_only: true
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
# Docker's 10s default is exactly the app's own drain budget, so a shutdown
# that uses all of it would be killed at the moment it finished.
stop_grace_period: 30s
restart: unless-stopped
# If your stack uses an external network, join it so the qBit/indexer service
# names resolve β otherwise use host IPs in the URLs above.
# networks:
# - media
# networks:
# media:
# external: true