# Service forge.chalec.org Service de forge logicielle de Chalec basé sur le logiciel libre Forgejo : https://forgejo.org/. Responsable: Adrien Bourmault (@neox) Anciens responsables : Christian Momon (@cpm). La première version de cette documentation est basée sur la [documentation Devinsy](urlhttps://forge.devinsy.fr/adminsys/documentation/src/branch/master/forge.devinsy.fr.md). Procédure d'installation inspirée de https://docs.gitea.io/en-us/install-from-binary/ où Gitea consiste en un unique binaire. Né en décembre 2022, Forgejo est un projet très jeune qui se réferre encore beaucoup à Gitea, la source de son fork. Notamment pour sa documentation. Note : la documentation est traduite en français mais pas complétement. La consultation en version française peut vous faire perdre beaucoup d'informations utiles. Voir par exemple entre https://docs.gitea.io/en-us/install-from-binary/ et https://docs.gitea.io/fr-fr/install-from-binary/. Note : pour l'instant, Forgejo est un _soft fork_ de Gitea, avec la volonté d'être interchangeable. Cela a pour conséquence que certaines variables d'envrionnement et certains messages contiennent le nom Gitea au lieu du nom Forgejo. # Intallation ## Prérequis système Vérifier que le fichier `/etc/hosts.deny` ne bloque pas les connexions ssh : ``` #sshd: ALL ``` ## NGinx Installer les paquets : ``` apt-get install nginx python3-certbot-nginx ``` Ouvrir les ports http (80) et https (443) : ``` ufw allow 'Nginx HTTP' ufw allow 'Nginx HTTPS' ``` Configurer a minima le site web dans `/etc/nginx/sites-available/forge.chalec.org` : ``` server { listen 80; listen [::]:80; server_name forge.chalec.org; access_log /var/log/nginx/forge.chalec.org-access.log; error_log /var/log/nginx/forge.chalec.org-error.log; } ``` Activer la configuration : ``` cd /etc/nginx/sites-enabled/ ln -s ../sites-available/forge.chalec.org ``` Vérifier que c'est bon et recharger : ``` nginx -t && systemctl reload nginx ``` Configurer le certificat SSl : ``` certbot --nginx ``` Créer un fichier générique `cat /etc/nginx/statoolinfos.conf` qui sera includé plus tard : ``` location /.well-known/statoolinfos/ { types { text/plain properties; } alias /srv/statoolinfos/well-known/statoolinfos/; autoindex on; } ``` Mettre beau le fichier `/etc/nginx/sites-enabled/forge.chalec.org` : ``` server { listen 80; listen [::]:80; server_name forge.chalec.org; access_log /var/log/nginx/forge.chalec.org-access.log; error_log /var/log/nginx/forge.chalec.org-error.log; #return 302 https://$host$request_uri; return 302 https://forge.chalec.org$request_uri; } server { set_real_ip_from 192.169.1.1; real_ip_header proxy_protocol; listen [::]:443 ssl ipv6only=on; listen 443 ssl proxy_protocol; server_name forge.chalec.org; access_log /var/log/nginx/forge.chalec.org-access.log; error_log /var/log/nginx/forge.chalec.org-error.log; ssl_certificate /etc/letsencrypt/live/forge.chalec.org/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/forge.chalec.org/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot # StatoolInfos. include /etc/nginx/statoolinfos.conf; location / { proxy_pass http://localhost:3000; } } ``` Vérifier que c'est bon et recharger : ``` nginx -t && systemctl reload nginx ``` ## Postgresql ``` apt install postgresql postgresql-contrib ``` D'après la documentation d'installation de Gitea : > PostgreSQL uses md5 challenge-response encryption scheme for password authentication by default. > Nowadays this scheme is not considered secure anymore. Use SCRAM-SHA-256 scheme instead by editing > the postgresql.conf configuration file on the database server to: > > password_encryption = scram-sha-256 > > Restart PostgreSQL to apply the setting. Le conseil semble judicieux donc éditer le fichier `/etc/postgresql/13/main/postgresql.conf` : ``` #password_encryption = md5 # md5 or scram-sha-256 password_encryption = scram-sha-256 ``` Et redémarrer le service : ``` systemctl restart postgresql.service ``` ## Préparation de la base de données Note : Gitea semble insister pour mettre un mot de passe pour l'accès à la base de données. Se connecter à Postgresql : ``` su -c "psql" - postgres ``` Créer un utilisateur (« role » en langage Pgsql) : ``` CREATE ROLE giteadba WITH LOGIN PASSWORD 'xxxxxxxxxxxxx'; ``` Créer une base de données : ``` CREATE DATABASE giteadb WITH OWNER giteadba TEMPLATE template0 ENCODING UTF8 LC_COLLATE 'fr_FR.UTF-8' LC_CTYPE 'fr_FR.UTF-8'; ``` Donner l'accès en éditant le ficher /etc/postgresql/13/main/pg_hba.conf : ``` local giteadb giteadba scram-sha-256 ``` Redémarrer le service : ``` systemctl restart postgresql.service ``` ## Création d'un utilisateur système dédié Créer un utilisateur système dédié : ``` adduser \ --system \ --shell /bin/bash \ --gecos 'Git Version Control' \ --group \ --disabled-password \ --home /srv/forgejo/ \ git ``` ## Préparation des fichiers Création de l'arborescence dédiée : ``` export GITEA_WORK_DIR=/srv/forgejo mkdir -p $GITEA_WORK_DIR/{bin,custom,data,tmp} chown -R git:git $GITEA_WORK_DIR chmod -R ug+x $GITEA_WORK_DIR chmod -R o-rwx $GITEA_WORK_DIR ``` Création du dossier de configuration : ``` mkdir /etc/forgejo chown root:git /etc/forgejo chmod ug+rwx /etc/forgejo chmod o-rwx /etc/forgejo ``` Création du dossier de logs (optionnel) : ``` mkdir /var/log/forgejo chown git.git /var/log/forgejo ``` ## Récupération du binaire Gitea consiste en un seul fichier binaire. Identifier la dernière version : https://dl.gitea.io/gitea/ Définir la version cible : ``` export GITEA_VERSION=1.XX.X ``` La télécharger : ``` mkdir -p /srv/forgejo/bin/ cd /srv/forgejo/bin/ wget https://codeberg.org/forgejo/forgejo/releases/download/v${VERSION}/forgejo-${VERSION}-linux-amd64 ``` Vérifier cohérence du fichier : ``` wget https://codeberg.org/forgejo/forgejo/releases/download/v${VERSION}/forgejo-${VERSION}-linux-amd64.sha256 sha256sum -c forgejo-${VERSION}-linux-amd64.sha256 ``` Installer gpg : ``` apt-get install gpg ``` Vérifier sa signature : ``` wget https://codeberg.org/forgejo/forgejo/releases/download/v${VERSION}/forgejo-${VERSION}-linux-amd64.asc gpg --keyserver keys.openpgp.org --recv EB114F5E6C0DC2BCDD183550A4B61A2DC5923710 gpg --verify forgejo-${VERSION}-linux-amd64.asc forgejo-${VERSION}-linux-amd64 ``` Renommer : ``` ln -s forgejo-${VERSION}-linux-amd64 forgejo chown root:git . forgejo chmod g=rx . forgejo ``` ## Intégration du service dans Systemd Forgejo propose un fichier prêt à l'emploi dont il faut modifier manuellement quelques paramètres. Fichier personnalisé à mettre dans `/etc/systemd/system/forgejo.service` : ``` [Unit] Description=Forgejo (Beyond coding. We forge.) After=syslog.target After=network.target Wants=postgresql.service After=postgresql.service [Service] # Modify these two values and uncomment them if you have # repos with lots of files and get an HTTP error 500 because # of that ### #LimitMEMLOCK=infinity #LimitNOFILE=65535 RestartSec=2s Type=simple User=git Group=git WorkingDirectory=/srv/forgejo/ ExecStart=/srv/forgejo/bin/forgejo web --config /etc/forgejo/forgejo.ini Restart=always Environment=USER=git HOME=/srv/forgejo/ GITEA_WORK_DIR=/srv/forgejo [Install] WantedBy=multi-user.target ``` Démarrage et activation du service : ``` systemctl daemon-reload systemctl enable forgejo.service systemctl start forgejo.service ``` ## Premier démarrage Suite au premier démarrage, ouvrir un navigateur web sur le site et cliquer sur « connexion ». Alors une page de configuration générale s'ouvre. La remplir comme suit : - base de données : - type de base de données : Postgresql - hôte : 127.0.0.1:5432 - nom d'utilisateur : forgejodba - mot de passe : xxxxxxxxxxxx - nom de la base : forgejodb - SSL : Disable - Schéma : vide - configuration générale : - titre du site : La forge Libre en Communs - Emplacement racine des dépôts : /srv/forgejo/data/forgejo-repositories - Répertoire racine Git LFS : /srv/forgejo/data/lfs - exécuter avec le compte d'un autre utilisateur : git - domaine du serveur : forge.a-lec.org - chemin des fichiers log : /var/log/forgejo/ - laisser les autres valeurs par défaut - paramètres facultatifs : - paramètres emails : - hôte SMTP : localhost - port SMTP : 25 - envoyer les mails en tant que : ne-pas-repondre@forge.a-lec.org - exiger la confirmation de l'email lors de l'inscription : oui - activer les notifications par email : oui - paramètres serveurs et tierces parties : - activer le mode hors-ligne : OUI (servira toutes les ressources localement) - désactiver Gravatar : OUI - activer les avatars unifiés : NON - activer l'inscription OpenID : NON - désactiver le formulaire d'inscription : non - n'autoriser l'inscription qu'à partir des services externes : non - activer l'inscription OpenID : non - activer le CAPTCHA : OUI - exiger la connexion à un compte pour afficher les pages : non - masquer les adresses e-mail par défaut : non - autoriser la création d'organisation par défaut : NON - activer le suivi de temps par défaut : NON - Domaine pour les e-mails cachés : noreply.localhost - paramètres de compte administrateur : - nom : alecadmin (admin est refusé par le formulaire) - mot de passe : xxxxxxxxxxx - adresse email : admin@a-lec.org Puis cliquer sur « Installer Forgejo ». Un fichier de configuration a été créé dans `/etc/forgejo/forgejo.ini`. Par la suite, les valeurs pourront être modifiées dans ce fichier. Précautions : ``` chown -R root:git /etc/forgejo chmod g=rx /etc/forgejo chmod g=r /etc/forgejo/forgejo.ini ``` Vérifier que : ``` [server] ROOT_URL = https://forge.a-lec.org/ ``` Pour vérifier, lancer un test via Gitea > Site Administration > Configuration > SMTP Mailer Configuration > Envoyer un e-mail de test. ## Licences préférées Extrait de la documentation : ``` PREFERRED_LICENSES: Apache License 2.0,MIT License: Preferred Licenses to place at the top of the list. Name must match file name in conf/license or custom/conf/license. ``` Les noms de fichiers à utiliser sont présents dans les sources : https://github.com/go-gitea/gitea/tree/master/options/license Paramétrage dans /etc/gitea/gitea.ini : ``` [repository] PREFERRED_LICENSES=AGPL-3.0-or-later,GPL-3.0-or-later,CC-BY-SA-4.0 ``` ## Taille maximale de téléversement Par défaut, la taille maximale d'un téléversement est limité à 3 Mo. Pour augmenter la taille (à 20 Mo pour la forge Chalec), ajouter une section dans /etc/forgejo/forgejo.ini : ``` [repository.upload] ; Whether repository file uploads are enabled. Defaults to `true` ; ENABLED = true ; Path for uploads. Defaults to `data/tmp/uploads` (tmp gets deleted on gitea restart) ; TEMP_PATH = data/tmp/uploads ; One or more allowed types, e.g. image/jpeg|image/png. Nothing means any file type ; ALLOWED_TYPES = ; Max size of each file in megabytes. Defaults to 3MB FILE_MAX_SIZE = 20 ; Max number of files per upload. Defaults to 5 ; MAX_FILES = 5 ``` Pour les téléversements de version (release) : ``` [attachment] ; Max size of each file. Defaults to 4MB MAX_SIZE = 20 ``` ## Taille maximale de téléversement Par défaut, la taille maximale d'un téléversement est limité à 3 Mo. Pour augmenter la taille (à 20 Mo pour la forge Chalec), ajouter une section dans /etc/gitea/gitea.ini : ``` [repository.upload] ; Whether repository file uploads are enabled. Defaults to `true` ; ENABLED = true ; Path for uploads. Defaults to `data/tmp/uploads` (tmp gets deleted on gitea restart) ; TEMP_PATH = data/tmp/uploads ; One or more allowed types, e.g. image/jpeg|image/png. Nothing means any file type ; ALLOWED_TYPES = ; Max size of each file in megabytes. Defaults to 3MB FILE_MAX_SIZE = 20 ; Max number of files per upload. Defaults to 5 ; MAX_FILES = 5 ``` Pour les téléversements de version (release) : ``` [attachment] ; Max size of each file. Defaults to 4MB MAX_SIZE = 20 ``` # Personnalisation ## Favicon + logo barre Enrichir l'arborescence de personnalisation : ``` mkdir -p /srv/forgejo/custom/public/img cd /srv/forgejo/custom/public/img wget https://git.a-lec.org/a-lec/commissions/chalec/forge/-/raw/main/forge.chalec.org-logo.svg mv forge.chalec.org-logo.svg logo.svg cp logo.svg favicon.svg chmod go+r * ``` ## Page d'accueil Ajouter le logo sans marge (pour gagner de la place d'affichage) : ``` mkdir -p /srv/forgejo/custom/public/img cd /srv/forgejo/custom/public/img wget https://git.a-lec.org/a-lec/commissions/chalec/forge/-/raw/main/forge.chalec.org-logo-nomarge.svg chmod go+r * ``` Télécharger le code de la page d'accueil officielle et la remplacer par une version personnalisée : ``` mkdir -p /srv/forgejo/custom/templates/ cd /srv/forgejo/custom/public/templates/ wget https://raw.githubusercontent.com/go-gitea/gitea/release/v1.16/templates/home.tmpl mv home.tmpl home.tpml.bak wget https://git.a-lec.org/a-lec/commissions/chalec/forge/-/raw/main/custom/templates/home.tmpl systemctl restart forgejo ``` La version personnalisée du code la page d'accueil est là : https://git.a-lec.org/a-lec/commissions/chalec/forge/-/raw/main/home.tmpl. Ce code est potentiellement impacté par les mises à jour et sera à vérifier à chaque fois. # Mise à jour Constat : * Forgejo consiste en un seul fichier binaire, une base de données, une arborescence de fichiers ; * la documentation officielle de Gitea contient une page sur les backups : https://docs.gitea.io/en-us/backup-and-restore/. Donc la procédure de mise à jour consiste juste à faire un export puis relancer avec le nouveau binaire. ATTENTION : toujours lire `changelog` avant toute mise à jour /!\/!\/!\ Installer les scripts : ``` cd /srv/forgejo/bin/ wget https://git.a-lec.org/a-lec/commissions/infrastructure/forge/-/raw/main/bin/check_update wget https://git.a-lec.org/a-lec/commissions/infrastructure/forge/-/raw/main/bin/upgrade wget https://git.a-lec.org/a-lec/commissions/infrastructure/forge/-/raw/main/bin/doctor chmod u+x check_update upgrade doctor ``` Vérifier la disponibilité d'une mise à jour : ``` cd /srv/forgejo/bin/ ./check_update ``` Mise à jour automatique via le script `bin/upgrade` : ``` cd /srv/forgejo/bin/ ./upgrade 1.XX.YY-ZZ ``` Démarrer : ``` systemctl start forgejo ; systemctl status forgejo ; journal -f -u forgejo ``` Ou suivant la configuration : ``` systemctl start forgejo ; systemctl status forgejo ; tail -f /var/log/forgejo/forgejo.log ``` Faire manuellement le nettoyage dans les anciens dump et les anciennes versions. # StatoolInfos Le déploiement de StatoolInfos se fait selon la procédure nominale. Quelques remarques : - forcer IPv6 dans le script `statoolinfos` ; - créer un token admin pour la génération de métriques spécifiques.