What (and why) I self-host on a Raspberry Pi

I started self-hosting because I wanted a way out.

For years I was a "cloud person". My photos lived in Google Photos, my notes in Apple Notes, and my website on a rented server on Amazon AWS. It was all convenient. Google Photos was free until June 2021 and then it wasn't. Once enough people had uploaded enough photos, the rules changed. That seems to be the common pattern - get you in, they make leaving painful, then they charge you monies.

Louis Rossmann has been an inspiration and a guide for me here, through his years of repair work and his fight for the right to repair and against anti-consumer tech. The Fulu Foundation carries that fight forward, and it's a good place to start if you want to see what these rights look like in practice. Also, here's his FUTO's wiki called Introduction to a Self Managed Life, a 13-hour presentation and written guide that covers networking, home services and more.

Some other projects I've run into along the way have been the Degooglise Internet project, and Berlin's Topio foundation that helps people move off Big Tech.

The hardware

Everything runs on a Raspberry Pi 5 sitting in my house. That includes the website you're reading this (no AWS, external cloud).

ComputerRaspberry Pi 5 (Model B), 8 GB RAM
Data disk1 TB Samsung T7 portable SSD
NetworkHome router, one LAN address, no open inbound ports

The easiest is to buy a starter pack like this one - the Raspberry Pi 5 starter kit which costs €102 in 2026. It comes with everything you need to get started.

Along with the Samsung T7 SSD, the total cost was a little over €200.

The Pi consumes about 53 kWh per year. At about €0.35-0.40 per kWh (typical German household rate), that is roughly €18-21 per year, or under €2 a month (this is an estimate, not a measurement).

In normal use it sits around 44 °C with a load of about 0.1 and several GB of RAM free.

What I run

Almost everything is a Docker Compose stack.

Helpful tips

Three tools do most of the heavy lifting, followed by the gotchas that cost me evenings.

Use Cloudflare Tunnel to get around dynamic IPs. Most households don't have a fixed public IP address. Your internet provider hands you one that changes every so often, which makes hosting from home difficult, because the address the world uses to find your server keeps moving. You'd also normally need to open ports on your router, which is a security risk in itself. Cloudflare Tunnel solves both. A small container on the Pi connects outbound to Cloudflare, and Cloudflare sends visitors down that connection to your services. So it doesn't matter what my IP is today, and I have no open inbound ports at all. This was the biggest relief of the whole setup.

Use Docker to manage everything. Every service I run lives in its own Docker container, defined in a Compose file. Installing something new is mostly "download the compose file, run docker compose up -d". Updating is docker compose pull and up -d again, and removing something leaves no mess on the system. It also keeps services from stepping on each other's dependencies, and moving to a new machine mostly means copying the folders over.

Use Nginx Proxy Manager to manage website hosting. Nginx Proxy Manager gives you a web interface for deciding which hostname goes to which container or folder. I add a new website or app by creating an entry in the UI (name, where it lives, done) instead of editing nginx config files by hand. It's how this website and all my other sites are served from the same Pi.

Gotchas

Docker containers can't see each other by default. Each container lives in its own sandbox. Nginx Proxy Manager couldn't reach Nextcloud until I explicitly connected the two networks (docker network connect ...). Sometimes even services inside one compose file need to share a network before they work together.

Port clashes. I run Postgres on the host for Pi-hole, so any container that wanted the default Postgres port 5432 simply failed. Change the published port, or move one of them.

DNS caching makes you think you broke something. After adding a hostname, my Mac kept insisting it didn't exist. Flushing the local DNS cache fixed it. I now try that before debugging anything else.

Limitations: what I don't self-host

Self-hosting isn't the right answer for everything. Two things I deliberately leave to someone else.

A password manager. I'd love to run Vaultwarden, but I don't. A password manager is the one service where failure is catastrophic and you can't afford to be the only person responsible for it. I use Bitwarden instead.

Email (SMTP). I don't run my own mail server. Sending mail from a home connection scores badly with the big providers: residential IP ranges are routinely on spam blocklists, many ISPs block port 25, and the IP changes. Even with SPF, DKIM and DMARC set up correctly, mail from a self-hosted server tends to end up in the spam folder, or not arrive at all. Receiving is the easy half, sending reliably is the hard half, and an email address I can't trust to reach people isn't worth the risk. (The FUTO guide has a self-managed email section that uses an outbound relay for exactly this reason.)

What's still on my to-do list

It isn't finished, and I'd rather say so than pretend.

Conclusion

Two years ago, setting all this up meant reading documentation. A lot of it. I read guides, documents, and long forum threads, and I got things wrong more than once before they worked. When something broke, there was no one to ask, just logs and patience.

Today you can describe what you want to an AI and get a working compose file, an nginx config and a fix for the error message in about a minute. It has made installing almost anything easy.

I believe that with AI, more people will get to try self-hosting who would have given up in the first hour.

If you've been thinking about leaving a service, you can always start small.

If I had to recommend a single service for you to try, it would be Immich. It has all the functionality you use in Google Photos (or Apple Photos), including face detection (which runs locally on the PI!), is well funded and supported by the community, and is easy to set up (including an easy way to import all your Google Photos, with all the metadata and even live photos if you want).

  1. Buy the Raspberry Pi starter kit (you don't need more than 8 GB RAM unless you want to run your own AI models locally)
  2. Use Claude Code to help with the setup. Once you have the basics setup (like SSH access, and Docker), then installing services is as simple as "Claude install Immich".
  3. Awesome Selfhosted is a great resource for finding new open source projects that you can self host.