# Service stats.a-lec.org Service de statistiques/métriques de Libre en Communs basé sur le logiciel libre StatoolInfos : https://forge.devinsy.fr/devinsy/statoolinfos. Équipe : Christian Momon (@cpm) Anciens de l'équipe : n/a. Ce service s'articule en deux parties : - côté serveur stats.a-lec.org : - un fichier properties décrit le Libre en Communs, - une moulinette collecte des fichiers properties et s'en sert pour générér le site web, - côté services LeC : - un fichier properties décrivant le service, - un fichier properties de métriques contenant les statistiques du services, - un programme lancé quotidiennement pour compléter le fichier properties de métriques. Pour déployer StatoolInfos sur un service LeC, aller directement à la [section dédiée](./README.md#ajout-dun-nouveau-service) de la documentation. # Installation basique du site web Actuellement, le site web est statique et généré par la moulinette `statoolinfos` toutes les heures. 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/stats.a-lec.org` : ``` server { listen 80; listen [::]:80; server_name stats.a-lec.org; access_log /var/log/nginx/stats.a-lec.org-access.log; error_log /var/log/nginx/stats.a-lec.org-error.log; } ``` Activer la configuration : ``` cd /etc/nginx/sites-enabled/ ln -s ../sites-available/stats.a-lec.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 `/etc/nginx/statoolinfos.conf` qui sera includé plus tard : ``` location /.well-known/statoolinfos/ { charset utf-8; types { text/plain properties; } alias /srv/statoolinfos/well-known/statoolinfos/; autoindex on; } ``` Mettre beau le fichier `/etc/nginx/sites-enabled/stats.a-lec.org` : ``` server { listen 80; listen [::]:80; server_name stats.a-lec.org; access_log /var/log/nginx/stats.a-lec.org-access.log; error_log /var/log/nginx/stats.a-lec.org-error.log; #return 302 https://$host$request_uri; return 302 https://stats.a-lec.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 stats.a-lec.org; access_log /var/log/nginx/stats.a-lec.org-access.log; error_log /var/log/nginx/stats.a-lec.org-error.log; ssl_certificate /etc/letsencrypt/live/stats.a-lec.org/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/stats.a-lec.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; root /var/www/stats.a-lec.org; location = / { index index.xhtml; } } ``` Vérifier que c'est bon et recharger : ``` nginx -t && systemctl reload nginx ``` # Déploiement du générateur de site web ## Configuration /etc/hosts Le programme StatoolInfos va faire des requêtes web sur la vm donc il a besoin de la voir. Pour éviter d'avoir un court-circuit proxy ipv4, modifier le fichier `/etc/hosts` pour déclarer stats.a-lec.org en ipv6 locale uniquement : ``` 127.0.0.1 localhost 127.0.1.1 stats # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback stats.a-lec.org stats ff02::1 ip6-allnodes ff02::2 ip6-allrouters ``` ## Configuration de Java Java : ``` apt-get install openjdk-11-jre-headless ``` ## Espace de travail Dossiers de travail : ``` mkdir -p /srv/statoolinfos/{conf,inputs,well-known} mkdir -p /srv/statoolinfos/well-known/statoolinfos/ ln -s /var/www/stats.a-lec.org /srv/statoolinfos/www ``` Déployer les catégories : copier le dossier https://framagit.org/chatons/chatonsinfos/-/tree/master/StatoolInfos/categories dans `/srv/statoolinfos/inputs/`. Créer un fichier de configuration `/srv/statoolinfos/conf/alec.conf` pour le générateur : ``` # [Configuration] conf.class=federation conf.protocol=StatoolInfos-0.5 conf.crawl.input=https://stats.a-lec.org/.well-known/statoolinfos/a-lec.properties conf.crawl.cache=/srv/statoolinfos/cache/ conf.htmlize.categories=/srv/statoolinfos/inputs/categories/categories.properties conf.htmlize.input=https://stats.a-lec.org/.well-known/statoolinfos/a-lec.properties conf.htmlize.directory=/srv/statoolinfos/www/ ``` Créer le fichier `properties` de type `federation` nommé `/srv/statoolinfos/well-known/statoolinfos/alec.properties` : ``` # [File] file.class=federation file.generator=Cpm file.datetime=2022-01-12T02:24:35 file.protocol=StatoolInfos-0.4.0 # [Federation] federation.name=Libre en Commnuns federation.description=L'association Libre en Communs federation.website=https://www.a-lec.org/ federation.logo=https://stats.a-lec.org/.well-known/statoolinfos/alec-logo.svg federation.contact.url= federation.contact.email=contact@a-lec.org federation.socialnetworks.mastodon= federation.legal.url= federation.guide.user= federation.guide.technical= federation.startdate=12/2021 federation.enddate= # [Subs] subs.infra=https://stats.a-lec.org/.well-known/statoolinfos/infra.properties subs.services=https://stats.a-lec.org/.well-known/statoolinfos/services.properties # [Metrics] metrics.members.count.2021 = 2 metrics.members.in.2021 = 2 metrics.members.out.2021 = 0 metrics.members.count.2022 = 2 metrics.members.in.2022 = 0 metrics.members.out.2022 = 0 ``` Vérifier la validité des valeurs et placer dans `/srv/statoolinfos/well-known/statoolinfos/` les images de logos nécessaires. Créer le fichier `properties` de type `organization` nommé `/srv/statoolinfos/well-known/statoolinfos/infra.properties` : ``` # [File] file.class=organization file.generator=Cpm file.datetime=2022-01-12T02:22:02.096451 file.protocol=StatoolInfos-0.5 # [Organization] organization.name=Infra organization.description=Les services d'infrastructure de Libre en Communs organization.website=https://www.a-lec.org/ organization.logo=https://stats.a-lec.org/.well-known/statoolinfos/alec-infra-logo.svg organization.status.level=ACTIVE organization.status.description=En activité organization.owner.name=Libre en Communs organization.owner.website=https://www.a-lec.org/ organization.owner.logo=https://stats.a-lec.org/.well-known/statoolinfos/alec-logo-carre.png organization.contact.url= organization.contact.email=contact@a-lec.org organization.socialnetworks.mastodon= organization.legal.url= organization.guide.user= organization.guide.technical= organization.startdate=12/2021 organization.enddate= organization.memberof.chalec.status.level=IDLE organization.memberof.chalec.status.description= organization.memberof.chalec.startdate=01/10/2021 organization.memberof.chalec.enddate= organization.country.name=France organization.country.code=FR # [Subs] subs.stats.a-lec.org=https://stats.a-lec.org/.well-known/statoolinfos/stats.a-lec.org.properties subs.www.a-lec.org=https://www.a-lec.org/.well-known/statoolinfos/www.a-lec.org.properties ``` Vérifier la validité des valeurs et placer dans `/srv/statoolinfos/well-known/statoolinfos/` les images de logos nécessaires. Créer le fichier `properties` de type `organization` nommé `/srv/statoolinfos/well-known/statoolinfos/services.properties` : ``` # [File] file.class=organization file.generator=Cpm file.datetime=2022-01-12T02:22:02.096451 file.protocol=StatoolInfos-0.5 # [Organization] organization.name=Services au public organization.description=Les services au public de Chalec organization.website=https://www.chalec.org/ organization.logo=https://stats.chalec.org/.well-known/statoolinfos/chalec-services-logo.svg organization.status.level=ACTIVE organization.status.description=En activité organization.owner.name=Chalec organization.owner.website=https://www.chalec.org/ organization.owner.logo=https://www.chalec.org/.well-known/statoolinfos/chalec-logo-carre.png organization.contact.url= organization.contact.email=contact@chalec.org organization.socialnetworks.mastodon= organization.legal.url= organization.guide.user= organization.guide.technical= organization.startdate=12/2021 organization.enddate= organization.memberof.chalec.status.level=IDLE organization.memberof.chalec.status.description= organization.memberof.chalec.startdate=12/2021 organization.memberof.chalec.enddate= organization.country.name=France organization.country.code=FR # [Subs] subs.audio=https://audio.chalec.org/.well-known/statoolinfos/audio.chalec.org.properties subs.libreverse=https://libreverse.chalec.org/.well-known/statoolinfos/libreverse.chalec.org.properties ``` Vérifier la validité des valeurs et placer dans `/srv/statoolinfos/well-known/statoolinfos/` les images de logos nécessaires. Récupérer la dernière version de StatoolInfos sur https://forge.devinsy.fr/devinsy/statoolinfos/releases. Puis placer dans `/srv/statoolinfos/bin/` les fichiers `statoolinfos.jar` et `statoolinfos.sh`. Faire un lien : ``` cd /srv/statoolinfos/bin/ ln -s statoolinfos.sh statoolinfos ``` Créer le script `/srv/statoolinfos/bin/crawl` : ``` #!/bin/bash cd $(dirname "$0") ./statoolinfos crawl ../conf/alec.conf ``` Créer le script `/srv/statoolinfos/bin/htmlize` : ``` #!/bin/bash cd $(dirname "$0") ./statoolinfos htmlize ../conf/alec.conf chmod -R go+rX ../www/ ``` Créer le script `/srv/statoolinfos/bin/probe` : ``` #!/bin/bash cd $(dirname "$0") ./statoolinfos probe -previousday ../conf/ ``` Créer le script `/srv/statoolinfos/bin/refresh` : ``` #!/bin/bash cd $(dirname "$0") ./probe ./crawl ./uptime ./htmlize ``` Créer le script `/srv/statoolinfos/bin/uptime` : ``` #!/bin/bash cd $(dirname "$0") ./statoolinfos uptime ../conf/alec.conf ``` Donner le droit d'exécution des scripts : ``` chmod u+x crawl htmlize probe refresh uptime ``` Créer le cron `/etc/cron.d/statoolinfos` : ``` 4 * * * * root /srv/statoolinfos/bin/refresh >> /srv/statoolinfos/statoolinfos-cron.log ``` # Ajout d'un nouveau service Tout se passe sur la vm du service, sauf la dernière étape. ## Configuration d'Apache Création d'un fichier générique `cat /etc/apache2/statoolinfos.conf` qui sera includé plus tard : ``` Alias "/.well-known/statoolinfos/" "/srv/statoolinfos/well-known/statoolinfos/" # Autoriser l'indexation par Apache et donc un affichage même sans index.html ou .php… Options +Indexes # Forcer le type de fichier correspondant aux extensions .properties avec le support de l'UTF-8. # Permet l'affichage dans le navigateur et l'affichage correct des accents par exemple. AddType "text/plain; charset=UTF-8" .properties # Donner le droit d'accès à tout le monde. Require all granted ``` ## Configuration de Nginx Création d'un fichier générique `cat /etc/nginx/statoolinfos.conf` qui sera includé plus tard : ``` # location ^~ /.well-known/statoolinfos/ # En cas de conflit de location. location /.well-known/statoolinfos/ { charset utf-8; types { text/plain properties; } alias /srv/statoolinfos/well-known/statoolinfos/; autoindex on; } ``` ## Espace de travail Dossiers de travail : ``` mkdir -p /srv/statoolinfos/{conf,well-known} mkdir -p /srv/statoolinfos/well-known/statoolinfos/ ``` ## Déclaration du service Configurer l'accès well-known en ajoutant à la fin de la configuration Apache du site : ``` # StatoolInfos Include statoolinfos.conf ``` Ou au début du bloc `server` du fichier de configuration Nginx du site : ``` # StatoolInfos. include /etc/nginx/statoolinfos.conf; ``` Avertissement : parfois, pour certaines applications, un conflit de `location` peut exister et alors une adaptation est à faire. Créer le fichier properties de type service à `/srv/statoolinfos/well-known/statoolinfos/foo.chalec.org.properties`. Une documentation des propriétés est disponible là : https://framagit.org/chatons/chatonsinfos/-/blob/master/MODELES/service.properties Vérifier les permissions de lecture : ``` chmod go+r /srv/statoolinfos/well-known/statoolinfos/* ``` ## Renseigner le fichier properties d'organisation Sur la vm `stats.alec.org`, éditer `/srv/statoolinfos/well-known/statoolinfos/services.properties` et ajouter une ligne `subs` : ``` subs.foo=https://foo.alec.org/.well-known/statoolinfos/foo.alec.org.properties ``` # Génération de métrics ## Configuration de Java Java : ``` apt-get install openjdk-11-jre-headless ``` ## Déploiement de statoolinfos Récupérer la dernière version de StatoolInfos sur https://forge.devinsy.fr/devinsy/statoolinfos/releases. Puis placer dans `/srv/statoolinfos/bin/` les fichiers `statoolinfos.jar` et `statoolinfos.sh`. Faire un lien : ``` cd /srv/statoolinfos/bin/ ln -s statoolinfos.sh statoolinfos ``` ## Configuration Créer un fichier de configuration dans `/srv/statoolinfos/conf/foo.a-lec.org.conf` : ``` conf.class=service conf.protocol=StatoolInfos-0.5 conf.probe.types=HttpAccessLog, HttpErrorLog conf.probe.httpaccesslog.file=/var/log/nginx/foo.a-lec.org-access.log* conf.probe.httperrorlog.file=/var/log/nginx/foo.a-lec.org-error.log* conf.probe.target=/srv/statoolinfos/well-known/statoolinfos/foo.a-lec.org-metrics.properties ``` Pour prendre connaissance de paramètres de configuration spécifiques, consulter le [projet StatoolInfos](https://forge.devinsy.fr/devinsy/statoolinfos#generate-metrics-files). Vérifier les permissions de lecture : ``` chmod go+r /srv/statoolinfos/well-known/statoolinfos/* ``` ## Génération Faire une première génération de métrics : ``` /srv/statoolinfos/bin/statoolinfos probe -full /srv/statoolinfos/conf/ ``` Vérifier les permissions de lecture : ``` chmod go+r /srv/statoolinfos/well-known/statoolinfos/* ``` Créer un cron `/etc/cron.d/statoolinfos` : ``` 2 * * * * root /srv/statoolinfos/bin/statoolinfos probe -previousday /srv/statoolinfos/conf/ >> /srv/statoolinfos/statoolinfos-cron.log ``` Faire un lien : ``` cd /srv/statoolinfos ln -s /etc/cron.d/statoolinfos cron ``` ## Renseigner le fichier properties de service Sur la vm du service, éditer `/srv/statoolinfos/well-known/statoolinfos/foo.a-lec.org.properties` et ajouter une ligne `subs` : ``` subs.foo=https://foo.a-lec.org/.well-known/statoolinfos/foo.a-lec.org-metrics.properties ```