<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Forgejo on DevOps von UCLAB</title>
    <link>https://uclab.dev/tags/forgejo/</link>
    <description>Recent content in Forgejo on DevOps von UCLAB</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Wed, 04 Mar 2026 19:06:41 +0000</lastBuildDate>
    <atom:link href="https://uclab.dev/tags/forgejo/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Hugo Blog — Hardening the Pipeline</title>
      <link>https://uclab.dev/posts/hugo-blog-gitops-hardening/</link>
      <pubDate>Wed, 04 Mar 2026 19:06:41 +0000</pubDate>
      <guid>https://uclab.dev/posts/hugo-blog-gitops-hardening/</guid>
      <description>&lt;h2 id=&#34;securing-the-cicd-chain&#34;&gt;Securing the CI/CD Chain&lt;/h2&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;https://uclab.dev/posts/hugo-blog-gitops/&#34;&gt;previous post&lt;/a&gt; we built a full GitOps pipeline: push to Forgejo, build a Hugo image, ship it to k3s via Flux. It worked. But it was naive in a few ways — running nginx as root, no image scanning, no signing, and deploying by mutable tag.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://uclab.dev/posts/hugo-blog-gitops-hardening/images/gemini3.png&#34;&#xA;    alt=&#34;Hardening&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;This post covers the fixes. Three independent improvements, each worth doing on its own:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Unprivileged nginx&lt;/strong&gt; — drop root from the container entirely&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Trivy&lt;/strong&gt; — scan the image for HIGH/CRITICAL CVEs before it ever touches the registry&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cosign&lt;/strong&gt; — sign the image so the cluster can verify it came from CI&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The full updated files are at the bottom. Here is the reasoning behind each change.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Forgejo on K3S</title>
      <link>https://uclab.dev/posts/forgejo/</link>
      <pubDate>Sun, 01 Mar 2026 19:30:11 +0000</pubDate>
      <guid>https://uclab.dev/posts/forgejo/</guid>
      <description>&lt;p&gt;Forgejo is a lightweight, self-hosted Git service — a community fork of Gitea. In this post I&amp;rsquo;ll walk through how I deployed it on my home k3s cluster backed by a CloudNativePG (CNPG) PostgreSQL database, MinIO S3-compatible object storage for backups, and exposed it via Cilium&amp;rsquo;s Gateway API with automatic TLS through cert-manager.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img src=&#34;https://uclab.dev/posts/forgejo/images/gemini6.png&#34;&#xA;    alt=&#34;forgejo&#34;&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;h2 id=&#34;architecture-overview&#34;&gt;Architecture Overview&lt;/h2&gt;&#xA;&lt;p&gt;The setup involves three main layers:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;App layer&lt;/strong&gt; — the Forgejo deployment, services, and ingress (Gateway + HTTPRoute)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Database layer&lt;/strong&gt; — a CloudNativePG PostgreSQL cluster with WAL archiving to MinIO&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Secrets layer&lt;/strong&gt; — External Secrets Operator pulling credentials from Vault&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the directory structure I&amp;rsquo;m using in my GitOps repo:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hugo Blog — Full CI/CD GitOps</title>
      <link>https://uclab.dev/posts/hugo-blog-gitops/</link>
      <pubDate>Sun, 01 Mar 2026 07:39:04 +0000</pubDate>
      <guid>https://uclab.dev/posts/hugo-blog-gitops/</guid>
      <description>&lt;h2 id=&#34;forgejo--k3s-with-flux&#34;&gt;Forgejo → k3s with Flux&lt;/h2&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Hugo + Risotto theme (git submodule) → Forgejo Actions → Forgejo Container Registry → k3s → Flux&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Flow:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git push &#xA;→ Forgejo Actions builds Hugo image &#xA;→ pushes to Forgejo registry&#xA;→ updates image tag in k8s manifest &#xA;→ commits back to repo&#xA;→ Flux detects commit &#xA;→ applies Deployment &#xA;→ k3s rolls out new image&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;No Bitnami charts. No Flux image automation controllers. No runtime git cloning. Just a plain nginx Deployment running your pre-built static site.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
