Installer Semapps sans Docker

Semapps est un projet intéressant de bases de connaissances distribué basé sur les spécifications Solid.

Lors de mes premiers test, j’ai été bloqué par Docker nécessitant plus de 4Go de RAM, que je n’ai pas. On va donc retenter une install sans Docker étant donné que celui-ci est utilisé pour créer le serveur Fuseki, mais que ce serveur Fuseki peut être installé en décompressant un simple ZIP.

Selon la doc officielle de Semapps, nous devons d’abord unstaller le serveur LDP.

Donc après avoir installé NodeJs nous pouvons installer Moleculer (un outil permettant de faire communiquer les microservices entre eux) en global avec la commande

npm install -g moleculer-cli

On peut ensuite initialiser le projet semapps avec la commande

moleculer init assemblee-virtuelle/semapps-template-ldp semapps

On répond oui à toutes les interrogations, même s’il est bien entendu que nous ne pourrons pas utiliser Docker, mais c’est ce que j’avais fait la première fois, donc on va repartir sur la même base, et cel permettra de voir ce qui cloche par rapport à une install avec Docker

? Do you need a local instance of Jena Fuseki (with Docker)? Yes
? Do you need a read-only SPARQL endpoint? Yes
Create ‘semapps’ folder…
? Would you like to run ‘npm install’? Yes
semapps init

Jusque là tout va bien on continue en omettant docker-compose up qui plante de toute façon

cd semapps
npm run dev

Et là… Oh surprise, gros message d’erreur

...
request to http://localhost:3030/$/datasets/localData failed, reason: connect ECONNREFUSED 127.0.0.1:3030 FetchError: request to http://localhost:3030/$/datasets/localData failed, reason: connect ECONNREFUSED 127.0.0.1:3030
...

Logique on n’a pas de serveur Fuseki qui tourne, donc on va l’installer manuellement. Notez au passage que Semapps recherche http://localhost:3030/$/datasets/localData donc il nous faudra un dataset ‘localData’ et le port 3030 est celui part défaut du serveur Fuseki.

Pour installer Fuseki, rien de plus simple, il suffit en fait de télécharger et décompresser l’archive que vous trouverez à cette adresse https://jena.apache.org/download/ (attention prenez bien Apache Jena Fuseki… A chaque que je reviens sur cette page, je me fais avoir & télécharge Apache Jena ;-)) C’est bien Apache Jena Fuseki que l’on veut.

au jour où j’écris ces lignes, c’est la 3.17.0 qui est dispo.

prenons le zip https://miroir.univ-lorraine.fr/apache/jena/binaries/apache-jena-fuseki-3.17.0.zip

décompressez-le et renommer éventuellement le dossier en ‘fuseki’ tout court pour faciliter le lancement plus tard

pour lancer Fuseki, nous aurons également besoin de Java JRE à télécharger ici https://www.java.com/fr/download/

Une fois le zip de Fuseki décompressé, vous pouvez ouvrir une autre fenêtre de commande et lancer Fuseki de la manière suivante, déjà pour voir si ça tourne…

cd fuseki
fuseki-server

Autorisez éventuellement le pare-feu pour les applis Java

si tout va bien, la série de lignes affichée devrait se terminer par un truc du style

17:04:40 INFO Server :: Started 2020/12/28 17:04:40 CET on port 3030

nous devrions donc avoir notre serveur Fuseki qui tourne, allons vérifier à l’adresse http://localhost:3030

Apache Jena Fuseki

Il ne nous reste plus qu’à créer le dataset ‘localData’ que nous avons repéré tout à l’heure, et à croiser les doigts…

Cliquez sur l’onglet ‘manage dataset’ puis sur ‘add new dataset’.

Dans le champ ‘dataset name’, saisissez ‘localData’
et cocher ‘Persistent (TDB2)’

et validez en cliquant sur le bouton ‘Create dataset’

Create Semapps ‘localData’ dataset

Notre dataset est maintenant créé

localData created

Si on relance maintenant la commande

npm run dev

on peut voir que notre serveur Semapps est opérationnel !!! Bravissimo !!!

semapps server running

On peut maintenant passer au test du serveur https://semapps.org/docs/guides/ldp-server#testing-your-ldp-server

Test de Semapps

on va utiliser https://addons.mozilla.org/fr/firefox/addon/restclient/ qu’il faut installer dans un navigateur Firefox ça vous rajoute une petite icone carrée rouge avec un engrenage dans la barre juste à côté du menu du navigateur.

L’idée est ici d’utiliser la méthode POST pour envoyer des données à notre serveur Semapps tout frais.

L’exemple de données proposé fait référence à une ancienne implementation avec un container /resources, mais celui-ci n’esiste plus:

POST /resources HTTP/1.1Host: localhost:3000Content-Type: application/jsonAccept: */*Content-Length: 97{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Note",
"name": "Hello World"
}

Ce qui veut dire en gros que l’on va envoyer une ‘Note’ avec le nom ‘Hello World’ à l’adresse http://localhost:3000/resources

NB : oui c’est bien le port 3000 (celui du serveur Semapps) et c’est lui qui se chargera d’envoyer ça au serveur Fuseki (port 3030)

Nous allons utiliser le container /persons car comme évoqué plus haut, /resources n’esiste plus

Donc avec Rest-Client (l’icone carrée rouge), choisissez la méthode POST, l’url http://localhost:3000/persons et dans Body, collez le json suivant en se basant sur les specifications ActivityStreams :

{
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Person",
"name": "Guillaume Cousin"
}
post on semapps

Dans la réponse, on voit sur la ligne l’adresse de la personne qui vient d’être créée

et si on se rend sur notre instance Semapps à l’adresse http://localhost:3000/persons

on la retrouve à l’adresse http://localhost:3000/persons/5fea10811332c894ceb28250

Et si on clique dessus, on a bien notre personne

Person dans Semapps

Pour terminer, si maintenant vous utilisez Rest-Client pour effectuer une requête GET à l’adresse http://localhost:3000/persons, vous retrouverez vos données au format turtle :

En modifiant le Content-Type en application/json, lors du POST, nous n’avons pas vraiment le même résultat et on post vraiment du json ce qui est some toute préférable (“text/plain” ou “application/json” ??? a vous de voir selon votre besoin…)

main Project : "un robot qui range ma chambre" robot that tidy my room. Working on "how can robots share informations ?" how can we tell them what we want...

main Project : "un robot qui range ma chambre" robot that tidy my room. Working on "how can robots share informations ?" how can we tell them what we want...