Repository navigation
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
82 lines (81 loc) · 4.41 KB
/
Copy pathdocker-compose.yml
File metadata and controls
82 lines (81 loc) · 4.41 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
services:
jack:
# Pre-built image published to GitHub Container Registry on every push to main.
image: ghcr.io/roziscoding/jack:main
container_name: jack
restart: unless-stopped
ports:
- '${JACK_PORT:-5225}:5225'
environment:
# production disables pino-pretty and emits structured JSON logs
ENVIRONMENT: production
LOG_LEVEL: info
PORT: 5225
APP_CONFIG_PATH: /config/config.jsonc
# Enables the management API (on MANAGEMENT_PORT, default 5226) that the
# jack-ui service talks to. The UI injects this same value as its
# X-Management-Key, so both read one variable and always match. To run jack
# headless, drop the jack-ui service below and this line.
JACK_MANAGEMENT_KEY: ${JACK_MANAGEMENT_KEY:?set JACK_MANAGEMENT_KEY in a .env file next to this compose (any long random string)}
# *arr API keys, forwarded from .env so config.jsonc can reference them
# as { "env": "RADARR_API_KEY" } instead of inlining the secret. Add one
# line per env-referenced secret; unused ones can stay empty.
RADARR_API_KEY: ${RADARR_API_KEY:-}
SONARR_API_KEY: ${SONARR_API_KEY:-}
volumes:
# App config. Drop your config.jsonc in a ./config dir next to this file
# (start from the config.jsonc template in this examples/ folder).
- ./config:/config
# Media library. jack streams files to peers using the absolute path each
# Radarr/Sonarr stores for the file (i.e. the path INSIDE the *arr
# container), so jack must see those files at that SAME path. The
# `/data/media` target below is a placeholder — change it to match your
# *arr's media path(s), and add one mount per path if they use several
# (e.g. /movies and /tv).
- ${MEDIA_PATH:-./data/media}:/data/media
# Completed downloads dir — must match `downloads.completedPath` in
# config.jsonc. IMPORTANT: mount this SAME folder into your Radarr and
# Sonarr containers at the SAME path (e.g. /data/torrents). jack writes
# finished files here and *arr resolves that literal path in its own
# filesystem to import them — if they don't match, *arr can't import.
# (No watch folder: *arr hands grabs to jack over the qBittorrent API.)
- ${TORRENTS_PATH:-./data/torrents}:/data/torrents
# If Radarr / Sonarr are defined in this same compose file, wait for them to
# be healthy before starting jack. Auto-registration only runs at startup, so
# this makes the Torznab indexer + qBittorrent client register on first boot
# instead of needing a jack restart. (Needs `healthcheck` blocks on those
# services — the linuxserver.io images ship with them.)
# depends_on:
# radarr: {condition: service_healthy}
# sonarr: {condition: service_healthy}
# If Radarr / Sonarr run in their own compose network, attach this service
# to it so `jack.internalUrl` / server URLs resolve by container name.
# Otherwise reach them via host IP.
# networks:
# - media
# Management console. Published alongside the backend on every push to main. Open it at http://localhost:3000.
jack-ui:
image: ghcr.io/roziscoding/jack-ui:main
container_name: jack-ui
restart: unless-stopped
depends_on:
- jack
ports:
- '${JACK_UI_PORT:-3000}:3000'
environment:
# The UI reaches jack's management API over the compose network by service
# name. Must match jack's MANAGEMENT_PORT (default 5226). No host port for
# 5226 is published — the UI is the only thing that needs it.
JACK_MANAGEMENT_API_URL: http://jack:5226
# Inject mode: the BFF adds X-Management-Key on every call, so the browser is
# never prompted. Same variable as jack's JACK_MANAGEMENT_KEY above, so they match.
JACK_MANAGEMENT_KEY: ${JACK_MANAGEMENT_KEY:?set JACK_MANAGEMENT_KEY in a .env file next to this compose (any long random string)}
# Only used in cookie-prompt mode (when JACK_MANAGEMENT_KEY is unset): seals
# the session cookie and must be >= 32 chars. Left unset here because this
# compose runs in inject mode, where sessions aren't used. If you switch to
# cookie mode (remove JACK_MANAGEMENT_KEY above), uncomment this so a real
# key is required — an empty value would break cookie sealing.
# JACK_SESSION_KEY: ${JACK_SESSION_KEY:?set a >= 32-char random string for cookie mode}
# networks:
# media:
# external: true