The Private
Cloud
In which a retired desktop computer is persuaded to replace Google Drive, Google Photos and a great deal of monthly expenditure — and to serve an entire household while remaining invisible to the internet.
The premise was straightforward: I was renting storage for photographs I had taken myself. An old tower was sitting unused with a two-terabyte disk in it. The gap between those two facts is this project.
What it became is a household file server — separate accounts for each member, mounted as an ordinary network drive on Windows, macOS and Linux alike — alongside a photo library that backs up phones automatically, and an encrypted backup regime that has actually been tested by restoring from it rather than merely assumed to work.
The design constraint that shaped everything was privacy without inconvenience. Services had to be reachable from a phone on mobile data, from a laptop in another country, and from a relative's Windows machine — without ever opening the house to the public internet. A private mesh network solved it, and every decision below follows from that choice.
How the Pieces Connect
Every device joins a private mesh. The server publishes nothing to the outside world.
What Runs, and Why
| Component | Purpose & Reasoning |
|---|---|
| Fedora Server | Chosen over a rolling-release distribution deliberately: a machine holding the household's only copy of anything should be boring. SELinux left enforcing, which accounted for a good share of the debugging. |
| Docker | Every service containerised, so a broken experiment never contaminates the host. Compose files and systemd units keep it reproducible. |
| Immich | Replaces Google Photos. Background upload from phones, face recognition and semantic search, all processed locally on the machine's GPU. |
| Nextcloud | Replaces Google Drive. Per-person accounts with storage quotas, exposed over WebDAV so it mounts as a native drive on every operating system in the house. |
| Tailscale | The keystone. A private mesh with automatic certificates means real HTTPS and remote access with no port forwarding, no dynamic DNS, and no exposure. |
| Navidrome | Music streaming over the Subsonic protocol, so any of a dozen mobile clients work with it. |
| Borg & rsync | Nightly deduplicated encrypted backups of the file server; weekly mirrors of the photo library and its database to a physically separate disk. |
Three Problems Worth Reporting
I. A Firewall That Wasn't
The firewall reported no open ports. The speech service, meanwhile, cheerfully announced itself on the machine's public IP address. Both were telling the truth: Docker publishes ports by writing its own packet-filtering rules, which sit beneath the firewall's zones rather than inside them.
Inspecting what was actually listening — rather than what was supposedly blocked — showed the services bound to every interface on the machine. Binding them explicitly to the mesh address closed the gap for good. The generalisable lesson: verify the state of the system, not the configuration you believe describes it.
II. The Crash Mid-Backup
The first full backup froze the machine outright. On restart the file server refused to come up, reporting endlessly that a backup was still running. It was not; the process had been killed, leaving a lock file behind that nothing was left alive to remove.
Reading the service's own log rather than guessing produced the answer — it printed the exact command to clear the stale lock. A useful reminder that mature software often anticipates its own failure modes, and that the log is the first place to look, not the last.
III. Three Hundred Gigabytes and a Space
Migrating an old archive onto the server exposed how brittle assumptions about filenames can be. Documents named in Arabic and Urdu failed to index, because the file server accepts only one Unicode normalisation form and the drive supplied another. A single command normalised them in place.
A related lesson followed shortly afterwards: an account whose username contained a space cost hours across three operating systems, because a space is legal in a display name and awkward in nearly every protocol that touches it. The account was recreated with a plain name and every symptom vanished at once.
The Second Half of the Story
What It Cost, and What It Bought
The hardware was already owned; the software is free; the running cost is electricity and occasional attention. Against that: photographs backed up automatically from every phone in the house, a family sharing documents across three operating systems, encrypted backups on a separate disk, and no monthly invoice from anyone.
The honest trade is responsibility. Google kept redundant copies of everything invisibly; that job is now mine, which is precisely why the backup regime was built before anything was deleted from the old accounts, and why it was tested by restoring rather than trusted on faith.
Every component here was chosen, installed, broken, diagnosed and repaired by hand. The account above is not a tutorial followed to completion; it is a record of decisions made and mistakes corrected — which is the only sort of experience worth reporting.