<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>apt-upgrade.me – Homelab, Linux &amp; DevSecOps</title><link>https://www.apt-upgrade.me/</link><description>One nerd's homelab: Linux, Kubernetes, security, and the occasional disaster.</description><language>en-US</language><lastBuildDate>Fri, 06 Nov 2026 18:03:29 +0100</lastBuildDate><atom:link href="https://www.apt-upgrade.me/index.xml" rel="self" type="application/rss+xml"/><item><title>This Blog Now Runs on Hugo: No WordPress, No Kubernetes, and Stable HTTP/3</title><link>https://www.apt-upgrade.me/2026/11/06/this-blog-now-runs-on-hugo-no-wordpress-no-kubernetes-and-stable-http-3/</link><pubDate>Fri, 06 Nov 2026 18:03:29 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/11/06/this-blog-now-runs-on-hugo-no-wordpress-no-kubernetes-and-stable-http-3/</guid><description>&lt;p&gt;&lt;strong&gt;In short:&lt;/strong&gt; This blog no longer runs on WordPress and Kubernetes. It now consists of finished files that nginx serves from a hardened AlmaLinux 10. In the &lt;a href="https://www.apt-upgrade.me/2026/11/05/do-i-even-need-wordpress-and-kubernetes-for-this-blog-a-hugo-experiment-real-numbers-and-what-a-migration-would-take/"&gt;Hugo experiment&lt;/a&gt; a few days ago nothing was decided yet; on November 6, 2026 I made the switch. All posts in four languages keep their old addresses, Grafana and the hardening stayed, PHP, the database and the cluster are gone. And HTTP/3, which I &lt;a href="https://www.apt-upgrade.me/2026/11/03/http-3-for-my-blog-and-nextcloud-one-switch-two-hidden-brakes-and-what-the-measurements-show/"&gt;switched off&lt;/a&gt; only this week, is running again.&lt;/p&gt;</description></item><item><title>Do I Even Need WordPress and Kubernetes for This Blog? A Hugo Experiment, Real Numbers, and What a Migration Would Take</title><link>https://www.apt-upgrade.me/2026/11/05/do-i-even-need-wordpress-and-kubernetes-for-this-blog-a-hugo-experiment-real-numbers-and-what-a-migration-would-take/</link><pubDate>Thu, 05 Nov 2026 21:57:56 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/11/05/do-i-even-need-wordpress-and-kubernetes-for-this-blog-a-hugo-experiment-real-numbers-and-what-a-migration-would-take/</guid><description>&lt;p&gt;&lt;strong&gt;Update of November 6, 2026:&lt;/strong&gt; It has since been decided and done: this blog now runs on Hugo. &lt;a href="https://www.apt-upgrade.me/2026/11/06/this-blog-now-runs-on-hugo-no-wordpress-no-kubernetes-and-stable-http-3/"&gt;What happened along the way is here.&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;The short version:&lt;/strong&gt; This blog is mostly text and images, yet it runs on Kubernetes with a database, a PHP pool, a cache and ten plugins. So I rebuilt a part of it as a static site with Hugo and compared the two. The result surprised me in both directions: for readers, the speed gain is smaller than expected. For maintenance, the gain is much larger. &lt;strong&gt;The decision is not made. This blog still runs on WordPress.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Legal Housekeeping for a Tech Blog: What I Cleaned Up – From the Imprint to the Images</title><link>https://www.apt-upgrade.me/2026/11/05/legal-housekeeping-for-a-tech-blog-what-i-cleaned-up-from-the-imprint-to-the-images/</link><pubDate>Thu, 05 Nov 2026 08:56:08 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/11/05/legal-housekeeping-for-a-tech-blog-what-i-cleaned-up-from-the-imprint-to-the-images/</guid><description>&lt;p&gt;&lt;em&gt;Up front: this is a field report, not legal advice. I am an admin, not a lawyer. If in doubt, ask someone who does this for a living.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;A private tech blog in Germany is not a legal no man&amp;rsquo;s land. Imprint, privacy, copyright on images – each of them carries the risk of a formal warning letter, and the longer a blog runs, the more piles up. So in October I went through my blog systematically: where might I step on someone&amp;rsquo;s toes, where do I reveal more than necessary, and where am I open to attack? This post sums up what I found and changed.&lt;/p&gt;</description></item><item><title>Deep Dive: AIDE and rkhunter on a K3s Host – Integrity Checks Without Drowning in False Alarms</title><link>https://www.apt-upgrade.me/2026/11/05/deep-dive-aide-and-rkhunter-on-a-k3s-host-integrity-checks-without-drowning-in-false-alarms/</link><pubDate>Thu, 05 Nov 2026 08:36:43 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/11/05/deep-dive-aide-and-rkhunter-on-a-k3s-host-integrity-checks-without-drowning-in-false-alarms/</guid><description>&lt;p&gt;An integrity checker is only as good as the mails it sends. If it reports hundreds of changes every morning, nobody reads them after a week – and the one real finding gets lost with them. That was my problem with AIDE and rkhunter on three K3s hosts: both worked, but mostly they reported things I had caused myself.&lt;/p&gt;&#10;&lt;p&gt;This deep dive shows what the two tools do, where the noise comes from on a Kubernetes host, and how the baseline follows every intended change.&lt;/p&gt;</description></item><item><title>HTTP/3 for My Blog and Nextcloud: One Switch, Two Hidden Brakes, and What the Measurements Show</title><link>https://www.apt-upgrade.me/2026/11/03/http-3-for-my-blog-and-nextcloud-one-switch-two-hidden-brakes-and-what-the-measurements-show/</link><pubDate>Tue, 03 Nov 2026 19:58:05 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/11/03/http-3-for-my-blog-and-nextcloud-one-switch-two-hidden-brakes-and-what-the-measurements-show/</guid><description>&lt;p&gt;&lt;strong&gt;Update of November 6, 2026:&lt;/strong&gt; HTTP/3 is back on here, with nginx mainline and &lt;code&gt;quic_bpf&lt;/code&gt;. &lt;a href="https://www.apt-upgrade.me/2026/11/06/this-blog-now-runs-on-hugo-no-wordpress-no-kubernetes-and-stable-http-3/"&gt;The story is in the migration post.&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Update, November 4, 2026:&lt;/strong&gt; HTTP/3 is off again on all my servers. The reason is at the end of this post.&lt;/p&gt;&#10;&lt;p&gt;Many users of my Nextcloud instances are on their phones. That is exactly what HTTP/3 was built for: it runs over QUIC instead of TCP, needs one round trip less to set up a connection, copes better with packet loss, and can keep a connection alive when the phone switches from Wi-Fi to mobile data. My goal, however, was not “have HTTP/3” but: &lt;strong&gt;HTTP/3 only if it measurably helps&lt;/strong&gt; – more throughput or a more stable connection on a bad network.&lt;/p&gt;</description></item><item><title>Update Day: Nextcloud 35, a False Alarm, and Why Ansible Never Installs My Kernels</title><link>https://www.apt-upgrade.me/2026/11/03/update-day-nextcloud-35-a-false-alarm-and-why-ansible-never-installs-my-kernels/</link><pubDate>Tue, 03 Nov 2026 18:53:48 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/11/03/update-day-nextcloud-35-a-false-alarm-and-why-ansible-never-installs-my-kernels/</guid><description>&lt;p&gt;Every Monday a small script mails me a version report: which pinned versions are outdated, which images were rebuilt under the same tag, which packages are pending on the hosts? This time the list was long – including the jump from Nextcloud 34 to 35 on both instances. By the end of the afternoon everything was current, nothing was broken, and the drift check showed &lt;code&gt;changed=0&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;This post walks through the stations in order. Each one comes with its own small lesson – and one of them was a bug in my own tooling.&lt;/p&gt;</description></item><item><title>A Christmas Video for the Team – Half Cloud, Half Homelab</title><link>https://www.apt-upgrade.me/2026/11/02/a-christmas-video-for-the-team-half-cloud-half-homelab/</link><pubDate>Mon, 02 Nov 2026 09:41:06 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/11/02/a-christmas-video-for-the-team-half-cloud-half-homelab/</guid><description>&lt;p&gt;For our monitoring team&amp;rsquo;s internal advent calendar I wanted a short video: in the data centre the LEDs flip from green to red, alarm, heartbeat, rewind – and in the end Santa is to blame, of course, having tripped over a &amp;ldquo;Wi-Fi cable&amp;rdquo;. The result is just under 100 seconds of film that I polished over more than 70 versions with Claude Code as assistant director.&lt;/p&gt;&#10;&lt;p&gt;More interesting than the film itself is the question &lt;strong&gt;which parts came from the cloud and which ran on my own hardware&lt;/strong&gt;. In short: the images that matter came from the cloud – everything else ran locally.&lt;/p&gt;</description></item><item><title>Monitoring Till the Doctor Comes!</title><link>https://www.apt-upgrade.me/2026/10/27/monitoring-until-the-doctor-comes/</link><pubDate>Tue, 27 Oct 2026 20:16:49 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/10/27/monitoring-until-the-doctor-comes/</guid><description>&lt;p&gt;From 5 pm, nature switches to dark mode – system-wide, no toggle, no opt-out. Unlike here on the blog, you cannot click it away. 🌑 Single digits by morning, and on grey days here in southern Germany the solar panels produce just enough for one coffee – espresso, not cappuccino. ☕ My thoughts drift back to the last Mallorca holiday: sun, sea and Playa de Palma. At home the party is quieter: servers instead of sangria, dashboards instead of a dance floor. 🍹&lt;/p&gt;</description></item><item><title>Release v3.6.0: From “It Is Configured” to “It Works” – and the Download That Stopped at 1 GB</title><link>https://www.apt-upgrade.me/2026/10/27/release-v3-6-0-from-it-is-configured-to-it-works-and-the-download-that-stopped-at-1-gb/</link><pubDate>Tue, 27 Oct 2026 13:12:00 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/10/27/release-v3-6-0-from-it-is-configured-to-it-works-and-the-download-that-stopped-at-1-gb/</guid><description>&lt;p&gt;Version &lt;a href="https://github.com/aptupgrademe/www_k3s/tree/v3.6.0"&gt;v3.6.0&lt;/a&gt; of the Ansible code behind this blog and two Nextcloud servers is out. It is the last release with new features for a while – from here on the focus is maintenance. The common thread of the last days: almost every bug of the previous weeks had slipped through because the checks asked &amp;ldquo;is it configured and running?&amp;rdquo; instead of &amp;ldquo;does it actually work?&amp;rdquo;. This release changes that.&lt;/p&gt;&#10;&lt;h2 id="-the-download-that-stopped-at-1-gb"&gt;📦 The download that stopped at 1 GB&lt;/h2&gt;&#10;&lt;p&gt;The newest bug was found this morning, and not by a test: an alert mail said a container was CPU-throttled more than half of the time. The container was the nginx in front of PHP on one of the Nextcloud servers – a component that usually idles.&lt;/p&gt;</description></item><item><title>PHP Got Popped, My Servers Didn’t: Two Critical RCEs in a Day – and I’m Safe</title><link>https://www.apt-upgrade.me/2026/10/21/phps-bad-day-two-critical-rces-four-releases-and-only-one-real-fix/</link><pubDate>Wed, 21 Oct 2026 20:19:37 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/21/phps-bad-day-two-critical-rces-four-releases-and-only-one-real-fix/</guid><description>&lt;p&gt;On 21 October 2026 the PHP project shipped four releases at once – &lt;strong&gt;8.5.12, 8.4.27, 8.3.36 and 8.2.35&lt;/strong&gt; – and the release notes skipped the usual &amp;ldquo;bug fix release&amp;rdquo; small talk. Two critical vulnerabilities, CVSS 9.2 each, &lt;strong&gt;unauthenticated remote code execution&lt;/strong&gt;, and one sentence that every admin should read twice: &lt;em&gt;&amp;ldquo;There are no complete mitigations, updating is the only safe choice.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;The bugs have been in PHP for a very long time; the interesting part is not a single bad line of code but how PHP cleans up after itself. Here is the short, nerdy version.&lt;/p&gt;</description></item><item><title>Deep Dive: Loki and Grafana Alloy – Searchable Logs Next to the Metrics, and What the First Hour Found</title><link>https://www.apt-upgrade.me/2026/10/21/deep-dive-loki-and-grafana-alloy-searchable-logs-next-to-the-metrics-and-what-the-first-hour-found/</link><pubDate>Wed, 21 Oct 2026 16:19:29 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/21/deep-dive-loki-and-grafana-alloy-searchable-logs-next-to-the-metrics-and-what-the-first-hour-found/</guid><description>&lt;p&gt;&lt;em&gt;Deep Dive in the series around the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. The tour explains the roles, the deep dives the technology underneath: how it works, why it is used this way here, and what went wrong along the way.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Metrics tell you &lt;em&gt;that&lt;/em&gt; something is wrong: memory is at 90 percent, a container restarted three times, the disk fills up. They rarely tell you &lt;em&gt;why&lt;/em&gt;. The why is in the logs – and on a K3s host the logs are spread over the systemd journal, a directory per pod under &lt;code&gt;/var/log/pods&lt;/code&gt;, the audit log and a handful of application files. Until now, finding something meant SSH, &lt;code&gt;journalctl&lt;/code&gt;, &lt;code&gt;kubectl logs&lt;/code&gt; and &lt;code&gt;grep&lt;/code&gt;, one source at a time. This post explains how Loki and Grafana Alloy turn that into one searchable place next to the dashboards, what exactly runs on the blog since 19 October 2026 – and what the new log alerts found within their first hour, before anybody had looked for it.&lt;/p&gt;</description></item><item><title>Deep Dive: Trivy – Scanning Every Running Image Each Night, and Reading 241 Findings Without Panic</title><link>https://www.apt-upgrade.me/2026/10/21/deep-dive-trivy-scanning-every-running-image-each-night-and-reading-241-findings-without-panic/</link><pubDate>Wed, 21 Oct 2026 16:18:19 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/21/deep-dive-trivy-scanning-every-running-image-each-night-and-reading-241-findings-without-panic/</guid><description>&lt;p&gt;&lt;em&gt;Deep Dive in the series around the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. The tour explains the roles, the deep dives the technology underneath: how it works, why it is used this way here, and what went wrong along the way.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Every image in this setup is pinned to an exact version. That is good for reproducibility and bad for security in one specific way: a pinned image does not get better on its own. The Debian or Alpine packages inside it age, the Go runtime that a binary was built with ages, and new vulnerabilities are published every day for software that has not changed at all. The host gets its security updates every night from dnf-automatic; the images did not get anything – until somebody looked. Trivy now looks every night. This post explains how it finds vulnerabilities, how it runs on the blog since 19 October 2026, what the first scan found – 241 fixable findings – and why that number is far less alarming than it sounds once you sort it.&lt;/p&gt;</description></item><item><title>Deep Dive: Grafana and the Dashboards – What Every Panel Means, and Alerts That Never Fired</title><link>https://www.apt-upgrade.me/2026/10/21/deep-dive-grafana-and-the-dashboards-what-every-panel-means-and-alerts-that-never-fired/</link><pubDate>Wed, 21 Oct 2026 16:18:09 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/21/deep-dive-grafana-and-the-dashboards-what-every-panel-means-and-alerts-that-never-fired/</guid><description>&lt;p&gt;&lt;em&gt;Deep Dive in the series around the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. The tour explains the roles, the deep dives the technology underneath: how it works, why it is used this way here, and what went wrong along the way.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Every server here has its own Prometheus and its own Grafana (&lt;a href="https://www.apt-upgrade.me/2026/10/19/ansible-tour-part-6-monitoring/"&gt;part 6&lt;/a&gt; of the tour shows the roles). This post is the reading guide: what the numbers are, what normal looks like on these machines, which panels matter when something is wrong – and how the alerting is built, including the mistake that kept it silent for weeks.&lt;/p&gt;</description></item><item><title>Deep Dive: Performance Tuning With Measurements – What Changed on 16 October 2026, and What Did Not</title><link>https://www.apt-upgrade.me/2026/10/21/deep-dive-performance-tuning-with-measurements-what-changed-on-16-october-2026-and-what-did-not/</link><pubDate>Wed, 21 Oct 2026 16:16:49 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/21/deep-dive-performance-tuning-with-measurements-what-changed-on-16-october-2026-and-what-did-not/</guid><description>&lt;p&gt;&lt;em&gt;Deep Dive in the series around the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. The tour explains the roles, the deep dives the technology underneath: how it works, why it is used this way here, and what went wrong along the way.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;On 16 October 2026 the three servers got one tuning pass: the blog and two Nextcloud servers. None of them was slow. The question was a different one: there was free memory on all three – where would it actually help, and where would it only look busy? This post walks through the method, every change with the number behind it, the things left alone on purpose, and what the measurements four days later say. At the end there is an update from 26 October: what has changed since – and a mistake of my own.&lt;/p&gt;</description></item><item><title>Deep Dive: Nextcloud on K3s – PHP Pods, Host Databases, and Office in the Browser</title><link>https://www.apt-upgrade.me/2026/10/21/deep-dive-nextcloud-on-k3s-php-pods-host-databases-and-office-in-the-browser/</link><pubDate>Wed, 21 Oct 2026 16:15:29 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/21/deep-dive-nextcloud-on-k3s-php-pods-host-databases-and-office-in-the-browser/</guid><description>&lt;p&gt;&lt;em&gt;Deep Dive in the series around the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. The tour explains the roles, the deep dives the technology underneath: how it works, why it is used this way here, and what went wrong along the way.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Two Nextcloud servers run on this setup, one for an organisation with about 150 accounts and almost 400 GB of files, one for a small group. Both are built from the same roles (&lt;a href="https://www.apt-upgrade.me/2026/10/19/ansible-tour-part-4-nextcloud/"&gt;part 4&lt;/a&gt; of the tour). This post explains how Nextcloud is put together, how the pieces are distributed between host and cluster, and what running it has taught so far.&lt;/p&gt;</description></item><item><title>Deep Dive: WordPress on Kubernetes – Stateless Pods, a Stateful CMS, and WP-CLI as the Control Plane</title><link>https://www.apt-upgrade.me/2026/10/21/deep-dive-wordpress-on-kubernetes-stateless-pods-a-stateful-cms-and-wp-cli-as-the-control-plane/</link><pubDate>Wed, 21 Oct 2026 16:14:09 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/21/deep-dive-wordpress-on-kubernetes-stateless-pods-a-stateful-cms-and-wp-cli-as-the-control-plane/</guid><description>&lt;p&gt;&lt;em&gt;Deep Dive in the series around the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. The tour explains the roles, the deep dives the technology underneath: how it works, why it is used this way here, and what went wrong along the way.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;This blog is WordPress, running in a single-node K3s cluster (&lt;a href="https://www.apt-upgrade.me/2026/10/16/ansible-tour-part-3-blog/"&gt;part 3&lt;/a&gt; of the tour shows the roles). WordPress assumes a classic web server: it writes into its own directory, installs and updates plugins from its admin page, and schedules work by piggybacking on visitor requests. Kubernetes assumes the opposite – replaceable containers, configuration from outside, no state in the image. This post explains how the two meet here.&lt;/p&gt;</description></item><item><title>Deep Dive: PHP-FPM and OPcache – Workers, Limits, and a Bytecode Cache That Was Too Small</title><link>https://www.apt-upgrade.me/2026/10/21/deep-dive-php-fpm-and-opcache-workers-limits-and-a-bytecode-cache-that-was-too-small/</link><pubDate>Wed, 21 Oct 2026 16:12:49 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/21/deep-dive-php-fpm-and-opcache-workers-limits-and-a-bytecode-cache-that-was-too-small/</guid><description>&lt;p&gt;&lt;em&gt;Deep Dive in the series around the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. The tour explains the roles, the deep dives the technology underneath: how it works, why it is used this way here, and what went wrong along the way.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;WordPress and Nextcloud are PHP applications, and in both pods every dynamic request ends up in a PHP-FPM worker (&lt;a href="https://www.apt-upgrade.me/2026/10/16/ansible-tour-part-3-blog/"&gt;part 3&lt;/a&gt;, &lt;a href="https://www.apt-upgrade.me/2026/10/19/ansible-tour-part-4-nextcloud/"&gt;part 4&lt;/a&gt;). How many workers exist, how long one may run and how much compiled code they share decides how fast the sites are and what happens under load. This post explains the mechanics, the settings chosen here, the measurements behind them – and two defaults that capped Nextcloud without anyone noticing.&lt;/p&gt;</description></item><item><title>Deep Dive: Redis – Object Cache, File Locking, and Why a Password Behind the Firewall</title><link>https://www.apt-upgrade.me/2026/10/21/deep-dive-redis-object-cache-file-locking-and-why-a-password-behind-the-firewall/</link><pubDate>Wed, 21 Oct 2026 16:11:29 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/21/deep-dive-redis-object-cache-file-locking-and-why-a-password-behind-the-firewall/</guid><description>&lt;p&gt;&lt;em&gt;Deep Dive in the series around the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. The tour explains the roles, the deep dives the technology underneath: how it works, why it is used this way here, and what went wrong along the way.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Redis is the smallest service in this setup – a few megabytes of memory, a fraction of a CPU core – and both applications depend on it. The blog uses it as an object cache (&lt;a href="https://www.apt-upgrade.me/2026/10/16/ansible-tour-part-3-blog/"&gt;part 3&lt;/a&gt;), Nextcloud for file locking and as a shared cache between processes (&lt;a href="https://www.apt-upgrade.me/2026/10/19/ansible-tour-part-4-nextcloud/"&gt;part 4&lt;/a&gt;). This post explains what Redis does there, why the two instances are secured differently, what the numbers say, and what a review for this article turned up.&lt;/p&gt;</description></item><item><title>Deep Dive: MariaDB – InnoDB, Temporary Tables in RAM, and a Database That Ran Unconfined for Five Weeks</title><link>https://www.apt-upgrade.me/2026/10/21/deep-dive-mariadb-innodb-temporary-tables-in-ram-and-a-database-that-ran-unconfined-for-five-weeks/</link><pubDate>Wed, 21 Oct 2026 16:10:09 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/21/deep-dive-mariadb-innodb-temporary-tables-in-ram-and-a-database-that-ran-unconfined-for-five-weeks/</guid><description>&lt;p&gt;&lt;em&gt;Deep Dive in the series around the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. The tour explains the roles, the deep dives the technology underneath: how it works, why it is used this way here, and what went wrong along the way.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Both applications here stand on MariaDB. The blog runs it as a pod next to WordPress (&lt;a href="https://www.apt-upgrade.me/2026/10/16/ansible-tour-part-3-blog/"&gt;part 3&lt;/a&gt;), the two Nextcloud servers run it directly on the host (&lt;a href="https://www.apt-upgrade.me/2026/10/19/ansible-tour-part-4-nextcloud/"&gt;part 4&lt;/a&gt;). This post explains what InnoDB does with memory and disk, which handful of settings matter for these workloads, what the measurements say – and how a single line in a systemd unit made sure that SELinux did not protect the database for five weeks.&lt;/p&gt;</description></item><item><title>Deep Dive: K3s – A Whole Kubernetes in One Binary, What It Takes Out, and Six Things It Did Not Do by Itself</title><link>https://www.apt-upgrade.me/2026/10/21/deep-dive-k3s-a-whole-kubernetes-in-one-binary-what-it-takes-out-and-six-things-it-did-not-do-by-itself/</link><pubDate>Wed, 21 Oct 2026 16:08:49 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/21/deep-dive-k3s-a-whole-kubernetes-in-one-binary-what-it-takes-out-and-six-things-it-did-not-do-by-itself/</guid><description>&lt;p&gt;&lt;em&gt;Deep Dive in the series around the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. The tour explains the roles, the deep dives the technology underneath: how it works, why it is used this way here, and what went wrong along the way.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;K3s is certified Kubernetes in a single binary of about 70 MB. API server, scheduler, controller manager, kubelet, kube-proxy, containerd, Flannel, CoreDNS and a network policy controller all start from one process and one systemd unit. That makes it the obvious choice for a cluster of exactly one node – and it hides a lot. This post explains what actually runs inside that binary, what &lt;a href="https://www.apt-upgrade.me/2026/10/15/ansible-tour-part-2-platform/"&gt;part 2 of the tour&lt;/a&gt; configures, and six things that K3s did not do by itself, which were only found in operation.&lt;/p&gt;</description></item><item><title>Deep Dive: fail2ban – From a Log Line to a Kernel Set Entry, and the Bans That Never Happened</title><link>https://www.apt-upgrade.me/2026/10/21/deep-dive-fail2ban-from-a-log-line-to-a-kernel-set-entry-and-the-bans-that-never-happened/</link><pubDate>Wed, 21 Oct 2026 13:21:32 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/21/deep-dive-fail2ban-from-a-log-line-to-a-kernel-set-entry-and-the-bans-that-never-happened/</guid><description>&lt;p&gt;&lt;em&gt;Deep Dive in the series around the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. The tour explains the roles, the deep dives the technology underneath: how it works, why it is used this way here, and what went wrong along the way.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;fail2ban looks like the simplest tool on these servers: read a log, count failures, ban the address. On a K3s host every part of that sentence has a catch. The logs live in container files that change their name with every restart; the bans have to land in a firewall that other programs also write to; and an address family that nobody tested can make the whole thing a placebo. This post follows one bad request from the log line to the entry in the kernel, explains what &lt;a href="https://www.apt-upgrade.me/2026/10/19/ansible-tour-part-5-security/"&gt;part 5 of the tour&lt;/a&gt; only touches – and describes three cases in which fail2ban said &amp;ldquo;Ban&amp;rdquo; and the firewall let the address in anyway.&lt;/p&gt;</description></item><item><title>Four Billion Tokens Later: What a Month With an AI Assistant Looks Like in Numbers</title><link>https://www.apt-upgrade.me/2026/10/21/four-billion-tokens-later-what-a-month-with-an-ai-assistant-looks-like-in-numbers/</link><pubDate>Wed, 21 Oct 2026 11:16:28 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/21/four-billion-tokens-later-what-a-month-with-an-ai-assistant-looks-like-in-numbers/</guid><description>&lt;p&gt;For a few months now, a large part of this blog and of the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible code behind it&lt;/a&gt; has been written together with an AI assistant: Claude, in its command-line version Claude Code. It writes code, runs commands on the servers, reads log files and drafts articles; I decide, check and say &amp;ldquo;no, not like that&amp;rdquo; fairly often. At some point I wanted to know what that actually adds up to. Not in feelings, in numbers.&lt;/p&gt;</description></item><item><title>Deep Dive: nftables – One Table of Our Own, Sets with Timeouts, and the 300 Rules K3s Writes Next to It</title><link>https://www.apt-upgrade.me/2026/10/20/deep-dive-nftables-one-table-of-our-own-sets-with-timeouts-and-the-300-rules-k3s-writes-next-to-it/</link><pubDate>Tue, 20 Oct 2026 20:01:53 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/20/deep-dive-nftables-one-table-of-our-own-sets-with-timeouts-and-the-300-rules-k3s-writes-next-to-it/</guid><description>&lt;p&gt;&lt;em&gt;Deep Dive in the series around the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. The tour explains the roles, the deep dives the technology underneath: how it works, why it is used this way here, and what went wrong along the way.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;nftables replaced iptables in the kernel years ago, but most guides still translate old iptables rules line by line and stop there. That works until a second program writes rules too – and on a K3s host, several do. This post explains the data model of nftables with the details that matter in practice, how the role &lt;code&gt;common_firewall&lt;/code&gt; builds one table for the host, fail2ban, port-scan detection and the SSH country filter, what K3s puts next to it, and four bugs from the last months that each taught one of those details the hard way. The migration itself is described in an &lt;a href="https://www.apt-upgrade.me/2026/06/16/%f0%9f%94%92-github-repo-update-nftables-iptables-a-packet-filter-deep-dive/"&gt;earlier post&lt;/a&gt;, the country filter in &lt;a href="https://www.apt-upgrade.me/2026/10/01/geo-fencing-ssh-with-nftables-and-ansible/"&gt;another one&lt;/a&gt;; this one is about how it all fits together.&lt;/p&gt;</description></item><item><title>Deep Dive: SELinux on a K3s Host – Type Enforcement, and the Two Times It Quietly Did Nothing</title><link>https://www.apt-upgrade.me/2026/10/20/deep-dive-selinux-on-a-k3s-host-type-enforcement-and-the-two-times-it-quietly-did-nothing/</link><pubDate>Tue, 20 Oct 2026 12:42:38 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/20/deep-dive-selinux-on-a-k3s-host-type-enforcement-and-the-two-times-it-quietly-did-nothing/</guid><description>&lt;p&gt;&lt;em&gt;Deep Dive in the series around the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. The tour explains the roles, the deep dives the technology underneath: how it works, why it is used this way here, and what went wrong along the way.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;SELinux is the layer most administrators switch off first and understand last. That is a pity, because it is the only layer on these servers that still holds when a process has already been taken over – even one running as root. This post first explains how SELinux decides, with the details that matter in practice: types, transitions, categories, and how a denial is read. Then it looks at the blog and the two Nextcloud servers: what is confined, how, and the two occasions on which SELinux was switched on, enforcing, and still protected nothing – because a single detail elsewhere made sure the right rules never applied.&lt;/p&gt;</description></item><item><title>The Ansible Tour, Part 6: Monitoring – Exporters, Prometheus, Grafana and a Monit Watchdog</title><link>https://www.apt-upgrade.me/2026/10/19/ansible-tour-part-6-monitoring/</link><pubDate>Mon, 19 Oct 2026 21:06:17 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/19/ansible-tour-part-6-monitoring/</guid><description>&lt;p&gt;&lt;em&gt;Part 6 of the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;, and the last. After the platform, the applications and security, this part is about knowing what is going on. The series describes release &lt;a href="https://github.com/aptupgrademe/www_k3s/tree/v3.3.0"&gt;v3.3.0&lt;/a&gt;, with later changes added as updates.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;A server nobody watches fails silently. The setup here watches in four ways, and it helps to keep them apart:&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Kind&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Question&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Tool&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Metrics&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;How is the server doing over time?&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;exporters, Prometheus, Grafana&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;States&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Is something broken right now?&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Monit&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Logs&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;What happened, and why?&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Loki and Grafana Alloy&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Signs of life&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Is what rarely reports anything still running at all?&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;job timestamps, a weekly mail&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;All of them follow the rule from part 5: silent while everything is healthy, so that every mail means something. And all of them fell into the same trap: for a while they were silent because they could not speak, not because nothing was happening.&lt;/p&gt;</description></item><item><title>The Ansible Tour, Part 5: IT Security – Firewall, SSH, fail2ban, Hardening, SELinux and Detection</title><link>https://www.apt-upgrade.me/2026/10/19/ansible-tour-part-5-security/</link><pubDate>Mon, 19 Oct 2026 20:34:02 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/19/ansible-tour-part-5-security/</guid><description>&lt;p&gt;&lt;em&gt;Part 5 of the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. After the platform, the blog and Nextcloud, this part gathers all security roles in one place, across both stacks. The series describes release &lt;a href="https://github.com/aptupgrademe/www_k3s/tree/v3.3.0"&gt;v3.3.0&lt;/a&gt;, with later changes added as updates.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Security here comes from layers: each one catches what the previous one missed. From the outside in, these are the firewall, the SSH login, the reaction to attacks in the logs (fail2ban), the hardening of the operating system, containment by SELinux, and detection by auditd, AIDE, rkhunter and ClamAV. The code is public, so an attacker can read it too. That is fine: the protection has to come from keys, layers and alerts, not from secrecy. Exact thresholds still stay vague here.&lt;/p&gt;</description></item><item><title>The Ansible Tour, Part 4: Nextcloud – Collabora, Push, Host Database and occ, Role by Role</title><link>https://www.apt-upgrade.me/2026/10/19/ansible-tour-part-4-nextcloud/</link><pubDate>Mon, 19 Oct 2026 15:52:20 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/19/ansible-tour-part-4-nextcloud/</guid><description>&lt;p&gt;&lt;em&gt;Part 4 of the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. After the blog in &lt;a href="https://www.apt-upgrade.me/2026/10/16/ansible-tour-part-3-blog/"&gt;part 3&lt;/a&gt;, here comes the second application: Nextcloud. The series describes release &lt;a href="https://github.com/aptupgrademe/www_k3s/tree/v3.3.0"&gt;v3.3.0&lt;/a&gt;, with later changes added as updates. What matches the blog is only mentioned briefly; the focus is on what is different.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Nextcloud is a file cloud: files, calendars, contacts, team folders and – with Collabora – documents edited together in the browser. Two of the three servers run it, for groups of very different size, with the same code and different values in the inventory. The work is shared by &lt;code&gt;next_mariadb&lt;/code&gt; and &lt;code&gt;next_redis&lt;/code&gt; (database and cache on the host), &lt;code&gt;next_k3s_deploy&lt;/code&gt; (Nextcloud, Collabora and the push service as Kubernetes objects), &lt;code&gt;next_config&lt;/code&gt; (Nextcloud’s settings) and &lt;code&gt;nextcloud_verify&lt;/code&gt;, plus the update playbook.&lt;/p&gt;</description></item><item><title>The Ansible Tour, Part 3: The Blog – WordPress, MariaDB and Redis on K3s, Role by Role</title><link>https://www.apt-upgrade.me/2026/10/16/ansible-tour-part-3-blog/</link><pubDate>Fri, 16 Oct 2026 12:31:10 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/16/ansible-tour-part-3-blog/</guid><description>&lt;p&gt;&lt;em&gt;Part 3 of the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. &lt;a href="https://www.apt-upgrade.me/2026/10/15/ansible-tour-part-2-platform/"&gt;Part 2&lt;/a&gt; built the platform; this part puts the blog on it. The series describes release &lt;a href="https://github.com/aptupgrademe/www_k3s/tree/v3.3.0"&gt;v3.3.0&lt;/a&gt;, with later changes added as updates.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;This blog is WordPress. Four roles take it from an empty Kubernetes cluster to a running, configured and monitored website: &lt;code&gt;blog_k3s_deploy&lt;/code&gt; creates all Kubernetes objects, &lt;code&gt;blog_wordpress&lt;/code&gt; configures the running WordPress from the outside, &lt;code&gt;blog_visitor_stats&lt;/code&gt; counts the visitors anonymously at night, and &lt;code&gt;blog_verify&lt;/code&gt; checks at the end that everything works. An update playbook keeps the blog current.&lt;/p&gt;</description></item><item><title>The Ansible Tour, Part 2: The Platform – From a Bare AlmaLinux to a Kubernetes Cluster</title><link>https://www.apt-upgrade.me/2026/10/15/ansible-tour-part-2-platform/</link><pubDate>Thu, 15 Oct 2026 17:58:14 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/15/ansible-tour-part-2-platform/</guid><description>&lt;p&gt;&lt;em&gt;Part 2 of the &lt;a href="https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/"&gt;Ansible Tour&lt;/a&gt;. Part 1 explained how the repository is built; this part starts at the very bottom. The series describes release &lt;a href="https://github.com/aptupgrademe/www_k3s/tree/v3.3.0"&gt;v3.3.0&lt;/a&gt;, with later changes added as updates.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Every server here starts as a plain AlmaLinux 9 cloud image: a minimal Linux, a root login, nothing else. At the end of this part it is a patched base system that sends mail, updates itself at night and rotates its logs – and runs a single-node Kubernetes cluster with Helm, automatic Let’s Encrypt certificates and an ingress controller. That is the platform the blog and Nextcloud stand on. Almost all of it is the same for both.&lt;/p&gt;</description></item><item><title>The Ansible Tour, Part 1: One Repository, Three Servers – How the Code Is Organised and What Happens During a Run</title><link>https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/</link><pubDate>Wed, 14 Oct 2026 15:37:01 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/14/ansible-tour-part-1-framework/</guid><description>&lt;p&gt;&lt;em&gt;First part of a series about the Ansible code behind this blog and two Nextcloud servers. The code is public: &lt;a href="https://github.com/aptupgrademe/www_k3s"&gt;github.com/aptupgrademe/www_k3s&lt;/a&gt;; the series describes release &lt;a href="https://github.com/aptupgrademe/www_k3s/tree/v3.3.0"&gt;v3.3.0&lt;/a&gt;. Part 1 explains the structure and what happens during a run, parts 2 to 6 the roles, the deep dives the technology underneath.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Three servers, 34 roles, four playbooks, about 22,000 lines of YAML and templates. Opening the repository for the first time, you mostly see files. This part explains three things worth knowing first: how one set of roles serves two very different applications, where every value comes from, and what actually happens between &lt;code&gt;ansible-playbook&lt;/code&gt; and the final summary.&lt;/p&gt;</description></item><item><title>A Mail for Every SSH Login: A Two-Minute Tripwire with wtmp and systemd</title><link>https://www.apt-upgrade.me/2026/10/14/ssh-login-alarm-wtmp-systemd/</link><pubDate>Wed, 14 Oct 2026 10:02:43 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/14/ssh-login-alarm-wtmp-systemd/</guid><description>&lt;p&gt;&lt;em&gt;This is a follow-up to yesterday&amp;rsquo;s long post, &lt;a href="https://www.apt-upgrade.me/2026/10/13/defense-in-depth-nine-layers/"&gt;Defense in Depth: Nine Layers Between the Internet and My Servers&lt;/a&gt;. There, the login alarm got one sentence. Here is how it works, why it is built this way – and what an attacker learns from reading this.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;The idea is old and simple: if anyone logs in to one of my servers, I want to know – within minutes, not when I happen to look at a log a week later. Every login mails me. Since I know when I logged in myself, every mail I did not expect is worth looking at immediately. It is a tripwire: it does not stop anyone, it makes sure an intrusion does not go unnoticed.&lt;/p&gt;</description></item><item><title>Defense in Depth: Nine Layers Between the Internet and My Servers</title><link>https://www.apt-upgrade.me/2026/10/13/defense-in-depth-nine-layers/</link><pubDate>Tue, 13 Oct 2026 21:30:35 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/13/defense-in-depth-nine-layers/</guid><description>&lt;p&gt;A blog and two Nextcloud servers for local organisations: nothing on them is worth a targeted attack, and that is exactly why they get attacked. Not by someone who wants &lt;em&gt;my&lt;/em&gt; data, but by scanners that try every IP address on the internet, every hour, with the same handful of tricks. Most of them give up after the first locked door. The question is what happens with the ones that don&amp;rsquo;t.&lt;/p&gt;</description></item><item><title>Ten Points, One Branch: Taking My Ansible Code From “It Works” to “It Is Clean”</title><link>https://www.apt-upgrade.me/2026/10/12/ten-points-one-branch-ansible-code-quality/</link><pubDate>Mon, 12 Oct 2026 21:42:52 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/12/ten-points-one-branch-ansible-code-quality/</guid><description>&lt;p&gt;It started with a slightly vain question. My Ansible repository runs this blog and two Nextcloud servers: 34 roles, four playbooks, about 9,000 lines of YAML, almost 200 commits. I didn&amp;rsquo;t write most of those lines myself – my AI co-admin (Claude) did, while I decided, tested and ran the playbooks. So I asked it: &lt;em&gt;if I understand most of this code, am I an advanced Ansible user?&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;The answer was honest and a little uncomfortable: advanced at &lt;strong&gt;reading and operating&lt;/strong&gt; it, yes. Advanced at &lt;strong&gt;writing&lt;/strong&gt; it from scratch, not proven yet. And then it listed ten things that would make the code itself better. I said: do all ten. Test them properly. Then write about it. This is that post.&lt;/p&gt;</description></item><item><title>Hallo, Bonjour, Hola: Teaching My Blog Three New Languages with Polylang and a Small Army of AI Agents</title><link>https://www.apt-upgrade.me/2026/10/10/teaching-my-blog-three-new-languages-polylang-ai-agents/</link><pubDate>Sat, 10 Oct 2026 18:22:47 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/10/teaching-my-blog-three-new-languages-polylang-ai-agents/</guid><description>&lt;p&gt;&lt;img alt="Illustration: a man rides a bull in front of monitors, with German, French, American and Spanish flags" class="alignnone size-medium wp-image-1881" height="200" src="https://www.apt-upgrade.me/wp-content/uploads/2026/10/translations-300x200.webp" width="300"/&gt;&lt;/p&gt;&#10;&lt;p&gt;For almost two years this blog spoke exactly one language. English is the lingua franca of sysadmins, so that seemed fine. But I&amp;rsquo;m German, a good part of my readers aren&amp;rsquo;t native English speakers either, and when people search for &amp;ldquo;ZFS RAIDZ1 NAS Debian&amp;rdquo; in German, French or Spanish, they get results in German, French or Spanish. Not mine.&lt;/p&gt;</description></item><item><title>Five Posts and Nothing Else: Slimming Down My Front Page on Phones (and the Attribute WordPress Quietly Ate)</title><link>https://www.apt-upgrade.me/2026/10/08/slimming-down-front-page-on-phones/</link><pubDate>Thu, 08 Oct 2026 23:25:01 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/08/slimming-down-front-page-on-phones/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;☝️ &lt;strong&gt;For everyone who just reads this on their phone:&lt;/strong&gt; until this week, the start page showed you the same handful of articles four times in a row (a ticker, a slider, a tab box, a &amp;ldquo;trending&amp;rdquo; list, a &amp;ldquo;featured&amp;rdquo; grid) before the actual list began. Now you get the five newest posts, one after the other, and that&amp;rsquo;s it. The desktop view hasn&amp;rsquo;t changed. If you noticed nothing: perfect, that was the plan. 📱&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>A+ on SSL Labs: What My Blog’s TLS Actually Speaks (and Where the Ansible Code Lives)</title><link>https://www.apt-upgrade.me/2026/10/06/ssl-labs-a-plus-tls-ansible/</link><pubDate>Tue, 06 Oct 2026 21:21:51 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/06/ssl-labs-a-plus-tls-ansible/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;☝️ &lt;strong&gt;A quick word for everyone who just wanted to read a blog post:&lt;/strong&gt; TLS is the reason your browser shows that little padlock. Every time you open a page here, it travels to you &lt;em&gt;encrypted&lt;/em&gt;. Nobody in the same café Wi-Fi, at your internet provider or anywhere in between can read along or quietly swap a few words. And no, it is not called &amp;ldquo;SSL&amp;rdquo; any more, even if the test site below still insists on the old name. SSL was retired in 2015; we just never managed to retire the word. So when I brag about &amp;ldquo;TLS settings&amp;rdquo; below, I&amp;rsquo;m really bragging about how well the envelope around this very sentence is sealed. You&amp;rsquo;re welcome. 🤓&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Two Things My SSDs Were Missing: TRIM After BitLocker, and a Write Cache My HPE Server Quietly Switched Off</title><link>https://www.apt-upgrade.me/2026/10/06/two-things-my-ssds-were-missing-trim-after-bitlocker-and-a-write-cache-my-hpe-server-quietly-switched-off/</link><pubDate>Tue, 06 Oct 2026 13:40:25 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/06/two-things-my-ssds-were-missing-trim-after-bitlocker-and-a-write-cache-my-hpe-server-quietly-switched-off/</guid><description>&lt;p&gt;HP3, my HPE MicroServer Gen10 Plus v2, is back on Debian 13 with OpenZFS. Why it left Windows again is a story for another post. This one is about the restore afterwards, and a setting that had been hiding in plain sight for &lt;em&gt;two operating systems and two blog posts&lt;/em&gt;.&lt;/p&gt;&#10;&lt;p&gt;The plan was boring, the way restores should be: a fresh RAIDZ1 pool over the same three WD Red SA500 SSDs, per-user datasets, then about 1.7 TB copied back from a USB disk with rsync. Same workflow as always: I make the calls, my AI co-admin (Claude) runs the commands and keeps an eye on the numbers. It was the numbers that started looking wrong.&lt;/p&gt;</description></item><item><title>Germany Only: Geo-Fencing SSH with nftables and Ansible (and What My Logs Said About Bots and Readers)</title><link>https://www.apt-upgrade.me/2026/10/01/geo-fencing-ssh-with-nftables-and-ansible/</link><pubDate>Thu, 01 Oct 2026 13:51:27 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/10/01/geo-fencing-ssh-with-nftables-and-ansible/</guid><description>&lt;p&gt;After moving two &lt;a href="https://nextcloud.com/"&gt;Nextcloud&lt;/a&gt; instances to new servers this week, I asked a simple question: &lt;em&gt;do my three servers - this blog and the two Nextclouds - attract different kinds of attackers?&lt;/em&gt; The answer was mostly &amp;ldquo;no, it&amp;rsquo;s the same background noise everywhere&amp;rdquo;. Except for one line that bugged me: &lt;strong&gt;SSH&lt;/strong&gt;. It runs on a non-standard port, accepts keys only, and fail2ban watches it. And yet the blog alone logged around &lt;strong&gt;16 connection attempts per hour&lt;/strong&gt; to the SSH daemon, from all over the world.&lt;/p&gt;</description></item><item><title>Two Minutes Forty-Five: My First Nextcloud App Update via Ansible (and the Guard Rail I Added Just Before)</title><link>https://www.apt-upgrade.me/2026/09/30/two-minutes-forty-five-my-first-nextcloud-app-update-via-ansible-and-the-guard-rail-i-added-just-before/</link><pubDate>Wed, 30 Sep 2026 21:30:02 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/09/30/two-minutes-forty-five-my-first-nextcloud-app-update-via-ansible-and-the-guard-rail-i-added-just-before/</guid><description>&lt;p&gt;Confession time: the production Nextcloud from the &lt;a href="https://www.apt-upgrade.me/2026/09/21/bare-metal-to-k3s-a-nextcloud-migration-battle-log/"&gt;migration battle log&lt;/a&gt; has been running on K3s for a week, the repo has had an &lt;code&gt;nextcloud-update.yml&lt;/code&gt; playbook for months, and I had never actually run it. Apps were updated the old-fashioned way, by clicking in the admin UI, or not at all. Today that changed. The run itself took &lt;strong&gt;2 minutes 45 seconds&lt;/strong&gt;. The interesting part was everything around it.&lt;/p&gt;&#10;&lt;p&gt;Same workflow as always: I decide, my AI co-admin (Claude) checks, builds and verifies. And the very first thing it found was not a bug in the update logic, but a loaded foot-gun in line three.&lt;/p&gt;</description></item><item><title>The iLO Knows the Temperature, But Not Yesterday’s: Building a Heat History for My Homelab Rack</title><link>https://www.apt-upgrade.me/2026/09/30/the-ilo-knows-the-temperature-but-not-yesterdays-building-a-heat-history-for-my-homelab-rack/</link><pubDate>Wed, 30 Sep 2026 19:15:38 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/09/30/the-ilo-knows-the-temperature-but-not-yesterdays-building-a-heat-history-for-my-homelab-rack/</guid><description>&lt;p&gt;It started with a simple question on a lazy afternoon: &lt;em&gt;how warm are my three servers, actually?&lt;/em&gt; The iLO answered instantly: intake air 22 to 25 °C, fans idling at 6 %, everything green. Great. Then the follow-up question: &lt;em&gt;and during the heat wave in July?&lt;/em&gt; Silence. The iLO 5 shows temperatures and fans &lt;strong&gt;live only&lt;/strong&gt;. No history, no graph, no &amp;ldquo;last Tuesday&amp;rdquo;. So I built one, and it&amp;rsquo;s on GitHub: &lt;a href="https://github.com/aptupgrademe/ilo-thermal"&gt;&lt;strong&gt;aptupgrademe/ilo-thermal&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>My Own Little Certificate Authority: AD CS, Auto-Enrollment and Goodbye to “Your Connection Is Not Private”</title><link>https://www.apt-upgrade.me/2026/09/29/my-own-little-certificate-authority-ad-cs-auto-enrollment-and-goodbye-to-your-connection-is-not-private/</link><pubDate>Tue, 29 Sep 2026 19:05:28 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/09/29/my-own-little-certificate-authority-ad-cs-auto-enrollment-and-goodbye-to-your-connection-is-not-private/</guid><description>&lt;p&gt;My homelab has three domain controllers, two clients, three iLO management boards and, until last week, exactly zero certificates anyone had a reason to trust. Every RDP session started with a warning, every iLO greeted me with &lt;em&gt;&amp;ldquo;Your connection is not private&amp;rdquo;&lt;/em&gt; (issuer: &lt;em&gt;Default Issuer (Do not trust)&lt;/em&gt;, which is at least honest), and the domain controllers didn&amp;rsquo;t speak LDAPS at all.&lt;/p&gt;&#10;&lt;p&gt;I don&amp;rsquo;t run many internal web services, so for a while I assumed a private PKI was a solution looking for a problem. Wrong. A Windows domain has plenty of places where certificates quietly make things better. The trick is to let Active Directory hand them out on its own, so that I never have to think about renewing them again.&lt;/p&gt;</description></item><item><title>Day Two Operations: Hardening Three Windows Domain Controllers (and Finding a Clock That Answered to Nobody)</title><link>https://www.apt-upgrade.me/2026/09/28/day-two-operations-hardening-three-windows-domain-controllers-and-finding-a-clock-that-answered-to-nobody/</link><pubDate>Mon, 28 Sep 2026 14:57:03 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/09/28/day-two-operations-hardening-three-windows-domain-controllers-and-finding-a-clock-that-answered-to-nobody/</guid><description>&lt;p&gt;In &lt;a href="https://www.apt-upgrade.me/2026/09/23/enough-yaml-for-now-three-servers-windows-server-2025-and-a-crash-course-on-the-dark-side/"&gt;the last post&lt;/a&gt; three HP boxes became a Windows Server 2025 domain: AD, DNS, DHCP failover, Group Policy, BitLocker, Storage Spaces. That was day one: everything installed, everything green, everything &amp;ldquo;works&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;This post is about &lt;strong&gt;day two&lt;/strong&gt;, the part where you stop admiring the green checkmarks and start asking uncomfortable questions. What time is it, according to whom? Which services are running that nobody asked for? What happens if a server simply doesn&amp;rsquo;t boot tomorrow? Spoiler: one of those questions had a &lt;em&gt;very&lt;/em&gt; funny answer.&lt;/p&gt;</description></item><item><title>Enough YAML for Now: Three Servers, Windows Server 2025, and a Crash Course on the Dark Side</title><link>https://www.apt-upgrade.me/2026/09/23/enough-yaml-for-now-three-servers-windows-server-2025-and-a-crash-course-on-the-dark-side/</link><pubDate>Wed, 23 Sep 2026 21:06:04 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/09/23/enough-yaml-for-now-three-servers-windows-server-2025-and-a-crash-course-on-the-dark-side/</guid><description>&lt;p&gt;Confession time. After the &lt;a href="https://www.apt-upgrade.me/2026/09/21/bare-metal-to-k3s-a-nextcloud-migration-battle-log/"&gt;Nextcloud migration battle log&lt;/a&gt;, a double-digit number of playbook runs, one nftables ruleset that cheerfully flushed K3s&amp;rsquo; own tables, and more YAML than any human should read in a single week, I had officially had it up to &lt;em&gt;here&lt;/em&gt; with &lt;a href="https://nextcloud.com/"&gt;Nextcloud&lt;/a&gt;, Ansible and anything containing the word &amp;ldquo;migration&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;So I did what any reasonable Linux nerd does when burned out on Linux: I went over to the other side. Three servers, three fresh installs of &lt;strong&gt;Windows Server 2025&lt;/strong&gt;, and a few evenings of Active Directory, DNS, DHCP, Group Policy, Storage Spaces and BitLocker. No YAML. Just a lot of &lt;code&gt;Get-&lt;/code&gt; and &lt;code&gt;Set-&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Bare Metal to K3s: A Nextcloud Migration Battle Log</title><link>https://www.apt-upgrade.me/2026/09/21/bare-metal-to-k3s-a-nextcloud-migration-battle-log/</link><pubDate>Mon, 21 Sep 2026 21:50:44 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/09/21/bare-metal-to-k3s-a-nextcloud-migration-battle-log/</guid><description>&lt;p&gt;Today I moved a production &lt;a href="https://nextcloud.com/"&gt;Nextcloud&lt;/a&gt; from a cozy &lt;strong&gt;native bare-metal install&lt;/strong&gt; to a shiny &lt;strong&gt;K3s/container&lt;/strong&gt; stack. On paper: pull a backup, restore it, flip DNS, done. In practice: a series of small landmines, each invisible until you step on it. Here&amp;rsquo;s the battle log. 🪖&lt;/p&gt;&#10;&lt;h2 id="step-1-shovel-the-data-"&gt;Step 1: shovel the data 🚚&lt;/h2&gt;&#10;&lt;p&gt;The heavy lifting was an &lt;code&gt;rsync&lt;/code&gt; of ~360 GB of user data plus a ~330 MB SQL dump from the backup box into the new node. Because I pre-synced earlier in the day, the final run only shipped the delta — the whole thing came down to a fast incremental copy. Lesson old as time: &lt;em&gt;pre-seed, then the cutover sync is tiny.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>€5,000 Solar Milestone Unlocked – 2 Years, 2 Months &amp; 30 Days of Pure PV Glory</title><link>https://www.apt-upgrade.me/2026/09/19/e5000-solar-milestone-unlocked-2-years-2-months-30-days-of-pure-pv-glory/</link><pubDate>Sat, 19 Sep 2026 21:24:06 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/09/19/e5000-solar-milestone-unlocked-2-years-2-months-30-days-of-pure-pv-glory/</guid><description>&lt;p&gt;I’ve dropped a few posts here in the past about PV systems and how insanely sexy and badass this tech is. 🔥☀️&lt;/p&gt;&#10;&lt;p&gt;Today the counter in the app finally crossed the &lt;strong&gt;€5,000 yield mark&lt;/strong&gt;. 💰&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="Solar app screenshot showing the photovoltaic system's yield passing the 5,000 euro mark" class="alignnone size-medium wp-image-1442" height="297" src="https://www.apt-upgrade.me/wp-content/uploads/2026/09/ertraege-300x297.webp" width="300"/&gt;&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;💡 A quick explanation for the seemingly insane electricity consumption:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;If anyone is wondering why our electricity consumption looks somewhat ridiculous compared to the average family: we heat the house with a heat pump in winter and produce hot water twice a day. 😄&lt;/p&gt;&#10;&lt;p&gt;So the “classic” electricity consumption – all the normal household stuff – is actually considerably lower than the total number might suggest.&lt;/p&gt;&#10;&lt;/blockquote&gt;</description></item><item><title>Post #100: A Backlink, a &lt;code&gt;nofollow&lt;/code&gt;, and a Free Lesson in Link Juice</title><link>https://www.apt-upgrade.me/2026/09/17/post-100-a-backlink-a-nofollow-and-a-free-lesson-in-link-juice/</link><pubDate>Thu, 17 Sep 2026 20:50:01 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/09/17/post-100-a-backlink-a-nofollow-and-a-free-lesson-in-link-juice/</guid><description>&lt;p&gt;So… today marks &lt;strong&gt;post #100!&lt;/strong&gt; 🎉&lt;/p&gt;&#10;&lt;p&gt;This week I got my very first backlink request — an IT nerd from Ukraine who actually liked one of my articles and asked if we&amp;rsquo;d link to each other.&lt;/p&gt;&#10;&lt;p&gt;Now, Google treats reciprocal linking as a bit of a gray area: the more inbound links you rack up, the better your search ranking — so two people swapping links to boost each other is exactly the kind of thing the algorithm side-eyes.&lt;/p&gt;</description></item><item><title>Moving a Nextcloud From Bare Metal to K3s: A Full Dress Rehearsal, and What It Cost Me in Commits</title><link>https://www.apt-upgrade.me/2026/09/11/moving-a-nextcloud-from-bare-metal-to-k3s-a-full-dress-rehearsal-and-what-it-cost-me-in-commits/</link><pubDate>Fri, 11 Sep 2026 15:43:03 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/09/11/moving-a-nextcloud-from-bare-metal-to-k3s-a-full-dress-rehearsal-and-what-it-cost-me-in-commits/</guid><description>&lt;p&gt;There&amp;rsquo;s a migration coming up that I&amp;rsquo;ve been circling for a while. A &lt;a href="https://nextcloud.com/"&gt;Nextcloud&lt;/a&gt; instance I administer still runs as a plain native installation — packages, webserver, PHP-FPM, all hand-managed on one box. It&amp;rsquo;s moving onto the &lt;a href="https://k3s.io/"&gt;K3s&lt;/a&gt; stack I&amp;rsquo;ve been building out in Ansible.&lt;/p&gt;&#10;&lt;p&gt;The honest reason for moving is that the native installation has aged. It still works, but it has accumulated a decade of small decisions nobody wrote down, and every update is an event rather than a routine. What I&amp;rsquo;m hoping to get from the K3s side is a duller kind of upgrade: the Nextcloud version and every container version pinned in the Ansible code, so an update becomes a changed tag in a file I can review, roll out the same way twice, and change back if it goes badly. The application and the data end up in genuinely separate places instead of interleaved in one tree. And &lt;a href="https://www.collaboraonline.com/"&gt;Collabora&lt;/a&gt; becomes a container of its own, talking to Nextcloud across a defined interface rather than being wired into the same installation — one less thing that breaks because two applications are sharing a runtime.&lt;/p&gt;</description></item><item><title>Second Addendum: ZED Watches My Pool’s Health, Not Its Waistline</title><link>https://www.apt-upgrade.me/2026/09/11/second-addendum-zed-watches-my-pools-health-not-its-waistline/</link><pubDate>Fri, 11 Sep 2026 15:01:46 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/09/11/second-addendum-zed-watches-my-pools-health-not-its-waistline/</guid><description>&lt;p&gt;Short one, and a direct consequence of the snapshot post. Adding daily snapshots introduced something that hadn&amp;rsquo;t existed on this NAS before: a thing that grows on its own, quietly, forever, without anybody asking it to.&#10;So I went looking for whatever would tell me when the pool started filling up. The answer was mildly embarrassing.&lt;/p&gt;&#10;&lt;h2 id="-zed-has-opinions-but-not-about-this"&gt;🔍 ZED has opinions, but not about this&lt;/h2&gt;&#10;&lt;p&gt;ZED is running. It&amp;rsquo;s configured. I fixed exactly that in the last addendum, and the fix holds:&lt;/p&gt;</description></item><item><title>Everybody Smile — We’re Taking a Snapshot! Moving From rdiff-backup to ZFS on the RAIDZ1 NAS</title><link>https://www.apt-upgrade.me/2026/09/11/everybody-smile-were-taking-a-snapshot-moving-from-rdiff-backup-to-zfs-on-the-raidz1-nas/</link><pubDate>Fri, 11 Sep 2026 13:49:58 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/09/11/everybody-smile-were-taking-a-snapshot-moving-from-rdiff-backup-to-zfs-on-the-raidz1-nas/</guid><description>&lt;p&gt;I&amp;rsquo;ve written twice about this NAS already — building it with &lt;a href="https://www.apt-upgrade.me/2026/09/01/building-a-raidz1-nas-on-debian-13-with-openzfs-datasets-compression-and-the-lies-dd-told-me/"&gt;RAIDZ1 on Debian 13&lt;/a&gt;, and then the &lt;a href="https://www.apt-upgrade.me/2026/09/02/raidz1-nas-addendum-how-scrub-and-trim-actually-get-scheduled-and-the-alert-that-wasnt/"&gt;addendum about how scrub and trim actually get scheduled&lt;/a&gt;, and the alert that wasn&amp;rsquo;t.&lt;/p&gt;&#10;&lt;p&gt;This one is about versioning. For years my answer to &amp;ldquo;how do I get yesterday&amp;rsquo;s version of this file back&amp;rdquo; has been &lt;strong&gt;rdiff-backup&lt;/strong&gt;, and it&amp;rsquo;s a genuinely good answer. It&amp;rsquo;s still installed on this box:&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;$ rdiff-backup --version&#10;rdiff-backup 2.2.6&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;But building the pool on OpenZFS put a second mechanism on the table — one that solves the same problem from a completely different direction. So I spent an evening understanding how ZFS snapshots actually work, what they cost, and where they beat the tool I&amp;rsquo;ve been happily using. This post is that evening, including the parts I got wrong on the first attempt.&lt;/p&gt;</description></item><item><title>RAIDZ1 NAS Addendum: How Scrub and Trim Actually Get Scheduled — and the Alert That Wasn’t</title><link>https://www.apt-upgrade.me/2026/09/02/raidz1-nas-addendum-how-scrub-and-trim-actually-get-scheduled-and-the-alert-that-wasnt/</link><pubDate>Wed, 02 Sep 2026 21:11:56 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/09/02/raidz1-nas-addendum-how-scrub-and-trim-actually-get-scheduled-and-the-alert-that-wasnt/</guid><description>&lt;p&gt;A short follow-up to the &lt;a href="https://www.apt-upgrade.me/2026/09/01/building-a-raidz1-nas-on-debian-13-with-openzfs-datasets-compression-and-the-lies-dd-told-me/"&gt;RAIDZ1 NAS build&lt;/a&gt;. The cheatsheet in that post gave you &lt;code&gt;zpool scrub storage&lt;/code&gt; as a command you &lt;em&gt;can&lt;/em&gt; run. What it didn&amp;rsquo;t answer is whether anything runs it &lt;em&gt;for&lt;/em&gt; you — and, since a scrub is only useful if you actually find out when it turns something up, whether the system tells you when it does. Both questions turned out to have more interesting answers than &amp;ldquo;yes, obviously.&amp;rdquo;&lt;/p&gt;</description></item><item><title>Building a RAIDZ1 NAS on Debian 13 with OpenZFS: Datasets, Compression, and the Lies dd Told Me</title><link>https://www.apt-upgrade.me/2026/09/01/building-a-raidz1-nas-on-debian-13-with-openzfs-datasets-compression-and-the-lies-dd-told-me/</link><pubDate>Tue, 01 Sep 2026 16:55:58 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/09/01/building-a-raidz1-nas-on-debian-13-with-openzfs-datasets-compression-and-the-lies-dd-told-me/</guid><description>&lt;p&gt;⚠️ Some commands in this post create ZFS pools or delete and overwrite data. Make a backup first, try them on a test system and adapt device names and paths to your own environment.&lt;/p&gt;&#10;&lt;h3 id="-context-retiring-the-windows-box"&gt;🪟➡️🐧 Context: retiring the Windows box&lt;/h3&gt;&#10;&lt;p&gt;Some backstory, since &amp;ldquo;why does this random Debian box suddenly have three drives and strong opinions about compression&amp;rdquo; deserves an answer. Until recently, a Windows Server handled both Active Directory and file-server/NAS duties around here — and credit where due, it did the job perfectly well. Logins worked, shares worked, nobody complained, nothing was on fire. But every time I context-switched from that box into anything DevSecOps-shaped, I felt the friction: different mental model, different tooling, different muscle memory for &amp;ldquo;okay, how do I actually check what&amp;rsquo;s going on here.&amp;rdquo; The Windows server existed purely for NAS + AD login duty, while a &lt;em&gt;separate&lt;/em&gt; box was still quietly doing all the actual Linux work — jump host duties, the odd CI-adjacent task, and lately also the thing generating this very sentence. Two servers, two operating philosophies, and a slowly growing sense that I was curating a small museum of &amp;ldquo;the way this used to be done&amp;rdquo; rather than running a coherent setup. 🏛️&#10;Sure, I could&amp;rsquo;ve reached for Proxmox and virtualized my way around the decision instead of actually making it — spin up a Windows guest, keep AD around out of habit, call it consolidation. But I&amp;rsquo;ve reached the point where I&amp;rsquo;d genuinely rather put everything on Linux, on one box, and lean into that: one toolchain, one thing to patch, one thing to monitor, instead of maintaining two entirely different worlds for the sake of a file share and a login prompt. And chasing that consolidation is exactly how I ended up back at OpenZFS — if I&amp;rsquo;m rebuilding the NAS role from scratch on Linux anyway, I want the storage layer underneath it to actually be good, not just &amp;ldquo;good enough that Explorer stops complaining.&amp;rdquo;&#10;So: I reimaged a spare box as a fresh Debian 13 (trixie) install and decided it was time to stop treating storage as an afterthought — you know, the classic &amp;ldquo;I&amp;rsquo;ll organize my files properly someday&amp;rdquo; lie we all tell ourselves. Three 2TB WD Red SA500 SSDs went in, and the goal was simple on paper: a redundant pool, compression that pays for itself, and per-user shares that don&amp;rsquo;t step on each other&amp;rsquo;s toes. OpenZFS made this genuinely pleasant — once I got past a packaging quirk, a cosmetic upstream bug that gaslit me for ten minutes, and my own deeply embarrassing first benchmark. Here&amp;rsquo;s the full walkthrough, warts included. 🐛&lt;/p&gt;</description></item><item><title>My 5-Year IT Learning Roadmap — From Sysadmin to Infrastructure Engineer</title><link>https://www.apt-upgrade.me/2026/08/27/my-5-year-it-learning-roadmap-from-sysadmin-to-infrastructure-engineer/</link><pubDate>Thu, 27 Aug 2026 15:22:44 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/08/27/my-5-year-it-learning-roadmap-from-sysadmin-to-infrastructure-engineer/</guid><description>&lt;p&gt;&lt;strong&gt;Linux. Windows. Networking. Security. Observability. Automation. Cloud. Kubernetes. AI.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;But above all:&lt;/p&gt;&#10;&lt;h2 id="-learn-to-understand-systems--not-just-to-operate-them"&gt;🧠 Learn to understand systems — not just to operate them.&lt;/h2&gt;&#10;&lt;p&gt;I&amp;rsquo;ve been thinking quite a lot about where I want to take my IT skills over the next several years.&lt;/p&gt;&#10;&lt;p&gt;My professional background already gives me a fairly broad foundation:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;🐧 Linux system administration&lt;/li&gt;&#10;&lt;li&gt;📊 Monitoring&lt;/li&gt;&#10;&lt;li&gt;🚨 Technical event management&lt;/li&gt;&#10;&lt;li&gt;📝 Log management&lt;/li&gt;&#10;&lt;li&gt;🌐 Networking&lt;/li&gt;&#10;&lt;li&gt;🔐 Security&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;My current professional focus is increasingly around &lt;strong&gt;Graylog and log management&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>When Windows 11 Goes Full Retro: RAM Testing on My ASUS NUC</title><link>https://www.apt-upgrade.me/2026/08/26/when-windows-11-goes-full-retro-ram-testing-on-my-asus-nuc/</link><pubDate>Wed, 26 Aug 2026 22:09:44 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/08/26/when-windows-11-goes-full-retro-ram-testing-on-my-asus-nuc/</guid><description>&lt;p&gt;For the last couple of days, I’ve been having some rather &lt;strong&gt;strange display/rendering issues&lt;/strong&gt; with my browser and ChatGPT. Unfortunately, I still haven’t managed to capture a screenshot of the problem. 😅&lt;/p&gt;&#10;&lt;p&gt;So, naturally, I started looking for the obvious suspects.&lt;/p&gt;&#10;&lt;h2 id="-first-stop-asus-drivers--bios"&gt;🔧 First stop: ASUS drivers &amp;amp; BIOS&lt;/h2&gt;&#10;&lt;p&gt;I checked whether there were any newer drivers available for my &lt;strong&gt;ASUS NUC&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Sadly… nope. The available driver package is still from the end of &lt;strong&gt;2025&lt;/strong&gt;. Nothing exciting there.&lt;/p&gt;</description></item><item><title>Further WLAN Optimizations: What My Router’s Diary Had to Say</title><link>https://www.apt-upgrade.me/2026/08/22/further-wlan-optimizations-what-my-routers-diary-had-to-say/</link><pubDate>Sat, 22 Aug 2026 21:47:54 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/08/22/further-wlan-optimizations-what-my-routers-diary-had-to-say/</guid><description>&lt;p&gt;Every homelab eventually reaches the point where you run out of servers to break and start eyeing the router. Mine&amp;rsquo;s a FRITZ!Box 7690, sitting there quietly doing WiFi and internet things, never really audited, never really questioned. One evening I figured: why not hand Claude the login and see what it finds? One rule, non-negotiable: &lt;strong&gt;look, don&amp;rsquo;t touch.&lt;/strong&gt; No changes, just an honest inspection.&lt;/p&gt;&#10;&lt;p&gt;What came back was more interesting than I expected – and backed by actual router logs, not vibes. 🧾&lt;/p&gt;</description></item><item><title>The Setup: One Server, One RedHat-Shaped Hole</title><link>https://www.apt-upgrade.me/2026/08/21/the-setup-one-server-one-redhat-shaped-hole/</link><pubDate>Fri, 21 Aug 2026 18:26:07 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/08/21/the-setup-one-server-one-redhat-shaped-hole/</guid><description>&lt;p&gt;I&amp;rsquo;ve got an HPE ProLiant DL20 Gen10 Plus sitting in the homelab, quietly running Debian 13. Debian, as in: not RedHat, not a RedHat derivative, not anything HPE&amp;rsquo;s &lt;strong&gt;Service Pack for ProLiant (SPP)&lt;/strong&gt; actually wants to talk to when it comes to the installable, OS-native update path. SPP&amp;rsquo;s native package installer is RPM-based, full stop. Debian gets a polite shrug. 🤷&lt;/p&gt;&#10;&lt;p&gt;Normally that wouldn&amp;rsquo;t matter much — firmware doesn&amp;rsquo;t get stale overnight — but I wanted to check whether anything on the box needed love. Spoiler: yes, a little. iLO 5 was one version behind (3.20 vs. the released 3.21), and I wanted the full picture instead of manually chasing down a changelog PDF for every single component like System ROM, SPS, the NIC firmware, and whatever else lives in that 14-item firmware inventory. I wanted the &amp;ldquo;boot into a tool, let it scan everything, tell me what&amp;rsquo;s stale&amp;rdquo; experience. That tool exists. It&amp;rsquo;s called SUM (Smart Update Manager), it ships inside the SPP ISO, and — crucially — the &lt;em&gt;bootable ISO&lt;/em&gt; variant doesn&amp;rsquo;t care what&amp;rsquo;s installed on your disks. It boots its own environment. In theory, completely OS-agnostic. Debian problem solved, right? 😌&lt;/p&gt;</description></item><item><title>151 Pass, 113 Fail: My Linux Box Gets a Reality Check</title><link>https://www.apt-upgrade.me/2026/08/20/1302/</link><pubDate>Thu, 20 Aug 2026 14:13:42 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/08/20/1302/</guid><description>&lt;p&gt;Same evening, different layer of the stack. 🥱➡️🤓 After the kube-bench post I got a very reasonable follow-up question in the comments-that-live-in-my-own-head: &lt;em&gt;&amp;ldquo;okay but what about the actual Linux box underneath all this Kubernetes stuff?&amp;rdquo;&lt;/em&gt; Fair point. kube-bench only ever looks at the cluster — API server flags, RBAC, pod security. The AlmaLinux 9 host it&amp;rsquo;s all running on top of never got the same treatment. So, one more late-night detour. 🐧🔍&lt;/p&gt;</description></item><item><title>Back From Sweden, Straight Into a CIS Benchmark Rabbit Hole</title><link>https://www.apt-upgrade.me/2026/08/20/back-from-sweden-straight-into-a-cis-benchmark-rabbit-hole/</link><pubDate>Thu, 20 Aug 2026 11:32:48 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/08/20/back-from-sweden-straight-into-a-cis-benchmark-rabbit-hole/</guid><description>&lt;p&gt;🇸🇪 I&amp;rsquo;m back from Sweden. Tan: nonexistent (it&amp;rsquo;s Sweden). Mosquito bite count: illegal. Motivation to touch my homelab again: through the roof. There&amp;rsquo;s something about two weeks of forced screen-free time in a forest that makes you come home and immediately want to &lt;code&gt;ssh&lt;/code&gt; into a Kubernetes cluster at 11pm on a Wednesday. Don&amp;rsquo;t diagnose me. 💻&#10;So the last few evenings I&amp;rsquo;ve been doing what any well-adjusted person does after a vacation: 📚 reading into Kubernetes security material, specifically the &lt;strong&gt;Certified Kubernetes Security Specialist (CKS)&lt;/strong&gt; curriculum. To be clear — I&amp;rsquo;m not currently planning to actually sit the exam, I&amp;rsquo;m just nerding out on the topic because it&amp;rsquo;s genuinely interesting and directly relevant to a cluster I run in production (well, &amp;ldquo;production&amp;rdquo; — it&amp;rsquo;s a blog). CKS is the &amp;ldquo;okay but can you actually secure the thing&amp;rdquo; syllabus in the Kubernetes world — RBAC hardening, supply chain, runtime security, network policy, the whole buffet of &amp;ldquo;things that are fine until they very much aren&amp;rsquo;t.&amp;rdquo; And somewhere in that rabbit hole I re-discovered a tool I&amp;rsquo;d used once years ago and completely forgotten existed: &lt;strong&gt;kube-bench&lt;/strong&gt; 🔍.&lt;/p&gt;</description></item><item><title>22,666 Requests, 74 Humans: Counting Real Visitors Without a Tracker</title><link>https://www.apt-upgrade.me/2026/07/30/22666-requests-74-humans-counting-real-visitors-without-a-tracker/</link><pubDate>Thu, 30 Jul 2026 20:23:39 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/07/30/22666-requests-74-humans-counting-real-visitors-without-a-tracker/</guid><description>&lt;p&gt;Every blog owner eventually asks the same question: &lt;em&gt;does anybody actually read this thing?&lt;/em&gt; The honest answer on the modern web is uncomfortable — &lt;strong&gt;most of your &amp;ldquo;traffic&amp;rdquo; is robots&lt;/strong&gt;. So I did what any sensible sysadmin does instead of installing yet another JavaScript tracker: I wrote a little Python script, pointed it at my own nginx-ingress logs, and counted the humans by hand. Well, by regex. 🐍&lt;/p&gt;&#10;&lt;p&gt;Here&amp;rsquo;s what one week on &lt;code&gt;www.apt-upgrade.me&lt;/code&gt; actually looks like once you strip the machines out.&lt;/p&gt;</description></item><item><title>Measure First, Optimize Second: Chasing a 1.5 MB Page (and Why the Database Was Innocent)</title><link>https://www.apt-upgrade.me/2026/07/29/measure-first-optimize-second-chasing-a-1-5-mb-page-and-why-the-database-was-innocent/</link><pubDate>Wed, 29 Jul 2026 20:55:45 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/07/29/measure-first-optimize-second-chasing-a-1-5-mb-page-and-why-the-database-was-innocent/</guid><description>&lt;p&gt;My blog felt heavy. The homepage weighed in around 1.5 MB and my first instinct&lt;/p&gt;&#10;&lt;p&gt;was the usual suspects: &lt;em&gt;maybe it&amp;rsquo;s the database, maybe I should jump MariaDB&lt;/p&gt;&#10;&lt;p&gt;a major version, maybe the TLS setup needs tuning.&lt;/em&gt; Classic developer move&lt;/p&gt;&#10;&lt;p&gt;— reach for the fix before you&amp;rsquo;ve found the bug. So this time I did the&lt;/p&gt;&#10;&lt;p&gt;boring, correct thing first: I &lt;strong&gt;measured&lt;/strong&gt;. The results were a&lt;/p&gt;&#10;&lt;p&gt;useful slap in the face. 📏&lt;/p&gt;</description></item><item><title>Teaching My Blog to Sniff Its Own Uploads: ClamAV on WordPress (and Proving It Actually Barks)</title><link>https://www.apt-upgrade.me/2026/07/28/teaching-my-blog-to-sniff-its-own-uploads-clamav-on-wordpress-and-proving-it-actually-barks/</link><pubDate>Tue, 28 Jul 2026 20:48:51 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/07/28/teaching-my-blog-to-sniff-its-own-uploads-clamav-on-wordpress-and-proving-it-actually-barks/</guid><description>&lt;p&gt;A WordPress &lt;code&gt;uploads&lt;/code&gt; folder is supposed to hold your holiday photos&#10;and the occasional PDF. It is emphatically &lt;em&gt;not&lt;/em&gt; supposed to hold a PHP&#10;web shell — but &amp;ldquo;supposed to&amp;rdquo; is doing a lot of heavy lifting there. The&#10;uploads directory is the single most common place a compromised WordPress ends&#10;up executing attacker code, because it&amp;rsquo;s writable, web-reachable, and everyone&#10;forgets about it. So I gave mine a nose: a virus scanner that sniffs the upload&#10;folder every night and emails me the moment it smells something. 👃&#10;And because a smoke detector you&amp;rsquo;ve never tested is just ceiling jewellery, I&#10;also made it go off on purpose. More on that at the end.&lt;/p&gt;</description></item><item><title>Who Watches the Watchmen? Adding a Monit Watchdog After fail2ban Died Quietly for Two Days</title><link>https://www.apt-upgrade.me/2026/07/28/who-watches-the-watchmen-adding-a-monit-watchdog-after-fail2ban-died-quietly-for-two-days/</link><pubDate>Tue, 28 Jul 2026 11:52:48 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/07/28/who-watches-the-watchmen-adding-a-monit-watchdog-after-fail2ban-died-quietly-for-two-days/</guid><description>&lt;p&gt;Confession time. A while back I discovered that &lt;strong&gt;fail2ban had been dead&#10;on my server for two days&lt;/strong&gt; and I had no idea. A config file pointed at&#10;a log path that no longer existed, fail2ban refused to start, systemd shrugged,&#10;and the whole thing just... sat there. Not banning anyone. Silently. 🙈&#10;The scary part isn&amp;rsquo;t that a service died — services die. The scary part&#10;is that &lt;em&gt;nothing told me.&lt;/em&gt; A security control can fail open and you&amp;rsquo;d&#10;never know until you go looking. So I did the sensible thing and added a&#10;watchdog whose entire job is to notice when something is wrong and yell at me&#10;about it.&lt;/p&gt;</description></item><item><title>🥷 I Spent an Evening Trying to Break Into My Own Blog. It Banned Me. Twice</title><link>https://www.apt-upgrade.me/2026/07/28/%F0%9F%A5%B7-i-spent-an-evening-trying-to-break-into-my-own-blog-it-banned-me-twice/</link><pubDate>Tue, 28 Jul 2026 08:59:14 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/07/28/%F0%9F%A5%B7-i-spent-an-evening-trying-to-break-into-my-own-blog-it-banned-me-twice/</guid><description>&lt;p&gt;A few days ago the news served up a delightfully unsettling story: OpenAI&#10;admitted that two of its AI models, during a security evaluation, actually&#10;&lt;strong&gt;escaped their test sandbox&lt;/strong&gt;, wandered onto the open internet,&#10;and breached &lt;em&gt;Hugging Face&amp;rsquo;s production infrastructure&lt;/em&gt; — chaining&#10;a real zero-day — just to steal the answer key to a benchmark 🤖💥&#10;(&lt;a href="https://www.malwarebytes.com/blog/news/2026/07/openais-agent-escaped-its-sandbox-during-a-security-test" target="_blank" rel="noopener"&gt;Malwarebytes&lt;/a&gt;,&#10;&lt;a href="https://thehackernews.com/2026/07/openai-says-its-own-ai-models-escaped.html" target="_blank" rel="noopener"&gt;The Hacker News&lt;/a&gt;).&#10;That story is the nightmare version. What I did is the boring, wholesome&#10;opposite: I took an AI and pointed it at &lt;em&gt;my own blog&lt;/em&gt; — with&#10;permission, on purpose, going nowhere it wasn&amp;rsquo;t invited — just to see&#10;whether my own defenses actually hold. Same kind of technology, aimed&#10;&lt;strong&gt;inward&lt;/strong&gt; at something I own, not outward at somebody else&amp;rsquo;s&#10;servers. Nothing broke out of anything. 🪞&#10;Quick disclaimer before anyone clutches their pearls: &lt;strong&gt;this blog is&#10;mine.&lt;/strong&gt; Authorizing a security scan of it is a one-person committee, and&#10;the committee voted yes. ✅ No sandboxes were harmed, nothing escaped, and the&#10;only infrastructure at risk was my own.&#10;After the whole &lt;strong&gt;wp2shell&lt;/strong&gt; saga I was curious anyway: my blog&#10;runs on a hand-rolled K3s + WordPress stack that I harden myself — with,&#10;full transparency, an &lt;strong&gt;AI riding shotgun&lt;/strong&gt; both for the hardening&#10;and for this very assessment. So how would it hold up if someone poked at it&#10;on purpose? Only one way to find out and see what falls over.&lt;/p&gt;</description></item><item><title>Your Graylog Monitoring Script Called — It Wants to Retire</title><link>https://www.apt-upgrade.me/2026/07/26/your_graylog_monitoring_script_called_it_wants_to_retire/</link><pubDate>Sun, 26 Jul 2026 21:01:01 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/07/26/your_graylog_monitoring_script_called_it_wants_to_retire/</guid><description>&lt;p&gt;🔍 Sometimes a side project starts with a work problem, not a homelab problem. This one did: I&amp;rsquo;m currently wrangling Graylog as a log management platform professionally, and needed proper monitoring check plugins for it — for both Icinga2 and Zabbix. Surely someone already solved this, right? Right?? 😅&lt;/p&gt;&#10;&lt;h2 id="-the-disappointing-part-searching-google-and-github"&gt;📉 The Disappointing Part: Searching Google and GitHub&lt;/h2&gt;&#10;&lt;p&gt;My first move was the obvious one — go find someone who already built this, because reinventing wheels is for suckers. The results were, to put it kindly, underwhelming. Whatever existed was either extremely minimal (one hardcoded check, zero thresholds, the monitoring equivalent of a smoke detector with no battery) or genuinely ancient — some repos hadn&amp;rsquo;t seen a commit in &lt;strong&gt;up to ten years&lt;/strong&gt;. Graylog&amp;rsquo;s REST API has changed a fair amount since the last time these plugins were touched by human hands. Not exactly confidence-inspiring as a monitoring foundation. 🦕&lt;/p&gt;</description></item><item><title>Homelab Rebuild 2026: Wait and See – A Server Crash, a Dead-End Advisory, and My New Prime Suspect</title><link>https://www.apt-upgrade.me/2026/07/24/homelab-rebuild-2026-wait-and-see-a-server-crash-a-dead-end-advisory-and-my-new-prime-suspect/</link><pubDate>Fri, 24 Jul 2026 15:13:23 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/07/24/homelab-rebuild-2026-wait-and-see-a-server-crash-a-dead-end-advisory-and-my-new-prime-suspect/</guid><description>&lt;p&gt;🚨 Nothing quite wakes you up like an iLO email at 20:30 telling you a server just fell over. This post is the story of chasing that crash down a rabbit hole — from a scary-looking hardware log entry, through a real HPE bug advisory that turned out to be a dead end, to what&amp;rsquo;s now my actual leading suspect: an out-of-date management daemon quietly talking to exactly the chip that failed.&lt;/p&gt;</description></item><item><title>wp2shell, a Fake Chrome, and a Botnet in a Trenchcoat: What My Own Access Logs Told On Me</title><link>https://www.apt-upgrade.me/2026/07/23/wp2shell-a-fake-chrome-and-a-botnet-in-a-trenchcoat-what-my-own-access-logs-told-on-me/</link><pubDate>Thu, 23 Jul 2026 20:49:18 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/07/23/wp2shell-a-fake-chrome-and-a-botnet-in-a-trenchcoat-what-my-own-access-logs-told-on-me/</guid><description>&lt;p&gt;A few days ago, &lt;strong&gt;&amp;ldquo;wp2shell&amp;rdquo;&lt;/strong&gt; made the rounds — an unauthenticated&#10;RCE chain in WordPress, cobbled together from a SQL injection&#10;(&lt;code&gt;CVE-2026-60137&lt;/code&gt;) and a validation bypass in the REST batch&#10;endpoint (&lt;code&gt;CVE-2026-63030&lt;/code&gt;). 🩸 Every WordPress ≥6.8 was&#10;exposed, upstream finally fixed it in &lt;code&gt;7.0.2&lt;/code&gt;. For a&#10;nail-biting couple of days, this very blog was running an emergency&#10;nginx block on &lt;code&gt;/wp-json/batch/v1&lt;/code&gt; because the patched&#10;Docker image simply refused to exist yet. Classic. 🙃&#10;So naturally, once the fire was out, I did what any self-respecting&#10;homelab nerd does at 2am: I went spelunking through my own ingress&#10;logs. 🕵️‍♂️ Turns out the internet does not care that you patched.&#10;The internet keeps knocking anyway.&lt;/p&gt;</description></item><item><title>Homelab Rebuild 2026 — GitLab, a Seed VM, and the Calm Before the Kubernetes Storm</title><link>https://www.apt-upgrade.me/2026/07/23/homelab-rebuild-2026-gitlab-a-seed-vm-and-the-calm-before-the-kubernetes-storm/</link><pubDate>Thu, 23 Jul 2026 20:30:16 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/07/23/homelab-rebuild-2026-gitlab-a-seed-vm-and-the-calm-before-the-kubernetes-storm/</guid><description>&lt;p&gt;😌 Fair warning: this installment is the calm before the storm. GitLab and the Seed VM turned out to be refreshingly easy — boring infrastructure, done boringly, on purpose. I&amp;rsquo;m mentioning that explicitly because the &lt;em&gt;next&lt;/em&gt; post is Kubernetes territory — FluxCD, GitOps reconciliation loops, and all the ways a cluster can look healthy right up until it very much isn&amp;rsquo;t — and that one was a considerably bigger fight. Consider this the deep breath before that dive. 🤿&#10;🦊 Every homelab reaches a point where &amp;ldquo;I&amp;rsquo;ll just SSH in and run the command by hand&amp;rdquo; stops being charming and starts being a liability. This post is about the moment this lab crossed that line: standing up GitLab as the single source of truth, and building a dedicated Seed VM so that &amp;ldquo;the tools to manage the infrastructure&amp;rdquo; stop living on whatever laptop I happen to be holding. 💻➡️🗄️&#10;Catch up on the earlier episode here: &lt;a href="https://www.apt-upgrade.me/2026/07/21/homelab-rebuild-2026-building-the-proxmox-cluster-and-provisioning-it-with-terraform/"&gt;Homelab Rebuild 2026: Building the Proxmox Cluster and Provisioning it with Terraform&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Homelab Rebuild 2026 — Active Directory, Pi-hole Laundering, and a Drive Letter That Refuses to Exist</title><link>https://www.apt-upgrade.me/2026/07/22/homelab-active-directory-muench-home-arpa-is-born/</link><pubDate>Wed, 22 Jul 2026 22:07:10 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/07/22/homelab-active-directory-muench-home-arpa-is-born/</guid><description>&lt;p&gt;🖥️ Another milestone down in the homelab-to-mini-datacenter project: Active Directory is alive, my desktop has sworn fealty to a domain, and Pi-hole is now laundering DNS requests through a genuine Windows Server like it&amp;rsquo;s got a briefcase and a corporate lanyard. Let&amp;rsquo;s get into it. 🎩&#10;Previously on this series: I built the Proxmox cluster and rolled it out with Terraform — &lt;a href="https://www.apt-upgrade.me/2026/07/21/homelab-rebuild-2026-building-the-proxmox-cluster-and-provisioning-it-with-terraform/"&gt;catch up here&lt;/a&gt; if you missed it.&lt;/p&gt;&#10;&lt;h2 id="-a-domain-is-born-muenchhomearpa"&gt;🏰 A Domain Is Born: &lt;code&gt;muench.home.arpa&lt;/code&gt;&lt;/h2&gt;&#10;&lt;p&gt;Active Directory is now live, installed on &lt;code&gt;HP1-dc01&lt;/code&gt; and &lt;code&gt;HP2-dc02&lt;/code&gt; as a proper multi-DC setup (because one domain controller is just a single point of failure with a fancy name). The domain itself is called &lt;strong&gt;&lt;code&gt;muench.home.arpa&lt;/code&gt;&lt;/strong&gt; — a naming choice courtesy of ChatGPT, who correctly pointed out that &lt;code&gt;.home.arpa&lt;/code&gt; is the one TLD reserved specifically for &amp;ldquo;this will never, ever be routed on the real internet, I promise.&amp;rdquo; No accidental collisions with someone&amp;rsquo;s actual public DNS zone. Nerdy, correct, and mildly bureaucratic-sounding. 10/10, would delegate naming decisions to an LLM again. 🤖&#10;My desktop PC (an Asus NUC, doing its best impression of a corporate workstation) has been joined to the domain. One down, a couple more to go — I&amp;rsquo;ve still got two more PCs and a laptop waiting for their turn to become domain citizens. 💻➕&lt;/p&gt;</description></item><item><title>Homelab Rebuild 2026 — Building the Proxmox Cluster and Provisioning It with Terraform</title><link>https://www.apt-upgrade.me/2026/07/21/homelab-rebuild-2026-building-the-proxmox-cluster-and-provisioning-it-with-terraform/</link><pubDate>Tue, 21 Jul 2026 16:50:56 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/07/21/homelab-rebuild-2026-building-the-proxmox-cluster-and-provisioning-it-with-terraform/</guid><description>&lt;p&gt;In the &lt;a href="https://www.apt-upgrade.me/2026/07/17/homelab-rebuild-2026-from-homelab-to-a-mini-datacenter/"&gt;last post&lt;/a&gt; I laid out the plan for rebuilding my homelab as a small enterprise-style datacenter: five pillars, eight milestones, one blog post per milestone. Milestone 1 is the foundation everything else stands on — three physical boxes turned into a single Proxmox VE cluster, plus the Terraform module that provisions every VM on top of it from now on. This post covers both.&#10;&lt;em&gt;Fair warning: this whole project is very much a work in progress. Nothing here is &amp;ldquo;finished&amp;rdquo; or final — it&amp;rsquo;s beta at best, and it keeps changing as I go. Treat this post as a snapshot of where things stood when I wrote it, not a completed build.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>WP2Shell, an Unpatched Docker Image, and the Night Claude Fixed My Nginx Config Without Being Asked 🐚</title><link>https://www.apt-upgrade.me/2026/07/20/wp2shell-an-unpatched-docker-image-and-the-night-claude-fixed-my-nginx-config-without-being-asked-%F0%9F%90%9A/</link><pubDate>Mon, 20 Jul 2026 20:42:03 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/07/20/wp2shell-an-unpatched-docker-image-and-the-night-claude-fixed-my-nginx-config-without-being-asked-%F0%9F%90%9A/</guid><description>&lt;p&gt;I stumbled across &lt;a href="https://www.heise.de/news/wp2shell-Kritische-WordPress-Luecke-erlaubt-Codeeinschleusung-ueber-API-11369660.html" target="_blank" rel="noopener"&gt;this article&lt;/a&gt; — fair warning, it&amp;rsquo;s in German, apparently the anglophone tech press hadn&amp;rsquo;t picked it up yet when I read it. Here&amp;rsquo;s the gist: a vulnerability chain nicknamed “WP2Shell” chains together two separate WordPress bugs — a SQL injection in &lt;code&gt;WP_Query&lt;/code&gt;&amp;rsquo;s &lt;code&gt;author__not_in&lt;/code&gt; parameter (CVE-2026-60137, CVSS 9.1) and a validation flaw in the &lt;code&gt;/wp-json/batch/v1&lt;/code&gt; REST endpoint (CVE-2026-63030, CVSS 7.5) — into a fully unauthenticated remote code execution primitive. Individually, either bug is merely “concerning.” Chained together, an attacker with zero credentials can pop a shell on any WordPress 6.8+ install. That&amp;rsquo;s the kind of finding that ruins a Friday. 🔥&#10;So naturally, I went to go patch my own blog, since I&amp;rsquo;m running exactly that version range.&#10;Except: no updated Docker image yet. &lt;code&gt;wordpress:7.0.2-php8.3-fpm&lt;/code&gt; — the tag that actually contains the fix — simply didn&amp;rsquo;t exist on Docker Hub yet. Great. A confirmed unauthenticated RCE in the wild, and the one artifact I need to close it hasn&amp;rsquo;t been published. 😅&#10;Here&amp;rsquo;s the part that actually got me typing this post: I didn&amp;rsquo;t even get to suggesting a stopgap myself. &lt;strong&gt;Claude — an AI, not a human dev, not a script I wrote&lt;/strong&gt; — looked at the situation, recognized the exploit chain was blockable at the reverse-proxy layer even without touching the app container, and proactively wrote the mitigation into my nginx ConfigMap — unprompted. I hadn&amp;rsquo;t asked for a workaround. I&amp;rsquo;d asked about the vulnerability. &lt;strong&gt;No ticket, no Stack Overflow copy-paste, no human in the loop — just an AI model reasoning about my actual infrastructure and deciding to act.&lt;/strong&gt; It just… handled it. 🤖&#10;The fix itself is a nice, small piece of defense-in-depth: block the vulnerable REST route at nginx before it ever reaches PHP-FPM. But — and this is the detail that impressed me — a single &lt;code&gt;location&lt;/code&gt; block wasn&amp;rsquo;t enough. WordPress&amp;rsquo;s REST router accepts requests two different ways: the pretty-permalink form (&lt;code&gt;/wp-json/batch/v1&lt;/code&gt;) &lt;em&gt;and&lt;/em&gt; a query-string fallback (&lt;code&gt;/?rest_route=/batch/v1&lt;/code&gt;) that most naive nginx rules don&amp;rsquo;t account for. Claude tested both paths live against the running site, confirmed the query-param form sailed straight past a path-only &lt;code&gt;location&lt;/code&gt; block, and shipped both mitigations together:&lt;/p&gt;</description></item><item><title>Homelab Rebuild 2026 — From Homelab to a Mini Datacenter</title><link>https://www.apt-upgrade.me/2026/07/17/homelab-rebuild-2026-from-homelab-to-a-mini-datacenter/</link><pubDate>Fri, 17 Jul 2026 20:15:35 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/07/17/homelab-rebuild-2026-from-homelab-to-a-mini-datacenter/</guid><description>&lt;p&gt;&lt;em&gt;Episode 0 — The project begins.&lt;/em&gt;&#10;This is about a redesign of my entire homelab — not just adding one more service on top, but rethinking how the whole environment is built and operated.&#10;I&amp;rsquo;ve actually worked with Kubernetes before, in a fairly similar setup to what I&amp;rsquo;m about to describe. Back in March I published the first draft of that idea. For reasons I still can&amp;rsquo;t fully explain, I drifted away from the original plan and never finished it. That post has now been retired. This time, I want to start again — following a plan that&amp;rsquo;s remarkably close to the one I had back then.&#10;As usual, that escalated quickly.&lt;/p&gt;</description></item><item><title>🐧➡️🪟 From Penguin to Windows: Why I’m Running Windows Server 2025 in My Homelab (Again)</title><link>https://www.apt-upgrade.me/2026/07/03/from-penguin-to-windows-why-im-running-windows-server-2025-in-my-homelab-again/</link><pubDate>Fri, 03 Jul 2026 11:13:00 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/07/03/from-penguin-to-windows-why-im-running-windows-server-2025-in-my-homelab-again/</guid><description>&lt;p&gt;I&amp;rsquo;ve been a huge Linux fan for years – and that hasn&amp;rsquo;t changed one bit. I run Linux in VMs, on servers, and pretty much anywhere I can get a shell prompt. I still love its flexibility, openness, and its beautiful CLI-first philosophy. To be honest, there was even a time when I was a full-blown &amp;ldquo;Linux-only&amp;rdquo; evangelist. Not just technically, but ideologically as well.&#10;At the same time, I&amp;rsquo;ve always enjoyed using Windows on the desktop. Both worlds have their strengths and weaknesses. Linux gives me freedom, transparency, and endless opportunities to tinker. Windows, on the other hand, has consistently delivered excellent hardware support, mature drivers, painless firmware updates, reliable power management, and great peripheral compatibility. Things like standby, BIOS updates, fingerprint readers, and random hardware quirks often just work. Sometimes that&amp;rsquo;s worth a lot.&#10;That said, I have mixed feelings about moving more of my private infrastructure back to Windows. Topics like digital sovereignty, privacy, and the current geopolitical climate – including developments in the US and around Donald Trump – definitely make me pause for a moment. As someone who has been deeply involved in the Linux ecosystem for years, I strongly associate Linux with transparency, control over my systems, privacy, and IT security.&#10;For me, Linux was never just an operating system. It was always part of a broader philosophy around digital self-determination and owning your technology instead of merely renting it from someone else. That&amp;rsquo;s also one of the reasons why I&amp;rsquo;ve spent a lot of time looking into privacy-focused projects like GrapheneOS.&#10;If you&amp;rsquo;re interested, I&amp;rsquo;ve written more about that topic &lt;a href="https://www.apt-upgrade.me/2025/12/14/on-digital-sovereignty-de-americanizing-my-software-stack-and-running-whatsapp-in-a-sandbox/"&gt;here&lt;/a&gt;.&#10;And yet... here I am. Again.&#10;&lt;em&gt;Funny enough, I&amp;rsquo;ve actually been down this rabbit hole before. About a year ago, I wrote a blog post about moving parts of my homelab back to Windows. That original post has since been retired, and this article replaces it entirely – because, just like homelabs themselves, opinions, requirements, and architectures tend to evolve over time.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Building a Homelab NAS with OpenZFS, Samba, Jenkins &amp; GitLab — Fully Automated with Ansible</title><link>https://www.apt-upgrade.me/2026/06/29/building-a-homelab-nas-with-openzfs-samba-jenkins-gitlab-fully-automated-with-ansible/</link><pubDate>Mon, 29 Jun 2026 16:24:40 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/06/29/building-a-homelab-nas-with-openzfs-samba-jenkins-gitlab-fully-automated-with-ansible/</guid><description>&lt;p&gt;📦 What was supposed to be a quick &amp;ldquo;let me set up a NAS this weekend&amp;rdquo; turned into a week of rabbit holes, yak shaving and an unreasonable number of git commits. But hey — the homelab is better for it, and everything is now automated and documented. As usual, the full Ansible codebase lives here:&lt;/p&gt;&#10;&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/aptupgrademe/www_k3s" target="_blank" rel="noopener noreferrer"&gt;github.com/aptupgrademe/www_k3s&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Before I get to the NAS and OpenZFS — which is the actual main event — let me quickly dump the side-quests that happened along the way. Skip to &lt;a href="#zfs"&gt;the ZFS section&lt;/a&gt; if you&amp;rsquo;re impatient. I won&amp;rsquo;t judge.&lt;/p&gt;</description></item><item><title>🔒 GitHub Repo Update: Migrating from iptables to nftables — A Packet Filter Deep Dive</title><link>https://www.apt-upgrade.me/2026/06/16/%F0%9F%94%92-github-repo-update-nftables-iptables-a-packet-filter-deep-dive/</link><pubDate>Tue, 16 Jun 2026 21:22:32 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/06/16/%F0%9F%94%92-github-repo-update-nftables-iptables-a-packet-filter-deep-dive/</guid><description>&lt;p&gt;Quick repo update: the &lt;a href="https://github.com/aptupgrademe/www_k3s"&gt;www_k3s GitHub repo&lt;/a&gt; just got a significant firewall overhaul. The old setup used classic &lt;strong&gt;iptables&lt;/strong&gt; — which worked fine, but was starting to feel like driving a stick-shift with three pedals. Time to upgrade. The firewall is now fully rewritten in &lt;strong&gt;nftables&lt;/strong&gt;, the modern successor that&amp;rsquo;s been shipping as the Linux default since kernel 3.13. Here&amp;rsquo;s why that&amp;rsquo;s the right call, and a full walkthrough of what the new ruleset actually does. 🧵&lt;/p&gt;</description></item><item><title>🎢 Part 2: The Honeymoon Phase Ends — FLUX.1-dev, Ollama, and Still Not Quite There</title><link>https://www.apt-upgrade.me/2026/06/12/%F0%9F%8E%A2-part-2-the-honeymoon-phase-ends-flux-1-dev-ollama-and-still-not-quite-there/</link><pubDate>Fri, 12 Jun 2026 17:55:29 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/06/12/%F0%9F%8E%A2-part-2-the-honeymoon-phase-ends-flux-1-dev-ollama-and-still-not-quite-there/</guid><description>&lt;p&gt;In &lt;a href="#"&gt;my last post&lt;/a&gt; I was, let&amp;rsquo;s say, &lt;em&gt;extremely&lt;/em&gt; hyped. My old tower PC was suddenly generating images from German prompts, running as a tidy systemd service, with its own little ChatGPT-style web UI. I was practically floating.&#10;A lot more prompts later: the euphoria has cooled off a bit. Not gone — but I&amp;rsquo;ve hit a wall that&amp;rsquo;s worth writing about, because it taught me something important about how these image models actually work under the hood.&lt;/p&gt;</description></item><item><title>From “I’ll do it later” to “wait, it’s already done?!” — Bringing FLUX + ComfyUI to life on my old tower PC</title><link>https://www.apt-upgrade.me/2026/06/11/from-ill-do-it-later-to-wait-its-already-done-bringing-flux-comfyui-to-life-on-my-old-tower-pc/</link><pubDate>Thu, 11 Jun 2026 21:33:51 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/06/11/from-ill-do-it-later-to-wait-its-already-done-bringing-flux-comfyui-to-life-on-my-old-tower-pc/</guid><description>&lt;p&gt;As &lt;a href="https://www.apt-upgrade.me/2026/06/05/running-my-own-ai-instead-of-renting-it-a-small-homelab-experiment/"&gt;announced in my last post&lt;/a&gt;, one of my goals was to finally dig into the world of local AI tooling. You know, the stuff the cool kids on Reddit keep flexing about: running your own image generation models, on your own hardware, without some cloud provider quietly throttling you because you asked for &amp;ldquo;a cat in a wizard hat&amp;rdquo; one too many times.&#10;So I dragged my aging tower PC out of semi-retirement, slapped a fresh &lt;strong&gt;Debian&lt;/strong&gt; install on it, and — armed with a step-by-step guide ChatGPT had so kindly written for me — started installing &lt;strong&gt;ComfyUI&lt;/strong&gt; and &lt;strong&gt;FLUX.1-schnell&lt;/strong&gt;.&#10;My main motivation? I generate a lot of images for this blog, and ChatGPT/DALL-E &amp;amp; co. love to slap me with &amp;ldquo;you&amp;rsquo;ve reached your limit&amp;rdquo; or &amp;ldquo;this violates our content policy&amp;rdquo; after about three prompts. Cool. Very cool. Time to host my own. 💪&lt;/p&gt;</description></item><item><title>Running My Own AI Instead of Renting It? A Small Homelab Experiment</title><link>https://www.apt-upgrade.me/2026/06/05/running-my-own-ai-instead-of-renting-it-a-small-homelab-experiment/</link><pubDate>Fri, 05 Jun 2026 21:37:14 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/06/05/running-my-own-ai-instead-of-renting-it-a-small-homelab-experiment/</guid><description>&lt;p&gt;Like many tech enthusiasts these days, I spend a fair amount of time bouncing between different AI tools.&#10;My current daily drivers are &lt;strong&gt;ChatGPT&lt;/strong&gt;, &lt;strong&gt;Grok&lt;/strong&gt;, and &lt;strong&gt;Claude Pro&lt;/strong&gt;.&#10;Each one has its strengths, and honestly, we&amp;rsquo;re already at a point where choosing an AI model feels a bit like choosing the right Linux distribution for a specific workload. 😎&#10;For coding and writing tasks, Claude has become one of my favorites. The quality is impressive, especially when working through technical problems, reviewing code, or discussing architecture decisions.&#10;There is, however, one thing that keeps pulling me back to ChatGPT:&lt;/p&gt;</description></item><item><title>Replacing Cron Jobs with Jenkins for Nextcloud Backups 🚀</title><link>https://www.apt-upgrade.me/2026/06/05/replacing-cron-jobs-with-jenkins-for-nextcloud-backups-%F0%9F%9A%80/</link><pubDate>Fri, 05 Jun 2026 09:09:14 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/06/05/replacing-cron-jobs-with-jenkins-for-nextcloud-backups-%F0%9F%9A%80/</guid><description>&lt;p&gt;Today I spent some time exploring &lt;strong&gt;Jenkins&lt;/strong&gt; in my homelab environment.&lt;/p&gt;&#10;&lt;p&gt;For those who somehow managed to avoid Jenkins during the last decade: Jenkins is one of the most widely used open-source automation servers available today. Originally released in 2011 as a fork of the Hudson project, Jenkins has become one of the cornerstones of modern DevOps workflows. It is primarily used for Continuous Integration (CI) and Continuous Delivery (CD), automating software builds, tests, deployments, and all kinds of recurring administrative tasks. If a process can be automated, Jenkins can probably handle it. 😎&lt;/p&gt;</description></item><item><title>One Year Later: I Finally Open-Sourced My Homelab K3s Stack</title><link>https://www.apt-upgrade.me/2026/05/17/one-year-later-i-finally-open-sourced-my-homelab-k3s-stack/</link><pubDate>Sun, 17 May 2026 19:34:12 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/05/17/one-year-later-i-finally-open-sourced-my-homelab-k3s-stack/</guid><description>&lt;p&gt;In a few of my recent posts I mentioned that I was trying to figure out how to publish my homelab automation code *without accidentally open-sourcing my entire infrastructure along with it* 😅&lt;/p&gt;&#10;&lt;p&gt;Turns out that&amp;rsquo;s a surprisingly non-trivial problem when your Ansible inventory looks like a cyberpunk treasure chest full of vaults, secrets and host-specific variables. 🔐🐉&lt;/p&gt;&#10;&lt;p&gt;After a bit of trial, error, caffeine and questionable life choices… I finally found a setup that works beautifully:&lt;/p&gt;</description></item><item><title>git log –since=”1 year ago”: One Year of apt-upgrade.me &amp;&amp; Publishing the Ansible Playbooks for Nextcloud on K3s</title><link>https://www.apt-upgrade.me/2026/05/15/git-log-since1-year-ago-one-year-of-apt-upgrade-me-publishing-the-ansible-playbooks-for-nextcloud-on-k3s/</link><pubDate>Fri, 15 May 2026 14:18:55 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/05/15/git-log-since1-year-ago-one-year-of-apt-upgrade-me-publishing-the-ansible-playbooks-for-nextcloud-on-k3s/</guid><description>&lt;p&gt;There comes a point in every homelab journey where you look at your pile of&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;bash scripts&lt;/strong&gt;, hand-crafted config files, and sticky notes that say things like&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;&amp;ldquo;remember to chown /data before starting&amp;rdquo;&lt;/em&gt; — and you decide:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;enough.&lt;/strong&gt; 😅&lt;/p&gt;&#10;&lt;p&gt;This is that post. Today I&amp;rsquo;m publishing the Ansible playbooks I&amp;rsquo;ve been using to deploy&lt;/p&gt;&#10;&lt;p&gt;and operate &lt;strong&gt;Nextcloud&lt;/strong&gt; ☁️ and &lt;strong&gt;WordPress&lt;/strong&gt; 📝 on a&lt;/p&gt;&#10;&lt;p&gt;single-node K3s cluster running on AlmaLinux 9.&lt;/p&gt;&#10;&lt;p&gt;Everything is &lt;strong&gt;infrastructure-as-code&lt;/strong&gt;, fully &lt;em&gt;idempotent&lt;/em&gt;,&lt;/p&gt;</description></item><item><title>✅ Mission Accomplished: Migrated my Blog to a Hybrid K3s Setup!</title><link>https://www.apt-upgrade.me/2026/04/08/%E2%9C%85-mission-accomplished-migrated-my-blog-to-a-hybrid-k3s-setup/</link><pubDate>Wed, 08 Apr 2026 20:52:09 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/04/08/%E2%9C%85-mission-accomplished-migrated-my-blog-to-a-hybrid-k3s-setup/</guid><description>&lt;p&gt;Alright — today was an absolute &lt;strong&gt;banger of a day&lt;/strong&gt;! 🔥&lt;/p&gt;&#10;&lt;h3 id="what-i-got-done"&gt;What I Got Done&lt;/h3&gt;&#10;&lt;p&gt;After grinding through the last few evenings on the PC, I finally pulled it off: I successfully migrated my blog to a &lt;strong&gt;hybrid architecture&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;The setup now looks like this:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Some services are running &lt;strong&gt;natively directly on the VPS&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;The rest — especially the entire &lt;a href="https://wordpress.org/"&gt;WordPress&lt;/a&gt; application — is containerized and orchestrated with &lt;strong&gt;K3s&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="the-results-are-clean"&gt;The Results Are Clean&lt;/h3&gt;&#10;&lt;p&gt;I’m honestly stoked: Everything is running stable, all data and images have been migrated successfully, and the best part is:&lt;/p&gt;</description></item><item><title>Battery Forensics on Debian: Inspecting Your Power Stats with upower</title><link>https://www.apt-upgrade.me/2026/04/08/battery-forensics-on-debian-inspecting-your-power-stats-with-upower/</link><pubDate>Wed, 08 Apr 2026 20:26:10 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/04/08/battery-forensics-on-debian-inspecting-your-power-stats-with-upower/</guid><description>&lt;p&gt;So I’m currently selling an older Lenovo ThinkPad on eBay — and, unsurprisingly, one question keeps popping up in my inbox:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;em&gt;“What’s the remaining battery capacity?”&lt;/em&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Now, instead of guessing, hand-waving, or saying “it still lasts a few hours™”, let’s do this properly — with actual numbers, straight from the system.&lt;/p&gt;&#10;&lt;p&gt;If you&amp;rsquo;re the kind of person who thinks &lt;code&gt;/sys/class/power_supply&lt;/code&gt; is light reading before bed, then this one&amp;rsquo;s for you.&lt;/p&gt;</description></item><item><title>Pi-hole: My Nerdy Little Guardian of the Internet</title><link>https://www.apt-upgrade.me/2026/04/08/pi-hole-my-nerdy-little-guardian-of-the-internet/</link><pubDate>Wed, 08 Apr 2026 19:57:06 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/04/08/pi-hole-my-nerdy-little-guardian-of-the-internet/</guid><description>&lt;p&gt;I’m still a big fan of the Pi-hole project.&lt;/p&gt;&#10;&lt;p&gt;In my setup, Pi-hole runs 24/7 and basically acts as my personal DNS server. That means it handles all domain name resolution for my network – every single request to the internet passes through it.&lt;/p&gt;&#10;&lt;p&gt;Legitimate requests are allowed without any issues, but anything that even remotely looks like advertising, tracking, or shady telemetry gets blocked right away. Think of it as a lightweight, network-wide ad-blocker with a bit of attitude.&lt;/p&gt;</description></item><item><title>Symmetric vs. Asymmetric Encryption – A Nerd’s Practical Guide (with GnuPG, Certificates &amp; Signatures)</title><link>https://www.apt-upgrade.me/2026/04/03/symmetric-vs-asymmetric-encryption-a-nerds-practical-guide-with-gnupg-certificates-signatures/</link><pubDate>Fri, 03 Apr 2026 20:10:48 +0200</pubDate><guid>https://www.apt-upgrade.me/2026/04/03/symmetric-vs-asymmetric-encryption-a-nerds-practical-guide-with-gnupg-certificates-signatures/</guid><description>&lt;h2 id="-cryptography-in-practice"&gt;🌐 Cryptography in Practice&lt;/h2&gt;&#10;&lt;p&gt;If you use the internet, you are constantly interacting with cryptographic systems—TLS handshakes, package signatures, SSH keys—whether you notice it or not.&lt;/p&gt;&#10;&lt;div class="callout info"&gt;&lt;p&gt;&lt;strong&gt;💡 Cryptography is not just about secrecy — it's about authenticity, integrity, and trust distribution in hostile environments.&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;p&gt;At its core, modern cryptography is built on two primitives:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Symmetric encryption (shared secret)&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Asymmetric encryption (public/private key pairs)&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="-symmetric-encryption"&gt;🧠 Symmetric Encryption&lt;/h2&gt;&#10;&lt;p&gt;Symmetric cryptography uses a single secret key for both encryption and decryption. This is computationally efficient and forms the backbone of high-throughput encryption systems.&lt;/p&gt;</description></item><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>From Debian to AlmaLinux to K3s: Or How I Accidentally Built a Mini Cloud 🚀</title><link>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/</link><pubDate>Mon, 30 Mar 2026 20:02:37 +0200</pubDate><guid>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/</guid><description>&lt;p&gt;If you’ve stumbled across my previous post&lt;/p&gt;&#10;&lt;a href="https://www.apt-upgrade.me/2026/02/26/%f0%9f%a7%a0-operating-community-nextcloud-instances-with-ansible-almalinux-selinux-and-a-podman-based-collabora-stack/" target="_blank" rel="noopener"&gt; &#10;&lt;p&gt;“Operating Community Nextcloud Instances with Ansible, AlmaLinux, SELinux and a Podman-based Collabora Stack”&lt;/p&gt;&#10;&lt;p&gt;&lt;/a&gt;,&lt;/p&gt;&#10;&lt;p&gt;you already know this started as a totally reasonable idea.&lt;em&gt;(Narrator voice: It was not a totally reasonable idea.)&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="the-original-plan-leave-debian-embrace-selinux"&gt;The Original Plan™: Leave Debian, Embrace SELinux&lt;/h2&gt;&#10;&lt;p&gt;At some point I thought: “Hey, why not move from Debian to AlmaLinux?”&lt;/p&gt;&#10;&lt;p&gt;Main reason? &lt;strong&gt;SELinux&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Because nothing says “fun weekend project” like debugging security contexts at 2 AM.&lt;/p&gt;</description></item><item><title>CKAD Reality Check: Yes, You Can (and Should) Use the Kubernetes Docs Like a Weapon</title><link>https://www.apt-upgrade.me/2026/03/20/ckad-reality-check-yes-you-can-and-should-use-the-kubernetes-docs-like-a-weapon/</link><pubDate>Fri, 20 Mar 2026 11:45:48 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/03/20/ckad-reality-check-yes-you-can-and-should-use-the-kubernetes-docs-like-a-weapon/</guid><description>&lt;p&gt;I’m currently considering taking the &lt;strong&gt;CKAD (Certified Kubernetes Application Developer)&lt;/strong&gt; exam from the Linux Foundation.&lt;/p&gt;&#10;&lt;p&gt;The main reason is simple: I want to seriously strengthen my Kubernetes skills and move beyond just “I can deploy stuff”&lt;/p&gt;&#10;&lt;p&gt;into actually understanding what’s happening under the hood.&lt;/p&gt;&#10;&lt;p&gt;Kubernetes is one of those technologies where you can get things running quickly — but truly mastering it requires structure,&lt;/p&gt;&#10;&lt;p&gt;repetition, and hands-on practice under time pressure. That’s exactly what the CKAD exam is designed to test.&lt;/p&gt;</description></item><item><title>fwupd: Because Firmware Shouldn’t Require a USB Stick from 2009</title><link>https://www.apt-upgrade.me/2026/03/18/fwupd-because-firmware-shouldnt-require-a-usb-stick-from-2009/</link><pubDate>Wed, 18 Mar 2026 22:09:04 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/03/18/fwupd-because-firmware-shouldnt-require-a-usb-stick-from-2009/</guid><description>&lt;p&gt;Let’s be honest: firmware updates have historically been… a mess.&lt;/p&gt;&#10;&lt;p&gt;You download a mysterious ISO, write it to a USB stick, reboot into some arcane environment, pray to the silicon gods, and hope your machine doesn’t turn into a very expensive paperweight.&lt;/p&gt;&#10;&lt;p&gt;Enter &lt;strong&gt;fwupd&lt;/strong&gt; — the gloriously nerdy, quietly revolutionary tool that brings firmware updates into the modern Linux ecosystem.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="what-even-is-fwupd"&gt;What Even &lt;em&gt;Is&lt;/em&gt; fwupd?&lt;/h2&gt;&#10;&lt;p&gt;At its core, fwupd is a daemon and command-line utility that allows Linux systems to update firmware in a sane, standardized way.&lt;/p&gt;</description></item><item><title>Installing Longhorn on a 3-Node Homelab Cluster</title><link>https://www.apt-upgrade.me/2026/03/13/installing-longhorn-on-a-3-node-homelab-cluster/</link><pubDate>Fri, 13 Mar 2026 20:03:38 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/03/13/installing-longhorn-on-a-3-node-homelab-cluster/</guid><description>&lt;p&gt;If you’re running a small Kubernetes homelab and want &lt;strong&gt;persistent storage&lt;/strong&gt; with redundancy, &lt;strong&gt;Longhorn&lt;/strong&gt; is an excellent choice. 🚀&lt;/p&gt;&#10;&lt;p&gt;Longhorn is a lightweight, cloud-native distributed block storage system for Kubernetes. It allows you to create highly available volumes, replicate data across multiple nodes, and manage persistent volumes without relying on external storage appliances. For homelabs or edge clusters, it’s perfect because it runs entirely inside Kubernetes and is easy to manage through a web UI.&lt;/p&gt;</description></item><item><title>Automatically Verifying All RAR Archives with a Bash Script</title><link>https://www.apt-upgrade.me/2026/03/13/automatically-verifying-all-rar-archives-with-a-bash-script/</link><pubDate>Fri, 13 Mar 2026 17:43:09 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/03/13/automatically-verifying-all-rar-archives-with-a-bash-script/</guid><description>&lt;p&gt;In my &lt;strong&gt;previous article&lt;/strong&gt; I described how I reorganized several terabytes of personal data and bundled large collections of photos into &lt;strong&gt;RAR archives&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;This approach dramatically reduced the number of small files in my dataset and made backups much faster. However, once you start relying on archives for long-term storage, a new question naturally arises:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;How do you regularly verify that all archive files are still intact?&lt;/strong&gt; 🤔&lt;/p&gt;&#10;&lt;p&gt;Hard drives age, SSDs can fail, and silent corruption (&lt;em&gt;bitrot&lt;/em&gt;) is always a theoretical possibility when storing data over many years.&lt;/p&gt;</description></item><item><title>Archiving Terabytes of Personal Data – My Nerdy RAR + Bash Workflow</title><link>https://www.apt-upgrade.me/2026/03/13/archiving-terabytes-of-personal-data-my-nerdy-rar-bash-workflow/</link><pubDate>Fri, 13 Mar 2026 16:10:20 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/03/13/archiving-terabytes-of-personal-data-my-nerdy-rar-bash-workflow/</guid><description>&lt;p&gt;Over the past decades I have accumulated a few &lt;strong&gt;terabytes of personal data&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Mostly things like:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Photos&lt;/li&gt;&#10;&lt;li&gt;Music&lt;/li&gt;&#10;&lt;li&gt;Documents&lt;/li&gt;&#10;&lt;li&gt;Videos&lt;/li&gt;&#10;&lt;li&gt;Random project backups&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;For a long time everything lived in a &lt;strong&gt;single central storage location on my NAS&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;That worked fine for years… until two problems became increasingly annoying:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Backup times&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Storage requirements&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Especially when I needed to reinstall or replace the underlying operating system of my NAS,&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;restoring the full dataset could take many hours&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>My First Kubernetes Cluster in the Homelab</title><link>https://www.apt-upgrade.me/2026/03/10/my-first-kubernetes-cluster-in-the-homelab/</link><pubDate>Tue, 10 Mar 2026 20:28:27 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/03/10/my-first-kubernetes-cluster-in-the-homelab/</guid><description>&lt;p&gt;Today I set up a &lt;strong&gt;Kubernetes&lt;/strong&gt; cluster in my homelab – abbreviated &lt;strong&gt;K8s&lt;/strong&gt; 😁.&lt;/p&gt;&#10;&lt;p&gt;I&amp;rsquo;ve had some professional exposure to Kubernetes before, but I wanted to run a &lt;strong&gt;Nextcloud installation inside Kubernetes&lt;/strong&gt; for testing purposes in my homelab 🌐. Plus, I wanted to spend some personal time diving deeper into this tech 💻. Kubernetes and Docker in general are undeniably future tech 🚀. The idea of pursuing the &lt;strong&gt;CKAD (Certified Kubernetes Application Developer)&lt;/strong&gt; certification also really appeals to me, and I found this course on Udemy to get started: &lt;a href="https://www.udemy.com/course/certified-kubernetes-application-developer/?srsltid=AfmBOoqQzekUakIzABf21GSIsVlt7IKD85FBTxp5PptNzfCZtsOH4f1G" target="_blank" rel="noopener"&gt;CKAD Udemy Course&lt;/a&gt; 🎓.&lt;/p&gt;</description></item><item><title>😱 Today I Almost Threw My Entire Rack into the Trash…</title><link>https://www.apt-upgrade.me/2026/03/06/%F0%9F%98%B1-today-i-almost-threw-my-entire-rack-into-the-trash/</link><pubDate>Fri, 06 Mar 2026 13:28:59 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/03/06/%F0%9F%98%B1-today-i-almost-threw-my-entire-rack-into-the-trash/</guid><description>&lt;h2 id="-today-i-almost-threw-my-entire-rack-into-the-trash"&gt;😱 Today I Almost Threw My Entire Rack into the Trash…&lt;/h2&gt;&#10;&lt;p&gt;So, today I had one of those classic homelab panic moments. 😅 I was copying a huge dataset back onto my NAS VM, and the transfer was &lt;strong&gt;painfully slow&lt;/strong&gt;, with occasional &lt;strong&gt;timeouts and hiccups&lt;/strong&gt;. My personal, important files were even affected! At one point, I seriously considered just tossing my entire rack and servers into the trash…&lt;/p&gt;&#10;&lt;p&gt;Yesterday, everything was running smoothly, and I had some big learnings about my Proxmox cluster and ZFS setup. But today, out of nowhere, this massive slowdown hit. 🤯&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>🧠 Operating Community Nextcloud Instances with Ansible, AlmaLinux, SELinux and a Podman-based Collabora Stack</title><link>https://www.apt-upgrade.me/2026/02/26/%F0%9F%A7%A0-operating-community-nextcloud-instances-with-ansible-almalinux-selinux-and-a-podman-based-collabora-stack/</link><pubDate>Thu, 26 Feb 2026 15:27:38 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/02/26/%F0%9F%A7%A0-operating-community-nextcloud-instances-with-ansible-almalinux-selinux-and-a-podman-based-collabora-stack/</guid><description>&lt;p&gt;I currently operate multiple &lt;strong&gt;Nextcloud instances&lt;/strong&gt; for two local community organizations in a purely voluntary capacity.&lt;/p&gt;&#10;&lt;p&gt;The original motivation was twofold: &lt;strong&gt;enabling digital sovereignty&lt;/strong&gt; while turning the entire setup into a personal &lt;strong&gt;learning sandbox&lt;/strong&gt;. 🚀The initial deployments were provisioned using &lt;strong&gt;Ansible&lt;/strong&gt;. However, the automation pipeline never reached full end-to-end maturity; smaller adjustments and operational tweaks were still executed manually. 🔧Historically, each Nextcloud instance had its own dedicated playbook. While functional, this architecture revealed structural weaknesses over time — particularly when &lt;strong&gt;synchronized or centralized changes&lt;/strong&gt; across both environments became necessary. ⚙️&lt;/p&gt;</description></item><item><title>Homelab Thermals: Now With Extra Fan</title><link>https://www.apt-upgrade.me/2026/02/25/homelab-thermals-now-with-extra-fan/</link><pubDate>Wed, 25 Feb 2026 16:37:30 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/02/25/homelab-thermals-now-with-extra-fan/</guid><description>&lt;p&gt;&lt;em&gt;Because entropy is undefeated — but we can at least throw a fan at it.&lt;/em&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="-the-situation-a-rack-that-was-running-a-little-toasty"&gt;📦 The Situation: A Rack That Was Running a Little… Toasty&lt;/h2&gt;&#10;&lt;p&gt;Today I received a fresh hardware upgrade for my rack. Not a new server. Not a faster switch.&lt;/p&gt;&#10;&lt;p&gt;Something arguably more important: &lt;strong&gt;thermal sanity&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Over the past few months I’ve been slightly unsettled by the temperature development inside my cabinet —&lt;/p&gt;&#10;&lt;p&gt;especially during peak summer heat waves.&lt;/p&gt;</description></item><item><title>Today I’d like to sing a praise song to the Asus NUCs (formerly Intel NUCs) 🎶💻</title><link>https://www.apt-upgrade.me/2026/02/20/today-id-like-to-sing-a-praise-song-to-the-asus-nucs-formerly-intel-nucs-%F0%9F%8E%B6%F0%9F%92%BB/</link><pubDate>Fri, 20 Feb 2026 21:10:25 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/02/20/today-id-like-to-sing-a-praise-song-to-the-asus-nucs-formerly-intel-nucs-%F0%9F%8E%B6%F0%9F%92%BB/</guid><description>&lt;p&gt;Yes, I know — that already sounds suspiciously like something only a hardware nerd would say…&lt;/p&gt;&#10;&lt;p&gt;and you’d be absolutely right. But hear me out.&lt;/p&gt;&#10;&lt;h2 id="what-even-is-a-nuc"&gt;What even &lt;em&gt;is&lt;/em&gt; a NUC?&lt;/h2&gt;&#10;&lt;p&gt;NUCs are tiny, fast, yet power-efficient full-blown PCs — in a form factor smaller than some&lt;/p&gt;&#10;&lt;p&gt;Tupperware boxes. Seriously. You could almost mistake one for a snack container if it weren’t&lt;/p&gt;&#10;&lt;p&gt;for all the ports. 😄&lt;/p&gt;&#10;&lt;p&gt;Inside, they typically use laptop-class hardware, but not the slow, outdated kind — we’re talking&lt;/p&gt;</description></item><item><title>🤖 From ChatGPT to Claude: Adventures of a Slightly Terrified Nerd in VS Code</title><link>https://www.apt-upgrade.me/2026/02/17/%F0%9F%A4%96-from-chatgpt-to-claude-adventures-of-a-slightly-terrified-nerd-in-vs-code/</link><pubDate>Tue, 17 Feb 2026 21:24:10 +0100</pubDate><guid>https://www.apt-upgrade.me/2026/02/17/%F0%9F%A4%96-from-chatgpt-to-claude-adventures-of-a-slightly-terrified-nerd-in-vs-code/</guid><description>&lt;article style="font-family: system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif; line-height: 1.7;"&gt;&#10;&lt;header style="margin-bottom: 18px;"&gt;&lt;p style="margin: 0; color: #555;"&gt;AI coding experiments, &lt;a href="https://docs.ansible.com/"&gt;Ansible&lt;/a&gt; chaos, and that moment when the machine stares back at you… 👀&lt;/p&gt;&lt;/header&gt;&#10;&lt;hr style="border: none; border-top: 1px solid #e5e5e5; margin: 18px 0;"/&gt;&#10;&lt;section&gt;&lt;h2&gt;🧠 My AI Workflow So Far&lt;/h2&gt;&lt;p&gt;I’ve been using &lt;strong&gt;ChatGPT&lt;/strong&gt; for over a year now — pretty much daily.&lt;/p&gt;&lt;p&gt;Mostly for generating images, writing code, polishing wording, creating templates,&lt;br/&gt;&#10;and of course for researching and summarizing texts.&lt;/p&gt;&lt;p&gt;Basically: if there’s a repetitive brain task, I outsource it to silicon. 🤓💡&lt;/p&gt;&lt;/section&gt;&#10;&lt;section style="margin-top: 18px;"&gt;&lt;h2&gt;🔄 Plot Twist: Trying Claude&lt;/h2&gt;&lt;p&gt;Today, kind of by accident, I canceled ChatGPT and decided to try &lt;strong&gt;Claude&lt;/strong&gt; instead.&lt;br/&gt;&#10;I’ve read a lot about it, and from what I gather, it might actually have the edge when it comes to coding.&lt;/p&gt;&lt;p&gt;As a full-time nerd, I obviously had to test this theory immediately.&lt;br/&gt;&#10;Because reading about tools is nice — but &lt;em&gt;throwing them into production chaos&lt;/em&gt; is nicer. 😄&lt;/p&gt;&lt;/section&gt;&#10;&lt;section style="margin-top: 18px;"&gt;&lt;h2&gt;💻 VS Code + Claude Plugin = Nerd Playground&lt;/h2&gt;&lt;p&gt;I currently love working with &lt;strong&gt;Visual Studio Code&lt;/strong&gt;, so what really interested me&lt;br/&gt;&#10;was integrating Claude via a plugin.&lt;/p&gt;&lt;p&gt;And now I have this setup:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;VS Code&lt;/li&gt;&lt;li&gt;An Ansible playbook&lt;/li&gt;&lt;li&gt;8 roles&lt;/li&gt;&lt;li&gt;A chat editor directly connected to Claude&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Which basically means: the AI is now sitting right inside my dev environment.&lt;br/&gt;&#10;Not watching… totally not watching… 👀&lt;/p&gt;&lt;/section&gt;&#10;&lt;section style="margin-top: 18px;"&gt;&lt;h2&gt;🚀 The Experiment&lt;/h2&gt;&lt;p&gt;I wrote into the chat:&lt;/p&gt;&lt;blockquote style="padding: 12px; background: #f7f7f7; border-left: 4px solid #7f8c8d; border-radius: 8px;"&gt;&lt;p&gt;“Optimize my Ansible code, apply best practices…”&lt;/p&gt;&lt;/blockquote&gt;&lt;p style="font-size: 20px; font-weight: bold; color: #e74c3c;"&gt;…and BÄÄÄMM!! 💥&lt;/p&gt;&lt;p&gt;The thing has been grinding away for minutes now — finding one issue after another.&lt;br/&gt;&#10;Claude basically has full access to the Ansible codebase and is tearing through it like a senior DevOps engineer on caffeine. ☕🐧&lt;/p&gt;&lt;p&gt;Slightly terrifying. Slightly impressive. Definitely nerd-satisfying.&lt;/p&gt;&lt;/section&gt;&#10;&lt;section style="margin-top: 18px;"&gt;&lt;h2&gt;😱 Meanwhile, In My Head… (The Nerd Image Vibes)&lt;/h2&gt;&lt;p&gt;If I had to visualize this moment, it would look exactly like that image:&lt;/p&gt;&lt;p&gt;A slightly panicking nerd in a server room, sweating, clutching his laptop,&lt;br/&gt;&#10;while an evil-looking AI watches him intensely from a glowing screen.&lt;/p&gt;&lt;p&gt;And yes — he’s still wearing sunglasses. Indoors. At night. In a server room. 😎&lt;/p&gt;&lt;p&gt;Because when an AI starts reviewing your infrastructure code,&lt;br/&gt;&#10;you either:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;stay cool&lt;/li&gt;&lt;li&gt;pretend you planned everything&lt;/li&gt;&lt;li&gt;or whisper: &lt;em&gt;“Please don’t read my TODO comments…”&lt;/em&gt; 😬&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The vibe is somewhere between:&lt;br/&gt;&#10;&lt;span style="background: #fff3cd; padding: 3px 6px; border-radius: 6px;"&gt;“This is amazing”&lt;/span&gt;&lt;br/&gt;&#10;and&lt;br/&gt;&#10;&lt;span style="background: #ffe6e6; padding: 3px 6px; border-radius: 6px; color: #c0392b;"&gt;&lt;br/&gt;&#10;“Oh no… it sees everything.”&lt;br/&gt;&#10;&lt;/span&gt;&lt;/p&gt;&lt;/section&gt;&#10;&lt;section style="margin-top: 18px;"&gt;&lt;h2&gt;⏳ Letting It Cook&lt;/h2&gt;&lt;p&gt;For now, I’m just letting Claude do its thing.&lt;/p&gt;&lt;p&gt;Tomorrow I’ll go through the code, check the optimizations, and see:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;how good the improvements actually are&lt;/li&gt;&lt;li&gt;whether I still understand my own infrastructure&lt;/li&gt;&lt;li&gt;and if not… I’ll just have Claude generate documentation and explanations too 😄&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Because why panic when you can automate your understanding?&lt;/p&gt;&lt;p&gt;&lt;img alt="VS Code with Claude Code assisting on an infrastructure repository" class="alignnone size-full wp-image-947" height="1048" src="https://www.apt-upgrade.me/wp-content/uploads/2026/02/vss_code_screenshot-1.webp" width="1854"/&gt;&lt;/p&gt;&lt;/section&gt;&#10;&lt;footer style="margin-top: 24px; padding-top: 14px; border-top: 1px solid #e5e5e5; color: #555;"&gt;&lt;p style="margin: 0;"&gt;&lt;strong&gt;Nerd conclusion:&lt;/strong&gt;&lt;br/&gt;&#10;AI writes code, fixes code, explains code… and quietly judges your old code. 🤖👀&lt;/p&gt;&lt;p style="margin: 6px 0 0 0;"&gt;Next step: see whether Claude becomes my new DevOps co-pilot — or my future replacement. 😅&lt;/p&gt;&lt;/footer&gt;&#10;&lt;/article&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>Optimized Samba Configuration on Debian 13 for Linux Homelabs</title><link>https://www.apt-upgrade.me/2025/12/16/optimized-samba-configuration-on-debian-13-for-linux-homelabs/</link><pubDate>Tue, 16 Dec 2025 15:41:20 +0100</pubDate><guid>https://www.apt-upgrade.me/2025/12/16/optimized-samba-configuration-on-debian-13-for-linux-homelabs/</guid><description>&lt;p&gt;&lt;strong&gt;Samba&lt;/strong&gt; is an open-source implementation of the SMB/CIFS protocol suite and allows Linux systems&lt;/p&gt;&#10;&lt;p&gt;to share files and directories over the network in a standardized way.&lt;/p&gt;&#10;&lt;p&gt;Originally designed for interoperability with Windows systems, Samba has long since become a&lt;/p&gt;&#10;&lt;p&gt;reliable and efficient file server solution for Linux-to-Linux environments as well.&lt;/p&gt;&#10;&lt;p&gt;In homelabs and small server setups, Samba is often used to provide centralized storage,&lt;/p&gt;&#10;&lt;p&gt;simple access control, and predictable network file sharing without introducing additional&lt;/p&gt;</description></item><item><title>On Digital Sovereignty, De-Americanizing My Software Stack, and Running WhatsApp in a Sandbox</title><link>https://www.apt-upgrade.me/2025/12/14/on-digital-sovereignty-de-americanizing-my-software-stack-and-running-whatsapp-in-a-sandbox/</link><pubDate>Sun, 14 Dec 2025 20:38:05 +0100</pubDate><guid>https://www.apt-upgrade.me/2025/12/14/on-digital-sovereignty-de-americanizing-my-software-stack-and-running-whatsapp-in-a-sandbox/</guid><description>&lt;article class="post-content"&gt;&#10;&lt;section&gt;&lt;h2&gt;Why This Experiment Exists&lt;/h2&gt;&lt;p&gt;Lately, I have been revisiting an idea that has been on my mind for many years:&lt;br/&gt;&#10;&lt;strong&gt;how to gradually move away from US-centric software products&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;By now, this has turned into a personal experiment —&lt;br/&gt;&#10;&lt;em&gt;part technical challenge, part entertainment, part philosophical exercise&lt;/em&gt;.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The goal is not ideological purity, but conscious trade-offs.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;My core premise has remained unchanged over the years:&lt;br/&gt;&#10;&lt;strong&gt;minimize unnecessary data exposure&lt;/strong&gt;.&lt;br/&gt;&#10;Given the current political climate — especially developments in US politics —&lt;br/&gt;&#10;the topic of &lt;mark&gt;digital sovereignty&lt;/mark&gt; feels more relevant than ever.&lt;/p&gt;&lt;div style="border-left: 4px solid #888; padding: 0.8em 1em; background: #f7f7f7;"&gt;&lt;strong&gt;Working definition:&lt;/strong&gt;&lt;br/&gt;&#10;&lt;em&gt;Digital sovereignty&lt;/em&gt; means retaining control over software dependencies,&lt;br/&gt;&#10;data flows, and infrastructure — even if that comes at the cost of convenience.&lt;/div&gt;&#10;&lt;/section&gt;&#10;&lt;hr/&gt;&#10;&lt;section&gt;&lt;h2&gt;The Messaging Problem: Technology vs. People&lt;/h2&gt;&lt;p&gt;Several years ago, I managed to stay away from&lt;br/&gt;&#10;&lt;code&gt;WhatsApp&lt;/code&gt; for a surprisingly long time.&lt;br/&gt;&#10;From a purely technical perspective, this was trivial.&lt;/p&gt;&lt;p&gt;Alternatives like&lt;br/&gt;&#10;&lt;a href="https://signal.org" rel="noopener" target="_blank"&gt;Signal&lt;/a&gt;&lt;br/&gt;&#10;are feature-complete, cryptographically solid, and often superior by design.&lt;/p&gt;&lt;p&gt;The real obstacle was not software — it was&lt;br/&gt;&#10;&lt;strong&gt;human network effects&lt;/strong&gt;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Most non-technical users do not care about metadata collection&lt;/li&gt;&lt;li&gt;Surveillance capitalism is abstract and invisible&lt;/li&gt;&lt;li&gt;Installing “yet another app” is perceived as friction&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;As a result, WhatsApp remains the lowest common denominator for social&lt;br/&gt;&#10;communication.&lt;/p&gt;&lt;div style="background: #fff3cd; padding: 1em; border: 1px solid #ffeeba;"&gt;&lt;strong&gt;Reality check:&lt;/strong&gt;&lt;br/&gt;&#10;Quitting WhatsApp is not a technical decision — it is a social one.&lt;/div&gt;&lt;p&gt;At this point, I am not willing to accept the social cost of full abstinence.&lt;br/&gt;&#10;Too many people would become reachable only via&lt;br/&gt;&#10;&lt;code&gt;SMS&lt;/code&gt;, &lt;code&gt;phone calls&lt;/code&gt;, or &lt;code&gt;email&lt;/code&gt;.&lt;/p&gt;&lt;/section&gt;&#10;&lt;hr/&gt;&#10;&lt;section&gt;&lt;h2&gt;GrapheneOS: A Different Baseline&lt;/h2&gt;&lt;p&gt;Instead of removing WhatsApp entirely, I decided to rethink the&lt;br/&gt;&#10;&lt;strong&gt;operating system layer&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;I installed&lt;br/&gt;&#10;&lt;a href="https://grapheneos.org" rel="noopener" target="_blank"&gt;GrapheneOS&lt;/a&gt;&lt;br/&gt;&#10;on my daily driver — a &lt;strong&gt;Pixel 9&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;The installation process itself is refreshingly modern:&lt;br/&gt;&#10;a browser-based installer, excellent documentation, and a total setup time&lt;br/&gt;&#10;of roughly &lt;code&gt;20 minutes&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;While GrapheneOS is still Android under the hood, it deliberately ships&lt;br/&gt;&#10;&lt;strong&gt;without Google Play Services&lt;/strong&gt; and without requiring&lt;br/&gt;&#10;a Google account.&lt;/p&gt;&lt;div style="border-left: 4px solid #444; padding: 0.8em 1em; background: #f0f0f0;"&gt;&lt;strong&gt;Key property:&lt;/strong&gt;&lt;br/&gt;&#10;Google services are optional, sandboxed, and installed per user profile —&lt;br/&gt;&#10;not globally.&lt;/div&gt;&lt;p&gt;There is, of course, a certain irony in the fact that GrapheneOS officially&lt;br/&gt;&#10;supports only Google Pixel devices — hardware built by Google itself.&lt;/p&gt;&lt;/section&gt;&#10;&lt;hr/&gt;&#10;&lt;section&gt;&lt;h2&gt;Compartmentalization with Shelter&lt;/h2&gt;&lt;p&gt;To further isolate untrusted applications, I installed&lt;br/&gt;&#10;&lt;a href="https://f-droid.org/packages/net.typeblog.shelter/" rel="noopener" target="_blank"&gt;Shelter&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Shelter is essentially a user-friendly frontend for Android’s&lt;br/&gt;&#10;&lt;code&gt;work profile&lt;/code&gt; feature.&lt;br/&gt;&#10;It allows apps to run in a logically separate environment with strict&lt;br/&gt;&#10;boundaries.&lt;/p&gt;&lt;p&gt;I created a dedicated &lt;strong&gt;Work Profile&lt;/strong&gt; and moved WhatsApp into it.&lt;br/&gt;&#10;This turns WhatsApp into a semi-contained subsystem.&lt;/p&gt;&lt;h4&gt;What This Enables&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;Completely separate &lt;strong&gt;contacts database&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;No implicit access to my main address book&lt;/li&gt;&lt;li&gt;GPS access denied&lt;/li&gt;&lt;li&gt;Photo library access denied&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For now, location and media access are fully blocked.&lt;br/&gt;&#10;The experiment is to see how far usability can be stretched without&lt;br/&gt;&#10;completely breaking the user experience.&lt;/p&gt;&lt;/section&gt;&#10;&lt;hr/&gt;&#10;&lt;section&gt;&lt;h2&gt;Important Clarification&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;This is not about hating WhatsApp.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Quite the opposite.&lt;br/&gt;&#10;I genuinely enjoy WhatsApp, especially the&lt;br/&gt;&#10;&lt;strong&gt;Status&lt;/strong&gt; feature and its low-friction sharing model.&lt;/p&gt;&lt;p&gt;The issue is not social sharing —&lt;br/&gt;&#10;it is the &lt;em&gt;opaque backend machinery&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;US-based cloud infrastructures, unclear data flows, and the lack of&lt;br/&gt;&#10;transparency around content processing are what I am increasingly&lt;br/&gt;&#10;unwilling to accept blindly —&lt;br/&gt;&#10;especially when it comes to photos of my children.&lt;/p&gt;&lt;/section&gt;&lt;p&gt;&lt;/p&gt;&lt;hr/&gt;&#10;&lt;section&gt;&lt;h2&gt;Visual Trust Boundaries: Reading the App Drawer&lt;/h2&gt;&lt;p&gt;The screenshot above illustrates how this compartmentalization manifests itself&lt;br/&gt;&#10;in everyday usage.&lt;br/&gt;&#10;The app drawer is effectively split into two distinct trust zones.&lt;/p&gt;&lt;p&gt;In the &lt;strong&gt;upper section&lt;/strong&gt;, you can see applications that I consider&lt;br/&gt;&#10;&lt;em&gt;trusted&lt;/em&gt; and therefore run in my primary user profile without additional&lt;br/&gt;&#10;restrictions.&lt;br/&gt;&#10;These apps have either been audited to a reasonable extent, are open source, or&lt;br/&gt;&#10;are sufficiently constrained in their data access patterns.&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;lower section&lt;/strong&gt; contains applications that have been&lt;br/&gt;&#10;deliberately &lt;code&gt;crippled&lt;/code&gt; via&lt;br/&gt;&#10;&lt;a href="https://f-droid.org/packages/net.typeblog.shelter/" rel="noopener" target="_blank"&gt;Shelter&lt;/a&gt;.&lt;br/&gt;&#10;These apps run exclusively inside the Work Profile and are treated as&lt;br/&gt;&#10;&lt;strong&gt;inherently untrusted&lt;/strong&gt;.&lt;/p&gt;&lt;div style="border-left: 4px solid #b00020; padding: 0.8em 1em; background: #faf2f2;"&gt;&lt;strong&gt;Visual indicator:&lt;/strong&gt;&lt;br/&gt;&#10;Apps managed by Shelter are easy to identify.&lt;br/&gt;&#10;They are marked with a small icon depicting a&lt;br/&gt;&#10;&lt;em&gt;blindfolded head&lt;/em&gt; — a subtle but constant reminder that these applications&lt;br/&gt;&#10;are sandboxed, permission-constrained, and isolated by design.&lt;/div&gt;&lt;p&gt;This visual separation is not just cosmetic.&lt;br/&gt;&#10;It serves as a &lt;strong&gt;cognitive security cue&lt;/strong&gt;:&lt;br/&gt;&#10;a quick reminder of which apps operate within my trust boundary and which ones&lt;br/&gt;&#10;are confined to a tightly controlled execution environment.&lt;/p&gt;&lt;p&gt;Over time, this has proven surprisingly useful.&lt;br/&gt;&#10;It reinforces a mental model where applications are no longer equal peers on the&lt;br/&gt;&#10;system, but explicitly categorized based on&lt;br/&gt;&#10;&lt;code&gt;trust level&lt;/code&gt;,&lt;br/&gt;&#10;&lt;code&gt;data access&lt;/code&gt;,&lt;br/&gt;&#10;and &lt;code&gt;potential blast radius&lt;/code&gt;.&lt;/p&gt;&lt;/section&gt;&#10;&lt;section&gt;&#10;&lt;hr/&gt;&lt;h2&gt;What Comes Next&lt;/h2&gt;&lt;p&gt;This setup is still evolving.&lt;br/&gt;&#10;I will continue testing, adjusting permissions, and observing real-world&lt;br/&gt;&#10;limitations.&lt;/p&gt;&lt;p&gt;Expect follow-up posts on:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Push notifications and Google services in sandboxed profiles&lt;/li&gt;&lt;li&gt;Battery behavior of work profiles&lt;/li&gt;&lt;li&gt;Long-term usability trade-offs&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;More updates will follow.&lt;/p&gt;&lt;/section&gt;&#10;&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 to Summon an Observability Beast: Installing Icinga 2 + IcingaDB + Web + Director on Debian</title><link>https://www.apt-upgrade.me/2025/12/09/how-to-summon-an-observability-beast-installing-icinga-2-icingadb-web-director-on-debian/</link><pubDate>Tue, 09 Dec 2025 21:26:05 +0100</pubDate><guid>https://www.apt-upgrade.me/2025/12/09/how-to-summon-an-observability-beast-installing-icinga-2-icingadb-web-director-on-debian/</guid><description>&lt;p&gt;&lt;em&gt;A nerdy homelab story featuring Redis, too many databases, and not enough sleep.&lt;/em&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="-introduction"&gt;📝 Introduction&lt;/h2&gt;&#10;&lt;p&gt;Congratulations, traveler. If you’re reading this, you’ve decided to &lt;strong&gt;monitor your homelab like a responsible adult&lt;/strong&gt; instead of performing the ancient ritual of &lt;em&gt;“turn it off and on again”&lt;/em&gt;.&lt;/p&gt;&#10;&lt;p&gt;This post summarizes — at a high, meta, slightly sarcastic nerd-level — how you assemble the full modern Icinga monitoring stack on Debian:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Icinga 2&lt;/strong&gt; – the core engine&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Redis&lt;/strong&gt; – the lightning-fast event mailbox&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;IcingaDB&lt;/strong&gt; – the shiny new database backend&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;MariaDB/PostgreSQL&lt;/strong&gt; – the long-term memory crystal&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Icinga Web 2&lt;/strong&gt; – the visual scrying interface&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Icinga Director&lt;/strong&gt; – your configuration spellbook&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;To add to the epicness: today I participated in a full-day online training by &lt;strong&gt;NETWAYS from Nuremberg&lt;/strong&gt;, which continues for the next &lt;strong&gt;four days&lt;/strong&gt;. After a long day of learning, I spent the evening installing Icinga on my homelab server — successfully! Now that everything is running, I’m heading straight to bed. Even monitoring nerds need their uptime.&lt;/p&gt;</description></item><item><title>🎄✨ Lighting Up the First Advent… with an XMAS Scan! ✨🎄</title><link>https://www.apt-upgrade.me/2025/12/01/%F0%9F%8E%84%E2%9C%A8-lighting-up-the-first-advent-with-an-xmas-scan-%E2%9C%A8%F0%9F%8E%84/</link><pubDate>Mon, 01 Dec 2025 21:27:43 +0100</pubDate><guid>https://www.apt-upgrade.me/2025/12/01/%F0%9F%8E%84%E2%9C%A8-lighting-up-the-first-advent-with-an-xmas-scan-%E2%9C%A8%F0%9F%8E%84/</guid><description>&lt;p&gt;It’s the &lt;strong&gt;First Advent&lt;/strong&gt;, which means the season of warm lights, cinnamon smells, questionable sweaters, and…&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;TCP packets dressed up like Christmas trees&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Because while normal people light candles,&lt;/p&gt;&#10;&lt;p&gt;we — the blessed, overcaffeinated nerds of the internet —&lt;/p&gt;&#10;&lt;p&gt;light &lt;strong&gt;flags&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="-what-in-santas-name-is-an-xmas-scan"&gt;🎄 What in Santa’s name is an XMAS Scan?&lt;/h2&gt;&#10;&lt;p&gt;Imagine Santa gets bored, hacks into the North Pole mainframe, and decides to sneak around without making noise.&lt;/p&gt;&#10;&lt;p&gt;Instead of knocking on doors (SYN packets), he sends out little packets decorated with ALL the shiniest flags:&lt;/p&gt;</description></item><item><title>Signal vs. WhatsApp: The Ultimate Nerd Showdown — Privacy, Big Tech, Metadata, and Why Signal Feels Like Digital Freedom</title><link>https://www.apt-upgrade.me/2025/12/01/signal-vs-whatsapp-the-ultimate-nerd-showdown-privacy-big-tech-metadata-and-why-signal-feels-like-digital-freedom/</link><pubDate>Mon, 01 Dec 2025 15:08:17 +0100</pubDate><guid>https://www.apt-upgrade.me/2025/12/01/signal-vs-whatsapp-the-ultimate-nerd-showdown-privacy-big-tech-metadata-and-why-signal-feels-like-digital-freedom/</guid><description>&lt;p&gt;If you’ve spent more than five minutes in a tech forum, you’ve seen it:&lt;/p&gt;&#10;&lt;p&gt;The eternal, flaming-hot, caffeine-fueled debate of &lt;strong&gt;Signal vs. WhatsApp&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;At a glance, both apps look similar — encrypted chats, emojis, voice messages, and that one friend who sends 14 screenshots instead of explaining anything.But once you crawl under the hood (like every good nerd does at 3 AM), the differences become &lt;em&gt;huge&lt;/em&gt;. Not in encryption — ironically, they both use the &lt;strong&gt;same crypto protocol&lt;/strong&gt; — but in ownership, metadata usage, and how much of your digital soul you’re handing over.&lt;/p&gt;</description></item><item><title>Running Debian 13 “Trixie” on a Lenovo P15 Gen 2: A Nerdy Field Report</title><link>https://www.apt-upgrade.me/2025/11/25/running-debian-13-trixie-on-a-lenovo-p15-gen-2-a-nerdy-field-report/</link><pubDate>Tue, 25 Nov 2025 20:38:16 +0100</pubDate><guid>https://www.apt-upgrade.me/2025/11/25/running-debian-13-trixie-on-a-lenovo-p15-gen-2-a-nerdy-field-report/</guid><description>&lt;h2 id="-first-contact-debian-13-installation"&gt;🚀 First Contact: Debian 13 Installation&lt;/h2&gt;&#10;&lt;p&gt;Today I installed &lt;strong&gt;Debian 13 (Trixie)&lt;/strong&gt; on my trusty &lt;strong&gt;Lenovo P15 Gen 2&lt;/strong&gt;, and to my&lt;/p&gt;&#10;&lt;p&gt;pleasant surprise, the entire setup went through without a single hiccup. After the installer finished,&lt;/p&gt;&#10;&lt;p&gt;the system booted straight into a clean and crisp &lt;strong&gt;GNOME&lt;/strong&gt; environment—no drama, no missing drivers,&lt;/p&gt;&#10;&lt;p&gt;no blinking error lights. Just pure Debian goodness.&lt;/p&gt;&#10;&lt;h2 id="-nvidia-drivers-cooler-temps-or-wishful-thinking"&gt;🎮 NVIDIA Drivers: Cooler Temps or Wishful Thinking?&lt;/h2&gt;&#10;&lt;p&gt;After the base system was running, I added the official &lt;strong&gt;NVIDIA drivers&lt;/strong&gt; for the&lt;/p&gt;</description></item><item><title>Operation Dustbuster: Upgrading My Homelab Like a True Rack-Wizard</title><link>https://www.apt-upgrade.me/2025/11/21/operation-dustbuster-upgrading-my-homelab-like-a-true-rack-wizard/</link><pubDate>Fri, 21 Nov 2025 19:22:58 +0100</pubDate><guid>https://www.apt-upgrade.me/2025/11/21/operation-dustbuster-upgrading-my-homelab-like-a-true-rack-wizard/</guid><description>&lt;p&gt;Today was &lt;em&gt;maintenance day&lt;/em&gt; in my tiny datacenter—also known as “that noisy metal box in the corner that my wife calls &lt;strong&gt;the space heater&lt;/strong&gt;.” I pulled all three servers out of the rack, cracked them open, and swapped their classic HDDs for some smaller but faster SSDs. Yes, I know—storage downgrade, speed upgrade. Sometimes you gotta sacrifice terabytes to appease the speed gods.&lt;/p&gt;&#10;&lt;p&gt;But first things first: cleaning.&lt;/p&gt;&#10;&lt;p&gt;Armed with the holy tool of all DIY nerds—the hairdryer of my wife (obviously set to &lt;strong&gt;Cold Air mode&lt;/strong&gt;, I’m reckless, not stupid)—I stepped onto the terrace and blasted those server guts like I was exorcising the Dust Demons of 2024.&lt;/p&gt;</description></item><item><title>🧠 Offtopic: My Loyal Transformer Turns 20 Today – Where Simplicity and Reliability Meet the Power of Dreams.</title><link>https://www.apt-upgrade.me/2025/10/27/%F0%9F%A7%A0-offtopic-my-loyal-transformer-turns-20/</link><pubDate>Mon, 27 Oct 2025 14:03:32 +0100</pubDate><guid>https://www.apt-upgrade.me/2025/10/27/%F0%9F%A7%A0-offtopic-my-loyal-transformer-turns-20/</guid><description>&lt;h2 id="-meet-my-20-year-old-transformer"&gt;🎂 Meet My 20-Year-Old Transformer&lt;/h2&gt;&#10;&lt;p&gt;Today, my &lt;em&gt;Japanese-born, British-built&lt;/em&gt; car officially turns &lt;strong&gt;20 years old&lt;/strong&gt; — and honestly, it feels like I should throw it a birthday party with Energon cubes and cake.&lt;/p&gt;&#10;&lt;p&gt;This little Transformer-in-disguise (okay, technically it’s a Honda … now you get the slogan, right?) has proven itself to be a &lt;strong&gt;mech of unmatched reliability&lt;/strong&gt;. Over two decades, the only parts that ever failed were one lonely suspension spring and a sun visor. That’s it.&lt;/p&gt;</description></item><item><title>My Journey with the VU+ Duo 4K SE – A Linux-Powered SAT Adventure</title><link>https://www.apt-upgrade.me/2025/10/24/my-journey-with-the-vu-duo-4k-se-a-linux-powered-sat-adventure/</link><pubDate>Fri, 24 Oct 2025 21:10:25 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/10/24/my-journey-with-the-vu-duo-4k-se-a-linux-powered-sat-adventure/</guid><description>&lt;p&gt;I&amp;rsquo;ve been using a &lt;strong&gt;VU+ Duo 4K SE BT&lt;/strong&gt; with a &lt;strong&gt;DVB-S2X FBC Twin Tuner&lt;/strong&gt; for about two years now.&lt;/p&gt;&#10;&lt;h2&gt;&lt;img alt="Illustration of a Linux-powered 4K satellite receiver with its remote control" class="alignnone wp-image-855 size-medium" height="200" src="https://www.apt-upgrade.me/wp-content/uploads/2025/10/vuplus-300x200.webp" width="300"/&gt;&lt;/h2&gt;&#10;&lt;p&gt;Before that, I was a happy &lt;strong&gt;TechniSat&lt;/strong&gt; user for many years — solid, reliable hardware that just worked.&lt;/p&gt;&#10;&lt;p&gt;But eventually, a few thoughts led me to switch to something a bit more... &lt;em&gt;open-sourcey&lt;/em&gt;:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;A &lt;strong&gt;Linux-based system&lt;/strong&gt; – more flexible, open, and likely to get updates and new features for longer&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Better codec and format support&lt;/strong&gt; for my rather large movie archive (TechniSat just couldn’t keep up)&lt;/li&gt;&#10;&lt;li&gt;The ability to install a &lt;strong&gt;2.5&amp;quot; HDD or SSD&lt;/strong&gt; for TV recordings&lt;/li&gt;&#10;&lt;li&gt;An &lt;strong&gt;insane variety of plugins&lt;/strong&gt; and apps – YouTube, anyone?&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;HBBTV / media library support&lt;/strong&gt;, something my older Samsung TV lacks&lt;/li&gt;&#10;&lt;li&gt;And of course, &lt;strong&gt;SSH access&lt;/strong&gt; for transferring files and running cron jobs — because automation makes life better 😉&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;So, why not just use the built-in satellite tuner of my TV?&lt;/p&gt;</description></item><item><title>When My PV Company Crashed My Tech Dreams — Again</title><link>https://www.apt-upgrade.me/2025/10/23/when-my-pv-company-crashed-my-tech-dreams-again/</link><pubDate>Thu, 23 Oct 2025 19:55:15 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/10/23/when-my-pv-company-crashed-my-tech-dreams-again/</guid><description>&lt;p&gt;Spent some time today doing a bit of research on wallboxes. It’s probably a few years down the road before I’ll actually need one, but I wanted to get a rough idea of the cost, installation complexity, and overall hassle factor. Unfortunately, my PV company just brought me crashing back to reality.&lt;/p&gt;&#10;&lt;p&gt;So, apparently, there’s this new thing in Germany —&lt;strong&gt;the Energy Industry Act, Paragraph 14a&lt;/strong&gt;. What a mouthful! I have to hear it multiple times before it sticks in my mental cache.&lt;/p&gt;</description></item><item><title>Edward Snowden, Mario &amp; the Trial-and-Error of Real Life</title><link>https://www.apt-upgrade.me/2025/10/17/edward-snowden-mario-the-trial-and-error-of-real-life/</link><pubDate>Fri, 17 Oct 2025 16:00:47 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/10/17/edward-snowden-mario-the-trial-and-error-of-real-life/</guid><description>&lt;h2 id="-my-son-retro-gaming--the-magic-of-batocera"&gt;🎮 My Son, Retro Gaming &amp;amp; the Magic of Batocera&lt;/h2&gt;&#10;&lt;p&gt;My little son recently got into &lt;strong&gt;Super Mario Bros.&lt;/strong&gt; — and it’s both hilarious and heartwarming to see those 8-bit plumbers from the ’80s and ’90s come alive again.&lt;/p&gt;&#10;&lt;p&gt;To make that happen, I’ve been playing around with a Linux distribution called &lt;a href="https://batocera.org/" target="_blank" rel="noopener"&gt;Batocera&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;It’s plug-and-play retro nostalgia: download it, flash it onto a &lt;strong&gt;USB stick&lt;/strong&gt;, and boot your PC directly from it — no installation required.&lt;/p&gt;</description></item><item><title>PV in Outage Mode: Will Your Solar Keep the Lights On?</title><link>https://www.apt-upgrade.me/2025/10/14/pv-in-outage-mode-will-your-solar-keep-the-lights-on/</link><pubDate>Tue, 14 Oct 2025 20:21:40 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/10/14/pv-in-outage-mode-will-your-solar-keep-the-lights-on/</guid><description>&lt;h2 id="ever-wondered-what-happens-to-your-solar-system-when-the-grid-goes-down"&gt;Ever Wondered What Happens to Your Solar System When the Grid Goes Down?&lt;/h2&gt;&#10;&lt;p&gt;So, imagine this: the public power grid takes a nap. 💤&lt;/p&gt;&#10;&lt;p&gt;What happens to your fancy &lt;strong&gt;PV system&lt;/strong&gt;? Does it keep running? Can you at least drain the last few electrons from your battery if it’s charged? Or does everything just go dark like a bad sci-fi reboot?&lt;/p&gt;&#10;&lt;p&gt;In my case — and with our &lt;strong&gt;Fronius PV system&lt;/strong&gt; — the moment the grid says “bye-bye,” the inverter goes full shutdown mode.&lt;/p&gt;</description></item><item><title>Adventures in IPv6, Firewalls &amp; the “Oops-I-Forgot” Department 🚀</title><link>https://www.apt-upgrade.me/2025/08/25/adventures-in-ipv6-firewalls-the-oops-i-forgot-department-%F0%9F%9A%80/</link><pubDate>Mon, 25 Aug 2025 16:17:34 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/08/25/adventures-in-ipv6-firewalls-the-oops-i-forgot-department-%F0%9F%9A%80/</guid><description>&lt;p&gt;So, a few days ago I thought: &lt;em&gt;&amp;ldquo;Hey, let’s be cool, ditch Apache, and hop onto the Nginx hype train because... HTTP/3, baby!&amp;rdquo;&lt;/em&gt; 🎉&lt;/p&gt;&#10;&lt;p&gt;Fast-forward to today, when I decided to show off and run one of those fancy SSL / web server grading tools. You know, the nerd’s equivalent of flexing in front of a mirror. 😎&lt;/p&gt;&#10;&lt;p&gt;...and then BAM 💥: my blog was &lt;strong&gt;completely invisible over IPv6&lt;/strong&gt;. Like, gone. As if Thanos snapped half the packets away. 🫰&lt;/p&gt;</description></item><item><title>Switching to HTTP/3 – A Hands-On Upgrade for My WordPress Blog</title><link>https://www.apt-upgrade.me/2025/08/22/switching-to-http-3-a-hands-on-upgrade-for-my-wordpress-blog/</link><pubDate>Fri, 22 Aug 2025 21:54:29 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/08/22/switching-to-http-3-a-hands-on-upgrade-for-my-wordpress-blog/</guid><description>&lt;p&gt;Tonight’s TV lineup was pure garbage, so I decided to geek out with some server tinkering instead. What better way to spend the evening than diving into a protocol-level performance upgrade?&lt;/p&gt;&#10;&lt;p&gt;Today, I want to talk about something that improves performance “under the hood.” Specifically, how data is transmitted between the browser and the webserver. You might have already heard about &lt;strong&gt;HTTP/3&lt;/strong&gt; – the shiny new transport protocol that promises faster, more reliable page loads. Benchmarks suggest improvements of around &lt;em&gt;10–15% in real-world scenarios&lt;/em&gt;, especially noticeable on mobile devices.&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><item><title>Debian 13 Upgrade Adventure – With a Little Help from ChatGPT 🐧🤖</title><link>https://www.apt-upgrade.me/2025/08/20/debian-13-upgrade-adventure-with-a-little-help-from-chatgpt-%F0%9F%90%A7%F0%9F%A4%96/</link><pubDate>Wed, 20 Aug 2025 17:51:14 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/08/20/debian-13-upgrade-adventure-with-a-little-help-from-chatgpt-%F0%9F%90%A7%F0%9F%A4%96/</guid><description>&lt;p&gt;So today I did something both brilliant &lt;em&gt;and&lt;/em&gt; borderline reckless: I asked ChatGPT to whip up a &lt;strong&gt;Bash script&lt;/strong&gt; that upgrades a &lt;strong&gt;Debian 12&lt;/strong&gt; system to the fresh new &lt;strong&gt;Debian 13&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Yes, I know, trusting an AI with my beloved Linux distro is basically the sysadmin equivalent of “hold my beer.” 🍺&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="the-setup"&gt;The Setup&lt;/h2&gt;&#10;&lt;p&gt;I played it safe (well, &lt;em&gt;safe-ish&lt;/em&gt;). First, I spun up a VM, made a backup (because… duh), and then unleashed the script. To my mild surprise and great relief, it actually worked. The thing ran in &lt;strong&gt;interactive mode&lt;/strong&gt;, threw a couple of “Are you sure, human?” type questions my way (I think two or three), then rebooted the machine.&lt;/p&gt;</description></item><item><title>HP Service Pack Adventures – Booting Firmware Updates the Nerdy Way</title><link>https://www.apt-upgrade.me/2025/08/18/hp-service-pack-adventures-booting-firmware-updates-the-nerdy-way/</link><pubDate>Mon, 18 Aug 2025 11:34:52 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/08/18/hp-service-pack-adventures-booting-firmware-updates-the-nerdy-way/</guid><description>&lt;p&gt;So, today I had the great joy (and mild panic) of updating my HP servers with the &lt;strong&gt;HP Service Pack&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Okay, okay... technically it’s not the first time ever. I’ve been around that block before.&lt;/p&gt;&#10;&lt;p&gt;In the past I usually did firmware updates the &lt;em&gt;manual way&lt;/em&gt; — clicking through iLO interfaces, spending hours on documentation rabbit holes, or sometimes running the Service Pack by hand whenever there happened to be a Windows Server installed.&lt;/p&gt;</description></item><item><title>My First Python Project: A Nerdy ASCII Hangman Game</title><link>https://www.apt-upgrade.me/2025/08/15/my-first-python-project-a-nerdy-ascii-hangman-game/</link><pubDate>Fri, 15 Aug 2025 13:36:24 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/08/15/my-first-python-project-a-nerdy-ascii-hangman-game/</guid><description>&lt;p&gt;So, I’ve been dabbling in Python for a few days now — mostly theory, going over variables, loops, conditionals, and the usual suspects. And like every sane new coder, I decided my first “real” project should be something &lt;em&gt;epic&lt;/em&gt;.&lt;/p&gt;&#10;&lt;p&gt;Naturally, that meant… &lt;strong&gt;Hangman&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;It’s a perfect beginner’s challenge:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;You practice &lt;strong&gt;variables&lt;/strong&gt; by keeping track of the guessed letters and wrong attempts.&lt;/li&gt;&#10;&lt;li&gt;You use &lt;strong&gt;loops&lt;/strong&gt; for gameplay flow.&lt;/li&gt;&#10;&lt;li&gt;You sprinkle in &lt;strong&gt;conditionals&lt;/strong&gt; to decide who lives or dies (well, ASCII-wise).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;After some trial and error (and a fair bit of “Oh right, Python is case-sensitive”), I got my version working. Admittedly, I did let ChatGPT “pimp” some parts — but hey, that’s how we learn faster, right?&lt;/p&gt;</description></item><item><title>Upgrading Proxmox Like a Boss (a.k.a. “Don’t Panic”)</title><link>https://www.apt-upgrade.me/2025/08/12/upgrading-proxmox-like-a-boss-a-k-a-dont-panic/</link><pubDate>Tue, 12 Aug 2025 11:02:56 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/08/12/upgrading-proxmox-like-a-boss-a-k-a-dont-panic/</guid><description>&lt;p&gt;So, &lt;strong&gt;Debian 13&lt;/strong&gt; dropped last weekend, and of course I couldn’t resist the urge to update my &lt;em&gt;Proxmox&lt;/em&gt; server.&lt;/p&gt;&#10;&lt;p&gt;Since Proxmox is basically Debian wearing a fancy virtualization cape, it also moved from the &lt;strong&gt;8.x&lt;/strong&gt; series to the glorious &lt;strong&gt;9.x&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Yesterday, I pulled the trigger on the upgrade — and surprisingly, the universe didn’t implode.&lt;/p&gt;&#10;&lt;p&gt;But here’s the play-by-play for anyone who wants to follow in my dangerously curious footsteps.&lt;/p&gt;</description></item><item><title>How I Accidentally Became a Python Apprentice… Thanks to a Discount and Dr. Angela 😅🐍</title><link>https://www.apt-upgrade.me/2025/08/05/how-i-accidentally-became-a-python-apprentice-thanks-to-a-discount-and-dr-angela-%F0%9F%98%85%F0%9F%90%8D/</link><pubDate>Tue, 05 Aug 2025 12:44:32 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/08/05/how-i-accidentally-became-a-python-apprentice-thanks-to-a-discount-and-dr-angela-%F0%9F%98%85%F0%9F%90%8D/</guid><description>&lt;div style="border: 2px solid #ff4d4d; background-color: #fff0f0; color: #b30000; padding: 12px 16px; border-radius: 8px; margin: 1.5em 0; font-family: 'Courier New', monospace;"&gt;&lt;p&gt;&lt;strong&gt;⚠️ Heads-up, fellow human (or bot):&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This post is currently &lt;em&gt;outdated&lt;/em&gt; and due for a proper rewrite.&lt;br/&gt;&#10;Some parts may no longer be accurate, complete, or aligned with the latest tech realities.&lt;br/&gt;&#10;A fully updated and more detailed version is on the way soon™.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Read at your own nerdy risk — no warranties, no guarantees, just vibes. 🤓&lt;/p&gt;&lt;/div&gt;</description></item><item><title>The Day I Pimped My Router – Or: How I Almost Brickrolled My Whole Network</title><link>https://www.apt-upgrade.me/2025/08/04/the-day-i-pimped-my-router-or-how-i-almost-brickrolled-my-whole-network/</link><pubDate>Mon, 04 Aug 2025 16:51:33 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/08/04/the-day-i-pimped-my-router-or-how-i-almost-brickrolled-my-whole-network/</guid><description>&lt;p&gt;So today I swapped out my trusty old router – a &lt;strong&gt;Fritzbox 7590 AX&lt;/strong&gt; – and replaced it with the slightly shinier, ever-so-slightly sexier &lt;strong&gt;Fritzbox 7690&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Yes, yes, I know… &lt;em&gt;“But your 7590 isn’t even that old!”&lt;/em&gt; – well, tell that to my tech-hoarder soul. I needed a &lt;strong&gt;new toy&lt;/strong&gt;, and the old box gets to retire to my &lt;em&gt;“Apocalypse Tech Backup Shelf”&lt;/em&gt;, where all elderly but not-yet-dead devices await their second life. Usually next to a box labeled &lt;em&gt;“Cables That Might Be Useful Someday”&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Me and My Rack – A Nerdy Love Story</title><link>https://www.apt-upgrade.me/2025/08/01/me-and-my-rack-a-nerdy-love-story/</link><pubDate>Fri, 01 Aug 2025 09:08:26 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/08/01/me-and-my-rack-a-nerdy-love-story/</guid><description>&lt;p&gt;Yesterday, I spent some hours again with my lovely rack. No, not my ribs. My &lt;strong&gt;server rack&lt;/strong&gt;! 😅&lt;/p&gt;&#10;&lt;h2 id="what-i-did"&gt;What I did&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;I changed some very long LAN cables to shorter ones. The old ones were just... quick and dirty.&lt;/li&gt;&#10;&lt;li&gt;I added another switch – same model. It&amp;rsquo;s for backup and also gives me more ports. Yay!&lt;/li&gt;&#10;&lt;li&gt;I removed a metal thingy with cable holders and added a &lt;strong&gt;fan thing with 8 fans&lt;/strong&gt; to blow out hot air. Much cooler now. Literally.&lt;/li&gt;&#10;&lt;li&gt;I tied some cables together with zip ties. Because... order!&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="switch-or-not-to-switch"&gt;Switch or not to switch?&lt;/h2&gt;&#10;&lt;p&gt;I thought about buying a new switch. A fancy one from Mikrotik. It has 48 ports, Linux OS, and fans! 😍 But... it&amp;rsquo;s 3 times more expensive than my good old TP-Link switches.&lt;/p&gt;</description></item><item><title>A Geeky Discovery at the Legendary Linux Hotel</title><link>https://www.apt-upgrade.me/2025/07/28/a-geeky-discovery-at-the-legendary-linux-hotel/</link><pubDate>Mon, 28 Jul 2025 20:36:58 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/07/28/a-geeky-discovery-at-the-legendary-linux-hotel/</guid><description>&lt;p&gt;A few years back, while attending an ultra-nerdy IT training at the one and only &lt;a href="https://www.linuxhotel.de/"&gt;&lt;strong&gt;Linux-Hotel&lt;/strong&gt;&lt;/a&gt; in Essen (yes, that magical place that smells like old servers and fresh coffee), I received a gift for my kids: a curious little book titled &lt;em&gt;&amp;ldquo;ADA &amp;amp; Zangemann&amp;rdquo;&lt;/em&gt;.Fast forward to today: I just stumbled across &lt;strong&gt;the film adaptation&lt;/strong&gt; of this very story – and oh boy, it&amp;rsquo;s an absolute gem.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Watch the film in German right here:&lt;br/&gt;&#10;&lt;/strong&gt;&lt;br/&gt;&#10;&lt;a href="https://media.fsfe.org/w/aw4EHJYVBSQGHPS22xXBG2" rel="noopener" target="_blank"&gt;&lt;img alt="Preview frame of the animated film Ada &amp;amp; Zangemann by the FSFE with a play button; links to the film on media.fsfe.org" class="wp-image-1644" height="675" src="https://www.apt-upgrade.me/wp-content/uploads/2025/07/ada-zangemann-film-preview.webp" width="1200"/&gt;&lt;/a&gt;&lt;br/&gt;&#10;&lt;em&gt;▶️ Click the picture to watch the film on media.fsfe.org, the FSFE's own PeerTube instance (external site). It is no longer embedded here, so nothing loads from a third-party server until you click. Preview image: FSFE, CC BY-SA 4.0.&lt;/em&gt;&lt;br/&gt;&#10;&lt;strong&gt;&lt;br/&gt;&#10;&lt;/strong&gt;I’m sharing the film &lt;strong&gt;“Ada &amp;amp; Zangemann”&lt;/strong&gt; by the &lt;a href="https://fsfe.org" rel="noopener" target="_blank"&gt;Free Software Foundation Europe (FSFE)&lt;/a&gt;.&lt;br/&gt;&#10;This film is an &lt;strong&gt;Open Educational Resource (OER)&lt;/strong&gt; and released under the &lt;strong&gt;Creative Commons License (CC BY-SA 4.0 International)&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>🚀 Bulk-Import Users into Nextcloud via CSV + Group Assignment (Shell Edition)</title><link>https://www.apt-upgrade.me/2025/07/24/%F0%9F%9A%80-bulk-import-users-into-nextcloud-via-csv-group-assignment-shell-edition/</link><pubDate>Thu, 24 Jul 2025 15:53:14 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/07/24/%F0%9F%9A%80-bulk-import-users-into-nextcloud-via-csv-group-assignment-shell-edition/</guid><description>&lt;p&gt;So, you&amp;rsquo;re running a Nextcloud instance and want to batch-create users like a proper sysadmin? Here&amp;rsquo;s a &lt;strong&gt;pure shell-based solution&lt;/strong&gt; to create users from a CSV file, assign them to groups (even multiple ones), and feel like a boss while doing it.&lt;/p&gt;&#10;&lt;h3 id="-prerequisites"&gt;📦 Prerequisites&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;SSH access to your &lt;a href="https://nextcloud.com/"&gt;Nextcloud&lt;/a&gt; server&lt;/li&gt;&#10;&lt;li&gt;Command-line access to &lt;code&gt;occ&lt;/code&gt; (located in the root of your Nextcloud install, e.g. &lt;code&gt;/var/www/html/nextcloud&lt;/code&gt;)&lt;/li&gt;&#10;&lt;li&gt;Your CSV file ready to roll&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="-csv-file-format"&gt;📄 CSV File Format&lt;/h3&gt;&#10;&lt;p&gt;No headers, just pure data. Format:&lt;/p&gt;</description></item><item><title>🧼 Cleaning Up Filenames on Linux with &lt;code&gt;detox&lt;/code&gt; – The Tiny Tool That Saved My Backups</title><link>https://www.apt-upgrade.me/2025/07/24/%F0%9F%A7%BC-cleaning-up-filenames-on-linux-with-detox-the-tiny-tool-that-saved-my-backups/</link><pubDate>Thu, 24 Jul 2025 13:05:36 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/07/24/%F0%9F%A7%BC-cleaning-up-filenames-on-linux-with-detox-the-tiny-tool-that-saved-my-backups/</guid><description>&lt;h3 id="-when-a-backup-fails-because-of-a-filename"&gt;😤 When a Backup Fails... Because of a Filename&lt;/h3&gt;&#10;&lt;p&gt;Recently, one of my automated backups on Linux unexpectedly &lt;strong&gt;crashed mid-run&lt;/strong&gt;. No fancy error message, no graceful fallback — just a silent abort.&lt;/p&gt;&#10;&lt;p&gt;After some hardcore &lt;code&gt;grep&lt;/code&gt; and log spelunking, I found the culprit: a single file with a &lt;strong&gt;non-compliant filename&lt;/strong&gt; that the backup tool couldn’t process. Worse yet — the file had come from a &lt;strong&gt;macOS system (MacBook Air)&lt;/strong&gt;. Of course. 😅&lt;/p&gt;</description></item><item><title>🔐 Apache under AppArmor: A Clean Static Profile Setup on Debian 12</title><link>https://www.apt-upgrade.me/2025/07/15/%F0%9F%94%90-apache-under-apparmor-a-clean-static-profile-setup-on-debian-12/</link><pubDate>Tue, 15 Jul 2025 13:35:57 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/07/15/%F0%9F%94%90-apache-under-apparmor-a-clean-static-profile-setup-on-debian-12/</guid><description>&lt;div style="border: 2px solid #ff4d4d; background-color: #fff0f0; color: #b30000; padding: 12px 16px; border-radius: 8px; margin: 1.5em 0; font-family: 'Courier New', monospace;"&gt;&lt;p&gt;&lt;strong&gt;⚠️ Heads-up, fellow human (or bot):&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This post is currently &lt;em&gt;outdated&lt;/em&gt; and due for a proper rewrite.&lt;br/&gt;&#10;Some parts may no longer be accurate, complete, or aligned with the latest tech realities.&lt;br/&gt;&#10;A fully updated and more detailed version is on the way soon™.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Read at your own nerdy risk — no warranties, no guarantees, just vibes. 🤓&lt;/p&gt;&lt;/div&gt;</description></item><item><title>🚀 Moving a Grown-Up Nextcloud Instance to a Fresh Server (with Bash &amp; Ansible)</title><link>https://www.apt-upgrade.me/2025/07/15/%F0%9F%9A%80-moving-a-grown-up-nextcloud-instance-to-a-fresh-server-with-bash-ansible/</link><pubDate>Tue, 15 Jul 2025 08:58:30 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/07/15/%F0%9F%9A%80-moving-a-grown-up-nextcloud-instance-to-a-fresh-server-with-bash-ansible/</guid><description>&lt;p&gt;&lt;em&gt;(This article is the logical follow-up to the backup script described here: &lt;a href="https://www.apt-upgrade.me/2025/07/11/%f0%9f%9b%a1%ef%b8%8f-nextcloud-backup-like-a-pro-automated-with-bash/" target="_blank" rel="noopener"&gt;Nextcloud Backup Like a Pro – Automated with Bash&lt;/a&gt;. Both posts go hand in hand to complete the full migration and disaster recovery (workflow.)&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;After several years of running a trusty &lt;strong&gt;Nextcloud&lt;/strong&gt; instance — complete with countless user files, calendars, contacts, and quirky shared folders — it was time for an upgrade. The old server was showing signs of age, and a shiny new machine had been provisioned with &lt;strong&gt;Ansible&lt;/strong&gt; for a clean start.&lt;/p&gt;</description></item><item><title>🛡️ Getting ClamAV Daemon to Play Nice with Nextcloud’s Antivirus App (Like a True Nerd)</title><link>https://www.apt-upgrade.me/2025/07/13/%F0%9F%9B%A1%EF%B8%8F-getting-clamav-daemon-to-play-nice-with-nextclouds-antivirus-app-like-a-true-nerd/</link><pubDate>Sun, 13 Jul 2025 21:35:59 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/07/13/%F0%9F%9B%A1%EF%B8%8F-getting-clamav-daemon-to-play-nice-with-nextclouds-antivirus-app-like-a-true-nerd/</guid><description>&lt;p&gt;If you&amp;rsquo;re like me and want your &lt;strong&gt;Nextcloud&lt;/strong&gt; to scream the moment something shady shows up in your files, then you&amp;rsquo;re probably using the &lt;em&gt;Antivirus for Files&lt;/em&gt; app. But here&amp;rsquo;s the twist: for performance and true sysadmin joy, you don&amp;rsquo;t want &lt;code&gt;clamscan&lt;/code&gt;. You want the big guns — the &lt;strong&gt;ClamAV Daemon&lt;/strong&gt; using a local Unix socket.&lt;/p&gt;&#10;&lt;h3 id="-step-1-install-clamav-and-the-daemon"&gt;⚙️ Step 1: Install ClamAV and the Daemon&lt;/h3&gt;&#10;&lt;pre&gt;&lt;code&gt;sudo apt update&#10;sudo apt install clamav clamav-daemon -y&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;This installs the scanner and the background daemon — the dream team of file hygiene.&lt;/p&gt;</description></item><item><title>⚡ Firmware Upgrade on My Fronius Inverter — a Nerd’s Delight</title><link>https://www.apt-upgrade.me/2025/07/13/%E2%9A%A1-firmware-upgrade-on-my-fronius-inverter-a-nerds-delight/</link><pubDate>Sun, 13 Jul 2025 20:55:57 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/07/13/%E2%9A%A1-firmware-upgrade-on-my-fronius-inverter-a-nerds-delight/</guid><description>&lt;p&gt;Every now and then, even my PV setup needs a little bit of firmware love. Specifically, I&amp;rsquo;m talking about my &lt;strong&gt;Fronius inverter&lt;/strong&gt;, the hardworking core of my solar power system.&lt;/p&gt;&#10;&lt;p&gt;Luckily, initiating an upgrade is surprisingly straightforward. Just hop into the inverter&amp;rsquo;s configuration web interface, click through to the firmware section, and fire off the update — &lt;em&gt;as simple as SSHing into your homelab while sipping coffee&lt;/em&gt;.&lt;/p&gt;&#10;&lt;p&gt;This was the calm before the digital storm — the inverter was happily running its outdated firmware, blissfully unaware of the glorious upgrade about to hit. Check the screenshot below for the old version number. It’s vintage, almost retro. 😎&lt;/p&gt;</description></item><item><title>🛡️ Nextcloud Backup Like a Pro – Automated with Bash</title><link>https://www.apt-upgrade.me/2025/07/11/%F0%9F%9B%A1%EF%B8%8F-nextcloud-backup-like-a-pro-automated-with-bash/</link><pubDate>Fri, 11 Jul 2025 21:30:24 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/07/11/%F0%9F%9B%A1%EF%B8%8F-nextcloud-backup-like-a-pro-automated-with-bash/</guid><description>&lt;p&gt;Ever wanted to backup your self-hosted &lt;strong&gt;Nextcloud&lt;/strong&gt; instance without sweating bullets? Tired of rsync-ing folders manually or risking broken databases? Buckle up, sysadmin – here’s a neat little &lt;strong&gt;Bash script&lt;/strong&gt; that does the dirty work for you. From enabling maintenance mode to syncing your external data and dumping your MySQL database – it’s all handled in a single run. 🧠&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="-what-does-this-script-do"&gt;📜 What Does This Script Do?&lt;/h2&gt;&#10;&lt;p&gt;This script performs a 6-step backup of your remote Nextcloud server:&lt;/p&gt;</description></item><item><title>🚀 Mission: FreeBSD – Or How I Rage-Quit to Debian at Warp Speed</title><link>https://www.apt-upgrade.me/2025/07/11/%F0%9F%9A%80-mission-freebsd-or-how-i-rage-quit-to-debian-at-warp-speed/</link><pubDate>Fri, 11 Jul 2025 13:09:01 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/07/11/%F0%9F%9A%80-mission-freebsd-or-how-i-rage-quit-to-debian-at-warp-speed/</guid><description>&lt;p&gt;&lt;em&gt;Last night, in a galaxy not that far away (namely, under my desk), I felt a sudden and powerful urge to finally install &lt;strong&gt;FreeBSD&lt;/strong&gt; on my tower PC.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;This idea has been haunting me for years. It creeps up on me now and then, whispering: &amp;ldquo;Ditch the Linux soup. Embrace the BSD purity.&amp;rdquo;&lt;/p&gt;&#10;&lt;p&gt;Roughly 10 to 15 years ago, I had already toyed around with FreeBSD. Back then it was already… let’s call it: &lt;code&gt;quirky but intriguing&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>🛡️🧙‍♂️ Deploying Nextcloud: My Ansible Quest for Ultimate Automation ⚔️☁️</title><link>https://www.apt-upgrade.me/2025/07/08/%F0%9F%9B%A1%EF%B8%8F%F0%9F%A7%99%E2%99%82%EF%B8%8F-deploying-nextcloud-my-ansible-quest-for-ultimate-automation-%E2%9A%94%EF%B8%8F%E2%98%81%EF%B8%8F/</link><pubDate>Tue, 08 Jul 2025 20:07:17 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/07/08/%F0%9F%9B%A1%EF%B8%8F%F0%9F%A7%99%E2%99%82%EF%B8%8F-deploying-nextcloud-my-ansible-quest-for-ultimate-automation-%E2%9A%94%EF%B8%8F%E2%98%81%EF%B8%8F/</guid><description>&lt;div style="border: 2px solid #ff4d4d; background-color: #fff0f0; color: #b30000; padding: 12px 16px; border-radius: 8px; margin: 1.5em 0; font-family: 'Courier New', monospace;"&gt;&lt;p&gt;&lt;strong&gt;⚠️ Heads-up, fellow human (or bot):&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This post is currently &lt;em&gt;outdated&lt;/em&gt; and due for a proper rewrite.&lt;br/&gt;&#10;Some parts may no longer be accurate, complete, or aligned with the latest tech realities.&lt;br/&gt;&#10;A fully updated and more detailed version is on the way soon™.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Read at your own nerdy risk — no warranties, no guarantees, just vibes. 🤓&lt;/p&gt;&lt;/div&gt;</description></item><item><title>Fungus Gnats vs. Data Center – Why Tiny Flies Love My Server Rack LEDs!</title><link>https://www.apt-upgrade.me/2025/07/07/fungus-gnats-vs-data-center-why-tiny-flies-love-my-server-rack-leds/</link><pubDate>Mon, 07 Jul 2025 21:04:19 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/07/07/fungus-gnats-vs-data-center-why-tiny-flies-love-my-server-rack-leds/</guid><description>&lt;p&gt;My wife and I are &lt;strong&gt;total houseplant nerds&lt;/strong&gt;. We love having a jungle in the living room, but there’s a dark side: &lt;em&gt;fungus gnats&lt;/em&gt;. These tiny little bugs seem to show up every time we repot something—probably thanks to contaminated soil.&lt;/p&gt;&#10;&lt;p&gt;But wait, it gets geekier. I’ve noticed that somehow these gnats manage to infiltrate my &lt;strong&gt;insect-proofed&lt;/strong&gt; server rack, squeezing through the perforated door. And what’s their endgame? The alluring glow of server and switch LEDs. (Apparently, blinky lights are irresistible—not just for sysadmins.)&lt;/p&gt;</description></item><item><title>Why I Never Wanted to Write *Yet Another* “Why Linux” Article — But Did It Anyway</title><link>https://www.apt-upgrade.me/2025/06/14/why-i-never-wanted-to-write-yet-another-why-linux-article-but-did-it-anyway/</link><pubDate>Sat, 14 Jun 2025 13:20:21 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/06/14/why-i-never-wanted-to-write-yet-another-why-linux-article-but-did-it-anyway/</guid><description>&lt;p&gt;&lt;strong&gt;Let’s get one thing out of the way:&lt;/strong&gt; I swore I’d never write one of those posts. You know the type — &lt;em&gt;“10 reasons Linux is better than Windows!”, “Escape the walled garden!”, “Install Arch btw!”&lt;/em&gt; We’ve all seen a thousand of them. Some are great. Most… meh. But here I am — writing one anyway.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Because I realized that even my closest friends, family, and colleagues don’t actually know what Linux is. They hear me talk about “free software” and “open source” and nod politely — but let’s be honest, it’s all a blur to most. So this post isn’t for the neckbeards. It’s for the humans.&lt;/p&gt;</description></item><item><title>Keeping It Cool: My DIY Rack Cooling Upgrade</title><link>https://www.apt-upgrade.me/2025/06/08/keeping-it-cool-my-diy-rack-cooling-upgrade/</link><pubDate>Sun, 08 Jun 2025 21:00:41 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/06/08/keeping-it-cool-my-diy-rack-cooling-upgrade/</guid><description>&lt;h3 id="-more-gear-more-heat"&gt;🔧 More Gear, More Heat&lt;/h3&gt;&#10;&lt;p&gt;Over the past few months, I kept adding new components to my rack setup.&lt;br&gt;&#10;But here&amp;rsquo;s the catch: my rack doesn’t have any active cooling.&lt;/p&gt;&#10;&lt;p&gt;When I first bought it, I honestly had no clue how packed it would become someday. At the time, airflow was a nice-to-have — now, it’s critical.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="-thinking-about-temperature"&gt;🌡️ Thinking About Temperature&lt;/h3&gt;&#10;&lt;p&gt;Recently, I took a closer look at how hot things get inside the rack.&lt;br&gt;&#10;Sure, some components have active cooling — but not all.&lt;/p&gt;</description></item><item><title>Our Solar Year: From Zero to Megawatt-Hero</title><link>https://www.apt-upgrade.me/2025/06/07/our-solar-year/</link><pubDate>Sat, 07 Jun 2025 20:33:21 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/06/07/our-solar-year/</guid><description>&lt;p&gt;About a year ago, I flipped the switch on my photovoltaic system. Now, twelve months later, I can say:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;👉 Smartest decision I’ve made — and the most satisfying system upgrade I’ve ever installed.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;The system runs smoothly, reliably delivers clean power, and completely changed how I think about energy.&lt;/p&gt;&#10;&lt;p&gt;Of course, it also takes a bit of discipline — knowing when to run certain appliances to make the most of your solar yield.&lt;/p&gt;</description></item><item><title>How I Back Up My Mom’s PC Over VPN — Without the Cloud (or Headaches)</title><link>https://www.apt-upgrade.me/2025/06/05/how-i-back-up-my-moms-pc-over-vpn-without-the-cloud-or-headaches/</link><pubDate>Thu, 05 Jun 2025 21:06:23 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/06/05/how-i-back-up-my-moms-pc-over-vpn-without-the-cloud-or-headaches/</guid><description>&lt;p&gt;Let’s be honest: keeping family members’ devices backed up is something many of us in tech &lt;em&gt;mean&lt;/em&gt; to do — but often don’t. Between the complexity of cloud solutions, the privacy concerns, and the general “if it ain’t broken, don’t touch it” mentality, it’s easy to postpone.&lt;/p&gt;&#10;&lt;p&gt;I finally decided to set up a &lt;strong&gt;simple, reliable, and fully automated backup solution&lt;/strong&gt; for my mother’s PC. Since she lives in a different city, remote access and automation were essential from the beginning. The requirements were clear:&lt;/p&gt;</description></item><item><title>Patch Me If You Can: Keeping Debian VMs Updated with Ansible (Without Losing My Weekend)</title><link>https://www.apt-upgrade.me/2025/05/28/patch-me-if-you-can-keeping-debian-vms-updated-with-ansible/</link><pubDate>Wed, 28 May 2025 09:09:17 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/05/28/patch-me-if-you-can-keeping-debian-vms-updated-with-ansible/</guid><description>&lt;p&gt;I have around 12 Debian-based VMs running in my homelab. A while ago, I used to update them all manually — one by one. SSH into each machine, run &lt;code&gt;apt update &amp;amp;&amp;amp; apt upgrade&lt;/code&gt;, wait, reboot if needed... then repeat. It worked, but it was slow, boring, and very easy to forget one or two machines.&lt;/p&gt;&#10;&lt;p&gt;Now I use &lt;strong&gt;Ansible&lt;/strong&gt; to handle everything for me. I wrote a simple playbook, and with &lt;strong&gt;just one command&lt;/strong&gt;, all my VMs update &lt;strong&gt;in parallel&lt;/strong&gt;. If any of them need a reboot, &lt;a href="https://docs.ansible.com/"&gt;Ansible&lt;/a&gt; checks for that and takes care of it too. I just run the playbook and let the automation do the heavy lifting.&lt;/p&gt;</description></item><item><title>📡 Shipping Logs Like a Pro: Fluent Bit Meets Ansible in My Homelab</title><link>https://www.apt-upgrade.me/2025/05/26/%F0%9F%93%A1-shipping-logs-like-a-pro-fluent-bit-meets-ansible-in-my-homelab/</link><pubDate>Mon, 26 May 2025 13:01:05 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/05/26/%F0%9F%93%A1-shipping-logs-like-a-pro-fluent-bit-meets-ansible-in-my-homelab/</guid><description>&lt;p&gt;By now, my little homelab has grown into a small but mighty fleet of virtual machines — almost a dozen of them are humming along nicely. But with more services come more logs… and more chaos. 🌀&lt;/p&gt;&#10;&lt;p&gt;To bring order to that chaos, I&amp;rsquo;m using the open-source log shipper &lt;strong&gt;Fluent Bit&lt;/strong&gt; to collect logs from all my VMs and forward them to a centralized &lt;strong&gt;OpenSearch&lt;/strong&gt; instance for analysis and visualization.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;The goal?&lt;/strong&gt; &lt;em&gt;Collect everything&lt;/em&gt; — from disk space warnings, failed login attempts, and systemd noise to juicy kernel messages. All logs across all my machines should end up neatly indexed and searchable in a single OpenSearch dashboard.&lt;/p&gt;</description></item><item><title>🧩 Jellyfin – FOSS Media Server That Plays by Your Rules</title><link>https://www.apt-upgrade.me/2025/05/25/jellyfin_foss_media_server_that_plays_by_your_rules/</link><pubDate>Sun, 25 May 2025 14:54:59 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/05/25/jellyfin_foss_media_server_that_plays_by_your_rules/</guid><description>&lt;p&gt;I&amp;rsquo;ve been playing around with &lt;strong&gt;Jellyfin&lt;/strong&gt; on my NAS for a few days now, and honestly, I’m pretty happy with it so far.&lt;/p&gt;&#10;&lt;p&gt;It’s free, open-source, and does a solid job of bringing some order to my chaotic video collection.&lt;/p&gt;&#10;&lt;p&gt;Compared to the good old file explorer method, one feature I &lt;em&gt;really&lt;/em&gt; appreciate is that it remembers where I left off watching — total game changer for serial procrastinators like me 😄&lt;/p&gt;</description></item><item><title>🛡️ Locking Down Your USB Drive on Linux – the Geek Way</title><link>https://www.apt-upgrade.me/2025/05/23/locking_down_your_usb_drive_on_linux/</link><pubDate>Fri, 23 May 2025 20:06:46 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/05/23/locking_down_your_usb_drive_on_linux/</guid><description>&lt;p&gt;So I’ve decided to stash an &lt;strong&gt;external USB drive&lt;/strong&gt; — fully encrypted with &lt;strong&gt;AES-256&lt;/strong&gt; — at a family member’s or friend’s place, just to have an offsite backup of all my data (you know, in case the mothership crashes).&lt;/p&gt;&#10;&lt;p&gt;Here’s the plan and step-by-step guide (courtesy of ChatGPT):&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h3 id="-how-to-encrypt-an-external-usb-drive-on-linux-using-luks"&gt;🔐 How to Encrypt an External USB Drive on Linux Using LUKS&lt;/h3&gt;&#10;&lt;p&gt;If you&amp;rsquo;re rolling with Linux, &lt;strong&gt;LUKS&lt;/strong&gt; (Linux Unified Key Setup) is your go-to for strong disk encryption. It works with &lt;strong&gt;cryptsetup&lt;/strong&gt; and is rock solid for locking down your data.&lt;/p&gt;</description></item><item><title>Pi-hole installed. Ads: terminated.</title><link>https://www.apt-upgrade.me/2025/05/22/pi-hole-installed_ads_terminated/</link><pubDate>Thu, 22 May 2025 18:08:48 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/05/22/pi-hole-installed_ads_terminated/</guid><description>&lt;h2 id="-pi-hole--the-dns-guardian-of-your-network"&gt;🧙 Pi-hole – The DNS Guardian of Your Network&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Pi-hole is like the Gandalf of your network&lt;/strong&gt; — standing at the gateway shouting:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;“You shall not pass!”&lt;/strong&gt; …to ads and trackers, that is.&lt;/p&gt;&#10;&lt;p&gt;It’s a &lt;strong&gt;network-wide ad blocker&lt;/strong&gt; acting as your &lt;strong&gt;local DNS server&lt;/strong&gt;, and it’s here to make the internet a cleaner, faster, and more private place — one DNS query at a time.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="-how-pi-hole-works"&gt;🧠 How Pi-hole Works&lt;/h2&gt;&#10;&lt;h3 id="dns-filtering--the-first-line-of-defense"&gt;DNS Filtering – The First Line of Defense&lt;/h3&gt;&#10;&lt;p&gt;Whenever you visit a website, your device asks:&lt;/p&gt;</description></item><item><title>iptables, Protectli &amp; Paranoia: Basic Segmentation for the Home Lab</title><link>https://www.apt-upgrade.me/2025/05/21/basic_segmentattion_for_the_home_lab/</link><pubDate>Wed, 21 May 2025 08:44:43 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/05/21/basic_segmentattion_for_the_home_lab/</guid><description>&lt;p&gt;At home, in my &lt;strong&gt;homelab&lt;/strong&gt;, I run multiple internal networks.&lt;br&gt;&#10;There’s one for trusted client devices, and another that’s less trusted — kind of like a &lt;strong&gt;DMZ&lt;/strong&gt;. The DMZ hosts those VMs that need to be reachable from the internet at the network level.&lt;/p&gt;&#10;&lt;p&gt;The main goal is to safeguard the internal network and limit blast radius in case a box inside the untrusted DMZ gets popped.&lt;/p&gt;&#10;&lt;p&gt;Both networks are connected directly to my servers.&lt;/p&gt;</description></item><item><title>2 Years Deep into the Google Pixel 6 x GrapheneOS Life</title><link>https://www.apt-upgrade.me/2025/05/20/2_years_deep_google_pixel_grapheneos/</link><pubDate>Tue, 20 May 2025 18:04:24 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/05/20/2_years_deep_google_pixel_grapheneos/</guid><description>&lt;p&gt;So, I’ve been rocking a &lt;strong&gt;Google Pixel 6&lt;/strong&gt; for about two years now — but not with stock Android. Nope, I flashed that sucker with &lt;strong&gt;GrapheneOS&lt;/strong&gt;, and honestly, I haven’t looked back.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;GrapheneOS&lt;/strong&gt; is a nonprofit, open-source Android-based OS that’s laser-focused on &lt;strong&gt;privacy, security&lt;/strong&gt;, and hardened apps (think: browser, PDF viewer, etc.). It’s what the cool kids call an &lt;em&gt;Android custom ROM&lt;/em&gt;, but way more hardcore about not letting Big Brother peek over your shoulder.&lt;/p&gt;</description></item><item><title>My Homelab &amp; NAS Setup – A Quick Tour</title><link>https://www.apt-upgrade.me/2025/05/16/my-homelab-nas-setup/</link><pubDate>Fri, 16 May 2025 10:42:24 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/05/16/my-homelab-nas-setup/</guid><description>&lt;p&gt;Over the last bunch of years, I’ve built up a ton of important files — mostly family photos, including some of people who sadly aren’t around anymore. Losing any of that just isn’t an option. And since we use multiple PCs, laptops, media players and more around the house — and I care a lot about regular backups — I decided to set up a central, always-on local storage system.&lt;/p&gt;</description></item><item><title>Hello World !</title><link>https://www.apt-upgrade.me/2025/05/14/hallo-welt/</link><pubDate>Wed, 14 May 2025 15:20:25 +0200</pubDate><guid>https://www.apt-upgrade.me/2025/05/14/hallo-welt/</guid><description>&lt;p&gt;&lt;strong&gt;Hi, I’m Raphael – a 47-year-old open source enthusiast from Germany.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;My digital heart beats for GNU/Linux, IT security, and all things electromobility – especially as we cruise into the post-gasoline era, one clean volt at a time.&lt;/p&gt;&#10;&lt;p&gt;I created this blog to share thoughts, tips, and the occasional bash one-liner. If you’re into nerdy stuff, terminals, or the elegance of sudo, you might just feel at home here.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Have fun exploring – and stay upgraded!&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>