My Google storage was getting full and I didn’t want to pay for more. So I thought, why not just self-host my photos? That was the plan. But then I kept adding things and now there’s a whole homelab running under my desk.

The Hardware

It’s a hand-me-down mini PC. AMD Ryzen 6800H, 24GB RAM. Runs Debian. Gets the job done.

Storage is a Pibox Dual 2 Bay enclosure with two old laptop HDDs I had lying around. I pulled them out of laptops when I upgraded to SSDs and they were just sitting in a drawer. Threw them into a RAID config and now they store my photos, media, backups. Slow? Yeah. Works? Also yeah.

First thing after setting up Debian, I made sure the whole thing comes back on its own after a power cut. BIOS set to auto-power-on, auto-login configured, and restart: unless-stopped on every container. The setup runs on solar power so it barely costs anything to keep running.

Networking

No static IP, so I needed to work around that.

Cloudflare Tunnel for public access. It makes an outbound connection so I don’t have to open ports on my router. Domain is from Porkbun, DNS on Cloudflare.

Headscale for private access when I’m out. It’s basically self-hosted Tailscale. I moved it to a free Oracle Cloud VM because running it behind Cloudflare Tunnel wasn’t working, websockets kept breaking.

Traefik as reverse proxy. It picks up Docker labels automatically, so adding a new service doesn’t need any config changes.

What I Run

Immich the whole reason this started. I tried Ente first because it’s e2e encrypted, but I couldn’t get it working. Setup kept breaking. Switched to Immich and had it up in about an hour. Phone backup, face recognition, map, timeline, it’s good. I don’t miss Google Photos.

Plan is to run Ente eventually. I want to share storage with a friend and Immich isn’t e2e encrypted, so I’m not comfortable having someone else on the same instance.

For Immich networking, I set it up so the app uses my local address when I’m home, Headscale when I’m out, and Cloudflare Tunnel as a last resort. I wouldn’t recommend the tunnel for photo backups, there’s a file size limit that’s annoying with videos.

Metabase hooked up to my Postgres databases. I use it to build quick dashboards for whatever I’m tracking.

Ollama set this up mostly just to try out running local LLMs. The 6800H handles small models fine. I keep OLLAMA_KEEP_ALIVE=0 so models only load when needed and free up RAM otherwise.

Headscale ties all my devices together. Phone, laptop, the homelab itself, all on one mesh network. Runs on a free Oracle Cloud instance.

PostgreSQL a few instances for different projects. I’m a backend dev so having databases always running is just convenient.

Some Go services side projects and personal tools that I run here instead of paying for cloud hosting.

Beszel resource monitoring. CPU, RAM, disk usage, per-container stats.

Beszel dashboard showing CPU, memory, disk, and network usage over 30 days

Portainer Docker UI. Yeah I could use the CLI for everything but sometimes I just want to click and see logs.

Homepage dashboard for all services. First thing I check.

Redlib private Reddit frontend. Originally set it up so a friend could bypass Reddit being blocked on his company laptop. Kept it running because it’s just a cleaner experience.

What Went Wrong

Cloudflare Tunnel and Headscale don’t work well together. Websockets kept breaking, which Headscale needs to function. Had to move Headscale to Oracle Cloud to fix it.

Also I didn’t configure the BIOS auto-power-on at first. So every power cut, the mini PC just stayed off and I’d have to physically go press the power button. Did that enough times before I went into the BIOS and set it to turn back on automatically after power loss.

Would I Recommend It?

If you read all this and thought “I want to try that”, go for it. The tools are solid now and the community is great.

Stuff will break. You’ll waste a weekend on something stupid. But running your own photos, your own databases, your own services on a box you own, on solar power, that’s pretty cool.


Backend engineer. Go, PostgreSQL. Open source enthusiast. Tinkerer.