<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Devops on Project Wintermute</title><link>https://wintermutecore.com/tags/devops/</link><description>Recent content in Devops on Project Wintermute</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 05 Mar 2026 14:00:00 +0200</lastBuildDate><atom:link href="https://wintermutecore.com/tags/devops/index.xml" rel="self" type="application/rss+xml"/><item><title>k3s on Hetzner: notes from running production clusters</title><link>https://wintermutecore.com/posts/k3s-hetzner-production-notes/</link><pubDate>Thu, 05 Mar 2026 14:00:00 +0200</pubDate><guid>https://wintermutecore.com/posts/k3s-hetzner-production-notes/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR.&lt;/strong&gt; k3s on Hetzner is a strong cost-control move when you are willing to operate the cluster. Mind the Flannel MTU on Hetzner private networks, separate stateless and stateful workloads at the storage layer, keep observability minimal but real, and treat backups as a tested practice rather than a config setting.&lt;/p&gt;
&lt;p&gt;A managed Kubernetes service is the right answer for most teams. When it is not the right answer (cost, control, locality of data), self-hosted k3s on a low-cost provider like Hetzner is one of the better options. We have run several clusters of this shape in production for over a year. This post is the set of decisions that have held up.&lt;/p&gt;</description></item><item><title>Speeding up GitHub Actions lint pipelines for large Go codebases</title><link>https://wintermutecore.com/posts/go-ci-lint-pipeline-optimisation/</link><pubDate>Thu, 12 Feb 2026 10:00:00 +0200</pubDate><guid>https://wintermutecore.com/posts/go-ci-lint-pipeline-optimisation/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR.&lt;/strong&gt; Lint on a large Go monorepo went from 63 seconds to about 25 seconds on warm cache, with macOS skipped on branches. Five changes: concurrency group, conditional OS matrix, combined cache restore and save, explicit &lt;code&gt;go mod download&lt;/code&gt;, and incremental &lt;code&gt;golangci-lint --new-from-rev&lt;/code&gt;. None require a self-hosted runner.&lt;/p&gt;
&lt;p&gt;A large Go codebase makes the CI lint stage the part developers feel most: every push, on every branch. Lint feedback that takes a minute and a half kills iteration speed and quietly trains people to push less often, which is the opposite of what you want.&lt;/p&gt;</description></item><item><title>Anatomy of a 6-hour Kubernetes ingress outage</title><link>https://wintermutecore.com/posts/kubernetes-ingress-outage-postmortem/</link><pubDate>Mon, 09 Feb 2026 12:00:00 +0200</pubDate><guid>https://wintermutecore.com/posts/kubernetes-ingress-outage-postmortem/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR.&lt;/strong&gt; A backend deployment lost all healthy pods. nginx active health checks marked the upstream pool empty. That pool was the &lt;code&gt;default_server&lt;/code&gt; for ports 80 and 443, so every unmatched hostname returned 502 for 6 hours and 38 minutes. The trigger was Kubernetes-side. The blast radius was a configuration choice we made years ago. The post-incident fixes were almost all on the nginx side.&lt;/p&gt;
&lt;p&gt;We had a P0 outage on a public ingress tier. Two redundant nginx instances, both showing the same symptoms, both serving production traffic to dozens of hostnames. This is the writeup, sanitised and reduced to the parts that generalise.&lt;/p&gt;</description></item><item><title>Services</title><link>https://wintermutecore.com/services/</link><pubDate>Sun, 13 Feb 2022 11:11:11 -0100</pubDate><guid>https://wintermutecore.com/services/</guid><description>&lt;p&gt;&lt;p style="text-align:center;"&gt;
 &lt;img src="https://wintermutecore.com/services.jpg" alt="Services" /&gt;
&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;Below is what we actually do day to day. We try to keep the list short and the descriptions honest. If something here matches what you need, get in touch.&lt;/p&gt;

&lt;h2 id="software-engineering" class="anchor-link"&gt;&lt;a href="#software-engineering"&gt;Software engineering&lt;span class="pilcrow"&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We write backend services in Java, Kotlin, Go, and Groovy. Most of the work falls into a few buckets: REST and gRPC APIs, distributed systems handling high request volumes, and the occasional batch job that has to be reliable more than fast.&lt;/p&gt;</description></item></channel></rss>