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 de gitea 1.0.3 en utilisant les binaires disponibles sur le site officiel ;
- import de la base de données et des fichiers, renommage de l'arborescence ;
- lancement de gitea et vérification du fonctionnement ;
- migration de la base de données par lancement successif des binaires des versions majeures, de la 1.0.3 à la 1.6.4 ;
- correction de la configuration et de quelques bugs mineurs (page d'accueil, ticket créé par un utilisateur qui n'existe plus et qui “plante” l'affichage de la liste des tickets).
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
- le fichier de configuration app.ini est placé dans le dossier /etc/gitea ;
- les fichiers (applicatif et dépôts) sont placé dans /var/lib/gitea :
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
- le dossier “custom” contient les éléments de configuration “custom” (template de la page d'accueil notamment) ;
- le dossier “data” contient les pièces jointes des tickets (stockés en base de données) ainsi que les avatars des utilisateurs ;
- le dossier “gitea-repositories” contient l'ensemble des dépôts des utilisateurs (un dossier par utilisateur) ;
- le dossier “log” contient… les logs !
- un lien symbolique (/usr/loca/bin/gitea) pointe vers le fichier binaire “gitea-1.6.4-linux-amd64”
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
- Arrêter le service :
# systemctl stop gitea
- Faire un backup de la base de données par sécurité :
# mysqldump gitea > gitea.sql
- Télécharger le dernier binaire en date depuis le site de gitea :
# cd /var/lib/gitea && wget https://dl.gitea.io/gitea/1.x.x/gitea-1.x.x-linux-amd64
- Changer les droits :
# chown git: gitea-1.x.x-linux-amd64 && chmod u+x gitea-1.x.x-linux-amd64
- Modifier le lien symbolique :
# cd /usr/local/bin && unlink gitea && ln -s /var/lib/gitea/gitea-1.x.x-linux-amd64 gitea
- Démarrer le service :
# 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; }