Reusing old hardware for self-hosting

, ,


I used to self-host a NAS in my home network out of a Raspberry Pi 4B and a couple of HDDs, but after a few years I’ve learned that the Pi is somewhat underpowered for my needs, getting in the way of my backup strategy. Once in a while I would search for NUCs and other small form factor computers, but I never found something in the range that I was comfortable to pay. Eventually, however, something clicked: I had the right solution under my nose the entire time: a 2011 Dell Vostro 3450.

Dell Vostro 3450, front side overview, with a Frozen sticker

My partner had purchased this device for her college years and it had reasonably beaten up when she graduated, so it was retired and sat in a closet ever since. Apart from the bend in the body and a few keys not working (notably the Ctrl and Alt keys), the display is also somewhat loose and the right side ports (HDMI, USB, eSATA!?) are shorted, so the system would sometimes reboot or display garbage when messing with the USB port. I also got a few a small discharges that I initially attributed to low humidity ESD (somewhat frequent for me with any hardware), but thankfully I didn’t lose any USB devices until I realized what was going on. Covering the ports with electrical tape was a quick and cheap solution.

The 2.3GHz i3-2350M with 4GB DDR3 isn’t particularly better than the Raspberry Pi 4B in the benchmarks, but given my use case could see better single-core performance (Nextcloud image resizing kept me waiting) and it had cryptographic acceleration, I figured it was worth the try. I installed Debian, configured BTRFS (I’m using btrfs snapshots for incremental backups) and it quickly became part of my local infrastructure.

The way I use my NAS isn’t quite standard, however. I initially went with Nextcloud as a Google Photos replacement, and for me it meant mostly archival, so the initial task was just backing up my phone’s photos. I’d turn on the NAS, run the sync, run the incremental backup scripts and shut it down. I eventually started using the file sync with a couple of computers at home, but was still using a free Dropbox account for day-to-day small things. If I edited something from my Nextcloud folder in a computer, I’d likely wait a few days until it was “worth the hassle” to turn the NAS on again, and at this point I was making the same requires willpower mistakes once again.

Eventually I wanted to bring home more services, like LinkAce, FreshRSS and Gitea, so I decided to transform it into an always-on solution. First I had to address the spinning rust noise, as I caught myself avoiding turning the NAS on just because of the low hum it made in the background. To fix this I purchased an 1TB SSD and went on to replace it, just to realize that the disk was the last thing I could remove:

Dell Vostro 3450, upside down, with the service cover removed, exposing the memory slots and part of the hard to access HDD

Dell Vostro 3450, fully disassembled with the motherboard upside down, exposing the HDD

Given I had it open and fully disassembled at this point, and also because of the shorted ports and other rusty parts in the motherboard, I second guessed myself and decided to not try with a brand new SSD before making sure I didn’t screw it up. So I bought some cleaning supplies (a can of compressed air, isopropanol, thermal paste), scavenged a 240GB SSD and a pair of 4GB DDR3 DIMMs out of a 2009 MacBook Pro and did a thorough cleaning and reassembly.

It booted! Debian was then installed, I ran my Ansible playbook and synced back my Nextcloud BTRFS snapshots into the SSD. The baseload uses around 300MB RAM and is silent, at 47°C it can be mistaken for a fanless system, as I only ever hear the fan when I’m browsing through Nextcloud’s gallery and it needs to generate thumbnails. It idles at around 12.6W with the screen on, and I have seen peaks of 38W with a couple of USB HDDs connected and a lot of load. 12W is quite low, but still 2.5 times more than a Pi, and I thought there was room for improvement.

The first win came out of the consoleblank Linux kernel parameter. I configured it to 60 seconds, and after the timeout it completely shuts off the display, bringing the idle consumption to 8.1W. While 8W amounts to about 30 SEK/month with my current electricity contract, I’m not particularly fond of wasting energy, but fortunately I got lucky as this machine had one last surprise hidden for me: full Wake on LAN support! I did some initial tests with WOL using Magic packets and it worked flawlessly. The system in the suspended state consumes just 1.1W and a magic packet is enough to wake it back to fully functional in less than 5 seconds. One problem I’m still looking for a fix is that the consoleblank that does not turn off the display once the system resumed from suspend.

So my next challenges in this project are all in software. I want to automatically suspend the system based on my usage patterns. I also want to avoid the requires willpower pitfall and have something awake the system when there is usage, but I suspect using the WOL unicast mode might conflict with the Nextcloud desktop app trying to stay connected. Alternatively, I can have my home DNS server (an always-on Raspberry Pi 3B) to send the magic packet when it detects usage.

Thank you.