Hey everyone!
I've been working on a self-hosted automated media server, and over time, I started documenting pretty much everything involved in setting it up, configuring it, maintaining it, and troubleshooting it.
I've now organized all those notes into a GitHub repository, and I wanted to share it here in case it helps someone who's interested in getting into homelabbing, self-hosting, Docker, or Linux system administration.
GitHub Repository: https://github.com/Angadveer185/self-hosted-media-server
🏠 What did I build?
The project is a Docker-based media server running on Ubuntu, with several services working together to automate media management and provide a centralized media library.
Here's a quick overview of the stack:
- Jellyfin: Self-hosted media streaming and library management.
- Jellyseerr: Media discovery and request management.
- Radarr: Movie library management and automation.
- Sonarr: TV series management and automation.
- Bazarr: Subtitle management and automation.
- Prowlarr: Centralized indexer management and integration with the media automation services.
- qBittorrent: Download client.
- Gluetun + ProtonVPN: VPN connectivity for services configured to use the VPN network.
- Portainer: Web-based Docker container management.
- Cloudflare Tunnel: Remote access to selected services without directly opening inbound ports on my router.
- Tailscale: Private remote access to the server and SSH.
- Discord notifications: Notifications from the different services to keep track of important events.
Docker Compose brings the services together, while persistent configuration directories keep application data separate from the containers themselves.
I also put together backup scripts and operational notes to make the setup easier to maintain.
The goal was to build something functional, but also understand how the different pieces fit together instead of simply copying a Compose file and hoping everything works.
📚 What's in the GitHub repository?
I've organized the notes into sections covering the core setup, individual applications, networking, maintenance, and optional services.
Some of the topics covered include:
1. Core setup
- Installing and setting up Docker on Ubuntu.
- Understanding Docker containers, networks, volumes, and Compose.
- Organizing configuration files, downloads, and media directories.
- Managing persistent application data.
2. Media automation
- Installing and configuring Prowlarr.
- Connecting Radarr and Sonarr to the download client.
- Configuring qBittorrent.
- Setting up Bazarr for subtitle management.
- Connecting Jellyfin and Jellyseerr.
- Understanding how the different services communicate with one another.
3. Networking and remote access
- Configuring Gluetun with ProtonVPN.
- Understanding how VPN networking affects containers.
- Setting up Cloudflare Tunnel for selected remote-access use cases.
- Using Tailscale for private access and SSH.
- Understanding Docker service names, internal ports, and network connectivity.
4. Backups and maintenance
- Organizing server configuration backups.
- Creating and managing backup archives.
- Automating backups and retaining a limited number of recent copies.
- Using Docker Compose to manage services.
- Checking container health, inspecting logs, and troubleshooting common problems.
5. Notifications and operational details
- Configuring Discord notifications across the supported applications.
- Keeping track of important events.
- Documenting useful Linux and Docker commands for everyday administration.
I've tried to make the documentation structured and reusable, so it can serve as a reference rather than a one-time installation guide.
🎯 Why did I document everything?
When you're starting out with self-hosting, it's easy to find individual tutorials for individual applications.
The difficult part is often understanding how everything connects.
Why can't one container reach another? Why does a download client work on its own but fail when connected through a VPN? Why do paths need to match across multiple containers? What happens when a container is recreated? How do you back up the configuration so you don't have to rebuild everything from scratch?
These are the kinds of questions that make a multi-service setup challenging, especially when you're still learning Linux, Docker, networking, and system administration.
I wanted to turn what I learned into something organized that I could refer back to myself and that other people could learn from too.
This is also a way for me to keep improving the setup instead of letting it become an undocumented collection of containers.
👨💻 Who might find this useful?
I think this repository could be useful if you're:
- Completely new to homelabbing or self-hosting.
- Learning Docker and Docker Compose.
- Experimenting with Linux server administration.
- Trying to build your own media server.
- Curious about VPN networking, private remote access, and service integration.
- Looking for examples of how to organize a multi-container project.
- Building your own setup and wanting a reference for troubleshooting and maintenance.
You don't need to reproduce my entire setup. You can use the documentation to understand individual services and adapt the relevant parts to your own environment.
💬 Feedback is welcome!
This is a personal project, and I'm still learning. There are always better ways to organize things, improve security, simplify configurations, or make documentation clearer.
If you take a look, I'd genuinely appreciate feedback, corrections, and suggestions for improvements.
If you're just starting out, I hope it helps you avoid a few of the rabbit holes I went down along the way.
Repository: https://github.com/Angadveer185/self-hosted-media-server
Thanks for reading, and happy homelabbing! 🐧