<?xml version="1.0" encoding="utf-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><script src="https://www.rss.style/js/atom-style.js" xmlns="http://www.w3.org/1999/xhtml"/><title>Tower of Kubes</title><link rel="self" type="application/atom+xml" hreflang="en" href="https://www.towerofkubes.com/tags/homelab/feed.xml"/><link rel="alternate" type="text/html" hreflang="en" href="https://www.towerofkubes.com/tags/homelab/"/><link rel="alternate" type="application/rss+xml" hreflang="en" href="https://www.towerofkubes.com/tags/homelab/index.xml"/><id>/</id><updated>2026-01-25T00:00:00Z</updated><author><name>Ro'i Bandel</name></author><generator>Hugo 0.157.0</generator><entry><title>TrueNAS Removes SMART Scheduling</title><link rel="alternate" type="text/html" hreflang="en" href="https://www.towerofkubes.com/articles/truenas-removes-smart-scheduling/"/><id>https://www.towerofkubes.com/articles/truenas-removes-smart-scheduling/</id><updated>2026-01-25T00:00:00Z</updated><summary type="html">TrueNAS 25.10 (Goldeye) removed SMART Scheduling from the Web UI. This has made a lot of people very angry and has been widely regarded as a bad move.</summary><content type="html"><![CDATA[<p>I have recently learned that <a href="https://www.truenas.com/docs/scale/25.10/gettingstarted/versionnotes/"  target="_blank" rel="noreferrer">TrueNAS 25.10 (Goldeye)</a> removed SMART Scheduling from the Web UI:</p>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p><strong>SMART Monitoring:</strong></p>
<ul>
<li>25.10 removes the built-in SMART test scheduling and monitoring interface to improve user flexibility for disk monitoring. The smartmontools binaries remain installed and continue to be used internally by TrueNAS, ensuring that existing third-party scripts and monitoring tools continue to work unchanged. Users seeking advanced SMART monitoring can install the “Scrutiny” app from the TrueNAS catalog, which offers superior disk health tracking with historical data storage, customizable alerts, and automatic drive detection. TrueNAS maintains monitoring of critical disk health indicators and automatically migrates existing scheduled SMART tests to cron tasks during upgrade.
See <a href="https://www.truenas.com/docs/scale/25.10/gettingstarted/versionnotes/#disk-management"  target="_blank" rel="noreferrer">Disk Management</a> for more information on disk health monitoring in 25.10 and beyond.</li>
</ul>
      </div>
    </div><ul>
<li><a href="https://www.truenas.com/docs/scale/25.10/gettingstarted/versionnotes/"  target="_blank" rel="noreferrer">25.10 (Goldeye) Version Notes | TrueNAS Documentation Hub</a></li>
</ul>
<p>This is a baffling change. TrueNAS is a <strong>NAS</strong> (Network Attached Storage) operating system. Data integrity is important for NAS users, it is important enough that TrueNAS has a “Data Protection” tab (which was where SMART tests used to be scheduled, before that section was removed in the 25.10 update).</p>
<p>SMART tests have their flaws, even so they can be very valuable and were used by many TrueNAS users, including me! One of the reasons I liked using TrueNAS was how easy it was to schedule SMART tests and ZFS scrub tasks.</p>

<h2 class="relative group">What Are SMART Tests?
    <div id="what-are-smart-tests" class="anchor"></div>
    
</h2>
<p>SMART (Self-Monitoring, Analysis and Reporting Technology) is the drive’s built-in health reporting. It exposes <strong>attributes</strong> (error counters, temps, reallocated/pending sectors, etc.) and can run <strong>self-tests</strong> on demand.</p>
<p>The two tests most people schedule are:</p>
<ul>
<li><strong>Short test</strong>: quick sanity check.</li>
<li><strong>Long/extended test</strong>: full surface scan that can take hours (and may impact performance while running).</li>
</ul>
<p>SMART tests don’t replace <strong>ZFS scrubs</strong> (scrubs verify data end-to-end), but they’re still useful as an early warning system for drives that are slowly going bad.</p>

<h2 class="relative group">What Exactly Did TrueNAS Remove?
    <div id="what-exactly-did-truenas-remove" class="anchor"></div>
    
</h2>
<p>Technically, iXsystems did not remove any SMART functionality from the system, only a UI section. SMART tests can still be scheduled using cron, though it is more cumbersome. For such a critical task, I appreciate having a UI that explains when tests are scheduled and makes it easy to schedule them at different times.</p>
<p>Indeed, the SMART UI in TrueNAS was never great. For as much as I avoid using TrueNAS apps (for reasons such as TrueNAS having broken every single app in the past when they moved from Kubernetes to Docker), the one app I always install is <a href="https://github.com/AnalogJ/scrutiny"  target="_blank" rel="noreferrer">Scrutiny</a>. It explains the SMART results better than any other app that I have found. Nevertheless, I take issue with the recommendation to use it as if it’s an alternative (“Users seeking advanced SMART monitoring can install the “Scrutiny” app from the TrueNAS catalog, which offers superior disk health tracking with historical data storage, customizable alerts, and automatic drive detection”). Scrutiny is great at displaying SMART results, however it <em>does not</em> schedule the tests itself. <a href="https://github.com/AnalogJ/scrutiny/issues/506#issuecomment-1688484758"  target="_blank" rel="noreferrer">Scrutiny is also seeking new maintainers</a>. What would’ve been nice was if instead of just pointing users to a third-party app, iXsystems would have stepped up and contributed to Scrutiny, acknowledging the things it does better than TrueNAS itself while also working to bring a better SMART UI to TrueNAS. Notably, iXsystems have contributed back to OpenZFS.</p>

