diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..84ab68d --- /dev/null +++ b/.env.example @@ -0,0 +1,94 @@ +# ============================================================================= +# Audiojacker Environment Configuration - Example +# ============================================================================= +# Copy this file to .env and fill in your actual values +# All sensitive credentials should be kept in .env (add to .gitignore!) +# ============================================================================= + +# ----------------------------------------------------------------------------- +# BASE CONFIGURATION +# ----------------------------------------------------------------------------- +# Base path for all media and configuration files +BASE_PATH=./audiojacker + +# User/Group IDs for file permissions (run `id -u` and `id -g` to find yours) +PUID=1000 +PGID=1000 + +# Timezone (use TZ database name: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) +TZ=America/New_York + +# ----------------------------------------------------------------------------- +# PROTONVPN CONFIGURATION (for gluetun) +# ----------------------------------------------------------------------------- +# Get your OpenVPN credentials from: https://account.protonvpn.com/settings +# Note: These are NOT your ProtonVPN login credentials - they're separate OpenVPN credentials +PROTONVPN_USER=your_protonvpn_openvpn_username +PROTONVPN_PASSWORD=your_protonvpn_openvpn_password + +# Preferred server countries (comma-separated, e.g., Netherlands,Switzerland,Iceland) +PROTONVPN_SERVERS=Netherlands + +# ----------------------------------------------------------------------------- +# QBITTORRENT CONFIGURATION +# ----------------------------------------------------------------------------- +# Web UI port (default: 8080) +QBITTORRENT_PORT=8080 + +# ----------------------------------------------------------------------------- +# LIDARR CONFIGURATION +# ----------------------------------------------------------------------------- +# Web UI port (default: 8686) +LIDARR_PORT=8686 + +# API key will be auto-generated on first start, or set manually +# Find it in Lidarr Settings > General > Security +LIDARR_API_KEY=your_lidarr_api_key_here + +# ----------------------------------------------------------------------------- +# SOULSEEK / SLSKD CONFIGURATION +# ----------------------------------------------------------------------------- +# Your Soulseek account credentials (create at https://www.slsknet.org) +SOULSEEK_USER=your_soulseek_username +SOULSEEK_PASS=your_soulseek_password + +# slskd Web UI port (default: 5000) +SLSKD_PORT=5000 + +# slskd admin credentials for Web UI +SLSKD_ADMIN_USER=admin +SLSKD_ADMIN_PASS=admin + +# ----------------------------------------------------------------------------- +# SOULARR CONFIGURATION +# ----------------------------------------------------------------------------- +# Web UI port (default: 8400) +SOULARR_PORT=8400 + +# ----------------------------------------------------------------------------- +# YUBAL CONFIGURATION +# ----------------------------------------------------------------------------- +# Web UI port (default: 8888) +YUBAL_PORT=8888 + +# ----------------------------------------------------------------------------- +# TORBOX CONFIGURATION +# ----------------------------------------------------------------------------- +# Get your API key from: https://torbox.app/settings +TORBOX_API_KEY=your_torbox_api_key + +# ----------------------------------------------------------------------------- +# AUDIOBOOKSHELF CONFIGURATION +# ----------------------------------------------------------------------------- +# Web UI port (default: 13378) +AUDIOBOOKSHELF_PORT=13378 + +# ----------------------------------------------------------------------------- +# KOEL CONFIGURATION +# ----------------------------------------------------------------------------- +# Web UI port (default: 8000) +KOEL_PORT=8000 + +# Admin credentials for Koel +KOEL_ADMIN_EMAIL=admin@koel.dev +KOEL_ADMIN_PASS=KoelIsCool \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b63ac15 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Environment files (contain sensitive credentials) +.env +*.env.local + +# Configuration directories with sensitive data +config/ + +# IDE and editor files +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# OS files +.DS_Store +Thumbs.db + +# Docker volumes (if using local volumes) +docker-volumes/ + +# Logs +*.log +logs/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e5a3795 --- /dev/null +++ b/README.md @@ -0,0 +1,292 @@ +# Audiojacker - All-in-One Media Download & Streaming Stack + +A comprehensive Docker Compose setup for automated media downloading and streaming with VPN protection. + +## 🎯 Features + +- **VPN Protection**: All download services route through ProtonVPN via gluetun +- **Torrent Downloads**: qBittorrent with Web UI +- **Music Management**: Lidarr for automated music collection management +- **Soulseek Integration**: slskd client + soularr for Lidarr integration +- **YouTube Downloads**: yubal for audio extraction +- **Torbox Integration**: Automated debrid downloading +- **Audiobook Streaming**: audiobookshelf server +- **Music Streaming**: Koel self-hosted music player + +## 📋 Services Overview + +| Service | Purpose | Port | Network | +|---------|---------|------|---------| +| gluetun | VPN Gateway | - | Bridge | +| qBittorrent | Torrent Client | 8080 | Via VPN | +| Lidarr | Music Manager | 8686 | Via VPN | +| slskd | Soulseek Client | 5000 | Via VPN | +| soularr | Lidarr-Soulseek Bridge | 8400 | Via VPN | +| yubal | YouTube Downloader | 8888 | Via VPN | +| torbox-auto-downloader | Torbox Integration | - | Via VPN | +| audiobookshelf | Audiobook Server | 13378 | Direct | +| koel | Music Streaming | 8000 | Direct | + +## 🚀 Quick Start + +### 1. Prerequisites + +- Docker and Docker Compose installed +- ProtonVPN account (OpenVPN credentials) +- Soulseek account (for slskd) +- Torbox account (optional, for torbox-auto-downloader) + +### 2. Clone/Create Directory Structure + +```bash +# Create the base directory +sudo mkdir -p /mnt/fast-block/audiojacker/{downloads,audiobooks,music,config} + +# Create subdirectories +sudo mkdir -p /mnt/fast-block/audiojacker/downloads/{torrents,soulseek,youtube,torbox,complete} +sudo mkdir -p /mnt/fast-block/audiojacker/music/{incoming,library} +``` + +### 3. Configure Environment + +```bash +# Copy the example environment file +cp .env.example .env + +# Edit with your credentials +nano .env +``` + +**Required credentials to fill in:** + +| Variable | Where to get it | +|----------|-----------------| +| `PROTONVPN_USER` | [ProtonVPN Account](https://account.protonvpn.com/settings) → OpenVPN/IKEv2 username | +| `PROTONVPN_PASSWORD` | [ProtonVPN Account](https://account.protonvpn.com/settings) → OpenVPN/IKEv2 password | +| `SOULSEEK_USER` | [Soulseek](https://www.slsknet.org) account | +| `SOULSEEK_PASS` | [Soulseek](https://www.slsknet.org) password | +| `TORBOX_API_KEY` | [Torbox](https://torbox.app/settings) API key | + +### 4. Set Permissions + +```bash +# Set ownership (replace with your PUID:PGID) +sudo chown -R 1000:1000 /mnt/fast-block/audiojacker + +# Set permissions +sudo chmod -R 755 /mnt/fast-block/audiojacker +``` + +### 5. Start the Stack + +```bash +# Start all services +docker-compose up -d + +# Check status +docker-compose ps + +# View logs +docker-compose logs -f +``` + +### 6. Access Web Interfaces + +| Service | URL | Default Credentials | +|---------|-----|---------------------| +| qBittorrent | http://localhost:8080 | `admin` / `adminadmin` | +| Lidarr | http://localhost:8686 | None (set on first access) | +| slskd | http://localhost:5000 | Set in .env (`SLSKD_ADMIN_USER/PASS`) | +| soularr | http://localhost:8400 | - | +| yubal | http://localhost:8888 | - | +| audiobookshelf | http://localhost:13378 | None (set on first access) | +| koel | http://localhost:8000 | Set in .env (`KOEL_ADMIN_EMAIL/PASS`) | + +## 📁 Directory Structure + +``` +/mnt/fast-block/audiojacker/ +├── downloads/ +│ ├── torrents/ # qBittorrent downloads +│ ├── soulseek/ # slskd downloads +│ ├── youtube/ # yubal downloads +│ ├── torbox/ # Torbox downloads +│ └── complete/ # Completed downloads +├── audiobooks/ # Audiobook library +├── music/ +│ ├── incoming/ # Music being processed +│ └── library/ # Organized music library +└── config/ + ├── gluetun/ + ├── qbittorrent/ + ├── lidarr/ + ├── slskd/ + ├── soularr/ + ├── yubal/ + ├── torbox/ + ├── audiobookshelf/ + └── koel/ +``` + +## ⚙️ Configuration + +### ProtonVPN Setup + +1. Log into [ProtonVPN](https://account.protonvpn.com/settings) +2. Go to **Downloads** → **OpenVPN configuration** +3. Note your **OpenVPN / IKEv2 username** and **password** +4. (Optional) Choose preferred server countries in `.env` + +### Lidarr Setup + +1. Access Lidarr at http://localhost:8686 +2. Complete the setup wizard +3. Add your music library path: `/music/library` +4. Add download client: qBittorrent at `localhost:8080` +5. Get API key from **Settings** → **General** → **Security** +6. Update `.env` with `LIDARR_API_KEY` +7. Restart soularr: `docker-compose restart soularr` + +### slskd Setup + +1. Access slskd at http://localhost:5000 +2. Login with credentials from `.env` +3. Configure share directories in **Shares** settings +4. Add `/music` as a share directory + +### soularr Setup + +soularr connects Lidarr with Soulseek for automated downloads: + +1. Ensure Lidarr is configured and running +2. Ensure slskd is configured and running +3. soularr will automatically search Soulseek for Lidarr requests + +### qBittorrent Setup + +1. Access qBittorrent at http://localhost:8080 +2. Login with `admin` / `adminadmin` +3. **Change password immediately** in **Tools** → **Options** → **Web UI** +4. Set download path to `/downloads` +5. Configure connection settings as needed + +### audiobookshelf Setup + +1. Access audiobookshelf at http://localhost:13378 +2. Create admin account on first access +3. Add library pointing to `/audiobooks` +4. Configure metadata provider preferences + +### Koel Setup + +1. Access Koel at http://localhost:8000 +2. Login with credentials from `.env` +3. Scan music library: `/music` +4. Configure settings as needed + +## 🔧 Maintenance + +### View Logs + +```bash +# All services +docker-compose logs -f + +# Specific service +docker-compose logs -f gluetun +docker-compose logs -f qbittorrent +``` + +### Restart Services + +```bash +# Restart all +docker-compose restart + +# Restart specific service +docker-compose restart gluetun +``` + +### Update Services + +```bash +# Pull latest images +docker-compose pull + +# Recreate containers with new images +docker-compose up -d +``` + +### Stop Services + +```bash +# Stop all +docker-compose down + +# Stop and remove volumes +docker-compose down -v +``` + +## 🐛 Troubleshooting + +### VPN Not Connecting + +```bash +# Check gluetun logs +docker-compose logs gluetun + +# Common issues: +# - Wrong OpenVPN credentials +# - Server country not available +# - Network connectivity issues +``` + +### Services Can't Connect Through VPN + +Ensure services are using `network_mode: service:gluetun` and gluetun is healthy: + +```bash +# Check gluetun health +docker-compose ps gluetun + +# Check VPN connection +docker-compose exec gluetun curl -s https://ipinfo.io +``` + +### Permission Issues + +```bash +# Check current PUID/PGID +id + +# Update .env with correct values +# Fix ownership +sudo chown -R $(id -u):$(id -g) /mnt/fast-block/audiojacker +``` + +### Port Conflicts + +If default ports are in use, modify the port mappings in `.env`: + +```bash +# Example: Change qBittorrent port +QBITTORRENT_PORT=18080 +``` + +## 📚 Additional Resources + +- [gluetun Wiki](https://github.com/qdm12/gluetun/wiki) +- [qBittorrent Documentation](https://github.com/linuxserver/docker-qbittorrent) +- [Lidarr Documentation](https://lidarr.audio/) +- [slskd Documentation](https://github.com/slskd/slskd) +- [soularr GitHub](https://github.com/guillevc/yubal) +- [audiobookshelf Documentation](https://www.audiobookshelf.org/) +- [Koel Documentation](https://koel.dev/) + +## 📜 License + +This configuration is provided as-is. Individual services have their own licenses. + +## ⚠️ Disclaimer + +This setup is for personal use with legally obtained content. Ensure compliance with copyright laws in your jurisdiction. The authors are not responsible for any misuse of this software. \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..65ab21a --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,292 @@ +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 + # =========================================================================== + gluetun: + image: qmcgaw/gluetun:latest + container_name: gluetun + cap_add: + - NET_ADMIN + devices: + - /dev/net/tun:/dev/net/tun + environment: + <<: *lsio-environment + VPN_SERVICE_PROVIDER: protonvpn + VPN_TYPE: openvpn + OPENVPN_USER: ${PROTONVPN_USER} + OPENVPN_PASSWORD: ${PROTONVPN_PASSWORD} + SERVER_COUNTRIES: ${PROTONVPN_SERVERS:-Netherlands} + # Optional: Add more ProtonVPN options + # SERVER_CITIES: Amsterdam + # VPN_ENDPOINT_IP: + # VPN_ENDPOINT_PORT: + volumes: + - ${BASE_PATH}/config/gluetun:/gluetun + ports: + # qBittorrent Web UI (routed through VPN) + - ${QBITTORRENT_PORT:-8080}: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) + - ${SOULARR_PORT:-8400}:8400 + # yubal Web UI (routed through VPN) + - ${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 + + # =========================================================================== + # TORRENT CLIENT - qBittorrent + # =========================================================================== + # Web UI accessible at http://localhost:8080 + # 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 + + # =========================================================================== + # 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 + + # =========================================================================== + # 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 + + # =========================================================================== + # LIDARR + SOULSEEK INTEGRATION - soularr + # =========================================================================== + # Connects Lidarr with Soulseek for automated music downloading + # Documentation: https://github.com/guillevc/yubal + # Note: soularr may need to be built from source or use alternative image + # =========================================================================== + 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 + # =========================================================================== + # Web UI accessible at http://localhost:8888 + # Documentation: https://github.com/guillevc/yubal + # =========================================================================== + 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 + # =========================================================================== + # Automated downloading from Torbox service + # Documentation: https://github.com/MrJoiny/torbox-auto-downloader + # =========================================================================== + 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} + # Add additional Torbox configuration as needed + 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 + # =========================================================================== + koel: + image: koel/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 + ports: + - ${KOEL_PORT:-8000}:80 + volumes: + - ${BASE_PATH}/music:/music + - ${BASE_PATH}/config/koel:/data + - ${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: \ No newline at end of file