C’était il y a plus d’un an, on commençait à fêter les 40 ans de Radio Panik et j’ajoutais à ce moment une publication automatique vers Mastodon des podcasts publiés; je notais alors qu’il y aurait sans doute à publier également les actualités et que de manière générale ça m’intéressait de réfléchir à une plus réelle intégration d’ActivityPub dans le site web.
Un an plus tard il y a comme une arrivée massive sur Mastodon et j’ai enfin ajouté le bout de code pour également y publier les actualités, cette partie était facile.
Pour davantage d’intégration par contre j’avais de loin des espoirs en TakahÄ“, un serveur ActivityPub écrit en Python mais c’est au point mort et ça n’était de toute façon pas prévu pour être branché dans une autre application, donc de toute façon les espoirs étaient minces.
Plus récemment je lisais un article comparant techniquement ActivityPub et ATProto (le protocole de Bluesky) (How decentralized is Bluesky really?, de Christine Lemmer-Webber) et c’était intéressant notamment dans la comparaison des ressources nécessaires,
Hosting a fediverse server is cheap particularly if you use something like GotoSocial is lightweight enough where one could host a server for one's family or friends on a device as light as a Raspberry Pi style form factor. It may require a lot of technical expertise, I may have many critiques of how it runs, but it's possible to host a fully participating fediverse node quite cheaply.
et ce passage m’a donc mis GoToSocial en tête pour expérimentation future.
L’effervescence récente a ça de bon que ça m’a remis dans ce bain et le plongeon a eu lieu ce week-end, go to installation de GoToSocial donc. Il y a la documentation officielle et sous la main j’avais aussi l’article "A complete guide for your GoToSocial server" et j’y allais en me disant qu’ok bon, ça n’était pas packagé pour Debian mais que tant pis, pas de purisme, je pouvais utiliser leur binaire.
Ça s’est installé facilement, j’ai créé un compte, j’y ai mis une image de bannière, j’y ai mis une image d’avatar, et plouf inondation dans les logs,
SIGILL: illegal instruction PC=0x7fe1212a1e7c m=9 sigcode=2 instruction bytes: 0x66 0xf 0x3a 0xb 0xc0 0x0 0x48 0xb9 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0x7f goroutine 2683 gp=0xc004059500 m=9 mp=0xc000a67808 [running]: […] (des pages entières)
Je perds un peu de temps avant de simplement aller voir les tickets existants et d’y trouver ce problème précis, (ticket 3412), le truc étant le petit processeur du server (Atom N2800) à qui est envoyé une instruction qu’il ne prend pas en charge. Le ticket se termine sur la suggestion d’utiliser la version i386 et ça marche dans le sens où l’erreur n’apparait plus, mais c’est une autre à la place, et c’était déjà annoncé dans le dernier commentaire du ticket donc pas de grosse surprise…
Okay, got news on this... Compiling with GOARCH=386 seems to fix this issue. I'll check how wasm is compiled on startup. I now, however, get ffprobe error: operation not permitted (-63) when trying to fetch most media. Don't know if it's related. Closing as it's from my end, thanks everyone :)
En gros GoToSocial utilise ffmpeg pour le traitement d’images mais utilise sa propre version compilée en "WebAssembly" pour pouvoir être exécutée de la manière la plus sécurisée possible, et c’est là-dedans que ça foire. Le ticket n’en fait pas mention mais il existe une option de compilation pour plutôt utiliser la version ffmpeg du système, et donc cette fois vraiment il va falloir compiler moi-même GoToSocial.
Ça se passe très bien.
Le problème est résolu, je peux continuer à explorer, j’arrive à "follow" un compte mais par contre il y a un message d’erreur dans les logs quand j’essaie de modifier mon compte ou poster quelque chose,
func=workers.(*clientAPI).UpdateAccount level=ERROR msg="error federating account update: UpdateAccount: error sending activity *typeupdate.ActivityStreamsUpdate via outbox https://social.0d.be/users/admin/outbox: https://social.0d.be/users/admin/followers resp was not ActivityPub media type: "
Comme j’ai déjà la tête dans les tickets j’y reste et je trouve facilement le 3530 qui correspond suaf que ça se résoud pas très clairement "I have since been tinkering some more, and it started working all of a sudden." et ça ne m’aide pas beaucoup.
35 onglets plus tard, pour découvrir le langage Go suffisamment pour débugguer ça,
reqTrace, _ := httputil.DumpRequestOut(resp.Request, true) respTrace, _ := httputil.DumpResponse(resp, true) log.Printf("XXX req: %s", reqTrace) log.Printf("XXX resp : %s", respTrace)
j’arrive à écrire dans les logs la réponse reçue et c’est :
HTTP/0.0 200 OK {"@context":"https://www.w3.org/ns/activitystreams","items":[],"type":"Collection"}
Il y a bien une réponse avec du contenu qui semble le bon format mais il n’y a pas l’entête Content-Type qui est attendu ? Et en fait pas d’entête du tout ? Et c’est écrit HTTP/0.0 c’est quoi ce numéro de version ? Et quand je mets des logs supplémentaires à l’endroit qui fait la requête HTTP ils n’apparaissent pas ?
En continuant à dérouler le debug j’arrive au commentaire qui explique tout :
// If the request is to us, we can shortcut for // certain URIs rather than going through the normal // request flow, thereby saving time and energy. if iri.Host == config.GetHost() {
Comme il voit que c’est une requête pour lui-même, plutôt que s’interroger il va appeler du code particulier et créer une fausse réponse en tirant les infos directement de la base de données.
De là la belle histoire pourrait continuer et j’ouvrirais encore des onglets pour ajouter le nécessaire pour que cette fausse réponse passe les tests et que tout rentre dans l’ordre et j’enverrais un patch et il serait intégré et ça serait super.
Mais non, je court-circuite la belle histoire, je supprime le raccourci en transformant ça en if iri.Host == config.GetHost() && false {
et ça fonctionne et j’ajoute un commentaire au ticket pour expliquer ça mais je ne me lance pas dans un patch propre.
C’est plutôt l’heure de se demander quoi faire maintenant que ça fonctionne, avant de revenir à des idées pour la radio, je me dis que peut-être je pourrais me fondre dans la masse des nouveaux arrivants du fedivers et voir comment ça s’y passe. Je fais ça.
Un peu plus tard, j’ajoute un post, je veux le modifier (tout le monde dit que c’est un truc super dans Mastodon), mais GoToSocial ça n’est pas Mastodon, et modifier un post, ça n’est pas encore possible. Mais c’est dans les tickets, c’est même dans les tickets résolus parce que ça sera là dans la prochaine version (c’est la PR 3597).
Bilan plutôt chouette et même si je ne vais pas me lancer tout de suite dans les contributions au projet je me dis que ça pourrait arriver. Et grosse satisfaction à voir au fil des heures les liens se tisser, les instances se fédérer, une par une et à l’heure actuelle 800, la fédération ça fonctionne, des logiciels différents peuvent interopérer, c’est très joli tout ça.