<h2 class="relative group">How Did the TrueNAS Community Respond?
    <div id="how-did-the-truenas-community-respond" class="anchor"></div>
    
</h2>
<p>What was perhaps more infuriating than the decision itself was the stubbornness in ignoring the community feedback that followed. A feature request to <a href="https://forums.truenas.com/t/not-accepted-bring-back-smart-scheduling-to-ui/57703"  target="_blank" rel="noreferrer">Bring back SMART scheduling to UI</a> was opened on the <a href="https://forums.truenas.com/c/features/12"  target="_blank" rel="noreferrer">Feature Requests</a> section on the TrueNAS forums, stating “Literally no one approves this change. Bring it back.”. The feature request gained <a href="https://forums.truenas.com/t/not-accepted-bring-back-smart-scheduling-to-ui/57703/54"  target="_blank" rel="noreferrer">significant traction</a>: it received 121 votes and 110 responses. In the end, after internal discussion, the feature was <a href="https://forums.truenas.com/t/not-accepted-bring-back-smart-scheduling-to-ui/57703/109"  target="_blank" rel="noreferrer">denied</a> (with explanations that many users didn’t find convincing).</p>
<p>If this doesn’t prove that iXsystems doesn’t care about community feedback, I don’t know what does. So much for TrueNAS “Community Edition”.</p>

<h2 class="relative group">Will I Keep Using TrueNAS?
    <div id="will-i-keep-using-truenas" class="anchor"></div>
    
</h2>
<p>I have been using TrueNAS for several years, since the release of TrueNAS SCALE in 2022 (which has since been renamed to TrueNAS Community Edition). I have maintained <a href="https://github.com/roib20/proxmox-scripts/tree/main/proxmox-truenas-script"  target="_blank" rel="noreferrer">scripts that help install TrueNAS on Proxmox VE</a>. To this day, TrueNAS remains a critical part of my homelab.</p>
<p>Of course there are alternatives. Before I moved to TrueNAS, I was using <a href="https://www.openmediavault.org/"  target="_blank" rel="noreferrer">OpenMediaVault</a> (OMV). I have high praise for that project, and unlike TrueNAS and Unraid, OMV is community-driven with no profit motives (<a href="https://www.openmediavault.org/donate.html"  target="_blank" rel="noreferrer">donations are accepted</a>). The main reason I moved to TrueNAS at the time was the native ZFS integration. OMV relies on a <a href="https://github.com/OpenMediaVault-Plugin-Developers/openmediavault-zfs"  target="_blank" rel="noreferrer">plugin</a> to enable ZFS. It works, but I preferred a system that’s designed to work with ZFS from the get-go (I was able to export my ZFS pool from OMV and import it into TrueNAS with no data loss).</p>
<p>These days, if I were to move away from TrueNAS, I will likely go the DIY route instead. When I think of what I use TrueNAS for, all I really need is a system that supports ZFS, NFS/SMB data shares, SMART tests and <a href="https://github.com/AnalogJ/scrutiny"  target="_blank" rel="noreferrer">Scrutiny</a>. I am currently experimenting with a NixOS installation that does all of that in one declarative configuration.</p>
<p>Nevertheless, for now I plan to stay with TrueNAS (at least until I finish examining NixOS for this purpose). I will continue using TrueNAS for the time being, ensure SMART tests are still scheduled in cron, as well as continue using Scrutiny.</p>
<p>There is value in having a curated and tested NAS distribution, even if I don’t agree with all of their decisions. I am reminded of <a href="https://youtu.be/Npu7jkJk5nM"  target="_blank" rel="noreferrer">the time that Linus Sebastian lost a petabyte of data</a>, due to having manually configured ZFS on CentOS without data scrubbing. In TrueNAS, data scrubbing is configured by default to run automatically, and at least the scheduling UI for that has not been removed.</p>
<hr>
<p><em>Featured image by <a href="https://unsplash.com/@frank041985?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Frank R</a> on <a href="https://unsplash.com/photos/black-and-silver-hard-disk-drive-SaiJ_n1TvCU?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Unsplash</a>.</em></p>
]]></content><author><name>Ro'i Bandel</name></author><category term="self-hosted" label="Self-Hosted" scheme="https://www.towerofkubes.com/tags/self-hosted/"/><category term="nas" label="Nas" scheme="https://www.towerofkubes.com/tags/nas/"/><category term="homelab" label="Homelab" scheme="https://www.towerofkubes.com/tags/homelab/"/><published>2026-01-25T00:00:00Z</published></entry><entry><title>Home Assistant on Kubernetes</title><link rel="alternate" type="text/html" hreflang="en" href="https://www.towerofkubes.com/articles/home-assistant-on-k8s/"/><id>https://www.towerofkubes.com/articles/home-assistant-on-k8s/</id><updated>2025-11-13T00:00:00Z</updated><summary type="html">Run Home Assistant on Kubernetes with the Helm chart, covering persistence, add-ons, replicas, and how it compares to Home Assistant OS for homelab smart home deployments.</summary><content type="html"><![CDATA[<p>Today I learned Home Assistant can run on K8s using this Helm Chart: <a href="https://github.com/pajikos/home-assistant-helm-chart"  target="_blank" rel="noreferrer">pajikos/home-assistant-helm-chart: Helm Chart for Home Assistant</a></p>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p>This Helm chart bootstraps a Home Assistant instance on Kubernetes, supports configurable persistence, controller types, add-ons (e.g. code-server), and is auto-updated with new Home Assistant releases.</p>
      </div>
    </div><ul>
