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).
| Computer | Raspberry Pi 5 (Model B), 8 GB RAM |
| Data disk | 1 TB Samsung T7 portable SSD |
| Network | Home 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.
- Immich replaces Google Photos. It runs its own database and a machine-learning container for search and face grouping.
- Nextcloud replaces Google Drive for files.
- Pi-hole blocks ads and trackers for the whole home network at the DNS level.
- Nginx Proxy Manager routes each hostname to the right container.
- Cloudflare Tunnel (cloudflared) exposes the services I want public without opening any port on my router.
- My websites, including the one you're reading this on, served as static files straight from the Pi.
- A BVG departures and weather display. I built an e-paper display where a small Python script on the Pi pulled Berlin train and tram times from the BVG API plus the weather, rendered it into an image, and served it on my home network, and a Raspberry Pi Pico in a picture frame by the door fetched it every couple of minutes. I wrote about how I built it, and the code is on GitHub.
- SilverBullet, a web editor for my notes
- A notes MCP server that lets me read and write markdown files on the server using Claude on my phone.
- Fail2ban and ufw as the security basics.
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.
- Backups. The big one. Dump the Postgres and MariaDB databases, then back up photos, files and configs with restic or borg to a second device or off-site location.
- Remote access to the home-only tools (like the notes editor) from outside the house, probably over Tailscale.
- Look into the Fediverse (Mastodon, PeerTube)
- Self-hosted video calls (Jitsi).
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).
- 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)
- 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".
- Awesome Selfhosted is a great resource for finding new open source projects that you can self host.