~/Portfolio$Jude Mawad Projects

[003]Project / Home Server

HOMESERVER

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

Machine
x86-64 Mini PC
Processor
Intel N150
Memory
16 GB DDR4 RAM
Storage
Internal SSD + external HDD
OS
Ubuntu 24.04.2 LTS
Runtime
Docker
Remote access
Tailscale + SSH

[002]

Why I built it

Running more of it myself

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

What runs on it

I use Docker to keep each service configured separately while still letting the stack share storage and communicate.

01

Media pipeline

  • Jellyfin
  • Overseerr
  • Sonarr
  • Radarr
  • Prowlarr
  • qBittorrent
02

Music

  • Navidrome
  • Lidarr
03

Files & control

  • Nextcloud
  • Homarr
  • Watchtower

[004]

Automation

From a request to the library

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

Files, music, and maintenance

Files

Nextcloud

Stores my files and replaces part of my cloud storage setup.

Music

Navidrome

Streams my music library. I use Lidarr to support the music workflow.

Dashboard

Homarr

Gives me one place to open and check my services.

Updates

Watchtower

Helps update the containers. I still need to check that the services work afterward.

[006]

Remote access

Access away from home

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.

REMOTE DEVICELaptop / phoneAuthorised client
PRIVATE NETWORKTailscaleRemote route to home
HOMEUbuntu serverDocker stack

[007]

Building it

Learning Linux and Docker

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.

  1. 01
    BASE SYSTEM

    Get comfortable in Ubuntu

    Learn the filesystem, packages, users, services, and enough terminal commands to understand what the machine was doing.

  2. 02
    CONTAINERS

    Learn Docker by running real services

    Work through images, containers, ports, volumes, environment values, and how configuration survives a restart.

  3. 03
    NETWORK

    Reach it outside my home

    Set up Tailscale, connect my devices, and use SSH so I could manage the server remotely.

  4. 04
    WORKFLOW

    Connect the services

    Make the request, search, download, library, and playback steps agree on where files and information should go.

[008]

Problems

What I had to troubleshoot

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.

  1. [PERMISSIONS]Linux ownership did not always match what a container expected.

    I learned to check users, groups, mounted paths, and whether the process could actually read and write there.

  2. [DOCKER CONFIG]A small mismatch could stop a service from behaving correctly.

    Ports, volumes, names, and environment values all had to describe the same setup.

  3. [REMOTE ACCESS]Working locally did not mean working through Tailscale.

    I had to trace the address, private-network route, and service before I could find where the connection stopped.

  4. [STORAGE]A connected drive was not automatically useful to Docker.

    The host had to mount it correctly, then the relevant containers needed the correct path and permission.

  5. [AUTOMATION]Every service worked alone before the full chain worked together.

    The difficult part was making requests, searches, downloads, library paths, and Jellyfin line up end to end.

[009]

What I learned

How I debug now

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.