diyhosting/cgit.html

137 lines
4.2 KiB
HTML

<!DOCTYPE html>
<html lang=en>
<head>
<title>Setting up Cgit &ndash; diyhosting.bhh.sh</title>
<!--# include file=".nav.html" -->
</head>
<body>
<header>
<h1>Setting up Cgit</h1>
<img src="pix/cgit.svg" class="titleimg">
</header>
<main>
<p>
Once you have your server hosting your git repositories, you might want to allow others to browse
your repositories on the web. Cgit is a Free Software that allows browsing git repositories through
the web. </p>
<p>
Note that Cgit is a read-only frontend for Git repositories and doesn't have issues, pull requests
or user management. If that's what you want, consider installing Gitea instead.</p>
<h2>Installing cgit and fcgiwrap</h2>
<h3>Install fcgiwrap</h3>
<p>
NGINX doesn't have the capability to run CGI scripts by itself, it depends on an intermediate layer
like fcgiwrap to run CGI scripts like cgit:</p>
<pre><code>apt install fcgiwrap</code></pre>
<p>And now we can install cgit itself with:</p>
<pre><code>apt install cgit</code></pre>
<h2>Setting up NGINX</h2>
<p>
You should have an NGINX server running with a TLS certificate by now. Add the following configuration
to your server to pass the requests to Cgit, while serving static files directly:</p>
<pre><code>
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/ssl/nginx/<strong>git.example.org</strong>.crt;
ssl_certificate_key /etc/ssl/nginx/<strong>git.example.org</strong>.key;
server_name <strong>git.example.org</strong>;
root /usr/share/cgit ;
try_files $uri @cgit ;
location @cgit {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /usr/lib/cgit/cgit.cgi;
fastcgi_param PATH_INFO $request_uri;
fastcgi_param QUERY_STRING $query_string;
fastcgi_pass unix:/run/fcgiwrap.socket;
}
}
</code></pre>
<p>Then get NGINX to reload your configuration.</p>
<h2>Configuring cgit</h2>
<p>You've got cgit up and running now, but you'll probably see it without any style and without any repository.
To change this, we need to configure Cgit to our liking, by editing <code>/etc/cgitrc</code>.
</p>
<pre><code>
css=/cgit.css
logo=/cgit.svg
virtual-root=/
# Title and description shown on top of each page
root-title=<strong>My git server</strong>
root-desc=<strong>A web interface to my git repositories, powered by Cgit</strong>
# The location where git repos are stored on the server
scan-path=/srv/git/
</code></pre>
<p>This configuration assumes you followed the <a href="/git">git hosting guide</a> and store your repositories
on the <code>/srv/git/</code> directory.</p>
<p>Cgit's configuration allows changing many settings, as documented on the cgitrc(5) manpage installed with
Cgit.</p>
<h3>Changing the displayed repository owner</h3>
<p>Cgit's main page shows each repo's owner, which is "git" in case you followed the git hosting guide, but you
might want to change the name to yours. Cgit shows the owner's system name, so you need to modify the git
user
to give it your name:</p>
<pre><code>
usermod -c "<strong>Your Name</strong>" git
</code></pre>
<h3>Changing the repository description</h3>
<p>Navigate to your bare repository on the server and edit the <code>description</code> file inside it</p>
<h3>Displaying the repository idle time</h3>
<p>To do this, we need to create a post-receive hook for each repository that updates the file cgit uses
to determine the idle time. Inside your repository, create a file <code>hooks/post-receive</code> and add
the following contents:</p>
<pre><code>
#!/bin/sh
agefile="$(git rev-parse --git-dir)"/info/web/last-modified
mkdir -p "$(dirname "$agefile")" &&
git for-each-ref \
--sort=-authordate --count=1 \
--format='%(authordate:iso8601)' \
>"$agefile"
</code></pre>
<p>And give it execution permissions with:</p>
<pre><code>chmod +x hooks/post-receive</code></pre>
<p>Next time you push to that repository, the idle time should reset and show the correct value.</p>
<h2>Contribution</h2>
<ul>
<li>Ariel Costas &ndash; <a href="https://costas.dev">website</a>, <a
href="https://costas.dev/donations/">donations</a></li>
</ul>
</main>
<!--# include file=".footer.html" -->
</body>
</html>