Nextcloud
Stores my files and replaces part of my cloud storage setup.
[003]Project / Home Server
A Mini PC I turned into my own place for media, files, music, and small automations.
It runs Ubuntu and Docker, stays online at home, and is reachable remotely through Tailscale and SSH.
My setup
[002]
Why I built it
I was paying for iCloud, Spotify, Netflix, and Disney+. I wanted to see how much of my file storage, music, and media I could host at home.
I now manage those services myself. This was also a way to learn Linux and Docker by running something I use.
[003]
Docker stack
I use Docker to keep each service configured separately while still letting the stack share storage and communicate.
[004]
Automation
I choose a film or series. The services then handle the search, download, and library update so it becomes available in Jellyfin.
Request
I choose the film or series I want to add.
[005]
Beyond media
Stores my files and replaces part of my cloud storage setup.
Streams my music library. I use Lidarr to support the music workflow.
Gives me one place to open and check my services.
Helps update the containers. I still need to check that the services work afterward.
[006]
Remote access
Tailscale gives my devices a private route back to the server when I am away from my home network. Once connected, I use SSH for administration and can reach the services I need.
[007]
Building it
I had never used Docker before this project, and Linux was new to me too. I installed one piece at a time, read the documentation when I got stuck, and tested it before adding the next.
Learn the filesystem, packages, users, services, and enough terminal commands to understand what the machine was doing.
Work through images, containers, ports, volumes, environment values, and how configuration survives a restart.
Set up Tailscale, connect my devices, and use SSH so I could manage the server remotely.
Make the request, search, download, library, and playback steps agree on where files and information should go.
[008]
Problems
A container could be running while the service still could not see a drive, reach another container, or write a file. Debugging meant checking each boundary instead of only looking at the application.
I learned to check users, groups, mounted paths, and whether the process could actually read and write there.
Ports, volumes, names, and environment values all had to describe the same setup.
I had to trace the address, private-network route, and service before I could find where the connection stopped.
The host had to mount it correctly, then the relevant containers needed the correct path and permission.
The difficult part was making requests, searches, downloads, library paths, and Jellyfin line up end to end.
[009]
What I learned
I now check the host, container configuration, network, and file permissions when a service fails. Running this server gave me practice tracing a problem through each of those parts.