FediPhoto I

En esta serie de artículos voy a explicar cómo funciona "FediPhoto", una aplicación Java hecha desde cero y (casi) sin dependencias que se integra en el Fediverso, a.k.a. Mastodon usando el protocolo ActivityPub

Fediverso

WARNING

Esto es un resumen muy particular

El llamado Fediverso es un conjunto de aplicaciones distribuidas que "hablan" un mismo protocolo abierto. Estas aplicaciones, en el 99%, se orientan a formar redes sociales donde un usuario con cuenta en una de ellas puede interactuar con usuarios en otras aplicaciones

Los casos de aplicaciones más conocidas en el fediverso pueden ser Mastodon, una aplicación de microblogging tipo Twitter (paso de llamarle X) o Peertube una aplicación orientada a la publicación de vídeos similar a Youtube

Como estas aplicaciones usan el protocolo ActivityPub pueden dialogar entre sí de tal forma que un usuario de una de ellas puede seguir a un usuario en la otra y ver en su timeline la actividad de este

ActivityPub

El protocolo ActivityPub, implementado por estas aplicaciones, es el que especifica el qué y el cómo tienen que enviarse actividades las aplicaciones para los usuarios de cada una pueda interactuar con las de otras. Todo ello de forma abierta y siguiendo las especificaciones del W3C

Dicho de forma burda, el protocolo especifica de qué forma un usuario en una instancia Mastodon, por ejemplo, puede obtener información sobre otro usuario en otra instancia, tanto Mastodon como Peertube por ejemplo, y cómo estos dos servidores (en nombre de esos usuarios) se intercambian "actividades" de sus usuarios

ActivityPub se basa en conceptos muy simples:

  • sólo especifica la publicación de actividades. NO en cómo transmitir o visualizar el resultado de esta actividad

  • las partes de una activity son: un actor, un objeto y una acción o verbo

  • el descubrimiento de usuarios usa la spec Webfinger (la veremos en otro post)

  • los mensajes de un usuario entre instancia van firmados con las claves publico-privadas de ese usuario

FediPhoto

En esa serie vamos a ir viendo cómo desarrollar una aplicación super-super-super-simple en Java que se integre en el Fediverso, de tal forma que cualquier usuario podrá:

  • descubrir los detalles de un usuario de esta instancia

  • seguir (y abandonar) a este usuario

  • recibir una activity en su timeline cuando el usuario publica una foto

Por su parte, el usuario "propietario" de la instancia podrá simplemente publicar fotos copiándola en un directorio "input" y el sistema se encargará de notificar que hay una nueva foto a sus followers de forma automática

Stack

Mi framework favorito de Java es de hace unos años Micronaut por lo que lo usaremos para llegar a construir un binario Linux mediante GraalVM

Así mismo mi build tool preferida es Gradle (por encima de Maven). En principio sería fácil usar Maven simplemente teniendo en cuenta los puntos que detallaré a continuación

La aplicación es super sencilla por lo que no usará ni base de datos, sólo carpetas y ficheros locales.

Tampoco tendrá un interface web.

Para comenzar usaremos el starter kit que ofrece Micronaut y crearemos un proyecto simple sin ninguna "feature" especial

Una vez descomprimido el zip en una carpeta de trabajo, revisaremos el build.gradle prestando atención a estas partes:

build.gradle
dependencies {
    annotationProcessor("io.micronaut:micronaut-http-validation")
    annotationProcessor("io.micronaut.openapi:micronaut-openapi")
    annotationProcessor("io.micronaut.openapi:micronaut-openapi-adoc")
    annotationProcessor("io.micronaut.serde:micronaut-serde-processor")
    implementation("io.micronaut.serde:micronaut-serde-jackson")
    implementation("io.micronaut:micronaut-http-client")
    compileOnly("io.micronaut.openapi:micronaut-openapi-annotations")
    runtimeOnly("ch.qos.logback:logback-classic")
    testImplementation("io.micronaut:micronaut-http-client")

    implementation("org.tomitribe:tomitribe-http-signatures:1.1")
}

Incluiremos la ultima dependencia para que nos facilite la parte de generar la firma http, por lo demás como se puede ver las dependencias son mínimas.

Para poder interactuar e incluso depurar la aplicación en desarrollo tenemos que poder acceder desde "fuera" y además vía SSL. Yo uso ngrok que me crea un túnel entre mi máquina e internet

application.properties
fediphoto.domain=tu-dns.ngrok-free.app
fediphoto.users=data/users

En domain tienes que poner el dns que te haya asignado Ngrok o el proxy que uses

Próximos pasos

En los siguientes artículos veremos:

  • el core, que inspecciona automaticamente las carpetas de usuarios y crea las claves publico/privada para cada uno, así como las carpetas de cada uno para detectar si hay que publicar una foto

  • el descubrimiento de usuarios

  • el Inbox/Outbox de usuarios

  • Recibiendo un Follow por usuario y guardándola

  • Enviando una notificación a los followers

Este texto ha sido escrito por un humano

This post has been written by a human

2019 - 2026 | Mixed with Bootstrap | Baked with JBake v2.6.7 | Terminos Terminos y Privacidad