<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>infrastructure – apt-upgrade.me – Homelab, Linux &amp; DevSecOps</title><link>https://www.apt-upgrade.me/tag/infrastructure/</link><description>One nerd's homelab: Linux, Kubernetes, security, and the occasional disaster.</description><language>en-US</language><lastBuildDate>Tue, 31 Mar 2026 13:26:24 +0200</lastBuildDate><atom:link href="https://www.apt-upgrade.me/tag/infrastructure/index.xml" rel="self" type="application/rss+xml"/><item><title>WordPress on K3s — A Nerdy, Layered Update Strategy</title><link>https://www.apt-upgrade.me/2026/03/31/wordpress-on-k3s-a-nerdy-layered-update-strategy/</link><pubDate>Tue, 31 Mar 2026 13:26:24 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/03/31/wordpress-on-k3s-a-nerdy-layered-update-strategy/</guid><description>&lt;p&gt;This article is a direct continuation of the previous guide. If you haven’t read it yet, start here: &lt;a href="https://www.apt-upgrade.me/2026/03/30/from-debian-to-almalinux-to-k3s-or-how-i-accidentally-built-a-mini-cloud-%f0%9f%9a%80/"&gt;Initial Setup: WordPress on K3s (Ansible-managed)&lt;/a&gt;.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;This guide describes a clean, deterministic update pipeline for a WordPress stack running on Kubernetes via &lt;strong&gt;K3s&lt;/strong&gt;, orchestrated with &lt;strong&gt;Ansible&lt;/strong&gt;. Think of it as a layered onion of updates — each layer independently maintainable, yet fully composable. &lt;em&gt;It also serves as a personal reference — a kind of living documentation — until these workflows become second nature to me 😉&lt;/em&gt;&lt;/p&gt;</description></item><item><title>🔄 Rethinking the Plan (Again)</title><link>https://www.apt-upgrade.me/2026/03/05/%F0%9F%94%84-rethinking-the-plan-again/</link><pubDate>Thu, 05 Mar 2026 16:29:45 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/03/05/%F0%9F%94%84-rethinking-the-plan-again/</guid><description>&lt;p&gt;Well… it happened again 😄&lt;/p&gt;&#10;&lt;p&gt;After writing the original plan and thinking about the architecture for a while, I started questioning some of my decisions. That’s the nice thing about a homelab: &lt;strong&gt;nothing is set in stone&lt;/strong&gt;. The whole point is to iterate, learn, and sometimes rebuild everything from scratch.&lt;/p&gt;&#10;&lt;p&gt;So yes — the rebuild plan has changed. &lt;strong&gt;Again.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;It really feels like that classic Monopoly moment — standing in front of the board, landing on “Go back to Start,” grumbling, and realizing you have to rebuild everything from scratch… 😅🎲&lt;/p&gt;</description></item><item><title>Staring Into the Void: A Love Letter to Log Files</title><link>https://www.apt-upgrade.me/2025/12/19/staring-into-the-void-a-love-letter-to-log-files/</link><pubDate>Fri, 19 Dec 2025 15:50:47 +0100</pubDate><guid>https://www.apt-upgrade.me/2025/12/19/staring-into-the-void-a-love-letter-to-log-files/</guid><description>&lt;article class="wp-log-nerd-post"&gt;If you’ve ever stared at a terminal full of log messages, you know: logs are where systems&lt;br/&gt;&#10;tell the truth. They are noisy, sometimes ugly, but absolutely essential when things go wrong.Today I installed &lt;strong&gt;Graylog&lt;/strong&gt; and &lt;strong&gt;Fluent Bit&lt;/strong&gt; on my server. Not only&lt;br/&gt;&#10;because I work with these tools professionally, but also because I will increasingly use them in the future, as my homelab is meant for&lt;br/&gt;&#10;experimenting, learning, and keeping my brain busy.&lt;h2&gt;Why Logging Matters&lt;/h2&gt;&lt;p&gt;Logging is one of the most fundamental building blocks of reliable systems. Metrics tell you&lt;br/&gt;&#10;&lt;em&gt;that&lt;/em&gt; something is wrong, logs tell you &lt;em&gt;why&lt;/em&gt;. Centralized logging becomes crucial&lt;br/&gt;&#10;once you operate more than a single machine.&lt;/p&gt;&lt;h2&gt;Fluent Bit, Graylog &amp;amp; Sidecar&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Fluent Bit&lt;/strong&gt; acts as the client component on the server. Its job is simple:&lt;br/&gt;&#10;collect logs locally and ship them to Graylog.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Graylog&lt;/strong&gt; provides the GUI and backend where logs are stored, processed, searched,&lt;br/&gt;&#10;and used for alerting. It can easily be used to collect log messages from several thousand&lt;br/&gt;&#10;servers and analyze them centrally.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Sidecar&lt;/strong&gt; is an additional service that allows centralized configuration of the&lt;br/&gt;&#10;Fluent Bit agent directly from Graylog, making rollouts and changes much more convenient.&lt;/p&gt;&lt;h2&gt;Memory Tuning &amp;amp; First Lessons Learned&lt;/h2&gt;&lt;p&gt;Functionally everything worked quite well, but I had to significantly reduce the RAM&lt;br/&gt;&#10;requirements. Interestingly, Graylog immediately grabbed swap space — even though the server&lt;br/&gt;&#10;has a total of 32 GB RAM available.&lt;/p&gt;&lt;p&gt;These Java-related memory topics are still new to me, so that’s something I’ll have to dig&lt;br/&gt;&#10;deeper into. For the beginning, having a &lt;strong&gt;Grafana dashboard&lt;/strong&gt; was extremely&lt;br/&gt;&#10;helpful to monitor CPU and RAM usage in detail.&lt;/p&gt;&lt;p&gt;To limit heap usage, I added the following entry to&lt;br/&gt;&#10;&lt;code&gt;/etc/graylog/datanode/datanode.conf&lt;/code&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;opensearch_heap = 2g&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Fluent Bit Configuration Example&lt;/h2&gt;&lt;p&gt;The following is the current &lt;strong&gt;Fluent Bit&lt;/strong&gt; configuration running on my Ubuntu/Debian system. It collects logs from multiple local sources (systemd journal, syslog, auth logs, and kernel logs) and forwards everything to Graylog using the &lt;em&gt;GELF&lt;/em&gt; output over TCP.&lt;/p&gt;&lt;p&gt;This setup works well for a homelab environment while still being close to what you would run in production.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&amp;#10;############################################&amp;#10;# Fluent Bit – Ubuntu / Debian&amp;#10;############################################&amp;#10;&amp;#10;[SERVICE]&amp;#10; Flush 30&amp;#10; Daemon Off&amp;#10; Log_Level info&amp;#10; storage.type memory&amp;#10;&amp;#10;&amp;#10;###################################################################&amp;#10;# INPUTS&amp;#10;###################################################################&amp;#10;&amp;#10;# Systemd Journal (primary input source)&amp;#10;[INPUT]&amp;#10; Name systemd&amp;#10; Tag journal.*&amp;#10; Read_From_Tail On&amp;#10;&amp;#10;&amp;#10;# /var/log/syslog&amp;#10;[INPUT]&amp;#10; Name tail&amp;#10; Path /var/log/syslog&amp;#10; Tag syslog.*&amp;#10; DB /var/log/fluent-bit/db_syslog.db&amp;#10; Mem_Buf_Limit 5MB&amp;#10; Skip_Long_Lines On&amp;#10;&amp;#10;&amp;#10;# Authentication Logs&amp;#10;[INPUT]&amp;#10; Name tail&amp;#10; Path /var/log/auth.log&amp;#10; Tag auth.*&amp;#10;&amp;#10;&amp;#10;# Kernel Log&amp;#10;[INPUT]&amp;#10; Name tail&amp;#10; Path /var/log/kern.log&amp;#10; Tag kernel.*&amp;#10;&amp;#10;&amp;#10;###################################################################&amp;#10;# OUTPUT&amp;#10;###################################################################&amp;#10;&amp;#10;[OUTPUT]&amp;#10; Name gelf&amp;#10; Match *&amp;#10; Host 192.168.10.x&amp;#10; Port 12201&amp;#10; Mode udp&amp;#10; Gelf_Short_Message_Key log&amp;#10; Gelf_Host_Key host&amp;#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;With this configuration, Fluent Bit reliably ships all relevant system logs to Graylog,&lt;br/&gt;&#10;where they can be indexed, searched, and used for alerting.&lt;/p&gt;&lt;h2&gt;Final Thoughts&lt;/h2&gt;&lt;p&gt;Centralized logging is a powerful tool — even (or especially) in a homelab. It helps build&lt;br/&gt;&#10;intuition for production systems and makes troubleshooting far less painful when things&lt;br/&gt;&#10;eventually break.&lt;/p&gt;&lt;/article&gt;</description></item><item><title>Winter Mode: Running on Just One Server</title><link>https://www.apt-upgrade.me/2025/12/09/winter-mode-running-on-just-one-server/</link><pubDate>Tue, 09 Dec 2025 21:37:08 +0100</pubDate><guid>https://www.apt-upgrade.me/2025/12/09/winter-mode-running-on-just-one-server/</guid><description>&lt;p&gt;Right now I’m only running one of my three servers…&lt;/p&gt;&#10;&lt;p&gt;thanks to winter season my PV setup isn’t exactly flooding me with power,&lt;/p&gt;&#10;&lt;p&gt;so I’ve had to consolidate my workloads a bit. (Kidding… mostly.) ☃️🔋&lt;/p&gt;&#10;&lt;p&gt;But it &lt;em&gt;is&lt;/em&gt; pretty funny watching the whole thing in Grafana,&lt;/p&gt;&#10;&lt;p&gt;which I use to monitor the server’s performance.&lt;/p&gt;&#10;&lt;p&gt;From the network load you can clearly see the 6-hour backup cycles of the two Nextcloud instances I manage for local clubs.&lt;/p&gt;</description></item><item><title>How I Managed to Wreck My Firewall Appliance With a Debian 13 Upgrade</title><link>https://www.apt-upgrade.me/2025/08/20/how-i-managed-to-wreck-my-firewall-appliance-with-a-debian-13-upgrade/</link><pubDate>Wed, 20 Aug 2025 21:25:15 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/08/20/how-i-managed-to-wreck-my-firewall-appliance-with-a-debian-13-upgrade/</guid><description>&lt;p&gt;Yesterday I proudly hit publish on a post about my &lt;em&gt;super smooth&lt;/em&gt; upgrade to Debian 13… feeling like a proper Linux wizard. 🧙‍♂️&lt;/p&gt;&#10;&lt;p&gt;A few hours later, reality slapped me in the face: I managed to completely nuke my poor firewall appliance while trying to upgrade it as well. RIP.&lt;/p&gt;&#10;&lt;p&gt;Technically, it still booted and looked fine – no scary red error messages. But this box was the one running &lt;strong&gt;Traefik&lt;/strong&gt;, the gatekeeper to my self-hosted blog. And suddenly… things got weird.&lt;/p&gt;</description></item></channel></rss>