diff --git a/README.md b/README.md index cafff2e..ad76132 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,408 @@ -# Service FORGE +# Service forge.chalec.org -Service de forge logicielle du candidat chaton de Libre en communs. +Service de forge logicielle du candidat chaton de Libre en communs basé sur le logiciel libre Gitea : https://gitea.io/. Responsable: Christian Momon (@cpm) + +Anciens responsables : n/a. + +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. + +À noter l'absence de paquet dans Debian : https://docs.gitea.io/en-us/install-from-package/#debian + +À noter l'absence de paquet deb pertinent : + +> Although there is a package of Gitea in Debian’s contrib, it is not supported directly by us. +> Unfortunately, the package is not maintained anymore and broken because of missing sources. +> Please follow the deployment from binary guide instead. + +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/. + + +# Intallation + +## 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; +} +``` + +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. + +Créer un utilisateur (« role » en langage Pgsql) : + +``` +su -c "psql" - postgres +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/gitea/ \ + git +``` + +## Préparation des fichiers + +Création de l'arborescence dédiée : + +``` +export GITEA_WORK_DIR=/srv/gitea +mkdir -p $GITEA_WORK_DIR/{custom,data} +chown -R git:gitea $GITEA_WORK_DIR +chmod -R ug+x $GITEA_WORK_DIR +chmod -R o-rwx $GITEA_WORK_DIR +``` + +``` +mkdir /etc/gitea +chown root:gitea /etc/gitea +chmod ug+rwx /etc/gitea +chmod o-rwx /etc/gitea +``` + +``` +mkdir /var/log/gitea +chown git.gitea /var/log/gitea +``` + +## Récupération du binaire + +Gitea consiste en un seul fichier binaire : + +``` +mkdir /srv/gitea/bin +cd /srv/gitea/bin/ +``` + +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 : +``` +wget -O gitea https://dl.gitea.io/gitea/$GITEA_VERSION/gitea-$GITEA_VERSION-linux-amd64 +chown root.gitea . gitea +chmod g=rx . gitea +``` + +Installer gpg : +``` +apt-get install gpg +``` + +Vérifier sa signature : +``` +wget https://dl.gitea.io/gitea/$GITEA_VERSION/gitea-$GITEA_VERSION-linux-amd64.asc +gpg --keyserver pgp.mit.edu --recv 7C9E68152594688862D62AF62D9AE806EC1592E2 +gpg --verify gitea-$GITEA_VERSION-linux-amd64.asc gitea +``` + + + +## Intégration du service dans Systemd + +La documentation de Gitea contient une page dédiée : + + https://docs.gitea.io/en-us/linux-service/ + +Gitea propose un fichier prêt à l'emploi dont il faut modifier manuellement quelques paramètres : + + https://github.com/go-gitea/gitea/blob/master/contrib/systemd/gitea.service + +Fichier personnalisé pour la forge April à mettre dans /etc/systemd/system/gitea.service : +``` +[Unit] +Description=Gitea (Git with a cup of tea) +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=gitea +WorkingDirectory=/srv/gitea/ +ExecStart=/srv/gitea/bin/gitea web --config /etc/gitea/gitea.ini +Restart=always +Environment=USER=git HOME=/srv/gitea/ GITEA_WORK_DIR=/srv/gitea + +[Install] +WantedBy=multi-user.target +``` + +Démarrage et activation du service : +``` +systemctl enable gitea.service +systemctl start gitea.service +``` + + +## 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 Devinsy), 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 +``` + +# Mettre à jour + +Constat : + +* Gitea 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. + +## Méthode automatique +Voir le script `update-gitea`. + +## Méthode manuelle + +Les étapes de la méthode manuelle : +* définir dans une variable le numéro de la nouvelle version : +``` +export VERSION=1.X.Y +``` + +* récupérer la dernière version sur https://dl.gitea.io/gitea et faire un sha256sum -c : +``` +cd /srv/gitea/bin +wget https://dl.gitea.io/gitea/$VERSION/gitea-$VERSION-linux-amd64 +wget https://dl.gitea.io/gitea/$VERSION/gitea-$VERSION-linux-amd64.asc +wget https://dl.gitea.io/gitea/$VERSION/gitea-$VERSION-linux-amd64.sha256 +sha256sum -c gitea-$VERSION-linux-amd64.sha256 +# gpg --keyserver keys.openpgp.org --recv 7C9E68152594688862D62AF62D9AE806EC1592E2 +gpg --verify gitea-$VERSION-linux-amd64.asc gitea-$VERSION-linux-amd64 +``` + +* stopper : +``` +systemctl stop gitea +``` + +* dumper : +``` +su - gitea -c "cd /srv/gitea/bin ; /srv/gitea/bin/gitea dump --tempdir /var/tmp/ -c /etc/gitea/gitea.ini" +``` + +* mettre les bons droits : +``` +cd /srv/gitea/bin/ +chown git.gitea gitea-$VERSION-linux-amd64 +chmod u+x gitea +``` + +* remplacer le binaire /srv/gitea/bin/gitea : +``` +ln --force gitea-$VERSION-linux-amd64 gitea +``` + +* démarrer : +``` +systemctl start gitea +``` + +* surveiller les logs : +``` +journal -f +``` +ou suivant la configuration : +``` +tail -f /var/log/gitea/gitea.log +``` + +* supprimer manuellement l'ancien dump et les anciennes versions.