I will be using Ubuntuserver in this guide. You can select whatever linux distro you prefer.
Download ubuntu server from https://ubuntu.com/download/server. Create a bootable USB drive using rufus or any other software(I prefer ventoy). Plug the usb on your computer, and select the usb drive from the boot menu and install ubuntu server. Follow the steps to install and configure ubuntu, and make sure to check "Install OpenSSH server". Don't install docker during the setup as the snap version is installed.
Once installation finishes you can now reboot and connect to your machine remotely using ssh.
ssh username@server-ip
# username you selected during installation
# Type ip a to find out the ip address of your server. Will be present against device like **enp4s0** prefixed with 192.168.
Create the directories for audiobooks, books, movies, music and tv.
I keep all my media at ~/server/media. If you will be using multiple drives you can look up how to mount drives.
We will be using hardlinks so once the torrents are downloaded they are linked to media directory as well as torrents directory without using double storage space. Read up the trash-guides to have a better understanding.
mkdir ~/server
mkdir ~/server/media # Media directory
mkdir ~/server/torrents # Torrents
# Creating the directories for torrents
cd ~/server/torrents
mkdir audiobooks books incomplete movies music tv
cd ~/server/media
mkdir audiobooks books movies music tv
Jackett is where you define all your torrent indexers. All the *arr apps use the tornzab feed provided by jackett to search torrents.
There is now an *arr app called prowlarr that is meant to be the replacement for jackett. But the flaresolverr(used for auto solving captchas) support was added very recently and doesn't work that well as compared to jackett, so I am still sticking with jackett for meantime. You can instead use prowlarr if none of your indexers use captcha.
Sonarr is a TV show scheduling and searching download program. It will take a list of shows you enjoy, search via Jackett, and add them to the qbittorrent downloads queue.
I personally only use jellyfin because it's completely free. I still have plex installed because overseerr which is used to request movies and tv shows require plex. But that's the only role plex has in my setup.
I will talk about the devices section later on.
For the media volume you only need to provide access to the /data/media directory instead of /data as jellyfin doesn't need to know about the torrents.
As I mentioned in the jellyfin section there is a section in the conmpose file as "devices". It is used for transcoding. If you don't include that section, whenever transcoding happens it will only use CPU. In order to utilise your gpu the devices must be passed on to the container.
The default username is admin and password adminadmin. You can change the user and password by going to Tools → Options → WebUI
Change "Default Save Path" in WebUI section to /data/torrents/ and "Keep incomplete torrents in" to /data/torrents/incomplete/
Create categories by right clicking on sidebar under category. Type category as TV and path as tv. Path needs to be same as the folder you created to store your media. Similarly for movies type Movies as category and path as movies. This will enable to automatically move the media to its correct folder.
Sonarr
Navigate to YOUR_SERVER_IP:8989
Under "Download Clients" add qbittorrent. Enter the host as YOUR_SERVER_IP port as **8080,** and the username and password you used for qbittorrent. In category type TV (or whatever you selected as categoryname(not path) on qbittorent). Test the connection and then save.
Under indexers, for each indexer you added in Jackett
Click on add button
Select Torzab
Copy the tornzab feed for the indexer from jackett
Copy the api key from jackett
Select the categories you want
Test and save
Under general, define the root folder as /data/media/tv
Repeat this process for Radarr, Lidarr and readarr.
Use /data/media/movies as root for Radarr and so on.
The setup for ombi/overseerr is super simple. Just hit the url and follow the on screen instructions.
Bazarr
Navigate to YOUR_SERVER_IP:6767
Go to settings and then sonarr. Enter the host as YOUR_SERVER_IP port as 8989. Copy the api key from sonarr settings→general.
Similarly for radarr, enter the host as YOUR_SERVER_IP port as 7878. Copy the api key from radarr settings→general.
Jellyfin
Go to YOUR_SERVER_IP:8096
Add all the libraries by selecting content type and then giving a name for that library. Select the particular library location from /data/media. Repeat this for movies, tv, music, books and audiobooks.
Go to dashboard→playback, and enable transcoding by selecting as VAAPI and enter the device as /dev/dri/renderD128
Monitor GPU usage while playing content using
sudo intel_gpu_top
Heimdall
Navigate to YOUR_SERVER_IP:8090
Setup all the services you use so you don't need to remember the ports like I showed in the first screenshot.
Updating docker images
With docker compose updates are very easy.
Navigate to the compose file directory ~/server/compose/media-server.
Then docker-compose pull to download the latest images.
And finally docker-compose up -d to use the latest images.
Remove old images by docker system prune -a
What's next
You can setup VPN if torrents are blocked by your ISP/Country. I wanted to keep this guide simple and I don't use VPN for my server, so I have left out the VPN part.
You can read about port forwarding to access your server over the internet.
I would recommend prowlarr instead of jackett for indexer management, and pihole as at least an additional blocking service but in reality it’s really all you need for use at home. I’d also strongly encourage use of a VPN on your *arr download services. I use a separate box to run Plex and then have my *arrs all running on their own VM inside if it to provide separation and allow be to more easily segregate the network traffic (as someone that doesn’t really know docker that well it “just works” for me.
Also probably worth looking at how to store your media on an external target, it’s easy to quickly accumulate 10s of TBs of media and trying to store that all on the server locally is asking for trouble. Better to set everything up on a NAS to start.
Why would you need PiHole? AdGuard Home is the same but with more features, for example it supports and uses DNS-over-HTTPS out of the box so your ISP can't view and modify the DNS requests and responses.
Since you only use Plex because of overseerr: There is a fork called Jellyseer that is compatible with Jellyfin. Haven't tried it yet but it may be worth looking into.
I notice you mention Prowlarr, I'd probably suggest it and jackett - i ran both for a while then dropped Jackett as all my matches were coming through Prowlarr and its just less admin to add sources there once and have them add to the rest of the servarr apps
Also, you might want to look at https://www.audiobookshelf.org/ - A great plex like app for streaming audiobooks specifically
For AdGuard Home, I'd recommend running it on two servers so that your internet doesn't break when one of the servers is down (eg for maintenance, upgrades, etc). It runs well on a Raspberry Pi. You can use AdGuardHome-Sync to keep the config in sync between the two servers.
In my experience, the router's primary DNS server is not used first, then the secondary. Rather your device just sends half of the requests to each. If you run two and one is down, every second request fails. Unless you can run a load balancer, but then you're back to a single point of failure.
If one of them fails, the client falls back to the other one. That's the main reason why you can configure two. I think you're right that some OSes / devices send half the queries to each server (that's what I'm seeing too) but the fallback logic is still there too.
AdGuard Home supports DNS over HTTPS and uses it by default (via Quad9). This encrypts your DNS requests and ensures your ISP can't collect the queries or modify the responses. Some ISPs build an advertising profile for you based on the sites you visit, even if you use third-party DNS like Cloudflare's 1.1.1.1 or Google's 8.8.8.8. Using encrypted DNS prevents them from doing this.
You can use DNS over HTTPS with PiHole but it's a lot of manual work to set it up. With AdGuard Home, you just enter the DNS server URL in the web UI, and that's it.
People suggest this all the time, but it's only useful if you're the only one who is going to be accessing your library externally. Otherwise you have to get family or friends who you let access your server to use it anytime they want to stream, and that's far easier said than done. They have to know what they're doing.
It also means they can't stream on their smart TVs or streaming boxes. You know, the things most people will want to watch this content on.
Tailscale is a VPN. It's built on top of Wireguard but simplifies/automates the configuration. It gives you a mesh VPN without having to configure the mesh manually - with regular Wireguard you'd have to add each peer to every other peer's config manually.
It provides NAT traversal too where needed (for example, if your network doesn't have native IPv6).
Separate instances of readarr for audio and text was a let-down for me. I just grab the torrent from MAM, and move it to the library folder from transmission remote. ABS picks it up when it's finished. We don't do THAT many books to make readarr worth it.
I run the snap version of nextcloud in an ubuntu VM. I know snap gets a lot of flac, but I have a day job and I don't want to spend all my time trying to keep nextcloud running.
I have just never been able to wrap my head around it. I have tried a couple projects like Dockstarter before and found them too confusing. The easiest media setup I've found so far is Swizzin community edition, which is not docker based.
I purchased my first NAS a few months ago and I had zero knowledge of self hosting and zero knowledge of Linux. I did manage to install all of these applications but, as suggested by tutorials I read, also installed Portainer because using docker in a command line method was just way too difficult. I'm quite sure I wouldn't be able to set up anything without a GUI.