189 lines
7.8 KiB
Markdown
189 lines
7.8 KiB
Markdown
# Arr Stack
|
|
|
|
Self-hosted media automation stack running via individual Docker Compose files, organized per service.
|
|
|
|
---
|
|
|
|
## Repository Structure
|
|
|
|
```
|
|
arr-stack/
|
|
├── bazarr/ docker-compose.yaml
|
|
├── ersatz/ docker-compose.yaml
|
|
├── flaresolverr/ docker-compose.yaml
|
|
├── kometa/ docker-compose.yaml
|
|
├── lidarr/ docker-compose.yaml
|
|
├── plexautolanguages/ docker-compose.yaml
|
|
├── prowlarr/ docker-compose.yaml
|
|
├── qbit-vpn/ docker-compose.yaml
|
|
├── radarr/ docker-compose.yaml
|
|
├── radarr4k/ docker-compose.yaml
|
|
├── readarr/ docker-compose.yaml
|
|
├── seerr/ docker-compose.yaml
|
|
├── sonarr/ docker-compose.yaml
|
|
├── sonarr4k/ docker-compose.yaml
|
|
├── tautulli/ docker-compose.yaml
|
|
├── refresh-radarr.sh
|
|
├── refresh-radarr4k.sh
|
|
├── refresh-sonarr.sh
|
|
└── refresh-sonarr4k.sh
|
|
```
|
|
|
|
---
|
|
|
|
## Services
|
|
|
|
| Service | Port | Purpose |
|
|
|---------|------|---------|
|
|
| [Prowlarr](https://github.com/Prowlarr/Prowlarr) | `9696` | Indexer manager - feeds all *arrs |
|
|
| [Radarr](https://radarr.video/) | `7878` | Movie collection manager |
|
|
| [Radarr 4K](https://radarr.video/) | `7879` | Movie collection manager (4K library) |
|
|
| [Sonarr](https://sonarr.tv/) | `8989` | TV series collection manager |
|
|
| [Sonarr 4K](https://sonarr.tv/) | `8990` | TV series collection manager (4K library) |
|
|
| [Lidarr](https://lidarr.audio/) | `8686` | Music collection manager |
|
|
| [Readarr](https://readarr.com/) | `8787` | Book/audiobook collection manager |
|
|
| [Bazarr](https://www.bazarr.media/) | `6767` | Subtitle manager |
|
|
| [FlareSolverr](https://github.com/FlareSolverr/FlareSolverr) | `8191` | Cloudflare bypass proxy for indexers |
|
|
| [Seerr](https://github.com/seerr-team/seerr) | `5055` | Media request portal (Overseerr fork) |
|
|
| [Tautulli](https://tautulli.com/) | `8181` | Plex stats and monitoring |
|
|
| [Kometa](https://kometa.wiki/) | `-` | Plex metadata/collections manager (runs on schedule at 03:00) |
|
|
| [PlexAutoLanguages](https://github.com/RemiRigal/Plex-Auto-Languages) | `-` | Auto-sets audio/subtitle language per user, set audio/subtitle language once for a show and all episodes will change |
|
|
| [ErsatzTV](https://ersatztv.org/) | `8409` | Virtual live TV channels from local media (only works for Plex Media Server owner and those in owner's 'Plex Home') |
|
|
| [qBittorrent + VPN](https://github.com/DyonR/docker-qbittorrentvpn) | `8080` / `8443` | Torrent client behind OpenVPN; HTTPS via sidecar Nginx |
|
|
|
|
---
|
|
|
|
## Data Layout
|
|
|
|
All services share a common volume structure on the host:
|
|
|
|
| Host Path | Purpose |
|
|
|-----------|---------|
|
|
| `/data` | Unified media root (movies, tv, music, books, downloads) |
|
|
| `/arr/<service>/appdata` | Per-service config (most services) |
|
|
| `/arr/<service>/config` | Per-service config (some services use `/config` naming) |
|
|
|
|
Having all services share `/data` means completed downloads are visible to the *arrs without cross-device moves.
|
|
|
|
---
|
|
|
|
## Refresh Scripts
|
|
|
|
The four refresh scripts hit their respective service's API to trigger a metadata refresh, missing media search, and RSS sync in sequence. Useful after library changes or to kick a stalled queue. NOTE: Arrs apps only search one time after adding a movie or tv-show. Manual refresh required if not using these scripts.
|
|
|
|
| Script | Target | Port |
|
|
|--------|--------|------|
|
|
| `refresh-radarr.sh` | Radarr | `7878` |
|
|
| `refresh-radarr4k.sh` | Radarr 4K | `7879` |
|
|
| `refresh-sonarr.sh` | Sonarr | `8989` |
|
|
| `refresh-sonarr4k.sh` | Sonarr 4K | `8990` |
|
|
|
|
Before using, set `API_KEY` at the top of each script to the API key found under **Settings → General** in the respective service UI.
|
|
|
|
```bash
|
|
chmod +x refresh-*.sh
|
|
./refresh-radarr.sh
|
|
```
|
|
|
|
---
|
|
|
|
## qBittorrent + VPN
|
|
|
|
The `qbit-vpn` stack runs two containers: the torrent client behind OpenVPN (`dyonr/qbittorrentvpn`) and a sidecar Nginx that terminates HTTPS on port `8443` and proxies to the qBittorrent web UI. The VPN credentials are in the compose file - keep that file out of public repos.
|
|
|
|
Ports:
|
|
- `8080` - qBittorrent web UI (HTTP, LAN only)
|
|
- `8443` - qBittorrent web UI (HTTPS via Nginx sidecar)
|
|
- `8999` / `8999/udp` - torrent peer traffic
|
|
|
|
SSL certs for Nginx are bind-mounted from `/arr/qbittorrent/ssl`. The Nginx config is at `/arr/qbittorrent/nginx.conf`.
|
|
|
|
---
|
|
|
|
## Starting / Stopping Services
|
|
|
|
Each service is independent. From its directory:
|
|
|
|
```bash
|
|
docker compose up -d
|
|
docker compose down
|
|
docker compose pull && docker compose up -d # update
|
|
```
|
|
|
|
---
|
|
|
|
## Notes
|
|
|
|
- All *arr services run as `PUID=0 / PGID=0` (root). This is due to how SMB shares are mounted to Proxmox LXCs, requiring 'PUID / PGID = 0'. If running in a VM (recommended), consider dropping to a dedicated `arr` user if hardening the host.
|
|
- `readarr` uses the `develop` tag (no stable release exists yet).
|
|
- `seerr` includes a healthcheck on `/api/v1/status` - useful for Uptime Kuma monitoring.
|
|
- `kometa` runs with `network_mode: host` so it can reach other services on localhost.
|
|
- FlareSolverr's port and log level are configurable via `.env` (`PORT`, `LOG_LEVEL`).
|
|
|
|
---
|
|
|
|
|
|
---
|
|
|
|
## Kometa Configuration (`kometa/config/config.yml`)
|
|
|
|
The Kometa config is templated - copy `config.yml.template` to `config.yml` and fill in credentials before first run.
|
|
|
|
### Active Libraries
|
|
|
|
| Library | Collections | Overlays |
|
|
|---------|-------------|---------|
|
|
| Movies | `basic`, `imdb` defaults | `media_info.yml`, `audience_rating.yml` |
|
|
| TV Shows | `basic`, `imdb` defaults | `media_info.yml`, `audience_rating.yml` |
|
|
| Music | `config/Music.yml` (local) | - |
|
|
|
|
4K Movies and 4K TV Shows libraries are defined but commented out. Uncomment and add to the `libraries:` block if/when those Plex libraries are active.
|
|
|
|
### Connected Services
|
|
|
|
| Service | Placeholder | Port |
|
|
|---------|-------------|------|
|
|
| Plex | `<YOUR_PLEX_IP>` | `32400` |
|
|
| Tautulli | `<YOUR_TAUTULLI_IP>` | `8181` |
|
|
| Radarr | `<YOUR_RADARR_IP>` | `7878` - root: `/data/media/movies` - profile: `HD - 720p/1080p` |
|
|
| Radarr 4K | `<YOUR_RADARR_4K_IP>` | `7879` - root: `/data/media/4k_movies` - profile: `Ultra-HD` |
|
|
| Sonarr | `<YOUR_SONARR_IP>` | `8989` - root: `/data/media/tv_shows` - profile: `HD - 720p/1080p` |
|
|
| Sonarr 4K | `<YOUR_SONARR_4K_IP>` | `8990` - root: `/data/media/4ktv_shows` - profile: `Ultra-HD` |
|
|
|
|
### Credentials to Fill In
|
|
|
|
All of the following must be set in `config.yml` before Kometa will run. Find them in each service's UI under **Settings → General → API Key** (or equivalent):
|
|
|
|
| Placeholder | Where to get it |
|
|
|-------------|----------------|
|
|
| `<YOUR_PLEX_TOKEN>` | Plex → Account → [Get token](https://support.plex.tv/articles/204059436/) |
|
|
| `<YOUR_TMDB_API_KEY>` | [TMDb API settings](https://www.themoviedb.org/settings/api) - **required** |
|
|
| `<YOUR_TAUTULLI_API_KEY>` | Tautulli → Settings → Web Interface |
|
|
| `<YOUR_RADARR_API_KEY>` | Radarr → Settings → General |
|
|
| `<YOUR_RADARR_4K_API_KEY>` | Radarr 4K → Settings → General |
|
|
| `<YOUR_SONARR_API_KEY>` | Sonarr → Settings → General |
|
|
| `<YOUR_SONARR_4K_API_KEY>` | Sonarr 4K → Settings → General |
|
|
| `github.token` | GitHub → Settings → Developer settings → Personal access tokens |
|
|
| `omdb.apikey` | [OMDb API](https://www.omdbapi.com/apikey.aspx) |
|
|
| `mdblist.apikey` | [MDBList](https://mdblist.com/preferences/) |
|
|
| `trakt.client_id` / `client_secret` | [Trakt API apps](https://trakt.tv/oauth/applications) |
|
|
|
|
Notifiarr, Gotify, AniDB, and MAL are stubbed out but disabled - fill in only if you use them.
|
|
|
|
### Custom Overlays
|
|
|
|
Local overlay files are expected at:
|
|
|
|
```
|
|
kometa/config/overlays/media_info.yml
|
|
kometa/config/overlays/audience_rating.yml
|
|
```
|
|
|
|
And the Music collection file at:
|
|
|
|
```
|
|
kometa/config/Music.yml
|
|
```
|
|
|
|
These are not included in this repo - create or source them separately.
|