Cela ne surprendra personne, mais si j’ai une instance de l’outil de blogging f√©d√©r√© Plume autoh√©berg√©, c’est parce que j’aime mon autonomie sur les outils que j’utilise. Et aimant geeker sur diverses sujets, il est bien aussi de pouvoir sauvegarder ses diverses scripts, codes, et bidouilles sur un gestionnaire de sources pour √©ventuellement le partager avec d’autres ou encore le centraliser dans un coin plus fiable qu’un dossier au fin fond d’un disque dur. Il est √©vident que mettre ses jouets sur Github est la simplicit√© absolue, mais l’auto h√©bergement reste un sujet qui me tient √† coeur.

Le logo Gitea est sous licence MIT

C’est ainsi que je me suis int√©ress√© √† auto h√©berger un repository Git personnel. N’en connaissant pas 36, j’ai commenc√© avec Gitlab, probablement l’un des plus connus. Sauf que lorsque vous voulez uniquement versionner du code, Gitlab c’est un peu l’arme nucl√©aire car c’est une suite compl√®te de niveau entreprise incluant une CI:CD et pas mal de fonctionnalit√©s qui me sont au final inutiles. Et il est assez chiant √† param√©trer je trouve.

De fil en aiguille je finis par tomber sur Gitea, qui promet d’√™tre simple et sans prise de t√™te ! Celui-ci est un fork de Gogs, dont le repository √©tait maintenu par une unique personne ce qui limitait les interactions de la communaut√© et ralentissait le d√©veloppement. Depuis il est pass√© aussi sur Github, √ßa doit surement avoir jou√© :)

Gitea se propose donc comme √©tant un auto h√©bergement de repo Git sans douleur. Et pour avoir mis en place une instance personnelle en quelques minutes, j’ai envie de dire : promesse tenue ! Egalement, c’est un outil d’une grande l√©g√®ret√© l√† o√Ļ Gitlab √©tait plus poussif du fait de sa plus grande complexit√© fonctionnelle.

Je vous propose donc un petit r√©cap des √©tapes pour l’installer.

Installation de la base

Etant dans la cat√©gorie des partisans du moindre effort, et n’aimant pas installer trop de runtimes de d√©veloppement sur des serveurs orient√©s production, j’ai opt√© pour l’image docker et utilis√© docker-compose pour monter le container. Je partirai du principe que les concepts de Docker sont connus par le lecteur. Si un blabla sur Docker vous int√©resse √©ventuellement, n’h√©sitez-pas √† le faire savoir et je pourrai y consacrer un article √† l’occasion.

Sur mon serveur Docker, j’ai cr√©√© un r√©pertoire /opt/gitea.

mkdir /opt/gitea

J’ai cr√©√© un fichier docker-compose.yml bas√© sur celui propos√© dans la documentation.

vi /opt/gitea/docker-compose.yml
version: "2"

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:latest
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    networks:
      - gitea
    volumes:
      - ./gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "222:22"

J’ai principalement personnalis√© les ports d’√©coute, le reste me convenait, pour cet exemple je laisse la proposition par d√©faut. Dans les faits, ce docker-compose va cr√©er trois volumes Docker qui seront mont√©s avec diverses r√©pertoires de /opt/gitea/gitea tels que la conf ou encore la base de donn√©es.

Ceci fait, on peut d√©marrer le container. Pour cela, on va dans le dossier /opt/gitea et on fait pop l’instance.

cd /opt/gitea
docker-compose up -d
Removing network gitea_gitea
Creating network "gitea_gitea" with the default driver
Creating gitea_server_1 ... done

Docker a fait sa magie, vous pouvez voir le container démarré avec les commandes de ce dernier.

docker container ls
CONTAINER ID        IMAGE                     COMMAND                  CREATED              STATUS                       PORTS                                                 NAMES
3d9408e41863        gitea/gitea:latest        "/usr/bin/entrypoint…"   About a minute ago   Up About a minute            0.0.0.0:222->22/tcp, 0.0.0.0:3000->3000/tcp           gitea_server_1

Le container √©coute le port 3000 sur mon serveur Docker. Utilisant un reverse proxy √† base d’Apache, je vais lui cr√©er son vhost pour y acc√©der.

Note : dans cet exemple j’utilise Apache HTTPD sur CentOS, les chemins varient sur d’autres distribs comme Debian

J’ai l’habitude de nommer mes vhosts avec un num√©ro en pr√©fixe.

cd /etc/httpd/conf.d
vi 021-gitea.conf

