Table des matières

Installation du serveur git Gitea

Le serveur git est hébergé sur juris. Le serveur git, utilisant initialement Gogs, a été migré le 20/01/2019 sur Gitea, qui est un fork de Gogs.

La migration s'est faite en suivant la documentation officielle, dans une VM de test.

Les principales étapes sont les suivantes :

Installation

L'installation de Gitea suit la procédure officielle d'installation. En complément MariaDB a été installé et la base de données créée manuellement afin de permettre l'import de la base existante.

Installation de MariaDB

# apt install -y mariadb-server

Sécurisation de MariaDB

# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Création de la BDD

# mysql -u"root" -p

CREATE DATABASE IF NOT EXISTS gitea CHARACTER SET utf8 COLLATE utf8_general_ci;

Création de l'utilisateur

CREATE USER 'gitea'@'%' IDENTIFIED BY 'gitea_PASSWORD_HERE';

GRANT ALL PRIVILEGES ON gitea.* TO 'gitea'@'%';

FLUSH PRIVILEGES;

Export/import de la base de données de gogs

# mysqldump gogs_EpaiPhe7 > gogs_EpaiPhe7.sql
# mysql gitea < gogs_EpaiPhe7.sql

Le reste de l'installation suit la procédure officielle (utilisateur git, droits, etc.). La configuration au niveau de merlin (nginx) reste inchangée (au port près).

Intégration de Gitea à LDAP

Type d'authentification : LDAP (via BindDN)
Protocole de sécurité : LDAPS
Hôte : leodagan.hadoly.fr
Port : 636
Bind DN : uid=gogs-account,ou=people,ou=service,dc=hadoly,dc=fr
Bind mot de passe : xxxxxxxxxxxxxxxxxxxxx
Utilisateur Search Base : dc=hadoly,dc=fr
Filtre utilisateur : (&(objectclass=person)(uid=%s)(memberof=cn=gogs_group,ou=groups,dc=hadoly,dc=fr))
Filtre administrateur : Vide
Attribut nom d'utilisateur : uid
Attribut du prénom : givenName
Attribut du nom de famille : sn
Attribut de l'e-mail : mail
[ ] Alllez chercher les attributs dans le contexte de liaison DN
[x] Ne pas vérifier TLS
[x] Authentification activée

Administration

Arborescence

root@juris:/var/lib/gitea# tree -L 2
.
├── custom
│   ├── conf
│   ├── public
│   └── templates
├── data
│   ├── attachments
│   ├── avatars
│   ├── indexers
│   └── sessions
├── gitea-1.6.4-linux-amd64
├── gitea-repositories
├── └── Dossiers des dépôts des utilisateurs 
├── indexers
│   └── issues.bleve
├── log
│   ├── gitea.log
│   ├── gitea.log.2019-01-21.001
│   ├── hooks
│   ├── http.log
│   ├── serv.log
│   ├── xorm.log
│   ├── xorm.log.2019-01-20.001
│   └── xorm.log.2019-01-21.001
└── public

Gestion du service

Un service systemd gitea est disponible pour démarrer/arrêter/redémarrer le service.

# systemctl start/stop/restart gitea

Fichier de configuration app.ini

APP_NAME = Gitea
RUN_USER = git
RUN_MODE = prod

[database]
DB_TYPE  = mysql
HOST     = 127.0.0.1:3306
NAME     = gitea
USER     = gitea
PASSWD   = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
SSL_MODE = disable
#PATH     = data/gitea.db

[repository]
ROOT          = /var/lib/gitea/gitea-repositories
; Force every new repository to be private
FORCE_PRIVATE = true

[repository.upload]
; Maximum size of each file in MB
FILE_MAX_SIZE = 100

[release.attachment]
; Max size of each file. Defaults to 32MB
MAX_SIZE = 100

[attachment]
; Max size of each file. Defaults to 4MB
MAX_SIZE = 100

[server]
DOMAIN           = git.hadoly.fr
HTTP_PORT        = 3000
ROOT_URL         = https://git.hadoly.fr/
DISABLE_SSH      = false
SSH_PORT         = 6900
SSH_DOMAIN       = git-ssh.hadoly.fr
START_SSH_SERVER = false
OFFLINE_MODE     = true

[mailer]
ENABLED = true
SUBJECT = Notification git.hadoly.fr
HOST    = yvain.hadoly.fr:465
FROM    = "Hadoly" <noreply@hadoly.fr>
# ; Mailer user name and password
USER    = noreply
PASSWD  = xxxxxxxxxxxxxxxxxxxxxxxxx

