flu0r1ne.net/logs/cgit-nginx-ubuntuLast Updated: 2021-07-17

Installing cGit behind NGINX on Ubuntu

cGit is a fast web interface based on the CGI specification. It is lightweight and doesn't require a database or web authentication system.

It's easy to configure. For some reason, all the online guides for Ubuntu decided they needed to compile it from scratch and write their own start scripts in a mix of perl and bash. You don't need superhero sysadmin skills from the late 90s. All components are packaged with systemd units... there is a better way...

1. Install cgit and fcgiwrap.

fcgiwrap will create a socket NGINX can use to pass the CGI variables to cGit:

sudo apt install fcgiwrap
sudo apt install cgit

2. Modify the cgitrc file under /etc/cgitrc to your liking:

# See cgitrc(5)
# prepend this string to every url
virtual-root=/
enable-index-links=1
enable-commit-graph=1

root-title=My Git Repos
root-desc=I exclusivly write code in Smalltalk-71
logo=/assets/my_custom_logo.png

# Add site-specific configuration
# ...

3. Optionally create an assets directory and add your custom logo / css:

mkdir /var/www/html/assets
cp my_custom_logo.png /var/www/html/assets

4. Configure NGINX

Add the site to NGINX. This launches the cgit.cgi executable passing it to the fcgiwrap socket:

echo >/etc/nginx/sites-available/cgit.conf <<EOF
server {
    listen 80;

    server_name  git.domain.com;
    server_name  www.git.domain.com;

    root /usr/share/cgit;

    # Maintainer overridden assets will live in /assets
    # This allows you to change add a custom logo or modified CSS
    # See cgitrc(5)
    location ~* /assets {
        root /var/www/html;
        expires 30d;
    }

    # Fallback to static assets included by cGit 
    location ~* ^.+\.(css|png|ico)$ {
        root /usr/share/cgit;
        expires 30d;
    }

    try_files $uri @cgit;

    location @cgit {
        fastcgi_param   SCRIPT_FILENAME /usr/lib/cgit/cgit.cgi;
        fastcgi_param   PATH_INFO       $uri;
        fastcgi_param   QUERY_STRING    $args;
        fastcgi_param   HTTP_HOST       $server_name;
        fastcgi_pass    unix:/run/fcgiwrap.socket;
    }

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log warn;
}
EOF

4. Enable the site:

ln -s /etc/nginx/sites-available/git.conf /etc/nginx/sites-enabled/cgit.conf

Note: all files in sites-enabled should be included in nginx.conf's http section:

include /etc/nginx/sites-enabled/*;

5. Restart NGINX

sudo systemctl restart nginx