<li><a href="https://t.me/KubeBuilders/1423"  target="_blank" rel="noreferrer">Telegram: View @KubeBuilders</a></li>
</ul>

<h2 class="relative group">My Opinion
    <div id="my-opinion" class="anchor"></div>
    
</h2>
<p>For over two years, I have been running <a href="http://home-assistant.io/"  target="_blank" rel="noreferrer">Home Assistant</a> on <a href="https://www.home-assistant.io/green/"  target="_blank" rel="noreferrer">Home Assistant Green</a>, which comes pre-installed with <a href="https://developers.home-assistant.io/docs/operating-system/"  target="_blank" rel="noreferrer">Home Assistant OS</a>.</p>
<p>The device has been working perfectly well for all of my smart home needs. Even though it is not the most cost-effective way to run Home Assistant, it is a well-designed device, fast enough for my needs and power efficient.</p>
<p>If I were buying a new dedicated device for Home Assistant today, I may have preferred to get a mini PC instead, since some mini PCs are similar in price to the HA Green but significantly more powerful (though maybe not as power efficient). However, I would still strive to run Home Assistant with <a href="https://developers.home-assistant.io/docs/operating-system/"  target="_blank" rel="noreferrer">Home Assistant OS</a>.</p>

<h3 class="relative group">Why standalone device for Home Assistant
    <div id="why-standalone-device-for-home-assistant" class="anchor"></div>
    
</h3>
<p>On recent podcast episodes of Linux Unplugged (including <a href="https://linuxunplugged.com/637"  target="_blank" rel="noreferrer">LINUX Unplugged 637: Chris’ Smart Home Disaster</a>), Chris talked about considering a move away from the Home Assistant Yellow (which is more powerful than the HA Green), perhaps towards a mini PC running multiple services (rather than just a mini PC). Chris also debated the benefits of running Home Assistant on NixOS vs Home Assistant OS. Nevertheless, I tend to agree with Chris’s long-standing stance that it’s best to give Home Assistant its own device, because of how essential it can be to a home.</p>

<h3 class="relative group">Why Home Assistant OS
    <div id="why-home-assistant-os" class="anchor"></div>
    
</h3>
<p>I run all my <em>other</em> self-hosted services in containers. Why not Home Assistant as well? The reason is that <a href="https://developers.home-assistant.io/docs/operating-system/"  target="_blank" rel="noreferrer">Home Assistant OS</a> makes everything easy. Notably, Home Assistant Container installations don’t have access to add-ons.</p>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p>Add-ons are additional standalone third-party software packages that can be installed on Home Assistant OS. <a href="https://www.home-assistant.io/getting-started/concepts-terminology/#add-ons"  target="_blank" rel="noreferrer">\[Learn more\]</a></p>
      </div>
    </div><ul>
<li><a href="https://www.home-assistant.io/installation/"  target="_blank" rel="noreferrer">Installation - Home Assistant</a></li>
</ul>
<p>Although Add-ons are really just containers, and many Home Assistant users manage to install them as separate containers, this requires elaborate configurations to make the different containers work together with Home Assistant. Even though I’ve been doing Docker Compose stacks (for example, applications that have multiple containers including a database), the moment I found out that HAOS allows one-click installation of Add-ons, I immediately gravitated towards that simplicity. Some examples of Add-ons that I use and rely on are <a href="https://www.home-assistant.io/integrations/matter/"  target="_blank" rel="noreferrer">Matter Server</a>, <a href="https://www.zigbee2mqtt.io/"  target="_blank" rel="noreferrer">Zigbee2MQTT</a> and <a href="https://www.music-assistant.io/"  target="_blank" rel="noreferrer">Music Assistant</a>.</p>
<p>Backups are also fairly simple on HAOS.</p>

<h3 class="relative group">Benefits of the Home Assistant Helm Chart
    <div id="benefits-of-the-home-assistant-helm-chart" class="anchor"></div>
    
</h3>
<p>Nevertheless, I do find the idea of this Home Assistant Helm Chart compelling. Features such as replicas and partial add-ons support make this an interesting alternative to HAOS. I may run a test deployment in my parent’s home, since that’s where my homelab cluster is.</p>
<hr>
<p><em>Featured image by <a href="https://unsplash.com/@jakubzerdzicki?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Jakub Żerdzicki</a> on <a href="https://unsplash.com/photos/a-cell-phone-is-connected-to-a-light-switch-We56jns_zLE?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Unsplash</a>.</em></p>
]]></content><author><name>Ro'i Bandel</name></author><category term="k8s" label="K8s" scheme="https://www.towerofkubes.com/tags/k8s/"/><category term="homeassistant" label="Homeassistant" scheme="https://www.towerofkubes.com/tags/homeassistant/"/><category term="homelab" label="Homelab" scheme="https://www.towerofkubes.com/tags/homelab/"/><category term="smarthome" label="Smarthome" scheme="https://www.towerofkubes.com/tags/smarthome/"/><category term="self-hosted" label="Self-Hosted" scheme="https://www.towerofkubes.com/tags/self-hosted/"/><category term="til" label="Til" scheme="https://www.towerofkubes.com/tags/til/"/><published>2025-11-13T00:00:00Z</published></entry><entry><title>Istio Gateway</title><link rel="alternate" type="text/html" hreflang="en" href="https://www.towerofkubes.com/articles/istio-gateway/"/><id>https://www.towerofkubes.com/articles/istio-gateway/</id><updated>2025-10-19T00:00:00Z</updated><summary type="html">Istio is known for its service mesh capabilities, however it can also serve as a Gateway and Ingress Controller, with support for both Ingress resources and Gateway API resources.</summary><content type="html"><![CDATA[
<h2 class="relative group">Istio as a Gateway and Ingress Controller
    <div id="istio-as-a-gateway-and-ingress-controller" class="anchor"></div>
    
