Media Server

Disk

  • /srv/media: xfs, 4 TB

  • /srv/media/cache, xfs, 1 TB

  • /srv/media/config, ext4, 10 GB

  • /var/lib/docker, xfs, 10G

Notes

  • First startup of each app requires initial configuration.

  • Read linuxserver documentation for configuration instructions.

Docker Stuff

I hate docker, but half of these applications are a horrific mess and docker is a great way to stuff it all away and not think about it. It also makes updates much more reliable (for the same reason).

/srv/media/update:

#!/bin/sh
docker-compose pull
docker-compose up --force-recreate --build -d
docker image prune -f

/srv/media/docker-compose.yml:

version: '2.1'
services:

  qbittorrent:
    image: ghcr.io/linuxserver/qbittorrent
    container_name: qbittorrent
    hostname: qbittorrent
    network_mode: media_network
    ports:
      - '8080:8080'
      - '6881:6881'
      - '6881:6881/udp'
    environment:
      - PUID=2001
      - PGID=2001
      - VERSION=docker
      - TZ=America/Central
    volumes:
      - /srv/media/config/qbittorrent:/config
      - /srv/media/cache/qbittorrent:/downloads
      - /srv/media/cache/sonarr:/downloads/sonarr
      - /srv/media/cache/radarr:/downloads/radarr
    restart: unless-stopped

  sabnzbd:
    image: ghcr.io/linuxserver/sabnzbd
    container_name: sabnzbd
    hostname: sabnzbd
    network_mode: media_network
    ports:
      - '8088:8080'
    environment:
      - PUID=2001
      - PGID=2001
      - VERSION=docker
      - TZ=America/Central
    volumes:
      - /srv/media/config/sabnzbd:/config
      - /srv/media/cache/sabnzbd:/downloads
      - /srv/media/cache/sonarr:/downloads/sonarr
      - /srv/media/cache/radarr:/downloads/radarr

  jackett:
    image: ghcr.io/linuxserver/jackett
    container_name: jackett
    hostname: jackett
    network_mode: media_network
    ports:
      - '9117:9117'
    environment:
      - PUID=2001
      - PGID=2001
      - VERSION=docker
      - TZ=America/Central
    volumes:
      - /srv/media/config/jackett:/config
      - /srv/media/cache/jackett:/downloads

  radarr:
    image: ghcr.io/linuxserver/radarr
    container_name: radarr
    hostname: radarr
    network_mode: media_network
    ports:
      - '7878:7878'
    environment:
      - PUID=2001
      - PGID=2001
      - VERSION=docker
      - TZ=America/Central
    volumes:
      - /srv/media/config/radarr:/config
      - /srv/media/cache/radarr:/downloads/radarr
      - /srv/media/data/movies:/movies

  sonarr:
    image: ghcr.io/linuxserver/sonarr
    container_name: sonarr
    hostname: sonarr
    network_mode: media_network
    ports:
      - '8989:8989'
    environment:
      - PUID=2001
      - PGID=2001
      - VERSION=docker
      - TZ=America/Central
    volumes:
      - /srv/media/config/sonarr:/config
      - /srv/media/cache/sonarr:/downloads/sonarr
      - /srv/media/data/shows:/tv

  plex:
    image: ghcr.io/linuxserver/plex
    container_name: plex
    hostname: plex
    network_mode: media_network
    ports:
      - '32400:32400'
      - '32400:32400/udp'
      - '32469:32469'
      - '32469:32469/udp'
      - '5353:5353/udp'
      - '1900:1900/udp'
    environment:
      - PUID=2001
      - PGID=2001
      - VERSION=docker
      - TZ=America/Central
    volumes:
      - /srv/media/config/plex:/config
      - /srv/media/data/movies:/movies
      - /srv/media/data/shows:/tv
      - /srv/media/data/music:/music
    devices:
      - '/dev/dri:/dev/dri'
    restart: unless-stopped

Backup Stuff

/srv/media/.restic_backup:

#!/bin/bash
export B2_ACCOUNT_ID='foo'
export B2_ACCOUNT_KEY='bar'

restic -r b2:mteck-media backup \
    --limit-upload 5120 \
    --password-file /root/.restic_pw \
    --files-from /srv/media/.restic_include \
    --exclude-file /srv/media/.restic_exclude \
    --cleanup-cache \
    --quiet

/srv/media/.restic_include:

/srv/media/.restic*
/srv/media/docker-compose.yml
/srv/media/update
/srv/media/config/**
/srv/media/data/**

/srv/media/.restic_exclude:

.cache/**
logs/**
logs*
updater.tx*
log.tx*
MediaCover/**
*.db
*.pid
rss/**
GeoDB/**
Library/*
Log*
Logs/**
lost+found/**
Metadata/**
Cache/**
Crash Reports/**
Diagnostics/**
Media/**