Ce virtualhost partira du principe que le serveur Apache est sur le m√™me que le Docker, et qu’il agit en frontal des containers d√©ploy√©s. Si le frontal est une machine s√©par√©e, il faudra alors attaquer avec l’IP ou le hostname du Docker plut√īt que 127.0.0.1. Cet exemple de config propose une redirection https depuis http et utilise un certificat fourni par Let’s Encrypt.

<VirtualHost *:80>
	ServerName gitea.monserver.com
	Redirect permanent / https://gitea.monserver.com
	RewriteEngine on
	RewriteCond %{SERVER_NAME} =gitea.monserver.com
	RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
	CustomLog /var/log/httpd/025-gitea_access.log common
	ErrorLog /var/log/httpd/025-gitea_error.log
</VirtualHost>

<VirtualHost *:443>
	ServerName gitea.monserver.com:443
	CustomLog /var/log/httpd/025-gitea_access_ssl.log common
	ErrorLog /var/log/httpd/025-gitea_error_ssl.log

	ServerAdmin admin@server.com
	Include /etc/letsencrypt/options-ssl-apache.conf

	# Encoded slashes need to be allowed
	AllowEncodedSlashes             NoDecode

	SSLProxyEngine On
	SSLProxyVerify     None
	SSLProxyCheckPeerCN Off
	SSLProxyCheckPeerName Off
	RewriteEngine On
	# keep the host
	ProxyPreserveHost On
	ProxyPass / http://127.0.0.1:3000/
	ProxyPassReverse / http://127.0.0.1:3000/
	
	ServerAlias   gitea.monserver.com
 	SSLCertificateFile           certificat.pem
	SSLCertificateKeyFile	pkey.pem
</VirtualHost>

On enregistre et reload httpd pour prendre en compte, et en principe Gitea devient accessible √† l’URL demand√©e ! Si ce n’est pas le cas, inspectez les logs du reverse proxy, il est possible que Apache n’ait pas le droit de sortir sur le port 3000 si vous avez SELinux activ√© par exemple. Dans ce cas une r√®gle est √† positionner pour l’y autoriser :

semanage port -a -t http_port_t -p tcp 3000

On se connecte donc √† l’URL https://gitea.monserver.com et on tombe sur sa homepage.

gitea2

Exemple avec l’instance de d√©mo du site

Configurer l’instance

Deux possibilit√©s : √©diter le fichier de configuration, ou alors cliquer sur “S’inscrire” dans l’IHM. Le lien vous renverra vers un formulaire de param√©trage √† compl√©ter pour finaliser l’installation.

Le fichier de conf permet d’ajouter plus de param√®tres cependant. Celui-ci se trouve dans l’un des volumes du Docker, donc si vous avez fait la m√™me chose que moi :

vi /opt/gitea/gitea/gitea/conf/app.ini

Après un peu de personnalisation :

APP_NAME = Gitea # Ici pour pouvez indiquer le nom de votre instance
RUN_MODE = prod
RUN_USER = git

[repository]
ROOT = /data/git/repositories

[repository.local]
LOCAL_COPY_PATH = /data/gitea/tmp/local-repo

[repository.upload]
TEMP_PATH = /data/gitea/uploads

[server]
APP_DATA_PATH    = /data/gitea
DOMAIN           = gitea.monserver.com # indiquez le nom de domaine pour y accéder
SSH_DOMAIN       = gitea.monserver.com # indiquez le nom de domaine pour y accéder
HTTP_PORT        = 3000 # port écouté en interne par Docker
ROOT_URL         = https://gitea.monserver.com/ # URL de l'appli
DISABLE_SSH      = false
SSH_PORT         = 22
SSH_LISTEN_PORT  = 22
LFS_START_SERVER = true
LFS_CONTENT_PATH = /data/git/lfs
LFS_JWT_SECRET   = xxx
OFFLINE_MODE     = false

# pour la BDD je suis resté sur SQLite
[database]
PATH     = /data/gitea/gitea.db
DB_TYPE  = sqlite3
HOST     = localhost:3306
NAME     = gitea
USER     = root
PASSWD   = 
SCHEMA   = 
SSL_MODE = disable
CHARSET  = utf8

[indexer]
ISSUE_INDEXER_PATH = /data/gitea/indexers/issues.bleve

[session]
PROVIDER_CONFIG = /data/gitea/sessions
PROVIDER        = file