</h2>
<p>Istio is known for its service mesh capabilities, however it can also serve as a Gateway and Ingress Controller, with support for both <a href="https://kubernetes.io/docs/concepts/services-networking/ingress/#the-ingress-resource"  target="_blank" rel="noreferrer">Ingress resources</a> and <a href="https://kubernetes.io/docs/concepts/services-networking/gateway/#resource-model"  target="_blank" rel="noreferrer">Gateway API resources</a>. Some view this use-case as <a href="https://www.reddit.com/r/kubernetes/comments/1m1frpy/what_are_the_advantages_of_using_istio_over_nginx/"  target="_blank" rel="noreferrer">overkill</a>. However, my own testing of using Istio exclusively as a gateway (without a service mesh) proves that it can in fact work quite well for this purpose. This is strengthened by the benchmarks done by <a href="https://blog.howardjohn.info/"  target="_blank" rel="noreferrer">Howard John</a>.</p>

<h2 class="relative group">My Rationale for using Istio
    <div id="my-rationale-for-using-istio" class="anchor"></div>
    
</h2>
<p>Here’s one potential reason I found to use Istio for ingress/gateway instead of Envoy Gateway: Coraza WAF.</p>
<p>I was previously using <a href="https://kubernetes.github.io/ingress-nginx/"  target="_blank" rel="noreferrer">ingress-nginx</a> which has easy-to-enable <a href="https://kubernetes.github.io/ingress-nginx/user-guide/third-party-addons/modsecurity/"  target="_blank" rel="noreferrer">support for ModSecurity</a> and OWASP CRS (Core Rule Set). Since <a href="https://kubernetes.github.io/ingress-nginx/"  target="_blank" rel="noreferrer">ingress-nginx</a> is planned to eventually be replaced with <a href="https://github.com/kubernetes-sigs/ingate"  target="_blank" rel="noreferrer">InGate</a>, I decided to look at the currently available Gateway API implementations and what WAF (Web Application Firewall) support they have. I found out that the more modern alternative to ModSecurity is <a href="https://coraza.io/"  target="_blank" rel="noreferrer">OWASP Coraza WAF</a>. From my research it seems to be able to use Coraza with Envoy Gateway you have to use Tetrate Enterprise Gateway.</p>
<p>However, upon further research I found this OpenShift guide: <a href="https://www.redhat.com/en/blog/creating-web-application-firewall-red-hat-openshift"  target="_blank" rel="noreferrer">Creating a Web Application Firewall in Red Hat OpenShift</a>. This guide uses <a href="https://github.com/corazawaf/coraza-proxy-wasm"  target="_blank" rel="noreferrer">Coraza Proxy WASM</a> with Istio. Istio seems to be required in order to be able to use the <a href="https://istio.io/latest/docs/reference/config/proxy_extensions/wasm-plugin/"  target="_blank" rel="noreferrer">WasmPlugin custom resource</a>. I believe that following this guide it should work with Istio on non-OpenShift K8s just the same.</p>

<h2 class="relative group">My Installation
    <div id="my-installation" class="anchor"></div>
    
</h2>
<p>I can confirm this works even without OpenShift! I tested this on my Talos staging cluster. Once Istio is installed and configured with the WASM Plugin for OWASP Coraza WAF, test malicious requests get blocked as expected.</p>
<p>The difficult part for me was getting Istio installed and figuring it out how to configure it as a gateway for Ingress and HTTPRoute resources. I wanted to avoid using the more advanced features of Istio (service mesh, ambient mesh etc.), at least for now. I have not used Istio before so there was a learning curve, certainly more complex than ingress-nginx. However, once I got Istio working as a gateway like I wanted, applying the WASM Plugin was relatively straightforward.</p>
<p>This is the solution that I am now using for my “homelab-as-code” Talos cluster.</p>

<h2 class="relative group">Istio Gateway Installation
    <div id="istio-gateway-installation" class="anchor"></div>
    
</h2>
<p><strong>The main resources which I followed are:</strong></p>
<ol>
<li><a href="https://istio.io/latest/docs/"  target="_blank" rel="noreferrer">Istio / Documentation</a></li>
<li><a href="https://istio.io/latest/docs/setup/install/helm/"  target="_blank" rel="noreferrer">Istio / Install with Helm</a></li>
<li><a href="https://tetrate.io/blog/istio-ingressclass-controller-with-helm"  target="_blank" rel="noreferrer">How to Install and Configure Istio Ingress with Helm</a></li>
<li><a href="https://www.redhat.com/en/blog/creating-web-application-firewall-red-hat-openshift"  target="_blank" rel="noreferrer">Creating a Web Application Firewall in Red Hat OpenShift</a></li>
</ol>
<p>I followed these resources, then adapted them for my own Argo CD GitOps structure and made them work with my existing <a href="https://github.com/adyanth/cloudflare-operator"  target="_blank" rel="noreferrer">adyanth/cloudflare-operator</a> and <a href="https://cert-manager.io/"  target="_blank" rel="noreferrer">cert-manager</a> deployments. I used some Istio custom resources to make the same Istio Gateway work with both <a href="https://kubernetes.io/docs/concepts/services-networking/ingress/#the-ingress-resource"  target="_blank" rel="noreferrer">Ingress resources</a> and <a href="https://kubernetes.io/docs/concepts/services-networking/gateway/#resource-model"  target="_blank" rel="noreferrer">Gateway API resources</a>. This essentially made Istio a drop-in replacement for my previous ingress-nginx deployment (any existing Ingress resources now use Istio as the default ingress class), with the added ability to now use Gateway API.</p>

