Dakshesh JainDakshesh Jain
HomeBlogsProjectsAboutContact
Dakshesh Jain
HomeBlogsProjectsAboutContact
Home
Blog
Projects
About
Contact

© 2026 Dakshesh Jain. All rights reserved.

How I Built My Home Server

Posted on: 29 October 2026 | Last updated: 29 October 2026 | Read: 11 min read | In: Linux, Server, Automation, Networking

How I Built My Home Server
Image provided by Pexels

Description

My experience building a home server, the hardware and software choices I made, the services I run, and my plans for the future.

Full blog

Background

In this article, I talk about my experience building a home server, what I am running, and some recommendations based on my experience.

I always wanted to get a home server because of the convenience and learning opportunities it offers. With a home server, I could set up services that block ads, provide better storage for important documents, and allow me to self-host various applications that we use in our day-to-day lives.

In this article, you will find my hardware choices, how I configured the BIOS, tested the hardware, installed Ubuntu Server, and set up the services I am running. I'll also discuss my future plans for this project. This is not a guide on how to build a home server, but I'll share some advice from my experience.

Hardware

Hardware choices are personal and depend on a lot of factors. The choices that worked for me might not work for others. If you are planning on building a home server, please consider the following:

  1. Budget
  2. What you are planning to use it for
  3. Whether you want to use the same hardware for something else

Here are some things I would generally recommend regardless of your requirements:

  1. Don't cheap out on the PSU. Your home server will probably run 24/7, and you don't want to risk damaging your components by using a poor-quality power supply.
  2. Have a backup plan, especially if you plan to store important documents and family photos on your server.

With those out of the way, here is my hardware configuration:

  1. Ryzen 5 5500
  2. MSI B550M-A PRO
  3. GT 610
  4. 8 GB 3200 MHz DDR4 Foxin RAM
  5. 256 GB NVMe SSD
  6. Antec cabinet
  7. Cooler Master 550 W 80 Plus Bronze PSU

My decisions were based on my budget and the fact that my personal computer already uses the same AM4 platform. If this project failed, the worst-case scenario was that I could upgrade my existing computer using some of these components.

The RAM was not my first choice because it was not from a brand that specializes in manufacturing RAM. That's why I ran some tests on it, which we'll discuss in the next section.

I also looked for second-hand PCs and components, but unfortunately, I couldn't find many options in my city. Don't let that discourage you, though. Chances are I was unlucky or didn't spend enough time searching.

Ideally, the SSD would only be used for the OS and services, so it would probably be enough for a long time. However, since I am also storing photos and movies on it, it will run out of space much sooner. I have plans to address this in the future.

You don't have to buy the same hardware as me. If you are planning to build a server yourself, you have plenty of choices. You can start with a simple Raspberry Pi, use an old laptop or desktop, buy second-hand components, or buy everything new. Do whatever fits your needs and budget.

In fact, I think it can be better to use separate hardware for separate services, depending on what you want to run. I'll discuss why I think this makes sense later in the article.

Finally, once the parts were sorted out, it was time to build the PC. This was one of the best parts of the project because I built it with my sister. I built my own computer back in 2018, and it was a lot of fun. I'm glad I was able to share the same experience with her. She enjoyed building the PC too!

Setting Up the Server

BIOS and Hardware Testing

My CPU was already supported by the motherboard, so I didn't need to flash a new BIOS. I checked and tweaked the following settings:

  1. Disabled Secure Boot: I did this because Memtest86+ didn't work for me with Secure Boot enabled. Secure Boot checks whether boot components are trusted by the system firmware. Depending on the tool and its boot configuration, it may prevent a memory-testing utility from starting. Disabling it was necessary for my setup, but it is not a general requirement for installing Ubuntu Server.
  2. Checked clock settings: I checked XMP and CPU settings to ensure everything was configured as expected.
  3. Checked the fan settings: I checked the fan speeds and curves.
  4. Enabled automatic power-on: I configured the system to turn back on automatically after a power cut.

