Garbage Collector

It's all in the title !

📑 Table of Contents

đŸ·ïž All Tags 📄 All Posts


- 8 minutes reading time

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"

    external: false

    image: gitea/gitea:latest
      - USER_UID=1000
      - USER_GID=1000
    restart: always
      - gitea
      - ./gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
      - "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  >22/tcp,>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 Cet exemple de config propose une redirection https depuis http et utilise un certificat fourni par Let’s Encrypt.

<VirtualHost *:80>
	Redirect permanent /
	RewriteEngine on
	RewriteCond %{SERVER_NAME}
	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 *:443>
	CustomLog /var/log/httpd/025-gitea_access_ssl.log common
	ErrorLog /var/log/httpd/025-gitea_error_ssl.log

	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 /
	ProxyPassReverse /
 	SSLCertificateFile           certificat.pem
	SSLCertificateKeyFile	pkey.pem

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 et on tombe sur sa homepage.


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

ROOT = /data/git/repositories

LOCAL_COPY_PATH = /data/gitea/tmp/local-repo

TEMP_PATH = /data/gitea/uploads

APP_DATA_PATH    = /data/gitea
DOMAIN           = # indiquez le nom de domaine pour y accéder
SSH_DOMAIN       = # indiquez le nom de domaine pour y accéder
HTTP_PORT        = 3000 # port écouté en interne par Docker
ROOT_URL         = # URL de l'appli
DISABLE_SSH      = false
SSH_PORT         = 22
LFS_CONTENT_PATH = /data/git/lfs
OFFLINE_MODE     = false

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

ISSUE_INDEXER_PATH = /data/gitea/indexers/issues.bleve

PROVIDER_CONFIG = /data/gitea/sessions
PROVIDER        = file

AVATAR_UPLOAD_PATH            = /data/gitea/avatars
REPOSITORY_AVATAR_UPLOAD_PATH = /data/gitea/repo-avatars
DISABLE_GRAVATAR              = false

PATH = /data/gitea/attachments

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

SECRET_KEY     = xxxx

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é
NO_REPLY_ADDRESS                  =
DEFAULT_ORG_VISIBILITY		  = private # par défaut je donne la visu privée aux organisations

JWT_SECRET = xxxxx

ENABLED = false


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

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


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 ! :)