<h2 class="relative group">Benchmarks
    <div id="benchmarks" class="anchor"></div>
    
</h2>
<p><a href="https://blog.howardjohn.info/"  target="_blank" rel="noreferrer">Howard John</a> works on Istio, so is not entirely without bias (which he admits). Nevertheless, he has created <a href="https://github.com/howardjohn/gateway-api-bench"  target="_blank" rel="noreferrer">Gateway API Benchmarks</a>, a common set of tests to evaluate a Gateway API implementation. Istio comes out quite favorably in the benchmark ("✅ No issues were found"): <a href="https://github.com/howardjohn/gateway-api-bench"  target="_blank" rel="noreferrer">howardjohn/gateway-api-bench: Gateway API Benchmarks provides a common set of tests to evaluate a Gateway API implementation</a>.</p>

    <div class="admonition tip">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><path d="M272 384c9.6-31.9 29.5-59.1 49.2-86.2c0 0 0 0 0 0c5.2-7.1 10.4-14.2 15.4-21.4c19.8-28.5 31.4-63 31.4-100.3C368 78.8 289.2 0 192 0S16 78.8 16 176c0 37.3 11.6 71.9 31.4 100.3c5 7.2 10.2 14.3 15.4 21.4c0 0 0 0 0 0c19.8 27.1 39.7 54.4 49.2 86.2l160 0zM192 512c44.2 0 80-35.8 80-80l0-16-160 0 0 16c0 44.2 35.8 80 80 80zM112 176c0 8.8-7.2 16-16 16s-16-7.2-16-16c0-61.9 50.1-112 112-112c8.8 0 16 7.2 16 16s-7.2 16-16 16c-44.2 0-80 35.8-80 80z"/></svg>
        <span><strong>UPDATE:</strong> John Howard has released <a href="https://github.com/howardjohn/gateway-api-bench/blob/main/README-v2.md"  target="_blank" rel="noreferrer">Gateway API Benchmarks - Part 2</a>. According to the new benchmarks, Istio is still among the leading Gateway API implementations; however, the new Agentgateway has better performance in the <a href="https://github.com/howardjohn/gateway-api-bench/blob/main/README-v2.md#route-scale"  target="_blank" rel="noreferrer">Route Scale</a> and <a href="https://github.com/howardjohn/gateway-api-bench/blob/main/README-v2.md#listenerset-scale"  target="_blank" rel="noreferrer">ListenerSet Scale</a> benchmarks.</span>
      </div>
    </div><hr>
<p><em>Featured image by <a href="https://unsplash.com/@sammoghadam?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Sam Moghadam</a> on <a href="https://unsplash.com/?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Unsplash</a>.</em></p>
]]></content><author><name>Ro'i Bandel</name></author><category term="istio" label="Istio" scheme="https://www.towerofkubes.com/tags/istio/"/><category term="gateway" label="Gateway" scheme="https://www.towerofkubes.com/tags/gateway/"/><category term="ingress" label="Ingress" scheme="https://www.towerofkubes.com/tags/ingress/"/><category term="homelab" label="Homelab" scheme="https://www.towerofkubes.com/tags/homelab/"/><category term="k8s" label="K8s" scheme="https://www.towerofkubes.com/tags/k8s/"/><published>2025-10-19T00:00:00Z</published></entry><entry><title>Diátaxis framework for technical documentation</title><link rel="alternate" type="text/html" hreflang="en" href="https://www.towerofkubes.com/articles/diataxis/"/><id>https://www.towerofkubes.com/articles/diataxis/</id><updated>2025-10-05T00:00:00Z</updated><summary type="html">Overview of the Diátaxis documentation framework: tutorials, how-to guides, reference, and explanation, and when to use it for clearer tech docs.</summary><content type="html"><![CDATA[<p>Today I learned about <a href="https://diataxis.fr"  target="_blank" rel="noreferrer">Diátaxis</a>, a framework for technical documentation.</p>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p>Diátaxis is a way of thinking about and doing documentation.
It prescribes approaches to content, architecture and form that emerge from a systematic approach to understanding the needs of documentation users.</p>
<p>Diátaxis identifies four distinct needs, and four corresponding forms of documentation - <em>tutorials</em>, <em>how-to guides</em>, <em>technical reference</em> and <em>explanation</em>. It places them in a systematic relationship, and proposes that documentation should itself be organised around the structures of those needs.</p>
<figure><img
    class="my-0 rounded-md"
    loading="lazy"
    decoding="async"
    fetchpriority="low"
    alt="Diátaxis"
    src="https://diataxis.fr/_images/diataxis.png"
    ></figure>
