<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Kiwilab</title>
    <link>https://kiwilab.dev/</link>
    <description>Recent content on Kiwilab</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Thu, 23 Jul 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://kiwilab.dev/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>One Server to Rule Them All</title>
      <link>https://kiwilab.dev/posts/one-serve-to-rule-them-all/</link>
      <pubDate>Thu, 23 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://kiwilab.dev/posts/one-serve-to-rule-them-all/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been slowly stripping my homelab down. Kubernetes to Docker was the first move. Three servers to one is the second.&lt;/p&gt;
&lt;p&gt;For a while, I had it split on purpose. One box for monitoring, one for Ansible, one for everything else I test at home. Different environments, different blast radius. Break something on the Ansible box, the rest doesn&amp;rsquo;t care.&lt;/p&gt;
&lt;p&gt;Then I actually looked at what the hardware was doing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Homelab: Network &amp; Virtualization Setup</title>
      <link>https://kiwilab.dev/projects/homelab/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://kiwilab.dev/projects/homelab/</guid>
      <description>My homelab behind OPNsense — WireGuard access from anywhere, an admin PC in front, and Proxmox for building and breaking things.</description>
    </item>
    <item>
      <title>Why I Went Back to Docker</title>
      <link>https://kiwilab.dev/posts/back-to-docker/</link>
      <pubDate>Thu, 16 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://kiwilab.dev/posts/back-to-docker/</guid>
      <description>I ran a full Kubernetes cluster with RKE2 and Flux in my homelab. Then I tore it down and went back to plain Docker. Here&amp;#39;s why.</description>
    </item>
    <item>
      <title>The Monitoring Alert That Was Just Time Machine</title>
      <link>https://kiwilab.dev/posts/monitoring-alert-timemachine/</link>
      <pubDate>Wed, 01 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://kiwilab.dev/posts/monitoring-alert-timemachine/</guid>
      <description>&lt;p&gt;Standard setup. Node Exporter and cAdvisor running on the servers, feeding metrics to the monitoring server over Wireguard.&lt;/p&gt;
&lt;p&gt;Nothing exotic. I wasn&amp;rsquo;t chasing a specific failure mode when I set it up. I just wanted numbers to look at.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-alert&#34;&gt;The alert&lt;/h2&gt;
&lt;p&gt;Disk usage on the Samba share on the NAS kept tripping the threshold. Almost full, every time.&lt;/p&gt;
&lt;p&gt;First reaction: something&amp;rsquo;s wrong. Logs filling up? A backup job stuck in a loop? I went looking for a problem.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pterodactyl Panel: Installing Game Servers the Easy Way</title>
      <link>https://kiwilab.dev/posts/pterodactyl-panel-test/</link>
      <pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://kiwilab.dev/posts/pterodactyl-panel-test/</guid>
      <description>&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;I kept hearing about Pterodactyl but never actually tried it.&lt;/p&gt;
&lt;p&gt;So I spun up a fresh Debian 13 VM and followed the &lt;a href=&#34;https://pterodactyl.io/panel/1.0/getting_started.html&#34;&gt;official docs&lt;/a&gt; from scratch.&lt;/p&gt;
&lt;p&gt;No shortcuts. No prior setup. Just the guide.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-is-pterodactyl&#34;&gt;What Is Pterodactyl?&lt;/h2&gt;
&lt;p&gt;An open-source game server management panel.&lt;/p&gt;
&lt;p&gt;Every game server runs in an &lt;strong&gt;isolated Docker container&lt;/strong&gt;.
The architecture splits into two parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Panel&lt;/strong&gt; — the web UI and API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wings&lt;/strong&gt; — the daemon that runs and manages the containers on the node&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Panel and Wings don&amp;rsquo;t need to be on the same machine.
That separation matters when you want to scale.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why I Moved My Game Servers from Homelab to Hetzner</title>
      <link>https://kiwilab.dev/posts/moving_to_hetzner/</link>
      <pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://kiwilab.dev/posts/moving_to_hetzner/</guid>
      <description>&lt;h1 id=&#34;summary&#34;&gt;Summary&lt;/h1&gt;
&lt;p&gt;Running game servers at home worked — until it didn’t.&lt;/p&gt;
&lt;p&gt;What started as a learning project slowly became a real workload with real users. Friends were connecting daily, sessions got longer, and expectations grew. At the same time, my home network was being used normally: streaming, downloads, updates, and general traffic.&lt;/p&gt;
&lt;p&gt;Eventually it became clear:&lt;/p&gt;
&lt;p&gt;Kubernetes was stable.
My storage was stable.
My home network was not.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-real-problem-home-network-limitations&#34;&gt;The Real Problem: Home Network Limitations&lt;/h2&gt;
&lt;p&gt;Game servers are extremely sensitive to:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Flux GitOps Setup with GitHub</title>
      <link>https://kiwilab.dev/posts/kubernetes_setup02-gitops/</link>
      <pubDate>Fri, 13 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://kiwilab.dev/posts/kubernetes_setup02-gitops/</guid>
      <description>&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;This post documents how I manage my Kubernetes cluster using Flux and a GitHub repository, and why I chose this approach.&lt;/p&gt;
