-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdocker-compose.example.yml
More file actions
122 lines (112 loc) · 7.44 KB
/
Copy pathdocker-compose.example.yml
File metadata and controls
122 lines (112 loc) · 7.44 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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
services:
stack-doctor:
image: ghcr.io/neoo-blue/stack-doctor:latest
# or build locally: build: .
container_name: stack-doctor
restart: unless-stopped
environment:
# ---------- mode ----------
DOCTOR_MODE: cron # cron | event
DOCTOR_INTERVAL: "900" # cron: seconds between sweeps
DOCTOR_DRY_RUN: "false" # true = log only, change nothing
DOCTOR_LOG_LEVEL: INFO
DOCTOR_LOG_FILE: /data/doctor.log # rotating file log (also logs to stdout)
# ---------- which checks to run ----------
ENABLE_QUEUE: "true" # *arr stuck-queue cleaner
ENABLE_PROVIDERS: "true" # auto-Test failed indexers/download clients (sonarr/radarr/prowlarr)
ENABLE_DECYPHARR: "true" # decypharr mount-hang watchdog
ENABLE_PLEX: "true" # Plex reachability
ENABLE_RESOURCES: "true" # host load / mem / swap
ENABLE_JANITOR: "false" # usenet dead-file quarantine (needs a decypharr log file)
ENABLE_BAZARR: "false" # Bazarr reachability (set BAZARR_URL/BAZARR_APIKEY)
ENABLE_SEERR: "false" # Overseerr/Jellyseerr/Seerr: auto-retry FAILED requests (set SEERR_URL/SEERR_APIKEY)
ENABLE_WARMER: "false" # precache the head of likely-next media (needs PLEX_URL/PLEX_TOKEN)
ENABLE_UI: "true" # web dashboard: status, per-service health, warmer stats, config, logs
# DOCTOR_UI_TOKEN: "changeme" # require ?token= / X-Doctor-Token to reach the dashboard
# ---------- queue check ----------
DOCTOR_MIN_STRIKES: "2" # consecutive sweeps stuck before acting (ignores transient blips)
DOCTOR_MAX_ACTIONS: "20" # max removals per sweep
DOCTOR_BLOCKLIST: "true" # blocklist removed grabs so a different release is fetched
# churn brake: stop a title that keeps grabbing dead releases (never imports, burns cycles)
DOCTOR_CHURN_LIMIT: "0" # after N dead grabs of the same episode/movie, brake (0 = off)
DOCTOR_CHURN_ACTION: "report" # report | park (un-monitor) | backoff (un-monitor, retry after cooldown)
DOCTOR_CHURN_COOLDOWN: "86400" # backoff: seconds parked before a fresh retry
# DOCTOR_LOAD_MAX: "60" # skip queue sweep if host 1-min load above this
# DOCTOR_CONDITIONS: "downloadClientUnavailable,importBlocked,importFailed,importPending_warning,failedPending,stalled"
INSTANCE_1_NAME: sonarr
INSTANCE_1_TYPE: sonarr
INSTANCE_1_URL: http://sonarr:8989
INSTANCE_1_APIKEY: ${SONARR_API_KEY}
INSTANCE_2_NAME: radarr
INSTANCE_2_TYPE: radarr
INSTANCE_2_URL: http://radarr:7878
INSTANCE_2_APIKEY: ${RADARR_API_KEY}
INSTANCE_3_NAME: sonarr4k
INSTANCE_3_TYPE: sonarr
INSTANCE_3_URL: http://sonarr4k:8989
INSTANCE_3_APIKEY: ${SONARR4K_API_KEY}
INSTANCE_4_NAME: radarr4k
INSTANCE_4_TYPE: radarr
INSTANCE_4_URL: http://radarr4k:7878
INSTANCE_4_APIKEY: ${RADARR4K_API_KEY}
INSTANCE_5_NAME: prowlarr # prowlarr is for the providers check (no download queue)
INSTANCE_5_TYPE: prowlarr
INSTANCE_5_URL: http://prowlarr:9696
INSTANCE_5_APIKEY: ${PROWLARR_API_KEY}
# ---------- bazarr (optional) ----------
BAZARR_URL: http://bazarr:6767
BAZARR_APIKEY: ${BAZARR_API_KEY}
# ---------- seerr (Overseerr / Jellyseerr / Seerr - auto-retry FAILED requests) ----------
# seerr hands an approved request to the arr with a ~10s timeout and never retries; under heavy
# arr load that add times out and the request is silently stuck FAILED. This re-drives them.
SEERR_URL: http://seerr:5055
SEERR_APIKEY: ${SEERR_API_KEY}
SEERR_RETRY_MAX: "10" # max requests retried per sweep (rate-limit the re-adds)
SEERR_MAX_ATTEMPTS: "5" # give up on a request after this many auto-retries (0 = never give up)
# ---------- decypharr (mount-hang watchdog) ----------
DECYPHARR_URL: http://192.168.1.10:8282 # API reachability (optional)
DECYPHARR_MOUNT_TEST: /mnt/library/movies # a dir on the FUSE mount to read-test
DECYPHARR_READ_TIMEOUT: "25"
# if a read hangs, run this to recover (decypharr is often a HOST service, so use ssh/docker):
# DECYPHARR_RESTART_CMD: "ssh root@192.168.1.10 systemctl restart decypharr"
# DECYPHARR_RESTART_CMD: "docker restart decypharr"
# ---------- plex ----------
PLEX_URL: http://192.168.1.20:32400
PLEX_TOKEN: ${PLEX_TOKEN}
PLEX_SCAN_ON_CHECK: "false" # also trigger a library refresh when Plex is up
# ---------- warmer (instant playback start; reuses PLEX_URL/PLEX_TOKEN) ----------
WARMER_PRECACHE_MB: "24" # head pulled per title (small = fast warm; the mount's read-ahead does the rest)
WARMER_TAIL_MB: "4" # also pull the tail (mkv cues / Plex end-probe); 0 = off
WARMER_PARTS: "1" # warm only the highest-res version per title (not the 4K AND the 1080p)
WARMER_SOURCES: "ondeck,next" # ondeck = Continue Watching, next = next episode of what's playing, recent = newly added
WARMER_ONDECK: "true" # quick on/off for Continue Watching warming (set false to disable just that)
WARMER_INTERVAL: "120" # seconds between session polls (next-episode prefetch)
WARMER_ONDECK_EVERY: "600" # seconds between On Deck / recent warms
WARMER_MAX_PER_CYCLE: "40" # cap background warms per cycle
WARMER_COOLDOWN: "3600" # don't re-warm the same file within this many seconds
WARMER_LOAD_MAX: "12" # pause BACKGROUND warming above this host 1-min load (protect live playback)
WARMER_CONCURRENCY: "2" # simultaneous BACKGROUND warm reads (keep low so it never starves playback)
WARMER_OPEN_CONCURRENCY: "4" # dedicated lane for a title you OPEN, so it warms instantly (never queues behind background)
# low-cache mode (small / RAM-backed cache): no On Deck warming, warm next ep only as the current nears its end
# WARMER_LOW_CACHE: "true"
# WARMER_NEXT_REMAINING_MIN: "10" # minutes left in the current ep before warming the next one
# WARMER_PATH_MAP: "/data/media:/mnt/library" # if Plex's file path differs from this container's
# detail-page warming: warm the exact title a viewer opens (bind-mount Plex's log read-only, then:)
# WARMER_PLEXLOG_FILE: "/plexlog/Plex Media Server.log"
# ---------- resources ----------
RES_LOAD_WARN: "40"
RES_SWAP_WARN_MB: "7000"
RES_MEM_MIN_MB: "800"
RES_DROP_CACHES: "false" # echo 1 > drop_caches under memory pressure (needs the mount below + privilege)
# ---------- janitor (optional) ----------
JANITOR_LIBRARY_PATHS: /mnt/library/tv,/mnt/library/movies
JANITOR_DECYPHARR_LOG: /logs/decypharr.log # mount decypharr's error log here
volumes:
- ./data:/data # state + file log + quarantine manifests
- /mnt/library:/mnt/library # for mount read-test + janitor (read/write for janitor)
# - /proc/loadavg:/proc/loadavg:ro # host load for resources check
# - /proc/meminfo:/proc/meminfo:ro # host memory for resources check
# - /var/log/decypharr.log:/logs/decypharr.log:ro # for the janitor
ports:
- "12345:12345" # web dashboard (ENABLE_UI)
# - "8088:8088" # only for event mode (Sonarr/Radarr webhook target)