User Tools


server:stagit

stagit – Static Git Web Interface

Stagit generates static HTML pages for a git repository. This guide assumes that you already have a git user on your system.

Installation

Install stagit:

git clone git://git.codemadness.org/stagit
cd stagit
make
make install

And install git:

apt install git
useradd -m git -d /var/git -s /bin/bash

nginx (server side)

Our stagit projects only need a repo folder for (of course) our bare repos and a html folder for (guess what) our from stagit generated html files.

mkdir -p /var/www/stagit/repos
git init --bare /var/www/stagit/repos/project1.git     ← we need this 
git init --bare /var/www/stagit/repos/project2.git     ← and this later
mkdir -p /var/www/stagit/html
mkdir -p /var/www/stagit/html/project1
mkdir -p /var/www/stagit/html/project2

Create the file /etc/nginx/sites-available/stagit and add the following (i highly recommend using a central enryptfile):

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name git.example.com www.git.example.com;
 
    root /var/www/stagit/html;
    index index.html;
 
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
 
    location / {
        try_files $uri $uri/ =404;
    }
 
    location ~ /\. {
        deny all;
    }
}
 
server {
    listen 80;
    listen [::]:80;
    server_name git.example.com www.git.example.com;
 
    return 301 https://$host$request_uri;
}

Then copy your basic website files to the stagit folder (here is an example style.css):

/var/www/stagit/html
  ├── project2
  ├── project1
  ├── style.css       ← 1.
  ├── favicon.ico     ← 2.
  └── logo.png        ← 3.

Set the right permissions for the complete directory, www-data for nginx and git for git:

chown -R git:www-data /var/www/stagit 

At last enable the site and restart nginx:

ln -s /etc/nginx/sites-available/stagit /etc/nginx/sites-enabled/
systemctl reload nginx

stagit (local side)

Then go to your local project directory and initialise a git project, point it to your server's project destination and optionally set your git user name and mail:

cd project1
git init
git remote add stagit git@git.example.org:/var/www/stagit/repos/project1.git
git remote -v
git config user.name "Your Name"
git config user.email "your@mail.com"

Now inside your freshly generated bare git folder found in .git, change the project description, the owner name and the clone url as well as creating a git-daemon-export-ok (leave empty) in order to let anyone clone your repo.

/project1/.git/
  ├── description                 ← 1.
  ├── owner                       ← 2.
  ├── url                         ← 3.
  └── git-daemon-export-ok        ← 4.

As well as in your .git/hooks folder add a post-receive script to update all necessary files after git pushing to your server (change file destination and repo name accordingly) with the following content:

#!/bin/sh
 
set -eu
 
REPO_NAME="project1"
REPO="/var/www/stagit/repos/${REPO_NAME}.git"
HTML_DIR="/var/www/stagit/html/${REPO_NAME}"
 
rm -rf "$HTML_DIR"
mkdir -p "$HTML_DIR"
cd "$HTML_DIR"
stagit "$REPO"
 
cd /var/www/stagit/html
stagit-index ../repos/*.git > index.html
 
ln -sf style.css "$HTML_DIR"
ln -sf logo.png "$HTML_DIR"
ln -sf favicon.png "$HTML_DIR"

I also created an alias script in my .config/shell/aliasrc so i only have to type git-sync.

git-sync() {
    printf "Commit message: "
    read -r msg
    git add .
    git commit -m "$msg"
    git push stagit master
#   git push aur master      <- if you own aur
#   git push github master   <- and github remotes
}

Cloning

Create a systemd unit on your server:

vim /etc/systemd/system/git-daemon.service

With the following Content:

[Unit]
Description=Git Daemon
After=network.target
 
[Service]
ExecStart=/usr/bin/git-daemon \
  --base-path=/var/www/stagit/repos \
  --export-all \
  --reuseaddr \
  --informative-errors \
  --verbose
User=git
Group=git
Restart=always
 
[Install]
WantedBy=multi-user.target

Activate it:

sudo systemctl daemon-reexec
sudo systemctl enable --now git-daemon.service

Then open port 9418 in your firewall to let anyone clone your repo:

sudo ufw allow 9418/tcp

Now you can do something like:

git clone git://git.example.org/project1

Finish! Enjoy your own statit git server \(^O^)/.