Files
audiojacker/docker-compose.yaml
T
2026-03-08 18:08:36 -04:00

322 lines
12 KiB
YAML

version: "3.9"
# =============================================================================
# Audiojacker - All-in-One Media Download and Streaming Stack
# =============================================================================
# This compose file sets up a complete media management system with:
# - VPN-routed download services (via gluetun)
# - Direct-access media servers
# =============================================================================
# Shared environment variables for linuxserver.io containers
x-lsio-environment: &lsio-environment
PUID: ${PUID:-1000}
PGID: ${PGID:-1000}
TZ: ${TZ:-America/New_York}
# Common volume mounts for download services
x-download-volumes: &download-volumes
- ${BASE_PATH}/downloads:/downloads
- ${BASE_PATH}/config:/config
services:
# ===========================================================================
# VPN GATEWAY - gluetun
# ===========================================================================
# All download services route through this container for VPN protection
# Documentation: https://github.com/qdm12/gluetun
# AirVPN setup: https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/airvpn.md
# Rootless Podman: Requires privileged mode for TUN device access
# ===========================================================================
gluetun:
image: qmcgaw/gluetun:latest
container_name: gluetun
# For rootless Podman: privileged mode is required for TUN device access
# For Docker: can use cap_add + devices instead (more secure)
privileged: true
cap_add:
- NET_ADMIN
- NET_RAW
devices:
- /dev/net/tun:/dev/net/tun
environment:
<<: *lsio-environment
VPN_SERVICE_PROVIDER: airvpn
VPN_TYPE: wireguard
# AirVPN WireGuard configuration
# Generate config at https://airvpn.org/generator/
# IMPORTANT: When using manual WireGuard keys, you MUST also set the endpoint
# OR remove all WIREGUARD_* variables and let gluetun auto-configure
WIREGUARD_PRIVATE_KEY: ${AIRVPN_WG_PRIVATE_KEY}
WIREGUARD_PRESHARED_KEY: ${AIRVPN_WG_PRESHARED_KEY:-}
WIREGUARD_ADDRESSES: ${AIRVPN_WG_ADDRESSES}
# Server selection - gluetun will auto-select from these countries
# The server public key is automatically managed by gluetun
SERVER_COUNTRIES: ${AIRVPN_SERVERS:-Netherlands}
# Optional: Specify exact server name if you want to use a specific server
# SERVER_NAMES: servername1,servername2
volumes:
- ${BASE_PATH}/config/gluetun:/gluetun
ports:
# qBittorrent Web UI (routed through VPN)
# Changed default from 8080 to 8090 to avoid port conflict
- ${QBITTORRENT_PORT:-8090}:8080
# Lidarr Web UI (routed through VPN)
- ${LIDARR_PORT:-8686}:8686
# slskd Web UI (routed through VPN)
- ${SLSKD_PORT:-5000}:5000
# slskd listen ports for Soulseek network
- 22398:22398/tcp
- 22398:22398/udp
- 22399:22399/tcp
- 22399:22399/udp
- 22400:22400/tcp
- 22400:22400/udp
# soularr Web UI (routed through VPN) - DISABLED: image not publicly available
# - ${SOULARR_PORT:-8400}:8400
# yubal Web UI (routed through VPN) - DISABLED: image not publicly available
# - ${YUBAL_PORT:-8888}:8888
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "https://ipinfo.io"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
networks:
- media_net
security_opt:
- "label=disable"
# ===========================================================================
# TORRENT CLIENT - qBittorrent
# ===========================================================================
# Web UI accessible at http://localhost:8090
# Default credentials: admin / adminadmin (change on first login)
# Documentation: https://hub.docker.com/r/linuxserver/qbittorrent
# ===========================================================================
qbittorrent:
image: linuxserver/qbittorrent:latest
container_name: qbittorrent
network_mode: service:gluetun
#depends_on:
# gluetun:
# condition: service_healthy
environment:
<<: *lsio-environment
WEBUI_PORT: 8080
TORRENTING_PORT: 6881
volumes:
- ${BASE_PATH}/config/qbittorrent:/config
- ${BASE_PATH}/downloads/torrents:/downloads
restart: unless-stopped
security_opt:
- "label=disable"
# ===========================================================================
# MUSIC COLLECTION MANAGER - Lidarr
# ===========================================================================
# Web UI accessible at http://localhost:8686
# Documentation: https://lidarr.audio/
# ===========================================================================
lidarr:
image: linuxserver/lidarr:latest
container_name: lidarr
network_mode: service:gluetun
#depends_on:
# gluetun:
# condition: service_healthy
environment:
<<: *lsio-environment
volumes:
- ${BASE_PATH}/config/lidarr:/config
- ${BASE_PATH}/music:/music
- ${BASE_PATH}/downloads:/downloads
restart: unless-stopped
security_opt:
- "label=disable"
# ===========================================================================
# SOULSEEK CLIENT - slskd
# ===========================================================================
# Web UI accessible at http://localhost:5000
# Documentation: https://github.com/slskd/slskd
# ===========================================================================
slskd:
image: slskd/slskd:latest
container_name: slskd
network_mode: service:gluetun
#depends_on:
# gluetun:
# condition: service_healthy
environment:
<<: *lsio-environment
SLSKD_SLSK_USERNAME: ${SOULSEEK_USER}
SLSKD_SLSK_PASSWORD: ${SOULSEEK_PASS}
SLSKD_SLSK_LISTEN_PORT: 22398
SLSKD_REMOTE_CONFIGURATION: true
SLSKD_NO_AUTH: false
SLSKD_USERNAME: ${SLSKD_ADMIN_USER:-admin}
SLSKD_PASSWORD: ${SLSKD_ADMIN_PASS:-admin}
volumes:
- ${BASE_PATH}/config/slskd:/app/data
- ${BASE_PATH}/downloads/soulseek:/downloads
- ${BASE_PATH}/music:/music
restart: unless-stopped
security_opt:
- "label=disable"
# ===========================================================================
# LIDARR + SOULSEEK INTEGRATION - soularr
# ===========================================================================
# DISABLED: The image ghcr.io/guillevc/soularr:latest is not publicly accessible
# (403 Forbidden). You may need to:
# 1. Build from source: https://github.com/guillevc/soularr
# 2. Request access to the container registry
# 3. Use an alternative image if available
# ===========================================================================
# soularr:
# image: ghcr.io/guillevc/soularr:latest
# container_name: soularr
# network_mode: service:gluetun
# depends_on:
# gluetun:
# condition: service_healthy
# lidarr:
# condition: service_started
# slskd:
# condition: service_started
# environment:
# <<: *lsio-environment
# LIDARR_URL: http://localhost:8686
# LIDARR_API_KEY: ${LIDARR_API_KEY}
# SLSKD_URL: http://localhost:5000
# SLSKD_API_KEY: ${SLSKD_API_KEY:-}
# volumes:
# - ${BASE_PATH}/config/soularr:/config
# - ${BASE_PATH}/downloads/soulseek:/downloads
# - ${BASE_PATH}/music:/music
# restart: unless-stopped
# ===========================================================================
# YOUTUBE AUDIO DOWNLOADER - yubal
# ===========================================================================
# DISABLED: The image ghcr.io/guillevc/yubal:latest is not publicly accessible
# (403 Forbidden). You may need to:
# 1. Build from source: https://github.com/guillevc/yubal
# 2. Request access to the container registry
# 3. Use an alternative image if available
# ===========================================================================
# yubal:
# image: ghcr.io/guillevc/yubal:latest
# container_name: yubal
# network_mode: service:gluetun
# depends_on:
# gluetun:
# condition: service_healthy
# environment:
# <<: *lsio-environment
# volumes:
# - ${BASE_PATH}/config/yubal:/config
# - ${BASE_PATH}/downloads/youtube:/downloads
# - ${BASE_PATH}/music:/music
# restart: unless-stopped
# ===========================================================================
# TORBOX AUTO DOWNLOADER
# ===========================================================================
# DISABLED: The image ghcr.io/mrjoiny/torbox-auto-downloader:latest is not
# publicly accessible (403 Forbidden). You may need to:
# 1. Build from source: https://github.com/MrJoiny/torbox-auto-downloader
# 2. Request access to the container registry
# 3. Use an alternative image if available
# ===========================================================================
# torbox-auto-downloader:
# image: ghcr.io/mrjoiny/torbox-auto-downloader:latest
# container_name: torbox-auto-downloader
# network_mode: service:gluetun
# depends_on:
# gluetun:
# condition: service_healthy
# environment:
# <<: *lsio-environment
# TORBOX_API_KEY: ${TORBOX_API_KEY}
# volumes:
# - ${BASE_PATH}/config/torbox:/config
# - ${BASE_PATH}/downloads/torbox:/downloads
# restart: unless-stopped
# ===========================================================================
# AUDIOBOOK SERVER - audiobookshelf
# ===========================================================================
# Web UI accessible at http://localhost:13378
# Documentation: https://github.com/advplyr/audiobookshelf
# ===========================================================================
audiobookshelf:
image: advplyr/audiobookshelf:latest
container_name: audiobookshelf
environment:
<<: *lsio-environment
ports:
- ${AUDIOBOOKSHELF_PORT:-13378}:80
volumes:
- ${BASE_PATH}/audiobooks:/audiobooks
- ${BASE_PATH}/config/audiobookshelf:/config
- ${BASE_PATH}/config/audiobookshelf/metadata:/metadata
restart: unless-stopped
networks:
- media_net
# ===========================================================================
# MUSIC STREAMING SERVER - koel
# ===========================================================================
# Web UI accessible at http://localhost:8000
# Default credentials: admin@koel.dev / KoelIsCool (change on first login)
# Documentation: https://github.com/koel/koel
# Note: Requires .env file - run init container first or mount config
# ===========================================================================
koel:
image: phanan/koel:latest
container_name: koel
environment:
<<: *lsio-environment
DB_CONNECTION: sqlite
DB_DATABASE: /data/koel.db
ADMIN_EMAIL: ${KOEL_ADMIN_EMAIL:-admin@koel.dev}
ADMIN_PASSWORD: ${KOEL_ADMIN_PASS:-KoelIsCool}
# Optional: For streaming optimization
STREAMING_METHOD: php
# Required for Koel to generate .env on first run
APP_KEY: ${KOEL_APP_KEY:-base64:your32characterbase64keyhere==}
APP_URL: ${KOEL_APP_URL:-http://localhost:8000}
ports:
- ${KOEL_PORT:-8000}:80
volumes:
- ${BASE_PATH}/music:/music
- ${BASE_PATH}/config/koel:/data
- ${BASE_PATH}/config/koel/.env:/var/www/html/.env
- ${BASE_PATH}/config/koel/covers:/var/www/html/public/img/covers
restart: unless-stopped
networks:
- media_net
# =============================================================================
# NETWORKS
# =============================================================================
networks:
media_net:
driver: bridge
name: media_net
# =============================================================================
# VOLUMES (optional - for persistent data if preferred over bind mounts)
# =============================================================================
# volumes:
# gluetun_data:
# qbittorrent_config:
# lidarr_config:
# slskd_data:
# soularr_config:
# yubal_config:
# torbox_config:
# audiobookshelf_config:
# audiobookshelf_metadata:
# koel_data: