Revise README for clarity and additional details
Updated README.md to enhance formatting and add prerequisites, setup instructions, and licensing information.
This commit is contained in:
@@ -1,5 +1,10 @@
|
|||||||
# Ainulindale
|
# 🎵 Ainulindale
|
||||||
A fully self-hosted, automated music discovery and streaming system. No Spotify. No YouTube Music. No ads. Just your music, your server, your rules.
|
|
||||||
|
> *"There was Eru, the One [...] and he made first the Ainur [...] and they sang before him, and he was glad."*
|
||||||
|
> — J.R.R. Tolkien, The Silmarillion
|
||||||
|
|
||||||
|
A fully self-hosted, automated music discovery and streaming system.
|
||||||
|
No Spotify. No YouTube Music. No ads. Just your music, your server, your rules.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -28,16 +33,29 @@ A fully self-hosted, automated music discovery and streaming system. No Spotify.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Unraid NAS (or any Linux server with Docker)
|
||||||
|
- ProtonVPN account (paid, for P2P/WireGuard support)
|
||||||
|
- Soulseek account — free at [slsknet.org](https://www.slsknet.org)
|
||||||
|
- ListenBrainz account — free at [listenbrainz.org](https://listenbrainz.org)
|
||||||
|
- Last.fm account — free at [last.fm](https://www.last.fm)
|
||||||
|
- Last.fm API key — free at [last.fm/api/account/create](https://www.last.fm/api/account/create)
|
||||||
|
- Substreamer app on your phone
|
||||||
|
- Pangolin or any reverse proxy for external access
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Folder Structure
|
## Folder Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
/mnt/user/appdata/
|
/mnt/user/appdata/
|
||||||
├── gluetun/ ← VPN state (auto-populated)
|
├── gluetun/ ← VPN state (auto-populated)
|
||||||
├── slskd/
|
├── slskd/
|
||||||
│ └── slskd.yml ← slskd config
|
│ └── slskd.yml ← slskd config (copy from repo)
|
||||||
└── explo/
|
└── explo/
|
||||||
├── .env ← Explo config
|
├── .env ← Explo config (copy from .env.example)
|
||||||
└── docker-compose.yml ← Full stack compose file
|
└── docker-compose.yml ← Full stack compose file (copy from repo)
|
||||||
|
|
||||||
/mnt/user/data/media/music/
|
/mnt/user/data/media/music/
|
||||||
├── incomplete/ ← In-progress downloads (Navidrome ignores these)
|
├── incomplete/ ← In-progress downloads (Navidrome ignores these)
|
||||||
@@ -47,149 +65,67 @@ A fully self-hosted, automated music discovery and streaming system. No Spotify.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## docker-compose.yml
|
## Setup
|
||||||
|
|
||||||
```yaml
|
### 1. Clone the repo
|
||||||
services:
|
|
||||||
|
|
||||||
gluetun:
|
```bash
|
||||||
image: qmcgaw/gluetun:latest
|
git clone https://github.com/yourusername/ainulindale
|
||||||
container_name: gluetun
|
cd ainulindale
|
||||||
cap_add:
|
|
||||||
- NET_ADMIN
|
|
||||||
devices:
|
|
||||||
- /dev/net/tun:/dev/net/tun
|
|
||||||
environment:
|
|
||||||
- VPN_SERVICE_PROVIDER=protonvpn
|
|
||||||
- VPN_TYPE=wireguard
|
|
||||||
- WIREGUARD_PRIVATE_KEY=YOUR_PRIVATE_KEY_HERE
|
|
||||||
- WIREGUARD_ADDRESSES=10.2.0.2/32
|
|
||||||
- SERVER_COUNTRIES=Switzerland
|
|
||||||
- TZ=Europe/Zurich
|
|
||||||
ports:
|
|
||||||
- 5030:5030
|
|
||||||
volumes:
|
|
||||||
- /mnt/user/appdata/gluetun:/gluetun
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
slskd:
|
|
||||||
image: slskd/slskd:latest
|
|
||||||
container_name: slskd
|
|
||||||
network_mode: "service:gluetun"
|
|
||||||
depends_on:
|
|
||||||
gluetun:
|
|
||||||
condition: service_healthy
|
|
||||||
environment:
|
|
||||||
- SLSKD_REMOTE_CONFIGURATION=true
|
|
||||||
volumes:
|
|
||||||
- /mnt/user/appdata/slskd:/app
|
|
||||||
- /mnt/user/data/media/music:/downloads
|
|
||||||
- /mnt/user/data/media/music:/music:ro
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
explo-weekly:
|
|
||||||
image: ghcr.io/lumepart/explo:latest
|
|
||||||
container_name: explo-weekly
|
|
||||||
environment:
|
|
||||||
- EXECUTE_ON_START=true
|
|
||||||
- WEEKLY_EXPLORATION_FLAGS=--playlist=weekly-exploration --persist
|
|
||||||
volumes:
|
|
||||||
- /mnt/user/appdata/explo/.env:/opt/explo/.env
|
|
||||||
- /mnt/user/data/media/music/explo:/data
|
|
||||||
- /mnt/user/data/media/music:/slskd
|
|
||||||
restart: "no"
|
|
||||||
|
|
||||||
explo-daily:
|
|
||||||
image: ghcr.io/lumepart/explo:latest
|
|
||||||
container_name: explo-daily
|
|
||||||
environment:
|
|
||||||
- EXECUTE_ON_START=true
|
|
||||||
- DAILY_JAMS_FLAGS=--playlist=daily-jams --download-mode=skip
|
|
||||||
volumes:
|
|
||||||
- /mnt/user/appdata/explo/.env:/opt/explo/.env
|
|
||||||
- /mnt/user/data/media/music/explo:/data
|
|
||||||
- /mnt/user/data/media/music:/slskd
|
|
||||||
restart: "no"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
### 2. Create your config files
|
||||||
|
|
||||||
## Explo .env
|
```bash
|
||||||
|
cp .env.example .env
|
||||||
```env
|
|
||||||
# --- Discovery ---
|
|
||||||
DISCOVERY_SERVICE=listenbrainz
|
|
||||||
LISTENBRAINZ_USER=your_listenbrainz_username
|
|
||||||
LISTENBRAINZ_DISCOVERY=playlist
|
|
||||||
|
|
||||||
# --- Navidrome (Subsonic API) ---
|
|
||||||
EXPLO_SYSTEM=subsonic
|
|
||||||
SYSTEM_URL=http://192.168.1.x:4533
|
|
||||||
SYSTEM_USERNAME=your_navidrome_username
|
|
||||||
SYSTEM_PASSWORD=your_navidrome_password
|
|
||||||
|
|
||||||
# --- Downloaders (slskd first, YouTube fallback) ---
|
|
||||||
DOWNLOAD_SERVICES=slskd,youtube
|
|
||||||
TRACK_EXTENSION=mp3
|
|
||||||
|
|
||||||
# --- slskd ---
|
|
||||||
SLSKD_URL=http://slskd:5030
|
|
||||||
SLSKD_API_KEY=your_slskd_api_key
|
|
||||||
MIGRATE_DOWNLOADS=true
|
|
||||||
RENAME_TRACK=true
|
|
||||||
|
|
||||||
# --- Quality gates (FLAC/WAV preferred, 320kbps minimum) ---
|
|
||||||
EXTENSIONS=flac,wav,mp3
|
|
||||||
MIN_BITRATE=320
|
|
||||||
MIN_BIT_DEPTH=16
|
|
||||||
|
|
||||||
# --- YouTube fallback (optional) ---
|
|
||||||
YOUTUBE_API_KEY=your_youtube_api_key
|
|
||||||
|
|
||||||
# --- Misc ---
|
|
||||||
SLEEP=2
|
|
||||||
LOG_LEVEL=INFO
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
Fill in `.env` with your WireGuard private key, paths, and VPN country.
|
||||||
|
|
||||||
## slskd.yml
|
Copy `slskd.yml` to your appdata folder:
|
||||||
|
```bash
|
||||||
```yaml
|
cp slskd.yml /mnt/user/appdata/slskd/slskd.yml
|
||||||
soulseek:
|
|
||||||
username: your_soulseek_username
|
|
||||||
password: your_soulseek_password
|
|
||||||
|
|
||||||
web:
|
|
||||||
authentication:
|
|
||||||
username: your_chosen_web_username
|
|
||||||
password: your_chosen_web_password
|
|
||||||
api_keys:
|
|
||||||
explo_key:
|
|
||||||
key: your_api_key_minimum_16_chars_long
|
|
||||||
role: readwrite
|
|
||||||
cidr: 0.0.0.0/0,::/0
|
|
||||||
|
|
||||||
directories:
|
|
||||||
incomplete: /downloads/incomplete
|
|
||||||
downloads: /downloads
|
|
||||||
|
|
||||||
transfers:
|
|
||||||
download:
|
|
||||||
slots: 50
|
|
||||||
upload:
|
|
||||||
slots: 20
|
|
||||||
|
|
||||||
shares:
|
|
||||||
directories:
|
|
||||||
- /music
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
Fill in your Soulseek credentials and choose a web UI username/password.
|
||||||
|
|
||||||
## Navidrome (Unraid Community Apps)
|
Copy the Explo env block from `.env.example` into a separate file:
|
||||||
|
```bash
|
||||||
|
cp .env.example /mnt/user/appdata/explo/.env
|
||||||
|
```
|
||||||
|
|
||||||
Navidrome is installed via Unraid's Community Apps store. Add these extra environment variables in the container template:
|
Fill in your ListenBrainz username, Navidrome URL/credentials, and slskd API key.
|
||||||
|
|
||||||
|
### 3. Create required folders
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p /mnt/user/appdata/{gluetun,slskd,explo}
|
||||||
|
mkdir -p /mnt/user/data/media/music/{explo,incomplete}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Get your ProtonVPN WireGuard key
|
||||||
|
|
||||||
|
1. Log into [account.proton.me](https://account.proton.me) → VPN → Downloads
|
||||||
|
2. Select **WireGuard** protocol and a **P2P-capable server**
|
||||||
|
3. Generate the config and copy the `PrivateKey` value into your `.env`
|
||||||
|
|
||||||
|
### 5. Start the stack
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Start VPN first and verify it connects
|
||||||
|
docker compose up -d gluetun
|
||||||
|
docker compose logs -f gluetun
|
||||||
|
# Look for: "Public IP address is x.x.x.x"
|
||||||
|
|
||||||
|
# Then start slskd
|
||||||
|
docker compose up -d slskd
|
||||||
|
```
|
||||||
|
|
||||||
|
Open `http://your-nas-ip:5030`, log in with your slskd credentials, go to **Options → API Keys**, generate a key and paste it into `/mnt/user/appdata/explo/.env` as `SLSKD_API_KEY`.
|
||||||
|
|
||||||
|
### 6. Install Navidrome via Unraid Community Apps
|
||||||
|
|
||||||
|
Add these environment variables in the Navidrome container template:
|
||||||
|
|
||||||
| Variable | Value |
|
| Variable | Value |
|
||||||
|---|---|
|
|---|---|
|
||||||
@@ -198,23 +134,17 @@ Navidrome is installed via Unraid's Community Apps store. Add these extra enviro
|
|||||||
| `ND_LASTFM_ENABLED` | `true` |
|
| `ND_LASTFM_ENABLED` | `true` |
|
||||||
| `ND_SCANSCHEDULE` | `1m` |
|
| `ND_SCANSCHEDULE` | `1m` |
|
||||||
|
|
||||||
Last.fm API credentials: [last.fm/api/account/create](https://www.last.fm/api/account/create)
|
### 7. Set up automation via Unraid User Scripts
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Automation — Unraid User Scripts
|
|
||||||
|
|
||||||
Install the **User Scripts** plugin from Community Apps, then add two scripts:
|
Install the **User Scripts** plugin from Community Apps, then add two scripts:
|
||||||
|
|
||||||
### Weekly Exploration (every Tuesday at 00:15)
|
**Weekly Exploration** — Cron: `15 0 * * 2`
|
||||||
Cron: `15 0 * * 2`
|
|
||||||
```bash
|
```bash
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
docker compose -f /mnt/user/appdata/explo/docker-compose.yml up explo-weekly
|
docker compose -f /mnt/user/appdata/explo/docker-compose.yml up explo-weekly
|
||||||
```
|
```
|
||||||
|
|
||||||
### Daily Jams (every day at 00:15)
|
**Daily Jams** — Cron: `15 0 * * *`
|
||||||
Cron: `15 0 * * *`
|
|
||||||
```bash
|
```bash
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
docker compose -f /mnt/user/appdata/explo/docker-compose.yml up explo-daily
|
docker compose -f /mnt/user/appdata/explo/docker-compose.yml up explo-daily
|
||||||
@@ -257,13 +187,6 @@ You discover new music 🎵
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Prerequisites
|
## License
|
||||||
|
|
||||||
- Unraid NAS (or any Linux server with Docker)
|
MIT — do whatever you want with it.
|
||||||
- ProtonVPN account (paid, for P2P/WireGuard support)
|
|
||||||
- Soulseek account — free at [slsknet.org](https://www.slsknet.org)
|
|
||||||
- ListenBrainz account — free at [listenbrainz.org](https://listenbrainz.org)
|
|
||||||
- Last.fm account — free at [last.fm](https://www.last.fm)
|
|
||||||
- Last.fm API key — free at [last.fm/api](https://www.last.fm/api/account/create)
|
|
||||||
- Substreamer app on your phone
|
|
||||||
- Pangolin or any reverse proxy for external access
|
|
||||||
|
|||||||
Reference in New Issue
Block a user