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:
- lighttpd, a lightweight web server, handles the public-facing websites, sites have various optimizations like web compression and no scripting
- DuckieBox, a small Python file sharing application
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-Options, Strict-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:
| Metric | Result |
|---|---|
| Idle RAM usage | 27 MB / 428 MB (6%) |
| RAM under full load | 29 MB (barely changed) |
| Web requests/sec @ 25 concurrent | 29.7 req/s |
| Web requests/sec @ 50 concurrent | 38.8 req/s |
| Failed requests under load | 0 |
| Temperature under load | 29.9°C (passive cooling) |
| WiFi transfer speed | ~1–1.3 MB/s |
| Uptime at time of testing | 1 day, 2h 47min |

Stress Test Results:
Hardware Specs
| Component | Spec |
|---|---|
| CPU | ARMv6 single-core @ ~1GHz (BogoMIPS: 996) |
| RAM | 512MB total / 428MB usable (84MB reserved by GPU) |
| Storage | 30GB SD card (runs as read-only, OS in tmpfs RAM disk) |
| Network | 802.11n WiFi 2.4GHz, RSSI -69dBm |
| OS | Alpine Linux 3.21.6, kernel 6.12.1 |
Web Server Performance — lighttpd (static site)
| Test | Result |
|---|---|
| First request latency | 109ms (cold) |
| Subsequent requests | 14–23ms |
| Page size served | 9.7KB |
| 25 concurrent users, 30s | 29.7 req/sec, 100% availability, 831ms avg response |
| 50 concurrent users, 30s | 38.8 req/sec, 100% availability, 1,277ms avg response |
| >td >3.18 MB/sec | |
| Failed transactions | 0 |
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
- Running continuously, 51 seconds CPU time accumulated
- HTTP listening on 0.0.0.0:8080
File Transfer Speed (WiFi)
| Direction | Speed |
|---|---|
| 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
| Metric | Value |
|---|---|
| tmpfs write speed | 144.8 MB/s |
| tmpfs read speed | 283.9 MB/s |
| RAM used at idle | 27MB / 428MB (6>#/span###) |
| RAM used under load | 29MB (7>#/span### -- barely moved) |
| SD card used | 81.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
| Metric | Value |
|---|---|
| Idle temperature | 29.3°C |
| After full stress test | 29.9°C (+0.6°C) |
| Uptime at test time | 1 day, 2h 47min |
| Active processes | 69 |
| Swap | 0 bytes (none configured, none needed) |
Temperature barely moved under load -- passive cooling is completely sufficient.
Services Running 24/7
- lighttpd — static website
- duckiebox — file sharing
- sshd — remote access
- dcron — scheduled tasks
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
Quackieduckie