[picture]
AVATAR_UPLOAD_PATH            = /data/gitea/avatars
REPOSITORY_AVATAR_UPLOAD_PATH = /data/gitea/repo-avatars
DISABLE_GRAVATAR              = false
ENABLE_FEDERATED_AVATAR       = true

[attachment]
PATH = /data/gitea/attachments

[log]
ROOT_PATH = /data/gitea/log
MODE      = file
LEVEL     = info

[security]
INSTALL_LOCK   = true
SECRET_KEY     = xxxx
INTERNAL_TOKEN = xxxx

[service]
DISABLE_REGISTRATION              = true # l'instance est personnelle, je n'autorise pas les créations de compte
REQUIRE_SIGNIN_VIEW               = false
REGISTER_EMAIL_CONFIRM            = false
ENABLE_NOTIFY_MAIL                = false
ALLOW_ONLY_EXTERNAL_REGISTRATION  = false # si vous activez ce paramètre seules les connexions via des services tierces seront possibles, compte Google, Github, etc
ENABLE_CAPTCHA                    = false
DEFAULT_KEEP_EMAIL_PRIVATE        = true # par défaut l'email est privé
DEFAULT_ALLOW_CREATE_ORGANIZATION = true
DEFAULT_ENABLE_TIMETRACKING       = true
NO_REPLY_ADDRESS                  = noreply@monserver.com
DEFAULT_ORG_VISIBILITY		  = private # par défaut je donne la visu privée aux organisations

[oauth2]
JWT_SECRET = xxxxx

[mailer]
ENABLED = false

[openid]
ENABLE_OPENID_SIGNIN = true
ENABLE_OPENID_SIGNUP = true

[ui]
DEFAULT_THEME = arc-green	# parce que j'aime le thème sombre :)

On sauvegarde le fichier et red√©marre l’instance pour prendre en compte le changement.

cd /opt/gitea
docker-compose down && docker-compose up -d

On regarde √©ventuellement les logs du container au cas o√Ļ il y aurait des insanit√©s.

docker container logs gitea_server_1 --follow

Et l√† … Vous vous demandez comment acc√©der √† votre propre instance puisqu’on a coup√© la cr√©ation de compte ! Pour ma part j’avais param√©tr√© la premi√®re fois via l’√©cran et donc j’ai cr√©√© mon compte ainsi. Visiblement, le premier compte cr√©√© dans l’appli est admin. Sinon elle dispose d’une interface en ligne de commandes, pour √ßa il faut par contre se rattacher au container.

docker container exec -it gitea_server_1 /bin/bash

Avec cette commande, on ouvre une session bash dans le container. On bascule avec l’utilisateur git qui est le compte de service de Gitea.

sudo su - git

# et on créé notre admin

gitea admin create-user --username myname --password asecurepassword --email me@example.com

A partir de l√†, vous pouvez vous connecter √† l’application avec votre compte !

gitea3

Maintenant vous pouvez cr√©er vos repos, et les cloner depuis votre instance. Globalement, √† l’usage, c’est un clone de Github. Il est tr√®s ressemblant sur l’interface et derri√®re vous retrouvez les principes habituels des gestionnaires de sources : repository, organisations pour un groupe de travail, pull requests, issues, wiki, etc.

Je n’ai pas encore explor√© le d√©tail, mais de ce que j’ai vu dans la doc, il est possible de l’interface avec des outils de CICD comme Jenkins ou Travis pour g√©rer les releases et le build de code (en m√™me temps c’est du Git !), mais aussi avec des Webhooks pour g√©rer des actions √©v√©nementielles (d√©tection de commit, publier une issue si un probl√®me est d√©tect√©, etc). L’outil est tr√®s r√©actif et la promesse de l√©g√®ret√© est bien tenue, c’est tr√®s fluide dans mon cas.

Mettre √† jour l’instance

Utilisant du Docker, c’est √©videmment tr√®s simple … Par contre il est indispensable de bien avoir les donn√©es dans un volume sans quoi elles seront perdues ! Le composer en cr√©√© un √† la base donc logiquement, pas de risque avec la conf propos√©e.

Pour mettre à jour, il suffit de pull la dernière version.

cd /opt/gitea
docker-compose pull
docker-compose up -d

Si une version a été fixée dans docker-compose.yml à la place de latest, il convient de changer la valeur avant.

Enjoy !

Voil√† un rapide billet sur une installation rapide et aussi simple que l’est outil. N’h√©sitez-pas √† partager votre exp√©rience sur le sujet et d’autres du m√™me genre vous int√©resse, faites-le savoir ! :)