<p>Diátaxis solves problems related to documentation <em>content</em> (what to write), <em>style</em> (how to write it) and <em>architecture</em> (how to organise it).</p>
<p>As well as serving the users of documentation, Diátaxis has value for documentation creators and maintainers. It is light-weight, easy to grasp and straightforward to apply. It doesn’t impose implementation constraints. It brings an active principle of quality to documentation that helps maintainers think effectively about their own work.</p>
      </div>
    </div>
<h2 class="relative group">I Need To Write Documentation
    <div id="i-need-to-write-documentation" class="anchor"></div>
    
</h2>
<p>I’ve been thinking a lot about documentation recently, experimenting with software such as Material for MkDocs and Docusaurus. These frameworks solve the problems of <em>how</em> and <em>where</em> to write documentation (Markdown files served as a static site by one of these frameworks together with <a href="/series/static-website-hosting/" >static website hosting</a>). However, they don’t solve the much more important problem of <em>what</em> to write about. There’s an entire field of <a href="https://en.wikipedia.org/wiki/Technical_writing"  target="_blank" rel="noreferrer"><strong>technical writing</strong></a>.</p>
<p>I am now in a situation where I need to write several pieces of documentation. My client requested I create documentation for them based on what I’m working on, to both on-board new users/developers on how to work on the codebase and run pipelines, as well as two explain in-depth to any future DevOps Engineers or admins about how I set up our cloud infrastructure, repositories, custom tools and pipelines. Two pieces of documentation are needed. For the client, I will use <a href="https://www.atlassian.com/software/confluence"  target="_blank" rel="noreferrer">Confluence</a>; <a href="/articles/bitbucket-vs-the-competition/" >I am not a fan of Atlassian</a>, but the alternative for this client is to write Word documents. Confluence will do. Besides, I’m not going to setup Docusaurus for this client.</p>
<p>At the same time, I also want to write documentation for my “homelab-as-code” project and to help write documentation for <a href="https://docs.calme.win/"  target="_blank" rel="noreferrer">CALMe</a> (together with Josh, who works as a technical writer).</p>

<h2 class="relative group">Diátaxis
    <div id="diátaxis" class="anchor"></div>
    
</h2>
<p>I learned about <a href="https://diataxis.fr"  target="_blank" rel="noreferrer">Diátaxis</a> from Khue’s Homelab: <a href="https://homelab.khuedoan.com/how-to-guides/updating-documentation/"  target="_blank" rel="noreferrer">Updating documentation (this website) - Khue’s Homelab</a></p>
<p><a href="https://homelab.khuedoan.com/"  target="_blank" rel="noreferrer">Khue’s Homelab</a> is one of the most impressive homelab projects that I’ve seen. “Fully automated homelab from empty disk to running services with a single command”. It is also well documented. It uses the <a href="https://diataxis.fr"  target="_blank" rel="noreferrer">Diátaxis</a> technical documentation framework:</p>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p>There are 4 main parts:</p>
<ul>
<li><a href="https://diataxis.fr/tutorials"  target="_blank" rel="noreferrer">Getting started (tutorials)</a>: learning-oriented</li>
<li><a href="https://diataxis.fr/explanation"  target="_blank" rel="noreferrer">Concepts (explanation)</a>: understanding-oriented</li>
<li><a href="https://diataxis.fr/how-to-guides"  target="_blank" rel="noreferrer">How-to guides</a>: goal-oriented</li>
<li><a href="https://diataxis.fr/reference"  target="_blank" rel="noreferrer">Reference</a>: information-oriented</li>
</ul>
      </div>
    </div><p><strong>These four parts are the basis of Diátaxis:</strong></p>

    <div class="admonition quote">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M448 296c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72zm-256 0c0 66.3-53.7 120-120 120l-8 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l8 0c30.9 0 56-25.1 56-56l0-8-64 0c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l64 0c35.3 0 64 28.7 64 64l0 32 0 32 0 72z"/></svg>
        <span>Quote</span>
      </div>
      <div class="admonition-content">
        <p>At the core of Diátaxis are the four different kinds of documentation it identifies. If you’re encountering Diátaxis for the first time, start with these pages.</p>
<ul>
<li>
<p><a href="https://diataxis.fr/tutorials/"  target="_blank" rel="noreferrer">Tutorials</a> - learning-oriented experiences</p>
</li>
<li>
<p><a href="https://diataxis.fr/how-to-guides/"  target="_blank" rel="noreferrer">How-to guides</a> - goal-oriented directions</p>
</li>
<li>
<p><a href="https://diataxis.fr/reference/"  target="_blank" rel="noreferrer">Reference</a> - information-oriented technical description</p>
</li>
<li>
<p><a href="https://diataxis.fr/explanation/"  target="_blank" rel="noreferrer">Explanation</a> - understanding-oriented discussion</p>
</li>
</ul>
<p>Diátaxis prescribes principles that guide action. These translate into particular ways of working, with implications for documentation process and execution. Once you’ve made your first start, the tools and methods outlined here will help smooth your way.</p>
<ul>
<li>
<p><a href="https://diataxis.fr/compass/"  target="_blank" rel="noreferrer">The compass</a> - a simple tool for direction-finding</p>
</li>
<li>
<p><a href="https://diataxis.fr/how-to-use-diataxis/"  target="_blank" rel="noreferrer">Workflow</a> in Diátaxis</p>
</li>
</ul>
      </div>
    </div>
<h2 class="relative group">Should I Adopt Diátaxis?
    <div id="should-i-adopt-diátaxis" class="anchor"></div>
    
