Created
May 24, 2026 01:10
-
-
Save brokosz/45f76ae6254787e037812a835c685223 to your computer and use it in GitHub Desktop.
Arr stack setup
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| # *arr Stack Management Script | |
| # Compose file: ~/.config/arr-stack/docker-compose.yml | |
| # | |
| # Usage: arr-stack-manager.sh <command> [service] | |
| # | |
| # Commands: | |
| # check [service] Check for available updates (all or one) | |
| # update-all Pull and restart all services | |
| # update <service> Pull and restart one service | |
| # restart <service> Restart a service without pulling | |
| # logs <service> Tail logs for a service | |
| # status Show running state of all services | |
| # start [service] Start all or one service | |
| # stop [service] Stop all or one service | |
| # | |
| # Services: sonarr, radarr, lidarr, readarr, bazarr, seerr, neutarr, kavita | |
| COMPOSE_DIR="$HOME/.config/arr-stack" | |
| cd "$COMPOSE_DIR" || exit 1 | |
| check_updates() { | |
| echo "🔍 Checking for updates..." | |
| if [ -n "$1" ]; then | |
| services="$1" | |
| else | |
| services=$(docker-compose config --services) | |
| fi | |
| for service in $services; do | |
| echo "Checking $service..." | |
| image_name=$(docker-compose config | grep -A2 "^ $service:" | grep "image:" | awk '{print $2}') | |
| local_hash=$(docker inspect --format='{{.Id}}' "$image_name" 2>/dev/null) | |
| remote_hash=$(docker pull --platform linux/amd64 "$image_name" 2>&1 | grep "Digest:" | awk '{print $2}' || docker inspect --format='{{.RepoDigests}}' "$image_name" 2>/dev/null | grep -o 'sha256:[a-f0-9]*' | head -1) | |
| if [ "$local_hash" != "$remote_hash" ] && [ -n "$remote_hash" ]; then | |
| echo "📦 $service: Update available" | |
| else | |
| echo "✅ $service: Up to date" | |
| fi | |
| done | |
| } | |
| case "$1" in | |
| "update-all") | |
| echo "🔄 Updating entire *arr stack..." | |
| docker-compose pull | |
| docker-compose up -d | |
| echo "✅ All services updated!" | |
| ;; | |
| "update") | |
| if [ -z "$2" ]; then | |
| echo "Usage: $0 update <service>" | |
| exit 1 | |
| fi | |
| echo "🔄 Updating $2..." | |
| docker-compose pull "$2" | |
| docker-compose up -d "$2" | |
| echo "✅ $2 updated!" | |
| ;; | |
| "restart") | |
| if [ -z "$2" ]; then | |
| echo "Usage: $0 restart <service>" | |
| exit 1 | |
| fi | |
| echo "🔄 Restarting $2..." | |
| docker-compose restart "$2" | |
| echo "✅ $2 restarted!" | |
| ;; | |
| "logs") | |
| if [ -z "$2" ]; then | |
| echo "Usage: $0 logs <service>" | |
| exit 1 | |
| fi | |
| docker-compose logs -f "$2" | |
| ;; | |
| "status") | |
| echo "📊 *arr Stack Status:" | |
| docker-compose ps | |
| ;; | |
| "stop") | |
| if [ -z "$2" ]; then | |
| echo "🛑 Stopping all services..." | |
| docker-compose down | |
| else | |
| echo "🛑 Stopping $2..." | |
| docker-compose stop "$2" | |
| fi | |
| ;; | |
| "start") | |
| if [ -z "$2" ]; then | |
| echo "🚀 Starting all services..." | |
| docker-compose up -d | |
| else | |
| echo "🚀 Starting $2..." | |
| docker-compose up -d "$2" | |
| fi | |
| ;; | |
| "check") | |
| check_updates "$2" | |
| ;; | |
| *) | |
| echo "🎬 *arr Stack Manager" | |
| echo "" | |
| echo "Usage: $0 <command> [service]" | |
| echo "" | |
| echo "Commands:" | |
| echo " check [service] Check for available updates" | |
| echo " update-all Update all services" | |
| echo " update <service> Update specific service" | |
| echo " restart <service> Restart specific service" | |
| echo " logs <service> View logs for specific service" | |
| echo " status Show status of all services" | |
| echo " start [service] Start all or specific service" | |
| echo " stop [service] Stop all or specific service" | |
| echo "" | |
| echo "Services: sonarr, radarr, lidarr, readarr, bazarr, seerr, neutarr, kavita" | |
| echo "" | |
| echo "Examples:" | |
| echo " $0 check # Check all services" | |
| echo " $0 check radarr # Check just Radarr" | |
| echo " $0 update-all # Update everything" | |
| echo " $0 update sonarr # Update just Sonarr" | |
| echo " $0 restart radarr # Restart Radarr" | |
| echo " $0 logs bazarr # View Bazarr logs" | |
| ;; | |
| esac |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # arr-stack docker-compose.yml | |
| # Replace /YOUR_CONFIG_BASE and /YOUR_MEDIA_BASE with your actual paths | |
| # PUID/PGID: match your host user (id -u / id -g) | |
| services: | |
| sonarr: | |
| image: lscr.io/linuxserver/sonarr:latest | |
| container_name: sonarr | |
| environment: | |
| - PUID=1000 | |
| - PGID=1000 | |
| - TZ=America/Denver | |
| - UMASK_SET=022 | |
| volumes: | |
| - /YOUR_CONFIG_BASE/sonarr:/config | |
| - /YOUR_MEDIA_BASE:/media | |
| ports: | |
| - 32774:8989 | |
| restart: unless-stopped | |
| radarr: | |
| image: lscr.io/linuxserver/radarr:latest | |
| container_name: radarr | |
| environment: | |
| - PUID=1000 | |
| - PGID=1000 | |
| - TZ=America/Denver | |
| - UMASK_SET=022 | |
| volumes: | |
| - /YOUR_CONFIG_BASE/radarr:/config | |
| - /YOUR_MEDIA_BASE:/media | |
| ports: | |
| - 32773:7878 | |
| restart: unless-stopped | |
| lidarr: | |
| image: lscr.io/linuxserver/lidarr:latest | |
| container_name: lidarr | |
| environment: | |
| - PUID=1000 | |
| - PGID=1000 | |
| - TZ=America/Denver | |
| - UMASK_SET=022 | |
| volumes: | |
| - /YOUR_CONFIG_BASE/lidarr:/config | |
| - /YOUR_MEDIA_BASE:/media | |
| ports: | |
| - 32775:8686 | |
| restart: unless-stopped | |
| readarr: | |
| # using pennydreadful/bookshelf:softcover instead of linuxserver/readarr | |
| image: ghcr.io/pennydreadful/bookshelf:softcover | |
| container_name: readarr | |
| environment: | |
| - PUID=1000 | |
| - PGID=1000 | |
| - TZ=America/Denver | |
| volumes: | |
| - /YOUR_CONFIG_BASE/readarr:/config | |
| - /YOUR_MEDIA_BASE:/media | |
| ports: | |
| - 32781:8787 | |
| restart: unless-stopped | |
| bazarr: | |
| image: lscr.io/linuxserver/bazarr:latest | |
| container_name: bazarr | |
| environment: | |
| - PUID=1000 | |
| - PGID=1000 | |
| - TZ=America/Denver | |
| - UMASK_SET=022 | |
| volumes: | |
| - /YOUR_CONFIG_BASE/bazarr:/config | |
| - /YOUR_MEDIA_BASE:/media | |
| ports: | |
| - 32772:6767 | |
| restart: unless-stopped | |
| seerr: | |
| image: ghcr.io/seerr-team/seerr:latest | |
| init: true | |
| container_name: seerr | |
| environment: | |
| - PUID=1000 | |
| - PGID=1000 | |
| - TZ=America/Denver | |
| volumes: | |
| - /YOUR_CONFIG_BASE/seerr:/app/config | |
| ports: | |
| - 32779:5055 | |
| restart: unless-stopped | |
| neutarr: | |
| image: iampuid0/neutarr:latest | |
| container_name: neutarr | |
| environment: | |
| - PUID=1000 | |
| - PGID=1000 | |
| - TZ=America/Denver | |
| volumes: | |
| - /YOUR_CONFIG_BASE/neutarr:/config | |
| ports: | |
| - 32780:9705 | |
| restart: unless-stopped | |
| kavita: | |
| image: jvmilazz0/kavita:latest | |
| container_name: kavita | |
| environment: | |
| - PUID=1000 | |
| - PGID=1000 | |
| - TZ=America/Denver | |
| volumes: | |
| - /YOUR_CONFIG_BASE/kavita:/kavita/config | |
| - /YOUR_MEDIA_BASE/books:/books | |
| ports: | |
| - 32784:5000 | |
| restart: unless-stopped |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
*arr Stack — Docker Compose
A Docker Compose setup for running a full *arr media management stack. Works on macOS or Linux with any Docker runtime.
Services
Prerequisites
Setup
1. Configure paths
Edit
docker-compose.ymland replace the two placeholders throughout:/YOUR_CONFIG_BASE— where each app stores its config (e.g./opt/dockeror/Volumes/Data/docker)/YOUR_MEDIA_BASE— root of your media library (e.g./mnt/mediaor/Volumes/Media)2. Set PUID/PGID
Replace
1000with your actual user and group IDs:3. Start the stack
Management Script
arr-stack-manager.shis a convenience wrapper arounddocker compose. Edit theCOMPOSE_DIRvariable at the top to match where you placeddocker-compose.yml.Install it:
Notes
ghcr.io/pennydreadful/bookshelf:softcover— a maintained fork of the upstream imagedocker-compose.ymlif needed