In uncertain times self reliant hosting is becoming more relevant than ever. I printed an aluminium heatsink case for a raspberry pi0w, optimized it to the best of my abilities and attached it to a solar powered battery to essentially keep it running indefinitely or at least until component failure.

Made possible thanks to the generous support of PCBway

There's a common assumption that personal hosting requires a proper server, a VPS, or at least something more powerful than a $15 microcomputer smaller than the size of a credit card. I wanted to challenge that. This is the story of running a personal website and a file sharing service on a Raspberry Pi Zero W — and the real performance data that shows it holds up surprisingly well.

The Hardware

The Pi Zero W is about as minimal as computing gets. A single ARM processor running at around 1GHz, 512MB of RAM, no ethernet port, and a 2.4GHz WiFi chip. That's it. It sips power — around 1 to 2 watts at idle — and makes no noise. The one I'm using has been running continuously for over three months without a single intervention, and its processor temperature sits at a steady 29°C without any active cooling. Just a bare board attached to the case of my 3d printer.

It's attached to a cheap allpowers power station which is using LiFePO 4 for longevity and reduction of fire hazard. That one in turn is attached to two 100w panels, which are essentially overkill but power other parts of my workshop as well. It can run for a week without requiring any sunlight.

What It's Running

Rather than a full Linux distribution, the server runs Alpine Linux in diskless mode — meaning the entire operating system lives in RAM, not on the SD card. This has two practical benefits: it dramatically reduces SD card wear (the card is mounted read-only), and it makes the system faster, since RAM is much quicker than flash storage. Two services run at all times:

Combined, these Two processes use about 27MB of RAM at idle — leaving over 400MB completely untouched.

The Stress Test

To get real numbers, I ran a series of load tests from another machine on the same network, hitting the web server with simultaneous requests and measuring how it responded under pressure.At 25 concurrent users making continuous requests for 30 seconds, the Pi served 29.7 pages per second with a 100% success rate and an average response time of 831 milliseconds. Not instant, but consistent and completely reliable.Pushing it harder to 50 concurrent users — well beyond anything a typical personal site would see — the server reached 38.8 requests per second, still with zero failed transactions. Response time climbed to about 1.3 seconds per request, which is noticeable but not broken. The Pi was handling more simultaneous connections than it has cores, and it didn't drop a single one.For file transfers over WiFi, upload and download both came in around 1 to 1.3 MB per second — expected for 2.4GHz 802.11n with SSH encryption overhead.Throughout the entire test, RAM usage barely moved (from 27MB to 29MB), and the temperature rose by less than a single degree thanks to the SLS printed aluminium case that also serves as a heatsink.

Making It Actually Reliable

Every service is configured to restart automatically on failure, with a 10-second backoff before retrying. A background monitoring script checks network connectivity every 30 seconds, and if it detects the connection is gone, it waits, then restarts networking and all dependent services once the router comes back. In practice, the server recovers from a router reboot without any manual intervention.The OS is set up in a way that survives a sudden power cut too — since the filesystem is read-only and the OS runs from RAM, there's no risk of SD card corruption from an abrupt shutdown.

Security on a Minimal Setup

Running a public-facing server, even a small personal one, means paying attention to security. The setup went through a deliberate hardening pass:Password authentication for SSH was replaced with ED25519 key pairs, so there are no credentials anywhere in plain text. A firewall (UFW) was configured on the Pi, blocking everything except the specific ports actually needed. HTTP security headers were added to the web server — things like X-Frame-OptionsStrict-Transport-Security, and Content-Type-Options — which protect visitors from common browser-based attacks. rate limiting was implemented as well. Automatic security updates were enabled so the system patches itself without requiring manual attention.

The Numbers in Summary:

MetricResult
Idle RAM usage27 MB / 428 MB (6%)
RAM under full load29 MB (barely changed)
Web requests/sec @ 25 concurrent29.7 req/s
Web requests/sec @ 50 concurrent38.8 req/s
Failed requests under load0
Temperature under load29.9°C (passive cooling)
WiFi transfer speed~1–1.3 MB/s
Uptime at time of testing1 day, 2h 47min
Example of a setup that can keep the solar pi running indefinitely. Photo by Marie Verdeil.

Stress Test Results:

Hardware Specs

ComponentSpec
CPUARMv6 single-core @ ~1GHz (BogoMIPS: 996)
RAM512MB total / 428MB usable (84MB reserved by GPU)
Storage30GB SD card (runs as read-only, OS in tmpfs RAM disk)
Network802.11n WiFi 2.4GHz, RSSI -69dBm
OSAlpine Linux 3.21.6, kernel 6.12.1

Web Server Performance — lighttpd (static site)

TestResult
First request latency109ms (cold)
Subsequent requests14–23ms
Page size served9.7KB
25 concurrent users, 30s29.7 req/sec, 100% availability, 831ms avg response
50 concurrent users, 30s38.8 req/sec, 100% availability, 1,277ms avg response
>td >3.18 MB/sec
Failed transactions0


Key takeaway: Zero failures under 50 simultaneous users. Response time degrades gracefully -- still under 1.3 seconds at 50 concurrent connections.

File Exchange Service — DuckieBox

File Transfer Speed (WiFi)

DirectionSpeed
Upload to Pi (5MB)~1.1 MB/s
Download from Pi (5MB)~1.3 MB/s

Typical for 802.11n at 2.4GHz over SSH encryption overhead.

Storage & Memory

MetricValue
tmpfs write speed144.8 MB/s
tmpfs read speed283.9 MB/s
RAM used at idle27MB / 428MB (6>#/span###)
RAM used under load29MB (7>#/span### -- barely moved)
SD card used81.6MB / 29.7GB

The OS runs entirely from RAM (Alpine's diskless mode), which is why RAM I/O is fast and SD card wear is near-zero.

Thermal & Stability

MetricValue
Idle temperature29.3°C
After full stress test29.9°C (+0.6°C)
Uptime at test time1 day, 2h 47min
Active processes69
Swap0 bytes (none configured, none needed)

Temperature barely moved under load -- passive cooling is completely sufficient.

Services Running 24/7

The Pi Zero W handles a personal website with 50 simultaneous visitors without a single failure, uses only 7% RAM under full load, runs at under 30°C, and has been online for over a day without intervention. For personal site hosting and file exchange with friends and family, it's more than sufficient -- the bottleneck in my case is WiFi bandwidth (~1 MB/s), not the hardware.

Is It Enough?

For a personal website, a portfolio, a small blog, or a private file sharing service for friends and family — yes, comfortably. The Pi Zero W handled 50 simultaneous users without a single failure and barely warmed up doing it. It uses so little power it can realistically run off a 20W solar panel with a small battery. And it costs next to nothing to run.The bottleneck, if there is one, is the WiFi connection — not the processor and not the RAM. For anything beyond a few megabytes per transfer, a wired connection or a Pi with ethernet would be a meaningful upgrade. But for text, images, and reasonable-sized files? The Zero W is more than enough.

See the hosted sites in action

enjoythed.biz

jowe.me