</h2>
<p>On first impressions Diátaxis looks great. Writing it may be somewhat challenging at first as I learn to structure technical writing in this way, but the results may well be worth it. I am having a hard time finding alternative documentation frameworks (though I’m sure they exist). The alternative for me to using Diátaxis would be free-flow documentation based on the topics that I think I should cover; this is how I have been writing documentation until now which does work but may end up a bit messy. Of course, Diátaxis is not perfect either and there are criticisms for it: <a href="https://www.hillelwayne.com/post/problems-with-the-4doc-model/"  target="_blank" rel="noreferrer">My Problem With the Four-Document Model</a>.</p>
<hr>
<p><em>Featured image by <a href="https://unsplash.com/@sigmund?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Sigmund</a> on <a href="https://unsplash.com/photos/a-screen-with-a-bunch-of-information-on-it-cdMAU_x9mxY?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Unsplash</a>.</em></p>
]]></content><author><name>Ro'i Bandel</name></author><category term="docs" label="Docs" scheme="https://www.towerofkubes.com/tags/docs/"/><category term="homelab" label="Homelab" scheme="https://www.towerofkubes.com/tags/homelab/"/><category term="til" label="Til" scheme="https://www.towerofkubes.com/tags/til/"/><published>2025-10-05T00:00:00Z</published></entry><entry><title>Docker User Interfaces</title><link rel="alternate" type="text/html" hreflang="en" href="https://www.towerofkubes.com/articles/docker-user-interfaces/"/><id>https://www.towerofkubes.com/articles/docker-user-interfaces/</id><updated>2025-09-17T00:00:00Z</updated><summary type="html">There are different User Interfaces that help use Docker.</summary><content type="html"><![CDATA[<p>There are different User Interfaces that help use Docker.</p>

<h2 class="relative group">Web UI
    <div id="web-ui" class="anchor"></div>
    
</h2>
<ul>
<li><a href="https://docs.portainer.io/start/install-ce"  target="_blank" rel="noreferrer"><strong>Portainer CE</strong></a></li>
<li><a href="https://komo.do/"  target="_blank" rel="noreferrer"><strong>Komodo</strong></a></li>
<li><a href="https://dockge.kuma.pet/"  target="_blank" rel="noreferrer"><strong>Dockge</strong></a></li>
<li><a href="https://dev.yacht.sh/"  target="_blank" rel="noreferrer"><strong>Yacht</strong></a></li>
<li><strong>More:</strong> <a href="https://github.com/veggiemonk/awesome-docker/blob/master/README.md#web"  target="_blank" rel="noreferrer">Web | awesome-docker</a></li>
</ul>

<h2 class="relative group">Desktop UI
    <div id="desktop-ui" class="anchor"></div>
    
</h2>
<ul>
<li><a href="https://www.docker.com/products/docker-desktop/"  target="_blank" rel="noreferrer"><strong>Docker Desktop</strong></a></li>
<li><a href="https://podman-desktop.io/"  target="_blank" rel="noreferrer"><strong>Podman Desktop</strong></a></li>
<li><a href="https://rancherdesktop.io/"  target="_blank" rel="noreferrer"><strong>Rancher Desktop by SUSE</strong></a></li>
<li><strong>More:</strong> <a href="https://github.com/veggiemonk/awesome-docker/blob/master/README.md#terminal"  target="_blank" rel="noreferrer">Desktop | awesome-docker</a></li>
</ul>

<h2 class="relative group">TUI (Terminal UI)
    <div id="tui-terminal-ui" class="anchor"></div>
    
</h2>
<ul>
<li><a href="https://www.docker.com/products/cli/"  target="_blank" rel="noreferrer"><strong>Docker CLI</strong></a></li>
<li><a href="https://github.com/jesseduffield/lazydocker"  target="_blank" rel="noreferrer"><strong>lazydocker</strong></a></li>
<li><strong>More:</strong> <a href="https://github.com/veggiemonk/awesome-docker/blob/master/README.md#terminal"  target="_blank" rel="noreferrer">Terminal | awesome-docker</a></li>
</ul>

<h2 class="relative group">My Experiences
    <div id="my-experiences" class="anchor"></div>
    
</h2>
<p>I first started using Docker with Podman CE in <a href="https://www.openmediavault.org/"  target="_blank" rel="noreferrer">openmediavault</a>. <a href="https://omv-extras.org"  target="_blank" rel="noreferrer">OMV-Extras.org</a> used to have an easy install option for Docker + Portainer CE.</p>

    <div class="admonition note">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M0 64C0 28.7 28.7 0 64 0L224 0l0 128c0 17.7 14.3 32 32 32l128 0 0 125.7-86.8 86.8c-10.3 10.3-17.5 23.1-21 37.2l-18.7 74.9c-2.3 9.2-1.8 18.8 1.3 27.5L64 512c-35.3 0-64-28.7-64-64L0 64zm384 64l-128 0L256 0 384 128zM549.8 235.7l14.4 14.4c15.6 15.6 15.6 40.9 0 56.6l-29.4 29.4-71-71 29.4-29.4c15.6-15.6 40.9-15.6 56.6 0zM311.9 417L441.1 287.8l71 71L382.9 487.9c-4.1 4.1-9.2 7-14.9 8.4l-60.1 15c-5.5 1.4-11.2-.2-15.2-4.2s-5.6-9.7-4.2-15.2l15-60.1c1.4-5.6 4.3-10.8 8.4-14.9z"/></svg>
        <span>Note</span>
      </div>
      <div class="admonition-content">
        <p>I see <a href="https://www.reddit.com/r/OpenMediaVault/comments/1btte0u/omv_7_portainer/"  target="_blank" rel="noreferrer">OMV 7 no longer has Portainer CE</a> and <a href="https://wiki.omv-extras.org/doku.php?id=omv7:docker_in_omv"  target="_blank" rel="noreferrer">the current guide</a> recommends using <a href="https://wiki.omv-extras.org/doku.php?id=omv7:omv7_plugins:docker_compose"  target="_blank" rel="noreferrer">openmediavault-compose plugin</a> instead. Of course, Portainer  can still be installed manually.</p>
      </div>
    </div><p>Initially, I was using the Portainer Web UI to deploy containers manually, until I learned about <a href="https://docs.docker.com/compose/"  target="_blank" rel="noreferrer">Docker Compose</a> and <a href="https://docs.portainer.io/user/docker/stacks"  target="_blank" rel="noreferrer">Portainer Stacks</a>. I quickly noticed that defining all the services in one file was quicker and more reproducible than manually configuring containers in Portainer. I continued using Portainer Stacks as my main form of container deployment, eventually transferring all my existing containers to stacks. I noticed that compose stacks that are deployed <em>outside</em> Portainer can be viewed but not managed by the Portainer UI, so I defaulted to deploying all Stacks through Portainer.</p>
