A Place for Memories

Open vintage photo album, a wooden keepsake box, and scattered family photographs on a rustic table in warm window light.

There are some services you build because they are interesting, and others you build because they answer a real need. Immich was always in the second category.

Photos are not just files. They are memories, context, and the shape of a life over time. They are easy to collect and surprisingly easy to lose track of. Over the years, I had accumulated more and more of them, but I had never really given them a proper home. They existed across devices, in different places, under different assumptions, and that was beginning to feel less like convenience and more like a path toward the fog of forgetting.

So at some point, it became obvious that the next real service in the homelab should be Immich.

That decision also felt like a kind of test. Up until now, a lot of the rebuild had been about foundations. Hosts. Storage. DNS. Reverse proxying. HTTPS. A dashboard. Local AI. Useful things, certainly, but still mostly infrastructure. Immich was different. Immich is not just another component in the lab. It is a service you actually use. It is the sort of thing that changes the lab from being a place where systems run into a place where something meaningful lives.

I decided to run it on hammer.

That felt like the right home for it. hammer already made sense as the more storage-oriented machine, and Immich is one of those services where simplicity matters. I did not want to get too clever. I wanted a dedicated VM, Ubuntu 24.04, Docker, and a straightforward deployment layout that I could understand later without having to reverse-engineer my own decisions.

So the VM was created, given enough room to breathe, and set up cleanly. Docker went on. A simple directory layout under /srv/immich followed. Postgres had its place. The machine learning cache had its place. The library had its place. That may not sound exciting, but I keep coming back to the same lesson: services feel easier to trust when they have a structure that makes sense at a glance.

That mattered here.

Immich itself came up without too much drama. Redis, Postgres, the server, the machine learning service - all of it settled down in the way you hope a stack will when you have taken enough care in the steps before it. The first real moment of relief came when the web interface loaded and the service stopped being theoretical. At that point, it was no longer “an Immich VM.” It was the beginning of an actual photo home.

I also made one decision early that I think was important: I kept the focus on photos.

Immich can handle video too, but I knew that if I tried to solve everything at once, I would make the whole thing more complicated than it needed to be. Photos are the core use case for me. Photos are what I care about. They are also the lighter, cleaner path through the problem. Smaller files, simpler uploads, fewer moving parts, less chance of turning the service into a performance problem before I had even learned to trust it.

That turned out to be the right instinct.

For access, I chose to publish photos.cdilks.com through Cloudflare Tunnel rather than opening ports directly into the house. That was one of those decisions that felt very aligned with the overall direction of the rebuild. I am trying, slowly, to make the lab more coherent without making it more exposed than it needs to be. Cloudflare Tunnel let me keep that boundary intact. The service became reachable without turning my home network into the front line.

What mattered even more was that the URL stayed simple.

If the service is going to be used from a browser and from a phone, then it needs one clear identity. I did not want one address internally and another externally. I did not want to explain to myself, six months later, why one path existed for Wi-Fi and another for mobile data. I wanted one name that meant the service everywhere.

So that name became photos.cdilks.com.

That part may seem small, but names matter more than people often realise. A service becomes easier to trust when it has a proper place to live. Internal DNS taught me that for the homelab as a whole. Immich reinforced it. A photo service should feel like it belongs somewhere. A stable name is part of that.

There is also something different about self-hosting photos compared with self-hosting infrastructure.

DNS can be rebuilt. Dashboards can be recreated. Reverse proxy config can be written again. Even local AI, for all its interest, is still mostly experimentation at this stage. Photos are different. They carry actual life with them. They are one of the places where the abstract work of systems and storage becomes personal very quickly. That changes how I think about reliability, naming, and backups. It also changes how seriously I take the deployment. Once a photo service starts to matter, it matters in a way that is harder to shrug off.

That is probably why Immich feels like a milestone.

It is not the largest thing in the lab, or the most technically intricate, or the most novel. But it is one of the first services in this rebuild that clearly belongs to ordinary life. It gives the infrastructure a purpose that goes beyond itself. It is not there to prove I can run it. It is there because photos deserve a place to live that feels deliberate, searchable, and mine.

That, more than anything, is what made the setup worthwhile.

The infrastructure mattered. The VM mattered. Docker mattered. Naming mattered. Tunnel access mattered. But none of those were the point. They were only the conditions that made the point possible.

The point was to give those memories a home.