<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kogent.Tech — Infrastructure Engineering Blog</title><link>https://blog.kogent.tech/</link><description>Recent content on Kogent.Tech — Infrastructure Engineering Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 06 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.kogent.tech/index.xml" rel="self" type="application/rss+xml"/><item><title>How We Built a Self-Healing DNS Failover for $0 Using Cloudflare Workers</title><link>https://blog.kogent.tech/posts/building-a-failover/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://blog.kogent.tech/posts/building-a-failover/</guid><description>&lt;p&gt;Every hosting provider has maintenance windows. Most give you notice. Some don&amp;rsquo;t.
When your provider goes dark at an inconvenient time, you have two options: scramble
to restore service or switch traffic to a secondary site that&amp;rsquo;s already running and
already current. The first option is stressful. The second one is engineering.&lt;/p&gt;
&lt;p&gt;This post covers how we built automated DNS failover across a fleet of production
sites — our own &amp;lsquo;kogent.tech&amp;rsquo; and several client sites — using Cloudflare Workers, Cloudflare KV,
an on-premises server, and a Cloudflare Tunnel. The whole system costs nothing in
ongoing fees. Failover takes under two minutes. Failback is automatic.&lt;/p&gt;</description></item><item><title>Building a Data-Sovereign Mail Server, Part 1: Classical Hardening</title><link>https://blog.kogent.tech/posts/building-a-mail-server/</link><pubDate>Wed, 29 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.kogent.tech/posts/building-a-mail-server/</guid><description>&lt;p&gt;Running your own mail server has a reputation. The conventional wisdom is that it&amp;rsquo;s a masochistic endeavour best left to people who enjoy reading RFC errata for fun on a Sunday afternoon. Spam filters will hate you. Your IP will be blacklisted before you send your first message. You&amp;rsquo;ll wake up at 3am to a silent inbox and spend an hour discovering that a single missing SPF record cost you a week of legitimate mail.&lt;/p&gt;</description></item><item><title>Building a DevOps blog: Hugo, GitLab CI, and Cloudflare Pages</title><link>https://blog.kogent.tech/posts/building-a-devops-blog/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://blog.kogent.tech/posts/building-a-devops-blog/</guid><description>&lt;p&gt;A DevOps blog should practice what it preaches. So when I decided to start writing
about infrastructure work, I wasn&amp;rsquo;t going to click through a WordPress installer
or pick a Squarespace template. The blog itself needed to be a project —
version-controlled, automated, infrastructure-as-code, and deployed through a
proper CI/CD pipeline.&lt;/p&gt;
&lt;p&gt;This is the write-up of how I built &lt;a href="https://blog.kogent.tech"&gt;blog.kogent.tech&lt;/a&gt;
from scratch — the stack decisions, the theme build, the pipeline, and everything
that broke along the way.&lt;/p&gt;</description></item><item><title>Migrating six WordPress sites to Kubernetes: what actually broke</title><link>https://blog.kogent.tech/posts/k8s-migration/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://blog.kogent.tech/posts/k8s-migration/</guid><description>&lt;p&gt;Running six WordPress sites on a bare-metal Debian 11 LAMP stack is fine — until it isn&amp;rsquo;t. No secret management, no automated backups, and deployments meant SSH-ing into the server and copying files. By early 2026 the technical debt was obvious enough to justify a full migration.&lt;/p&gt;
&lt;p&gt;The goal: migrate everything to Kubernetes, implement proper secret management with HashiCorp Vault, automate backups, and decommission the old host entirely. This post covers what that actually looked like — not the happy path, but the parts that broke and why.&lt;/p&gt;</description></item></channel></rss>