<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Projects on nik4nao</title><link>https://nik4nao.com/projects/</link><description>Recent content in Projects on nik4nao</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 17 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://nik4nao.com/projects/index.xml" rel="self" type="application/rss+xml"/><item><title>Homelab Kubernetes Cluster</title><link>https://nik4nao.com/projects/homelab/</link><pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate><guid>https://nik4nao.com/projects/homelab/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;A self-hosted Kubernetes cluster running on bare-metal hardware at home. The cluster serves as a
platform for running personal services, experimenting with cloud-native tooling, and learning
operational patterns without a cloud bill.&lt;/p&gt;
&lt;h2 id="hardware"&gt;Hardware&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Host&lt;/th&gt;
 &lt;th&gt;Role&lt;/th&gt;
 &lt;th&gt;Specs&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Minisforum UM780 XTX&lt;/td&gt;
 &lt;td&gt;K3s control-plane&lt;/td&gt;
 &lt;td&gt;AMD Ryzen 7 8745H&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;HP ProDesk (nik-debian)&lt;/td&gt;
 &lt;td&gt;K3s storage agent&lt;/td&gt;
 &lt;td&gt;NFS server, mergerfs media pool&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Mac Mini M2&lt;/td&gt;
 &lt;td&gt;Standalone Docker host&lt;/td&gt;
 &lt;td&gt;ARM, outside the cluster&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="stack"&gt;Stack&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Distribution:&lt;/strong&gt; k3s&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ingress:&lt;/strong&gt; Traefik v3&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLS:&lt;/strong&gt; cert-manager — Let&amp;rsquo;s Encrypt (public) + internal CA (LAN)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auth:&lt;/strong&gt; Authentik SSO — OIDC + forwardAuth proxy, TOTP MFA enforced&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS:&lt;/strong&gt; Pihole (primary + secondary, externalIPs)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage:&lt;/strong&gt; NFS (Debian) + local-path dynamic provisioner&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI/CD:&lt;/strong&gt; Gitea Actions + act_runner, Docker buildx multiarch (amd64 + arm64)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Registry:&lt;/strong&gt; Gitea built-in container registry&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observability:&lt;/strong&gt; Prometheus + Grafana + Loki + Promtail&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IaC:&lt;/strong&gt; Ansible (host-level), Helm + raw manifests (cluster-level), all tracked in Gitea&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="highlights"&gt;Highlights&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;All cluster state is managed as code in a Gitea monorepo — single-file manifests per service, organised by concern&lt;/li&gt;
&lt;li&gt;Authentik SSO protects all web-facing services via Traefik forwardAuth; OIDC integrated with Gitea and Grafana&lt;/li&gt;
&lt;li&gt;Multi-arch image builds (amd64 + arm64) via buildx on every push to &lt;code&gt;main&lt;/code&gt;, pushed to the self-hosted registry&lt;/li&gt;
&lt;li&gt;Dual-cert TLS strategy: internal CA for &lt;code&gt;*.home.arpa&lt;/code&gt; services, Let&amp;rsquo;s Encrypt for &lt;code&gt;*.nik4nao.com&lt;/code&gt; public services&lt;/li&gt;
&lt;li&gt;Pihole running as primary + secondary with externalIPs for LAN-wide DNS and ad-blocking&lt;/li&gt;
&lt;li&gt;DDNS CronJob keeps the public A record in sync via the Porkbun API&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="running-workloads"&gt;Running Workloads&lt;/h2&gt;
&lt;p&gt;Traefik, cert-manager, Pihole, Authentik, Gitea, Prometheus, Grafana, Loki, Promtail,
Jellyfin, qBittorrent, JDownloader, Photoview, Dashy, Glances, DDNS CronJob, this portfolio site.&lt;/p&gt;</description></item></channel></rss>