<p>I am aware that some people don’t like Portainer for various reasons. However, it has been rock-solid for me through the years that I’ve been using it. I’ve also never found the Community Edition of Portainer to be too limiting. There are a few minor things that I don’t like about it, but I still appreciated having a UI, and even experimented with some of Portainer’s more advanced features like <a href="https://www.portainer.io/blog/portainer-agent-vs-edge-agent"  target="_blank" rel="noreferrer">Agents/Edge Agents</a> (for management of multiple nodes) and <a href="https://portainer.io/blog/gitops-with-portainer-real-world-use-cases-and-worked-examples"  target="_blank" rel="noreferrer">GitOps</a>. Eventually, I learned how to use the Docker CLI and <code>docker compose</code> commands well enough to the point that I don’t <em>need</em> the Web UI for anything, however I still like having a UI for my homelab.</p>
<p>Throughout the years, there have been many other Web UIs. I tried some of them including Yacht. Some of these UIs did not survive and got abandoned eventually (including Yacht). Portainer continued to be maintained. It’s likely the fact that <a href="https://www.portainer.io/company/about-us"  target="_blank" rel="noreferrer">Portainer is a company</a> with paid solutions helped. Interestingly, I see Portainer much more in the homelab community than in the professional world, so I don’t know how much the company is really making. Nevertheless, Portainer looks like it’s here to stay and recently went through a rebrand (<a href="https://portainer.io/blog/why-we-rebranded-portainer"  target="_blank" rel="noreferrer">Why we rebranded Portainer</a>).</p>
<p>More recently, I have heard about two newer Web UIs, Komodo and Dockge. Both look good, though part of me wonders whether they will last a long time like Portainer, or get abandoned eventually like Yacht.</p>
<p>On the Desktop UI front, I have avoided using Docker Desktop for many years. I felt like I had no need for it since I had Portainer CE working well as a Web UI, and also learned to use the Docker CLI commands. I was also concerend about the <a href="https://docs.docker.com/subscription/desktop-license/"  target="_blank" rel="noreferrer">Docker Desktop license agreement</a>. Unlike Docker CLI, Docker Desktop <strong>is not</strong> open-source.</p>
<p>I did briefly try Docker Desktop a few months ago before uninstalling it. It is useful on Windows, however I found that installing regular Docker inside WSL also works well.</p>
<p>I have also tried Podman Desktop. Unlike most of the tools in this note, Podman Desktop is not a Docker UI but instead a Podman UI. Nevertheless, Podman can run Docker containers thanks to the <a href="https://opencontainers.org/"  target="_blank" rel="noreferrer">Open Container Initiative</a>.</p>

<h2 class="relative group">My Choice
    <div id="my-choice" class="anchor"></div>
    
</h2>
<p>I’m in the process of fully moving my homelab from Docker to a Kubernetes cluster. My Kubernetes UIs of choice are <a href="https://argo-cd.readthedocs.io/"  target="_blank" rel="noreferrer">Argo CD</a> (Web UI and GitOps), <a href="https://kubernetes.io/docs/reference/kubectl/"  target="_blank" rel="noreferrer">kubectl</a> (CLI) and <a href="https://k9scli.io/"  target="_blank" rel="noreferrer">K9s</a> (TUI), though there are many others as well which I may try.</p>
<p>I still want to try Komodo some day. I imagine, if I were to ever re-engineer my homelab, but choose to go back to Docker instead of Kubernetes, I would want to have a Web UI and some type of GitOps solution. Portainer and Komodo both have GitOps support. Dockge doesn’t which rules it out for me.</p>
<hr>
<p><em>Featured image by <a href="https://unsplash.com/@ventiviews?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Venti Views</a> on <a href="https://unsplash.com/?utm_source=hugo&utm_medium=referral"  target="_blank" rel="noreferrer">Unsplash</a>.</em></p>
]]></content><author><name>Ro'i Bandel</name></author><category term="docker" label="Docker" scheme="https://www.towerofkubes.com/tags/docker/"/><category term="homelab" label="Homelab" scheme="https://www.towerofkubes.com/tags/homelab/"/><published>2025-09-17T00:00:00Z</published></entry></feed>