I’ve been running Plex, Sonarr, Radarr, Lidarr, NZBget, Ombi, and more for a long time at home. It’s lived on my QNAP goofynewton for as long as I’ve had it. I’m getting ready to migrate everything over to my NVMe NAS (more power and consolidation - to include my Frigate/Compreface/DoubleTake setup), so I figured I should document how everything worked in Docker before I migrate to NixOS to host it all. Don’t worry my NixOS friends, I’ll be sure to update with a part 2 describing that setup and configuration once I have it all working.

Scope

The scope of this post will include everything that I’m running for our Home Production network:

  • Reverse Proxy with automatic HTTPS
  • Plex (migrating to Jellyfin)
  • Jellyfin
  • Sonarr
  • Radarr
  • Lidarr
  • TDARR
  • NZBGet
  • Home Assistant
  • Frigate
  • CompreFace
  • Double Take
  • Pihole
  • and more….

docker-compose.yml

Below you’ll find a redacted version of my Docker Compose file.

---
version: "2.1"
services:
  swag:
    image: lscr.io/linuxserver/swag:latest
    container_name: swag
    cap_add:
      - NET_ADMIN
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
      - URL=wes.today
      - VALIDATION=http
      - SUBDOMAINS=wesflix,sonarr,radarr,nzbget,ombi,ha
      - [email protected]
      - ONLY_SUBDOMAINS=true
      - STAGING=false 
    volumes:
      - /mnt/appdata/swag:/config
    ports:
      - 443:443
      - 80:80 #optional
    restart: unless-stopped

  syncthing:
    image: lscr.io/linuxserver/syncthing:latest
    container_name: syncthing
    hostname: goofynewton #optional
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
    volumes:
      - /mnt/appdata/syncthing/:/config
      - /home/wk/mediacenter:/mediacenter
      - /media/home:/homes
      - /mnt/appdata:/appdata
      - /media/.hidden:/hidden
    ports:
      - 8384:8384
      - 22000:22000/tcp
      - 22000:22000/udp
      - 21027:21027/udp
    restart: unless-stopped

  plex:
    image: lscr.io/linuxserver/plex:latest
    container_name: plex
    network_mode: host
    environment:
      - PUID=1000
      - PGID=1000
      - VERSION=docker
      - PLEX_CLAIM=FIXME_MOVETOENV # optional
    volumes:
      - /mnt/appdata/plex:/config
      - /media/shows:/tv
      - /media/movies:/movies
      - /media/music:/music
      - /media/kids:/kids
      - /media/kids_movies:/kids_movies
    restart: unless-stopped

  sonarr:
    image: lscr.io/linuxserver/sonarr:latest
    container_name: sonarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
    volumes:
      - /mnt/appdata/sonarr:/config
      - /media/shows/shows:/shows
      - /mnt/appdata/downloads:/downloads
      - /media/kids:/kids

    ports:
      - 8989:8989
    restart: unless-stopped

  radarr:
    image: lscr.io/linuxserver/radarr:latest
    container_name: radarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
    volumes:
      - /mnt/appdata/radarr:/config
      - /media/movies/movies:/movies
      - /media/kids_movies:/kids_movies
      - /mnt/appdata/downloads:/downloads
    ports:
      - 7878:7878
    restart: unless-stopped

  nzbget:
    image: lscr.io/linuxserver/nzbget:latest
    container_name: nzbget
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
    volumes:
      - /mnt/appdata/nzbget:/config
      - /mnt/appdata/downloads:/downloads
    ports:
      - 6789:6789
    restart: unless-stopped

  tautulli:
    image: lscr.io/linuxserver/tautulli:latest
    container_name: tautulli
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
    volumes:
      - /mnt/appdata/tautulli:/config
    ports:
      - 8181:8181
    restart: unless-stopped

  ombi:
    image: lscr.io/linuxserver/ombi:latest
    container_name: ombi
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
    volumes:
      - /mnt/appdata/ombi:/config
    ports:
      - 3579:3579
    restart: unless-stopped

  tdarr:
    image: ghcr.io/haveagitgat/tdarr:latest
    container_name: tdarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
      - UMASK_SET=002
      - serverIP=10.80.0.20
      - serverPort=8266
      - webUIPort=8265
      - internalNode=true
      - nodeID=tdarr-mgmt
    volumes:
      - /mnt/appdata/tdarr/server:/app/server
      - /mnt/appdata/tdarr/configs:/app/configs
      - /mnt/appdata/tdarr/logs:/app/logs
      - /media:/media
      - /mnt/transcode:/temp
    ports:
      - 8265:8265
      - 8266:8266
      - 8267:8267
      - 8268:8268
    restart: unless-stopped

  homeassistant:
    image: lscr.io/linuxserver/homeassistant:latest
    container_name: homeassistant
    depends_on:
      - ha_postgres
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=America/New_York
    volumes:
      - /mnt/appdata/homeassistant:/config
      - /run/dbus:/run/dbus:ro
    ports:
      - 8123:8123
    restart: unless-stopped

  mdns-reflector:
    image: monstrenyatko/mdns-repeater
    container_name: mdns-reflector
    restart: unless-stopped
    command: mdns-repeater-app -f $MDNS_REPEATER_INTERFACES
    env_file: env/mdns.env
    network_mode: "host"

  ha_mq:
    container_name: ha_mq
    image: nanomq/nanomq:0.6.6
    ports:
      - 1883:1883
    restart: always

  ha_esphome:
    image: esphome/esphome:latest
    devices:
      - "/dev/bus/usb:/dev/bus/usb"
    privileged: true
    container_name: ha_esphome
    volumes:
      - /mnt/appdata/ha_esphome/config:/config:rw
      - /etc/localtime:/etc/localtime:ro
    environment:
      - ESPHOME_DASHBOARD_USE_PING=true
    ports:
      - 6053:6053
      - 6152:6052
      - 6123:6123
    restart: unless-stopped
  
  ha_postgres:
    container_name: ha_postgres
    image: postgres:14.5
    healthcheck:
      test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "FIXME_MOVETOENV" ]
      timeout: 45s
      interval: 10s
      retries: 10
    restart: always
    environment:
      - POSTGRES_USER=FIXME_MOVETOENV
      - POSTGRES_PASSWORD=FIXME_MOVETOENV
      - APP_DB_USER=FIXME_MOVETOENV
      - APP_DB_PASS=FIXME_MOVETOENV
      - APP_DB_NAME=ha_db
    volumes:
      - /mnt/appdata/ha_postgres/init/:/docker-entrypoint-initdb.d/
      - /mnt/appdata/ha_postgres/data/:/var/lib/postgresql/data/
    ports:
      - 5432:5432

  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "8080:80/tcp"
    environment:
      TZ: 'America/New_York'
      WEBPASSWORD: 'FIXME_MOVETOENV'
    volumes:
      - '/mnt/appdata/pihole/etc-pihole:/etc/pihole'
      - '/mnt/appdata/pihole/etc-dnsmasq.d:/etc/dnsmasq.d'    
    restart: unless-stopped

  wolrelay:
    init: true
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:5000"]
      interval: 1m30s
      timeout: 10s
      retries: 3
    network_mode: host
    image: wolrelay:latest
    build:
      context: ./WOLRelay
      dockerfile: Dockerfile

[FIXME] Diagram