<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Cgit on Thanos Apollo</title>
    <link>https://thanosapollo.org/tags/cgit/</link>
    <description>Recent content in Cgit on Thanos Apollo</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Sun, 01 Feb 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://thanosapollo.org/tags/cgit/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Cgit with GNU Guix</title>
      <link>https://thanosapollo.org/posts/cgit-guix/</link>
      <pubDate>Sun, 01 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://thanosapollo.org/posts/cgit-guix/</guid>
      <description>&lt;p&gt;Recently I switched my home server to &lt;a href=&#34;https://guix.gnu.org&#34;&gt;GNU Guix&lt;/a&gt;, this is a quick guide
on how I setup &lt;code&gt;cgit&lt;/code&gt;.  Hope this helps some of you.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Recently I switched my home server to <a href="https://guix.gnu.org">GNU Guix</a>, this is a quick guide
on how I setup <code>cgit</code>.  Hope this helps some of you.</p>
<h2 id="why-i-use-gnu-guix-for-my-server">Why I use GNU Guix for my server</h2>
<p>GNU Guix is my preferred system for every machine I use, recently I
even switched my home server (<em>back</em>) to Guix.  I use my home server to
host this blog as well as my <a href="https://git.thanosapollo.org">cgit instance</a>, so far I recommend using
Guix, as a hobbyist, for the following reasons:</p>
<ul>
<li><code>Roll backs</code>
<ul>
<li>I had tried both Gentoo and Debian before for my server, more than
once I had one or more of my self hosted services down because an
update broke my setup.  My time is limited and those breakages
would often occur at busy weeks where I didn&rsquo;t have the time to
fix them.  With Guix I can just roll back to a previous working
generation if an update or a misconfiguration of mine breaks something.</li>
</ul>
</li>
<li><code>Reproducibility</code>
<ul>
<li>Define your setup once, run anywhere.  I do not want to manually
setup anything.</li>
</ul>
</li>
<li><code>Simplicity</code>
<ul>
<li>The entirety of Guix code lives in <a href="https://codeberg.org/guix/guix">one repo</a> and is almost entirely
written in one language, guile scheme.  If you find any issues
with a service or a package you can redefine it as you like in
your configuration.</li>
</ul>
</li>
</ul>
<h2 id="why-self-host-a-git-server">Why self-host a git server?</h2>
<p>Why would you not self-host your own projects?  I find it antithetical
to the FOSS ethos, and perhaps even ironic, to rely on proprietary
platforms for distributing free software.</p>
<p>Hosting a Git server is straightforward and requires minimal resources.</p>
<h2 id="git-http-backend-uri-issue-and-fix">git-http-backend &ldquo;/&rdquo; uri issue and fix</h2>
<p>Guix has a separate configuration data type for serving Git
repositories over HTTP.  Currently, the regex it uses does not allow
the root <code>&quot;/&quot;</code> to be used a URI for serving (<a href="https://lists.gnu.org/archive/html/help-guix/2022-07/msg00002.html">ref archive</a>).</p>
<p>The issue is in the <code>(gnu services version-control)</code> module, specifically in this part:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-emacs-lisp" data-lang="emacs-lisp"><span style="display:flex;"><span>(define* (git-http-nginx-location-configuration <span style="color:#e6db74">#:optional</span>
</span></span><span style="display:flex;"><span>                                                (config
</span></span><span style="display:flex;"><span>                                                 (git-http-configuration)))
</span></span><span style="display:flex;"><span>  (match config
</span></span><span style="display:flex;"><span>    (($ &lt;git-http-configuration&gt; package git-root export-all?
</span></span><span style="display:flex;"><span>                                 uri-path fcgiwrap-socket)
</span></span><span style="display:flex;"><span>     (nginx-location-configuration
</span></span><span style="display:flex;"><span>      <span style="color:#75715e">;; ISSUE here: regex won&#39;t allow for &#34;/&#34;</span>
</span></span><span style="display:flex;"><span>      (uri (string-append <span style="color:#e6db74">&#34;~ /&#34;</span> (string-trim-both uri-path <span style="color:#960050;background-color:#1e0010">#</span>\/) <span style="color:#e6db74">&#34;(/.*)&#34;</span>))
</span></span><span style="display:flex;"><span>      (body
</span></span><span style="display:flex;"><span>       (<span style="color:#a6e22e">list</span>
</span></span><span style="display:flex;"><span>        (<span style="color:#a6e22e">list</span> <span style="color:#e6db74">&#34;fastcgi_pass &#34;</span> fcgiwrap-socket <span style="color:#e6db74">&#34;;&#34;</span>)
</span></span><span style="display:flex;"><span>        (<span style="color:#a6e22e">list</span> <span style="color:#e6db74">&#34;fastcgi_param SCRIPT_FILENAME &#34;</span>
</span></span><span style="display:flex;"><span>              package <span style="color:#e6db74">&#34;/libexec/git-core/git-http-backend&#34;</span>
</span></span><span style="display:flex;"><span>              <span style="color:#e6db74">&#34;;&#34;</span>)
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;fastcgi_param QUERY_STRING $query_string;&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;fastcgi_param REQUEST_METHOD $request_method;&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;fastcgi_param CONTENT_TYPE $content_type;&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;fastcgi_param CONTENT_LENGTH $content_length;&#34;</span>
</span></span><span style="display:flex;"><span>        (if export-all?
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;fastcgi_param GIT_HTTP_EXPORT_ALL \&#34;\&#34;;&#34;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">&#34;&#34;</span>)
</span></span><span style="display:flex;"><span>        (<span style="color:#a6e22e">list</span> <span style="color:#e6db74">&#34;fastcgi_param GIT_PROJECT_ROOT &#34;</span> git-root <span style="color:#e6db74">&#34;;&#34;</span>)
</span></span><span style="display:flex;"><span>        (<span style="color:#a6e22e">list</span> <span style="color:#e6db74">&#34;fastcgi_param GIT_CONFIG_GLOBAL &#34;</span>
</span></span><span style="display:flex;"><span>              (plain-file <span style="color:#e6db74">&#34;gitconfig&#34;</span>
</span></span><span style="display:flex;"><span>                          (string-append <span style="color:#e6db74">&#34;[safe]\n\tdirectory = &#34;</span> git-root <span style="color:#e6db74">&#34;/*\n&#34;</span>))
</span></span><span style="display:flex;"><span>              <span style="color:#e6db74">&#34;;&#34;</span>)
</span></span><span style="display:flex;"><span>        <span style="color:#e6db74">&#34;fastcgi_param PATH_INFO $1;&#34;</span>))))))
</span></span></code></pre></div><p>Thankfully, we can easily resolve this by redefining
<code>(gnu services version-control)</code>.</p>
<ul>
<li>My changes (diff) to fix this issue, as well as specify git actions:</li>
</ul>
<!--listend-->
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-diff" data-lang="diff"><span style="display:flex;"><span>diff --git a/gnu/services/version-control.scm b/gnu/services/version-control.scm
</span></span><span style="display:flex;"><span>index a7f40812a6c..e33e5de21f0 100644
</span></span><span style="display:flex;"><span><span style="color:#f92672">--- a/gnu/services/version-control.scm
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+++ b/gnu/services/version-control.scm
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">@@ -235,7 +235,11 @@ (define* (git-http-nginx-location-configuration #:optional
</span></span></span><span style="display:flex;"><span>     (($ &lt;git-http-configuration&gt; package git-root export-all?
</span></span><span style="display:flex;"><span>                                  uri-path fcgiwrap-socket)
</span></span><span style="display:flex;"><span>      (nginx-location-configuration
</span></span><span style="display:flex;"><span><span style="color:#f92672">-      (uri (string-append &#34;~ /&#34; (string-trim-both uri-path #\/) &#34;(/.*)&#34;))
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+      (uri (string-append &#34;~ &#34;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+			  (if (string=? uri-path &#34;/&#34;)
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+                              &#34;&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+                              (string-append &#34;/&#34; (string-trim-both uri-path #\/)))
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+			  &#34;/(info/refs|git-upload-pack|git-receive-pack)&#34;))
</span></span></span><span style="display:flex;"><span>       (body
</span></span><span style="display:flex;"><span>        (list
</span></span><span style="display:flex;"><span>         (list &#34;fastcgi_pass &#34; fcgiwrap-socket &#34;;&#34;)
</span></span><span style="display:flex;"><span><span style="color:#75715e">@@ -254,7 +258,7 @@ (define* (git-http-nginx-location-configuration #:optional
</span></span></span><span style="display:flex;"><span>               (plain-file &#34;gitconfig&#34;
</span></span><span style="display:flex;"><span>                           (string-append &#34;[safe]\n\tdirectory = &#34; git-root &#34;/*\n&#34;))
</span></span><span style="display:flex;"><span>               &#34;;&#34;)
</span></span><span style="display:flex;"><span><span style="color:#f92672">-        &#34;fastcgi_param PATH_INFO $1;&#34;))))))
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">+        &#34;fastcgi_param PATH_INFO $uri;&#34;))))))
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span> ;;;
</span></span></code></pre></div><p>You can find the full module that I use <a href="https://git.thanosapollo.org/dotfiles/tree/guix/services/version-control.scm">here</a> in my dotfiles repo.</p>
<p>I&rsquo;d recommend creating your own module and load it by running the following command:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo guix system reocnfigure ~/dotfiles/guix/server-config.scm -L ~/dotfiles/guix
</span></span></code></pre></div><h2 id="configuring-cgit-service-type">Configuring <code>cgit-service-type</code></h2>
<p>Guix provides a cgit service module <code>(gnu services cgit)</code>.</p>
<blockquote>
<p>A couple things to note:</p>
<ul>
<li>You can provide <code>css</code> and <code>favicon</code> using an external url.  You can
find the css styling that I use <a href="https://thanosapollo.org/cgit.css">here</a>.</li>
</ul>
</blockquote>
<p>Example <code>cgit-service-type</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-scheme" data-lang="scheme"><span style="display:flex;"><span>(<span style="color:#66d9ef">define </span>my/git-repos
</span></span><span style="display:flex;"><span>  (<span style="color:#a6e22e">list</span>
</span></span><span style="display:flex;"><span>   (<span style="color:#a6e22e">repository-cgit-configuration</span>
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">url</span> <span style="color:#e6db74">&#34;repo1&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">name</span> <span style="color:#e6db74">&#34;repo1&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">desc</span> <span style="color:#e6db74">&#34;Example Repo 1&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">path</span> <span style="color:#e6db74">&#34;/srv/git/repo1&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">section</span> <span style="color:#e6db74">&#34;Section 1&#34;</span>))
</span></span><span style="display:flex;"><span>   (<span style="color:#a6e22e">repository-cgit-configuration</span>
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">url</span> <span style="color:#e6db74">&#34;repo2&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">name</span> <span style="color:#e6db74">&#34;repo2&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">desc</span> <span style="color:#e6db74">&#34;Example Repo 2&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">path</span> <span style="color:#e6db74">&#34;/srv/git/repo2&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">homepage</span> <span style="color:#e6db74">&#34;https://myhomepage&#34;</span>)
</span></span><span style="display:flex;"><span>     (<span style="color:#a6e22e">section</span> <span style="color:#e6db74">&#34;Section 2&#34;</span>))))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>(<span style="color:#a6e22e">service</span> cgit-service-type
</span></span><span style="display:flex;"><span>         (<span style="color:#a6e22e">cgit-configuration</span>
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">package</span> cgit)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">root-desc</span> <span style="color:#e6db74">&#34;Root Desc&#34;</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">repository-directory</span> <span style="color:#e6db74">&#34;&#34;</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">root-title</span> <span style="color:#e6db74">&#34;Root Title&#34;</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">repositories</span> my/git-repos)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">enable-index-owner?</span> <span style="color:#66d9ef">#f</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">enable-http-clone?</span> <span style="color:#66d9ef">#f</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">clone-prefix</span> <span style="color:#f92672">&#39;</span>(<span style="color:#e6db74">&#34;https://git.thanosapollo.org&#34;</span>)) <span style="color:#75715e">;; change this to your own url</span>
</span></span><span style="display:flex;"><span>           <span style="color:#75715e">;; Cache</span>
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-root</span> <span style="color:#e6db74">&#34;/var/cache/cgit&#34;</span>)
</span></span><span style="display:flex;"><span>           <span style="color:#75715e">;; 20000 = 5 hours.  Feel free to adjust this.</span>
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-size</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-static-ttl</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-dynamic-ttl</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-repo-ttl</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-root-ttl</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-scanrc-ttl</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-about-ttl</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">cache-snapshot-ttl</span> <span style="color:#ae81ff">20000</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">case-sensitive-sort?</span> <span style="color:#66d9ef">#f</span>)
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">css</span> <span style="color:#e6db74">&#34;https://thanosapollo.org/cgit.css&#34;</span>) <span style="color:#75715e">;; My personal css.</span>
</span></span><span style="display:flex;"><span>           (<span style="color:#a6e22e">nginx</span>
</span></span><span style="display:flex;"><span>            (<span style="color:#a6e22e">list</span>
</span></span><span style="display:flex;"><span>             (<span style="color:#a6e22e">nginx-server-configuration</span>
</span></span><span style="display:flex;"><span>               (<span style="color:#a6e22e">server-name</span> <span style="color:#f92672">&#39;</span>(<span style="color:#e6db74">&#34;git.thanosapollo.org&#34;</span>))
</span></span><span style="display:flex;"><span>               (<span style="color:#a6e22e">root</span> cgit)
</span></span><span style="display:flex;"><span>               (<span style="color:#a6e22e">try-files</span> (list <span style="color:#e6db74">&#34;$uri&#34;</span> <span style="color:#e6db74">&#34;@cgit&#34;</span>))
</span></span><span style="display:flex;"><span>               <span style="color:#75715e">;; I use cloudflare tunnel, which handles certs for me.</span>
</span></span><span style="display:flex;"><span>               (<span style="color:#a6e22e">listen</span> <span style="color:#f92672">&#39;</span>(<span style="color:#e6db74">&#34;80&#34;</span>))
</span></span><span style="display:flex;"><span>               (<span style="color:#a6e22e">ssl-certificate</span> <span style="color:#66d9ef">#f</span>)
</span></span><span style="display:flex;"><span>               (<span style="color:#a6e22e">ssl-certificate-key</span> <span style="color:#66d9ef">#f</span>)
</span></span><span style="display:flex;"><span>               <span style="color:#75715e">;; ;; If you use certbot try the following:</span>
</span></span><span style="display:flex;"><span>               <span style="color:#75715e">;; (listen &#39;(&#34;443 ssl&#34;))</span>
</span></span><span style="display:flex;"><span>               <span style="color:#75715e">;; (ssl-certificate</span>
</span></span><span style="display:flex;"><span>               <span style="color:#75715e">;;  &#34;/etc/certs/git.my-host.org/fullchain.pem&#34;)</span>
</span></span><span style="display:flex;"><span>               <span style="color:#75715e">;; (ssl-certificate-key</span>
</span></span><span style="display:flex;"><span>               <span style="color:#75715e">;;  &#34;/etc/certs/git.my-host.org/privkey.pem&#34;)</span>
</span></span><span style="display:flex;"><span>               (<span style="color:#a6e22e">locations</span>
</span></span><span style="display:flex;"><span>                (<span style="color:#a6e22e">list</span>
</span></span><span style="display:flex;"><span>                 (<span style="color:#a6e22e">nginx-location-configuration</span>
</span></span><span style="display:flex;"><span>                   (<span style="color:#a6e22e">uri</span> <span style="color:#e6db74">&#34;@cgit&#34;</span>)
</span></span><span style="display:flex;"><span>                   (<span style="color:#a6e22e">body</span> <span style="color:#f92672">&#39;</span>(<span style="color:#e6db74">&#34;fastcgi_param SCRIPT_FILENAME $document_root/lib/cgit/cgit.cgi;&#34;</span>
</span></span><span style="display:flex;"><span>                           <span style="color:#e6db74">&#34;fastcgi_param PATH_INFO $uri;&#34;</span>
</span></span><span style="display:flex;"><span>                           <span style="color:#e6db74">&#34;fastcgi_param QUERY_STRING $args;&#34;</span>
</span></span><span style="display:flex;"><span>                           <span style="color:#e6db74">&#34;fastcgi_param HTTP_HOST $server_name;&#34;</span>
</span></span><span style="display:flex;"><span>                           <span style="color:#e6db74">&#34;fastcgi_pass 127.0.0.1:9000;&#34;</span>)))
</span></span><span style="display:flex;"><span>                 (<span style="color:#a6e22e">git-http-nginx-location-configuration</span>
</span></span><span style="display:flex;"><span>                  (<span style="color:#a6e22e">git-http-configuration</span>
</span></span><span style="display:flex;"><span>                    (<span style="color:#a6e22e">uri-path</span> <span style="color:#e6db74">&#34;/&#34;</span>)
</span></span><span style="display:flex;"><span>                    (<span style="color:#a6e22e">export-all?</span> <span style="color:#66d9ef">#t</span>))))))))))
</span></span></code></pre></div><p>You can find my home server configuration <a href="https://git.thanosapollo.org/dotfiles/tree/guix/theodora.scm">here</a>.</p>]]></content:encoded>
    </item>
  </channel>
</rss>
