zkk / VPS git server



Installazione

Installo sul server il pacchetto git e creo il relativo utente con homedirectory nella cartella /var/git/ poi attribuisco una password:

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

Creazione repository

Sul server

Dopo essermi loggato tramite ssh:

su -l git
git config --global init.defaultBranch main # necessario per chiamare 'main' il branch
git init --bare 'repo-name'.git

Continuo copiando le chiavi SSH in modo da potermi connettere senza digitazione della password:

mkdir /var/git/.ssh	# Create the required directory.
cp ~/.ssh/authorized_keys /var/git/.ssh/	# Copy over the authorized key.
chown git:git -R /var/git/.ssh	# Make the created directory and contents to be owned by the git user.

Sul computer locale

cd 'path-to-repo'
git init
git remote add origin git@massimo-fontana.net:'repo-name'.git
git add .
git commit -m "First commit"
git push origin main

Cgit

Installazione componenti

apt install cgit
apt install fcgiwrap
apt install python3-markdown

Il pacchetto python3-mardown serve a mostrare correttamente il file README.md all’interno di una repository nella sezione about.

Impostazione pagina webserver

Creo il file /etc/nginx/sites-available/git inserendo il seguente codice:

server {
    listen 80 ;
    listen [::]:80 ;
    server_name git.massimo-fontana.net ;
    root /usr/share/cgit;
    try_files $uri @cgit ;

    location ~ /.+/(info/refs|git-upload-pack) {
	  include             fastcgi_params;
	  fastcgi_param       SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
	  fastcgi_param       PATH_INFO           $uri;
	  fastcgi_param       GIT_HTTP_EXPORT_ALL 1;
	  fastcgi_param       GIT_PROJECT_ROOT    /var/git;
	  fastcgi_param       HOME                /var/git;
	  fastcgi_pass        unix:/run/fcgiwrap.socket;
    }

    location @cgit {
	  include fastcgi_params;
	  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;
    }

}

Attivo il webserver ed aggiungo la protezione ssl:

ln -s /etc/nginx/sites-available/git /etc/nginx/sites-enabled/
systemctl reload nginx.service
certbot --nginx
systemctl reload nginx.service

Configurazione Cgit

Faccio la copia di backup del file /etc/cgitrc e lo sostituisco con il seguente contenuto:

# cgit config
# see cgitrc(5) for details

css=/cgit.css
logo=/cgit.png
virtual-root=/
clone-prefix=https://git.massimo-fontana.net

# Title and description shown on top of each page
root-title=MyGit server
root-desc=Max's git repositories, powered by Cgit

# About page
about-filter=/usr/lib/cgit/filters/about-formatting.sh
readme=:README.md

# If you do not want that webcrawler (like google) index your site
robots=noindex, nofollow

# The location where git repos are stored on the server
scan-path=/var/git/

Per determinare come proprietazio dei repository il sottoscritto imposto il nome dell’utente git:

usermod -c "Max" git

Infine, per poter visualizzare nella repository a quando risale l’aggiornamento del file, devo inserire il seguente file all’interno di ogni repository creata con il nome di /var/git/repo-name/hooks/post-receive e con il seguente contenuto:

#!/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"

Attribuendo il necessario permesso di esecuzione:

chmod +x /var/git/repo-name/hooks/post-receive