Hello Gitea

Publié le 04/07/2018

Gitea se présente comme un service d'hébergement et d'accès à des dépôts Git, le tout sans douleur.

Spoiler alert: C'est quand même un peu douloureux. Mais moins que pour un service Gitlab qui nécessite ses scripts Chef, parce que trop compliqué.

Installation

Pour l'installation, l'article le plus complet que j'ai trouvé (et sur lequel je me suis basé :-)) est disponible ici.

L'installation est relativement simple; le plus compliqué a été de découvrir certaines spécificités et de rendre le service disponible depuis un sous-répertoire sur Nginx.

adduser --disabled-login --gecos 'gitea' git
su - git

Comme le rappelle man adduser (et aussi le forum AskUbuntu):

--disabled-login
    Do not run passwd to set the password.  The user won't be able
    to use  her  account until the password is set.

--gecos GECOS
    Set  the  gecos field for the new entry generated.  adduser will
    not ask for finger information if this option is given.

Voir ici pour la signification de GECOS (TL;DR: on s'attend à avoir le nom, le bâtiment/la chambre, le numéro de téléphone pro, le numéro de téléphone privé et toute autre information, séparées par des virgules).

Téléchargez ensuite la bonne version de l'application en fonction de votre architecture, sur la page de téléchargement et rendez le exécutable. Attention donc que pour un serveur ARM type Raspberry-Pi, vous ne devrez surtout pas prendre les fichiers type amd64. Oui, ça a l'air logique, mais sur le coup, en suivant le tuto d'installation pas-à-pas, ça l'est moins.

Après l'installation, et au premier démarrage, Gitea créera un fichier de configuration spécifique qu'il placera à l'emplacement custom/conf/app.ini. Créez déjà les répertoires de stockage pour les données: mkdir -p custom/conf data, puis démarrer l'application via ./gitea web.

Si vous souhaitez démarrer Gitea dans un sous-répertoire du domaine, coupez le service, modifiez le fichier afin d'y ajouter [server] ROOT_URL = /git/ et redémarrez-le ensuite.

Configuration Nginx

server {
    listen 443 ssl;
    ssl_protocols TLSv1.1 TLSv1.2;

    [...]

    location /git/ {
        proxy_pass http://localhost:3000/;
        client_max_body_size 100M;
    }

    [...]

Et démarrez le service à la main: ./gitea web. Vous pourrez ensuite passer à l'installation, en vous rendant sur la bonne page.

Une fois que tout sera correctement installé, on peut passer à la (re)configuration via le fichier custom/conf/app.ini. Le seul changement que j'ai appliqué consiste à modifier la section [server]:

[server]
PROTOCOL         = http
ROOT_URL         = https://grimbox.be/git/
SSH_DOMAIN       = grimbox.be
DOMAIN           = grimbox.be
HTTP_PORT        = 3000
HTTP_ADDR        = 0.0.0.0
DISABLE_SSH      = false
SSH_PORT         = 22
LFS_START_SERVER = true

Configuration Supervisord

La documentation conseille de passer par systemd, mais le tuto conseille plutôt de passer par supervisor, ce qui revient +/- au même:

apt install supervisor
mkdir /var/log/gitea
vim /etc/supervisor/conf.d/gitea.conf

Et copiez le contenu ci-dessous:

[program:gitea]
directory=/home/git/
command=/home/git/gitea web
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/var/log/gitea/stdout.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/var/log/gitea/stderr.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
environment = HOME="/home/git", USER="git"

Et on termine par supervisorctl start gitea (après avoir arrêté l'instance qui tourne déjà en manuel :-)).

Arborescence finale

git@dagger:~$ tree .
.
├── custom
│   └── conf
│       └── app.ini
├── data
│   ├── avatars
│   │   └── 9ffb88df5ac2a65fbad9a981cd1b949a
│   ├── gitea.db
│   ├── indexers
│   │   └── issues.bleve
│   │       ├── index_meta.json
│   │       └── store
│   ├── lfs
│   ├── sessions
│   └── ...
├── gitea
├── gitea-repositories
│   └── <user>
│       └── <repo1>.git
│           ├── branches
│           ├── config
│           ├── description
│           ├── HEAD
│           ├── hooks
│           │   └── ...
│           ├── info
│           │   └── ...
│           ├── objects
│           │   └── ...
│           └── refs
│               ├── heads
│               │   └── master
│               └── tags
└── log
    ├── gitea.log
    ├── hooks
    │   ├── post-receive.log
    │   ├── pre-receive.log
    │   └── update.log
    ├── http.log
    ├── serv.log
    ├── xorm.log
    └── xorm.log.2018-07-04.001

Backup

Toute la magie tient dans une seule commande: ./gitea dump.

Cela créera une archive ~timestampée~ ~horodatée~ avec un indice. Générée le 04/07/2018 à 13h16, elle porte par exemple l'indice 1530702980. Ajoutez donc ce dump dans un crontab, et envoyez le tout vers votre dépôt Borg préféré :-)

Restore

Vous pouvez dézipper l'archive générée ci-dessus, mais la structure sera différente de l'arborescence des fichiers attendus par Gitea. Les répertoires custom et data se trouveront aux bons endroits, mais la base de données devra être reconfigurée en fonction de votre configuration (avec du SQLite, c'est plus simple...).

Idem pour les dépôts: ils sont archivés dans un fichier gitea-repo.zip à l'intérieur du dump réalisé ci-dessus.

Comme l'indique la documentation, il n'y a donc pas de processus automatique.

Push derrère un proxy d'entreprise

Si vous obtenez une erreur d'authentification (401) lors d'un push, il est possible que vous deviez passer par un tunnel, afin de vous identifier correctement par rapport à votre proxy. Pour cela, dans la configuration de cntlm, ajoutez un tunnel de type Tunnel 12222:<server_url>:22 afin de mapper un port interne (ici, le 12222) sur le port d'écoute du serveur externe.

On peut ensuite configurer son dépôt local avec l'URL suivante: url = ssh://git@localhost:12222/<repo_url>.git.