&lt;p&gt;The short version: &lt;strong&gt;Git is the source of truth&lt;/strong&gt;. The cluster continuously reconciles itself toward whatever is declared in the repo.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;why-i-chose-gitops&#34;&gt;Why I Chose GitOps&lt;/h2&gt;
&lt;p&gt;Before GitOps, managing Kubernetes often turns into:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;applying YAML manually&lt;/li&gt;
&lt;li&gt;losing track of what changed&lt;/li&gt;
&lt;li&gt;“it worked yesterday” debugging&lt;/li&gt;
&lt;li&gt;differences between environments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GitOps fixes that by enforcing a clean workflow:&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Kubernetes Setup with OPNsense and RKE2</title>
      <link>https://kiwilab.dev/posts/kubernetes_setup01/</link>
      <pubDate>Fri, 13 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://kiwilab.dev/posts/kubernetes_setup01/</guid>
      <description>&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;This post documents my current Kubernetes architecture running in my homelab. The goal was not just &amp;ldquo;make it work&amp;rdquo;, but build something that is structured, secure, reproducible, and close to how I would design it in a small production environment.&lt;/p&gt;
&lt;p&gt;The stack is built around:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OPNsense as firewall and entry point&lt;/li&gt;
&lt;li&gt;HAProxy for load balancing&lt;/li&gt;
&lt;li&gt;RKE2 as the Kubernetes distribution&lt;/li&gt;
&lt;li&gt;Proxmox as virtualization layer&lt;/li&gt;
&lt;li&gt;Dedicated database VMs (PostgreSQL and MariaDB)&lt;/li&gt;
&lt;li&gt;WireGuard for secure access&lt;/li&gt;
&lt;li&gt;Restic for encrypted S3 backups&lt;/li&gt;
&lt;li&gt;Traefik + CrowdSec for ingress and security&lt;/li&gt;
&lt;li&gt;MetalLB for static service IPs&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;network-design&#34;&gt;Network Design&lt;/h2&gt;
&lt;p&gt;The internal cluster network runs on:&lt;/p&gt;</description>
    </item>
    <item>
      <title>From Proxmox &amp; Docker to Kubernetes</title>
      <link>https://kiwilab.dev/posts/docker_to_kubernetes/</link>
      <pubDate>Mon, 09 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://kiwilab.dev/posts/docker_to_kubernetes/</guid>
      <description>&lt;h2 id=&#34;background&#34;&gt;Background&lt;/h2&gt;
&lt;p&gt;My homelab started in a fairly classic way.&lt;/p&gt;
&lt;p&gt;I was running &lt;strong&gt;Proxmox&lt;/strong&gt; as a hypervisor with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;one main VM running Docker&lt;/li&gt;
&lt;li&gt;one NAS for storage&lt;/li&gt;
&lt;li&gt;two additional Mini PCs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Across these systems, I hosted:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;game servers for friends&lt;/li&gt;
&lt;li&gt;internal websites&lt;/li&gt;
&lt;li&gt;a personal wiki&lt;/li&gt;
&lt;li&gt;monitoring and small helper services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At the time, this setup worked well. It was flexible, easy to understand, and fast to get running.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;how-the-old-setup-worked&#34;&gt;How the Old Setup Worked&lt;/h2&gt;
&lt;p&gt;Each host had a clear role:&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://kiwilab.dev/about/</link>
      <pubDate>Thu, 05 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://kiwilab.dev/about/</guid>
      <description>Dominik — Linux System Administrator from Germany. Webservers, containers, and practical infrastructure that runs 24/7.</description>
    </item>
    <item>
      <title>Impressum</title>
      <link>https://kiwilab.dev/impressum/</link>
      <pubDate>Thu, 05 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://kiwilab.dev/impressum/</guid>
      <description>&lt;p&gt;Name: Dominik Mehlhorn&lt;br&gt;
Adresse: Rudolf-Virchow-Str. 7&lt;br&gt;
Ort: 58300 Wetter&lt;br&gt;
E-Mail: &lt;a href=&#34;mailto:dominik.mehlhorn@gmail.com&#34;&gt;dominik.mehlhorn@gmail.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Verantwortlich für den Inhalt: wie oben&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