[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL     = true
DISABLE_REGISTRATION   = true
ENABLE_CAPTCHA         = true
REQUIRE_SIGNIN_VIEW    = false

[picture]
DISABLE_GRAVATAR        = true
ENABLE_FEDERATED_AVATAR = false

[session]
PROVIDER = file

[log]
MODE      = file
LEVEL     = Info
ROOT_PATH = /var/lib/gitea/log

[security]
INSTALL_LOCK   = true
SECRET_KEY     = xxxxxxxxxxxxxxxxx
INTERNAL_TOKEN = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Procédure de mise à jour

# systemctl stop gitea
# mysqldump gitea > gitea.sql
# cd /var/lib/gitea && wget https://dl.gitea.io/gitea/1.x.x/gitea-1.x.x-linux-amd64
# chown git: gitea-1.x.x-linux-amd64 && chmod u+x gitea-1.x.x-linux-amd64
# cd /usr/local/bin && unlink gitea && ln -s /var/lib/gitea/gitea-1.x.x-linux-amd64 gitea
# systemctl start gitea

En cas de problème lors de la mise à jour, arrêter le service, restaurer la base de données et faire pointer le lien symbolique sur la version précédente du binaire.

Penser à supprimer les version n-2

Personnalisation

Le dossier d'installation de Gitea est /var/lib/gitea.

C'est à partir de cet emplacement que le site peut être personnalisé et plus particulièrement en intervenant sur le dossier /var/lib/gitea/custom/.

Page de garde

Il est possible de faire une page de garde personnalisée en créant le fichier gogs/custom/templates/home.tmpl (par défaut le fichier affiché est /var/lib/gitea/templates/home.tmpl).

Il est également possible de personnaliser l'entête (/var/lib/gitea/custom/templates/inject/head.tmpl) et le bas de page (/var/lib/gitea/custom/templates/inject/footer.tmpl).

Il est ainsi possible d'appliquer un CSS personnalisé qu'on placera dans /var/lib/gitea/custom/public/css et qu'on incluera dans l'entête personnalisé (exemple : <link rel="stylesheet" href="/css/custom.css">).

Logo & favicon

2021 : la technique permettant de changer le logo ne marche plus. Corrigé en faisant un lien symbolique gitea-sm.png → logo_hadoly.png dans /var/lib/gitea/custom/img

Afin de mettre le logo Hadoly dans le menu et en favicon, il suffit de remplacer le fichier /var/lib/gitea/custom/public/img/favicon.png.

Concernant le logo de la page de garde, il faut modifier l'image pointée par la class CSS “logo” du fichier home.tmpl (par défaut utilise le favicon).

Liste des utilistateurs

Par défault, la liste des utilisateurs est publique, et visible y compris aux persononnes non authentifiées. (sur https://git.hadoly.fr/explore/users) Ce n'est pas configurable pour le moment, cf Issue 2908

Il est possible de passer REQUIRE_SIGNIN_VIEW à true, mais cela empêche alors d'avoir des dépots publics.

Pour masquer la liste des utilisateurs dans l'interface web, on crée le fichier /var/lib/gitea/custom/templates/explore/users.tmpl :

{{template "base/head" .}}
<div class="explore users">
	{{template "explore/navbar" .}}
	<div class="ui container">

		<div class="ui user list">
                La liste des utilisateurs n'est pas disponible.
		</div>

	</div>
</div>
{{template "base/footer" .}}

Il faut aussi bloquer le endpoint d'API api/v1/users/search qui permet de récupérer un beau json avec la liste des utilisateurs, (Login, Nom, Prénom, email, date de création, date dernier login…)

Pour tester: curl -X GET “https://git.hadoly.Fr/api/v1/users/search” -H “accept: application/json” | jq

Pour bloquer cela, il n'existe pas de bonne sollution sans impacter le fonctionnement de l'appli. Bloquer tout users/search/ empeche d'ajouter des utilisateurs à sur un dépot. Et casse peut être d'autres choses… Le comportement par default de l'API, si on fait une requète avec n'importe quoi sur ce endpoint est de retourner la liste complète des users. Ça rend quasiment impossible de bloquer correctement avec une regex et la logique nginx. (en tout cas je n'y suis pas arrivé).

Sollution très imparfaite qui bloque un petit peu, et laisse la recherche fonctionner du moment qu'on fournis au moins 3 lettres ou chiffres.

        location ~ ^/api/v1/users/search/?$ {
                if ($args ~* "^q?=?[a-z0-9]{0,3}$") {
                        return 403;
                }