This is by far my longest and most complex project, encompassing both hardware and software with lots of sysadmin work. I've been tinkering with it since I graduated high school almost 6 years ago! It's a custom headless Linux server that hosts all my Dockerized microservices and runs my custom, personal streaming service among many others. Containers can be instantly spun up and assigned a subdomain using Cloudflare DNS routing by leveraging Docker. It sits in a dark corner of my mom's house (lol) with just a power cable to an Uninterruptible Power Supply (UPS) and a gigabit Ethernet connection.
The inception of this project began with an obsession for perfection and usability. I was frustrated that even though I was paying for many different streaming services, I was locked out of content for different regions and could never remember what show or movie was on which service. So, as any reasonable CS major would do, I decided to build my own streaming service just for me! I still pay for all the streaming services that host the content I watch, but I also host my own streaming service on my server so I can have everything set up just the way I like it.
I first built the server from spare parts I collected from friends and family, and as I started to have more money from jobs or upgrade my gaming PC, I slowly added to my server piece by piece. Born from an Intel Core 2 Duo from 2006, 4GB of DDR3 RAM, and 512GB of storage, it has now matured into a monster with an Intel i9-12900K, 32GB of DDR5 RAM, and 50+ TB of storage. Thank you, Microcenter! I have put my blood, sweat, and tears into this server, and it has served me well. My friends and family use the services I run on it every day, which I will talk about more below.
The server runs on Ubuntu Server 24.04 LTS, which is completely headless. I access it using SSH with a password-protected private key. All the hard drives (HDDs) are formatted in ext4 and plugged directly into the motherboard and mounted on the root filesystem using a custom fstab file. I have a mishmash of vendor drives right now, but my go-to currently are Seagate Exos's from Server Part Deals!
I have my home router set up to forward all inbound network traffic to my server's IP and use the Traefik reverse proxy to direct network traffic to the correct Docker containers. I went with Traefik over something like Caddy (which is awesome and a close second!) or Nginx Proxy Manager because Traefik plays very nicely with Docker Compose, automatically generates SSL certs, and integrates smoothly with my OAuth provider of choice, Google OAuth! Traefik allowed me to have all my network and container config in one file as opposed to multiple files for other reverse proxies. It was a little complicated to get wildcard certs for subdomain routing on the origin server using Cloudflare, especially because it's very easy to get rate-limited and temporarily banned if you're not careful about using the staging server, but the payoff is worth it. After successfully setting up the Docker networks and Traefik, I can now edit my compose file, run a simple command, and Docker will automatically create the container, assign it to the Traefik network, create a subdomain, provide SSL certs, and instantaneously make it available to the internet with load balancing and OAuth! Pretty sweet.
As for the streaming service, I use Plex for the frontend site and apps and the Arr suite for managing content procurement and file processing. Everything is hosted on my server in containers with Traefik labels. My current set up goes like this:
1. Request media from my request site or from the mobile web app
2. Request is routed to Sonarr or Radarr
3. Request is Prowlarr to access P2P providers for magnet download links
4. Request is sent to Transmission behind an isolated VPN network using Gluetun to download
5. Download is completed and sent back to Sonarr or Radarr
6. Content is automagically moved to the correct HDD and renamed
7. Plex picks up the file and assigns it the correct metadata, then makes it available to stream anywhere in the world
8. Plex does post-processing to add thumbnail previews, AI-enhanced subtitle matching, auto-skip for intro/credits, and more!
This entire processing happens as fast as under a minute for anything I want, all in one place and one streamlined interface.
Another major service I have running is Scrypted, which I dive deeper into in another project post. Long story short, I wanted to set up security cameras at my mom's house as cheaply as possible, make it easy to access for my tech-illiterate mom, and take advantage of my iCloud+ subscription and existing server infrastructure. My solution was to buy 4 Tapo smart cameras on sale for $80 from Amazon, buy a brand-new Apple TV off someone on Facebook Marketplace for $80, set up Scrypted on my server, then use it to bridge the local cameras to HomeKit Secure Video (HKSV). In doing so, I was able to avoid buying expensive HKSV-certified cameras that were $160+ each, my mom and I were able to access 10 days of cloud recordings for free, we could easily view the videos in the Home app, and facial recognition, voice control, object recognition, and rich notifications to our devices were seamlessly done locally by the Apple TV on video bridged with Scrypted. It has been working flawlessly for months now and wouldn't have been possible without my lovely server! I did run into some issues, such as my modem hardwired connected server not seeing the wireless router connected cameras due to being on different networks, but luckily it was simple enough to turn off NAT on the router and have the modem control the IP pool.
I also have other services like my own cloud photo storage with Immich, including all the bells and whistles like facial recognition, editing tools, location-based awareness, etc., but none were as complex to set up as the containerization and Scrypted. I'm continuing to make improvements to my setup, and my goal is to eventually host all my projects and sites on my server too! I've learned so much about Linux and sysadmin work thanks to this project. Thanks for taking a look :)