After that, I booted into Memtest86+ using a bootable USB drive. Memtest86+ is a memory-testing tool that helps identify problems with RAM. I wanted to run it before doing anything else because my RAM was not from a well-known manufacturer.

I used the default settings and ran the test before proceeding with the OS installation.

Installing Ubuntu Server

I installed Ubuntu Server using a bootable USB drive. Ubuntu Server was a natural choice for me because, as a software engineer, I already had experience using it on VPS instances.

If you are not comfortable using the terminal, you can also explore CasaOS, Umbrel, or similar projects. CasaOS, for example, provides a graphical interface for managing applications and services on top of a Linux installation.

For managing deployments and maintenance, I find the terminal simpler and more manageable than a GUI, so I didn't install CasaOS or anything similar.

After installing Ubuntu, I followed the usual practices for setting up a server. These included creating a non-root user, configuring SSH key-based authentication, disabling password authentication for SSH, updating installed packages, and installing the required tools such as Docker and Docker Compose.

Why I Chose Docker Compose

I manage my applications using Docker Compose. I find it simple and manageable, especially when running multiple services.

I prefer pinning the versions of the applications I run instead of blindly using latest. This gives me more control over updates and makes deployments more predictable. However, pinning versions also means I need to keep track of updates and apply security fixes when they become available.

I also keep my environment variables in .env files and exclude those files from Git so that credentials are not committed to the repository.

My Docker Compose configuration files are backed up in my home-server repository. This makes it easier to review my configuration and recreate services if needed. However, these files alone are not a complete backup of the server or the data stored on it.

What I Am Running

I haven't started using these services to their full potential yet, and I am still setting some of them up. All of these projects are well-structured and modular. As a software developer, I appreciate these projects even more and look forward to learning more from them.

If you want to review my Compose files, you can find them in my home-server repository.

CategoryServices
NetworkPi-hole
Dashboard and MonitoringHomepage, Beszel
Photos and MediaImmich, Jellyfin
Media AutomationJackett, Radarr, qBittorrent
Workflow Automationn8n

Future Scope

I have a lot of plans for this project and want to extend the setup further. Here's how I would divide those plans.

Near-Term Goals

  • Set up NAS storage.
  • Establish redundancy and proper backups for important documents and family photos.
  • Configure secure remote access.
  • Start using the existing services more regularly and explore their full potential.
  • Move network-related services to their own low-powered devices. Ideally, I would run these services on two separate devices so that network services can remain available if one device goes offline.

Long-Term Goals

  • Run local LLMs.
  • Move the hardware to a rack.
  • Host selected personal projects and make them available over the public internet.

When I started this project, I thought I should build a single server that could do all of these things. However, I think it can be better to use separate computers for different tasks.

A single machine is cheaper and simpler to start with, and it makes sense when you are experimenting or running services that don't require high availability. However, separate devices let you choose hardware that best fits each workload and help isolate failures. If one machine goes down, services running on other machines can continue working.

For example, network services such as DNS filtering are useful only when they are available. Running them on a separate low-powered device means that a failure or restart of the main server doesn't necessarily take down the entire network. Having two devices can provide additional redundancy, although the services must also be configured to fail over properly.

Of course, running multiple machines also means more hardware costs, power consumption, and maintenance. I don't think every service needs its own machine, but separating services where it makes sense can be a better approach in the long run.

Closing Thoughts

I was a little worried before starting this project about whether everything would work out or whether my money would go to waste. However, I think it was a good decision in the end.

There's a certain satisfaction in running your own server and having more control over your data and the services you use. This project has also given me an opportunity to learn more about Linux, Docker, networking, and managing multiple services.

I haven't fully utilized this setup yet, and there is still a lot I want to do. But I think that's part of what makes a project like this interesting. I can keep improving it, experiment with new ideas, and learn along the way.