DevOps

It Wasn't the Load Balancer: Stale MySQL Stats After a Migration
86 tables told MySQL they were empty, two days after 25 GB had been loaded into them. One query to find stale InnoDB statistics, and the second slowdown that same night that had nothing to do with them.

A Staging Database That Rebuilds Itself From Production Every Night
A Python script, a systemd timer and four checks that restore production into staging every night. The one that mattered most was counting the tables, because pg_restore exits 0 on an empty dump.

OpenTelemetry Into a Stack You Own
Four machines, one self-hosted SigNoz on a 7.5 GB box. The collector setup and naming scheme that keep it usable, and the two defaults that quietly deleted my logs and buried the box in its own profiling data.

Your Server Logs Are the Only Place You Can See AI Crawlers
Analytics can't see AI assistants reading a site, because they never run JavaScript. What a client's access logs showed instead, how I sort the three kinds of AI fetch, and what the log still can't tell you.

Getting Self-Hosted Mail to Actually Deliver
Notes from a bulk-mail server I built for a client, with fourteen sending IPs. The setup that has to be right, the config, and why a first send that passed every check still went to spam.

Why I Reach for a Modular Monolith First
Why I start client backends as one deployable with hard boundaries inside, using a marketplace I'm building as the example, and the few reasons I'd split it.

From Docker Compose to Infrastructure as Code with OpenTofu
My homelab runs from two Git repos: OpenTofu for the VMs, DNS and tunnels, and a small deploy script for 15 Compose stacks. How each one works, and the two and a half months one of them was quietly wrong.