This post will not contain anything novel, instead it will show that old hardware can still be an excellent home server.
My goal is to know where my data is stored and to have full governance over it. I don't want to rely on a third-party provider for documents and media storage. I'm happy trading a bit of convenience in usage for the governance aspect.
I run two machines at my home:
- Ancient Dell PowerEdge T20 for services and storage
- Raspberry Pi 5 as offsite backup for friends and family
We will go into more detail about the T20 setup as it runs most services. If you are interested in the setup of the backup Pi, then please let me know.
The main machine
My main machine to run a few VMs and containers is an old Dell PowerEdge T20 tower server from 2013. Its hardware is rather unspectacular:
| Component | Specification |
|---|---|
| CPU | Intel(R) Xeon(R) CPU E3-1225 v3 @ 3.20GHz |
| Memory | 24GB ECC |
| Disks | 3x Seagate Exos 7E8 8TB 1x Crucial MX300 500GB |
Yes, there are more energy efficient new machines, but this machine did cost around 300 Euros back in the day. I've collected my ideas for an ideal replacement in the conclusion, but with the current memory, prices I hope it runs for a few more years.
On the other hand, I'm thinking more about downsizing the machine again, as even the 4 old Haswell cores are more than fast enough to serve my needs.
I changed 3 things in the meantime:
- The power supply was changed ~3 years ago because it was more efficient and I just don't trust a ~10-year-old PSU.
- The case was updated to one with more space for the disks. I initially planned upgrading to more than 4 disks (with a PCIe card), but never actually did it.
- Initially I ran it with a set of 3TB WD Red disks, which got replaced by the Seagates around 2022, and obviously the dying SSD got replaced too.
The software
Based on the last few posts on my blog, you can probably imagine that the server is running NixOS. I had a failing boot disk around a year ago and then decided to fully go with a declarative approach. Obviously I've tried to keep all the setup in sync with a Terraform (for the VMs) and Ansible (everything else) infrastructure-as-code setup, but I always had drift for a few tiny changes here and there. While figuring out how to set up the machine again after the disk failure, I noticed that essentially all Caddy changes were missing and decided that I never want to be in that situation again. Luckily I was able to recover all of the configs and the data was fully backed up anyway. Of course I could have gone deeper into the IaC stack by building automation to deploy and forbidding any manual SSH access to the machine, but I was already sold to the Nix idea by a former colleague.
I've used a guide from Michael Stapelberg to get my own boot image with my SSH keys baked in so I could directly remotely manage my installation.
The configuration files are currently living next to my home-manager files and are versioned by a single flake.lock, something that I might change in the near future because it makes no sense to force an update on my server when updating CLI tools. On the other hand, it forces me a bit to keep the server updated and not ignore it for months.
This is how it looks in the filesystem:
.
├── flake.lock
├── flake.nix
├── hosts
│ ├── desktop
│ │ ├── desktop.nix
│ │ └── hardware-configuration.nix
│ ├── mac
│ │ └── home.nix
│ ├── T20
│ │ ├── borgmatic.nix
│ │ ├── caddy.nix
│ │ ├── hardware-configuration.nix
│ │ ├── samba.nix
│ │ ├── T20.nix
│ │ └── users.nix
│ ├── work
│ │ └── home.nix
│ └── x390
│ ├── bluetooth.nix
│ ├── hardware-configuration.nix
│ └── x390.nix
├── modules
│ └── base.nix
└── README.md
8 directories, 17 filesIt took me quite some time to figure out how to get the bridge networking mode working, so here is the config for it:
networking.useDHCP = false;
networking.useNetworkd = true;
systemd.network = {
enable = true;
netdevs."10-br0" = {
netdevConfig = {
Name = "br0";
Kind = "bridge";
};
};
networks."10-eno1" = {
matchConfig.Name = "eno1";
networkConfig.Bridge = "br0";
linkConfig.RequiredForOnline = "enslaved";
};
networks."20-br0" = {
matchConfig.Name = "br0";
bridgeConfig = { };
address = [ "192.168.178.2/24" ];
gateway = [ "192.168.178.1" ];
dns = [ "192.168.178.1" ];
networkConfig.LinkLocalAddressing = "no";
linkConfig.RequiredForOnline = "routable";
};
};The caddy config with tailscale support was just a single option:
{
# Allow the caddy user to fetch Tailscale TLS certificates
services.tailscale.permitCertUid = "caddy";
services.caddy = {
enable = true;
virtualHosts."t20.tail1337.ts.net" = {
extraConfig = ''
respond /test/* "Hello, this is a test" 200 {
close
}
handle_path /paperless/* {
reverse_proxy /* 127.0.0.1:8000 {
header_down Referrer-Policy "strict-origin-when-cross-origin"
}
}
'';
};
};
}The other service definitions like Samba or borgmatic are exactly following the upstream documentation. No need for multiple configuration languages anymore. The whole machine is defined in 6 files and I can replicate it easily to a potential new machine.
Services
I'm running the following services either as a VM or a container.
| Service | Usage |
|---|---|
| pihole | DNS-based ad blocking |
| Home Assistant | Home automation |
| paperless-ngx | Document management system |
| forgejo | Git forge |
| jellyfin | Media streaming |
| private services | e.g. dnd-music-manager |
The services are exposed more or less the same as described in this old post, with the only difference that the services are not publicly exposed, but only in my tailnet.
Conclusion
After using and maintaining this setup for roughly one year now, I'm still convinced that it was the right choice for my problem. The hardware is quite old and I'm getting more and more afraid that it will fail in the near future and I'll be forced to replace it with something less suitable for the use case.
My wishlist for a new machine would be:
- energy efficient (the current machine pulls ~45 watts)
- smaller form factor (I've looked at some crazy board like this)
- ECC support (debatable, but no ECC would be a downgrade)
- cheap I don't want to spend 1k Euros on the machine (without disks of course)
If you have an idea for a platform that could be interesting, then please let me know!