Homelab
The hardware, network, storage and hosting under it all, plus this site.
Posts
Moving a MEGAcmd sync to a new host turned every file that had changed since its last upload into a conflict. On top of that, half the account quota was old versions and the rubbish bin, the package installs its own apt source, and syncs are two-way only.
DNS lookups to the Pi-hole address succeeded, but its query log stayed empty. The answers came from the router, whose ad-block feature redirects every port-53 packet on the LAN to its own resolver. How I found out, and the one-line test that would have saved me the afternoon.
I added local semantic search to a small knowledge base, and the default LLM reranker took 33 seconds to put the wrong document first. Every cheaper path got it right, which I only found out by asking questions I already knew the answers to.
Retiring an unpatched WordPress on PHP 5.6 by replacing it with an Astro build pushed from a self-hosted Gitea runner to the same shared hosting.
Notes
Before a NAS reboots, everything using it has to stop. The inventory is wrong about what that is, umount does not release the mount, and the restore has to replay what was actually running.
An NFS mount using the QNAP filesystem path instead of the export name resolved to a different share, and an image that runs chown -R at startup re-owned almost everything on it. How to mount correctly, how to verify by inode, and why to keep the chown output.
The wildcard record was correct at the registrar, the public resolvers answered it, and the router and Pi-hole still said NXDOMAIN. They had cached the failure from a lookup made before the record existed, for the zone's negative TTL. How to tell, and the flush order.
influx backup has no incremental mode, and the backup of a 5 GB database takes 18 minutes while Home Assistant keeps writing. Restore a second backup into a scratch bucket and copy only the gap across with Flux to().
Home Assistant's InfluxDB integration can live in a UI config entry instead of configuration.yaml. Before moving or retiring the database, find the real writers in its own log.
Working out whether a mini PC can take a second NVMe: lspci only shows drives that are installed, dmidecode lists firmware defaults, and a generic board may not even say its model.
MEGAcmd restarted every 14 seconds with "Unable to connect to service". The real reason was an fcntl lock on an NFSv3 mount that outlived the killed server. Giving the lock file a new inode fixed it.
An LVM thin pool on Proxmox was 85 % allocated while the data inside used a third of that. Longhorn's volume trim moved nothing. fstrim on each node's filesystem took the pool to 25 % in five minutes.
Shared hosting FTP certificates usually cover the server node, not ftp.<your-domain>. Read the certificate, connect by the name it covers, and never turn verification off on a session carrying a password.
Pi-hole v6 shows clients as bare IPs unless you give them a description. A short stdlib Python script reads names from the UniFi controller and writes them through the Pi-hole API, then runs on a schedule as a CronJob. The API details and the traps in both.
Configure Shiki with two themes and no default colour, choose between them in CSS with prefers-color-scheme, and use a Shiki transformer, not a rehype plugin, to add file names and a copy button. Includes the contrast catch with the standard GitHub themes.
Keep the instructions in AGENTS.md and make CLAUDE.md a single line that imports it. And grep your global instructions before you rename anything, because a renamed file they point at breaks every session without an error.