Acerca del proyecto

Página de inicioPágina de publicación
captura principalcaptura del chat

Lemmy es similar a sitios como Menéame, Reddit, Lobste.rs, Raddle, o Hacker News: te subscribes a los foros que te interesan, publicas enlaces y debates, luego votas y comentas en ellos. Entre bastidores, es muy diferente; cualquiera puede gestionar fácilmente un servidor, y todos estos servidores son federados (piensa en el correo electrónico), y conectados al mismo universo, llamado Fediverso.

Para un agregador de enlaces, esto significa que un usuario registrado en un servidor puede suscribirse a los foros de otro servidor, lo que le permite mantener discusiones con usuarios registrados en otros lugares.

El objetivo general es crear una alternativa a reddit/menéame y otros agregadores de enlaces, fácilmente auto-hospedada, descentralizada, y fuera del control e intromisión corporativa de éstos.

Cada servidor lemmy puede establecer su propia política de moderación; nombrando a los administradores del sitio y a los moderadores de la comunidad para mantener alejados a los trolls, fomentar un entorno saludable y no tóxico en el que todos puedan sentirse cómodos contribuyendo.

La Federación está en constante desarrollo

¿Por qué se llama Lemmy?

Desarrollado Con

Características

  • Código abierto, Licencia AGPL.
  • Auto-hospedado, fácil de desplegar (deploy).
  • Interfaz limpia y fácil de usar. Apta para dispositivos móviles.
    • Sólo se requiere como mínimo un nombre de usuario y una contraseñar para inscribirse!
    • Soporte de avatar de usuario.
    • Hilos de comentarios actualizados en directo.
    • Puntuaciones completas de los votos (+/-) como en el antiguo reddit.
    • Temas, incluidos los claros, los oscuros, y los solarizados.
    • Emojis con soporte de autocompletado. Empieza tecleando :
      • Ejemplo miau :cat: => miau 🐈
    • Etiquetado de Usuarios con @, etiquetado de Comunidades con !.
      • Ejemplo @miguel@lemmy.ml me invitó a la comunidad !gaming@lemmy.ml
    • Carga de imágenes integrada tanto en las publicaciones como en los comentarios.
    • Una publicación puede consistir en un título y cualquier combinación de texto propio, una URL o nada más.
    • Notificaciones, sobre las respuestas a los comentarios y cuando te etiquetan.
      • Las notificaciones se pueden enviar por correo electrónico.
    • Soporte de i18n / internacionalización.
    • Fuentes RSS / Atom para Todo All, Suscrito Subscribed, Bandeja de entrada inbox, Usuario User, y Comunidad Community.
  • Soporte para la publicación cruzada (cross-posting).
    • búsqueda de publicaciones similares al crear una nueva. Ideal para comunidades de preguntas y respuestas.
  • Capacidades de moderación.
    • Registros públicos de moderación.
    • Puedes pegar las publicaciones a la parte superior de las comunidades.
    • Tanto los administradores del sitio, como los moderadores de la comunidad, pueden nombrar a otros moderadores.
    • Puedes bloquear, eliminar y restaurar publicaciones y comentarios.
    • Puedes banear y desbanear usuarios de las comunidades y del sitio.
    • Puedes transferir el sitio y las comunidades a otros.
  • Puedes borrar completamente tus datos, reemplazando todas las publicaciones y comentarios.
  • Soporte para publicaciones y comunidades NSFW.
  • Alto rendimiento.
    • El servidor está escrito en rust.
    • El front end está comprimido (gzipped) en ~80kB.
    • El front end funciona sin javascript (sólo lectura).
    • Soporta arm64 / Raspberry Pi.

Metas

Esta sección contiene ideas y recursos del equipo que desarrolla Lemmy. Parecido a un bloc de notas

  • Piensa en un nombre / nombre clave.
  • Debe tener comunidades.
  • Debe tener comentarios hilados.
  • Debe ser federado: enlazar y seguir comunidades en todas las instancias.
  • Debe estar actualizado en vivo: tener un panel derecho para nuevos comentarios y un panel principal para la vista completa de los hilos.
    • Usar websockets para publicar (post) / obtener (gets) hacia tu propia instancia.

Preguntas

  • ¿Cómo funciona la votación? ¿Debemos volver a la antigua forma de mostrar y contar los votos negativos? ¿O sólo una puntuación?
  • Decidir la tecnología que se utilizará
    • Backend: Actix, Diesel.
    • Frontend: inferno, typescript y bootstrap por ahora.
  • ¿Deberia permitir bots?
  • ¿Deberían los comentarios/votos ser estáticos, o sentirse como un chat, como flowchat?.
    • Modelo de dos paneles - El panel derecho para comentarios en vivo, el panel izquierdo para la vista en árbol en vivo
    • En el móvil, permite cambiar entre ellos. ¿Por defecto?

Recursos / Librerías potenciales

Tendencia / Popular / Mejor algoritmo de clasificación

Metas

  • Durante el día, las nuevas publicaciones y comentarios deben estar cerca de la parte superior, para que puedan ser votados.
  • Después de un día más o menos, el factor tiempo debería desaparecer.
  • Utilizar una escala logarítmica, ya que los votos tienden a convertirse en una bola de nieve, por lo que los primeros 10 votos son tan importantes como los siguientes cien.

Implementaciones

Reddit

No tiene en cuenta la duración del hilo, lo que da a los primeros comentarios una ventaja abrumadora sobre los posteriores, siendo el efecto aún peor en las comunidades pequeñas. Los nuevos comentarios se acumulan en la parte inferior del hilo, acabando con la discusión y convirtiendo cada hilo en una carrera por comentar antes. Esto reduce la calidad de la conversación y premia los comentarios repetitivos y el spam.

Hacker News

Aunque es muy superior a la implementación de Reddit por su decaimiento de las puntuaciones en el tiempo, el algoritmo de clasificación de Hacker News no utiliza una escala logarítmica para las puntuaciones.

Lemmy

Contrarresta el efecto de bola de nieve de los votos a lo largo del tiempo con una escala logarítmica. Anula la ventaja inherente de los primeros comentarios y garantiza que los votos sigan siendo importantes a largo plazo, sin perjudicar los comentarios populares más antiguos.

Rank = ScaleFactor * log(Max(1, 3 + Score)) / (Time + 2)^Gravity

Score = Upvotes - Downvotes
Time = time since submission (in hours)
Gravity = Decay gravity, 1.8 is default
  • Lemmy utiliza el mismo algoritmo Rank anterior, en dos tipos: Active y Hot.
    • El algoritmo "activo" utiliza los votos de las publicaciones y el tiempo de los últimos comentarios (limitado a dos días).
    • Hot utiliza los votos de las publicaciones, y la hora de publicación de los mismos.
  • Utiliza Max(1, score) para asegurarse de que todos los comentarios se ven afectados por el decaimiento del tiempo.
  • Añade 3 a la puntuación, para que todo lo que tenga menos de 3 downvotes parezca nuevo. De lo contrario, todos los comentarios nuevos se quedarían en cero, cerca del fondo.
  • El signo y los abs de la puntuación son necesarios para tratar el registro de las puntuaciones negativas.
  • Un factor de escala de 10k obtiene el rango en forma de número entero.

Un gráfico del rango a lo largo de 24 horas, de puntuaciones de 1, 5, 10, 100, 1000, con un factor de escala de 10k.

Conteo de usuarios activos

Lemmy también muestra el conteo de usuarios activos de tu sitio y sus comunidades. Estos se cuentan en el último día day, semana week, mes month y medio año half year, almacenándose en caché al iniciar Lemmy, y cada hora.

Un usuario activo es alguien que ha publicado o comentado en nuestra instancia o comunidad en el último periodo de tiempo. Para el conteo de sitios, sólo se cuentan los usuarios locales. Para los conteos de la comunidad, se incluyen los usuarios federados.

Guía de Lemmy

¿Eres nuevo aquí? Esta sección es la indicada para que los nuevos (y no tan nuevos 😙) usuarios puedan sacar provecho de todo lo que Lemmy ofrece.

Vídeo Explicativo (en inglés)

Comandos Útiles

Empieza tecleando...

  • @nombre_usuario para obtener una lista de nombres de usuario.
  • !nombre_comunidad para obtener una lista de comunidades.
  • :emoji para obtener una lista de emojis.

Clasificación

Se aplica tanto a las publicaciones como a los comentarios.

TipoDescripción
ActivoTendencias ordenadas en base a la puntuación, y la hora del comentario mas reciente.
PopularTendencias ordenadas en base a la puntuación, y la hora de creación de la publicación.
NuevoLas publicaciones más nuevas.
Más comentadosLas publicaciones con más comentarios.
Nuevos comentariosLas publicaciones con los comentarios más recientes, es decir un ordenamiento tipo foro.
TopLas publicaciones con mayor puntuación en el periodo de dado.

Para más detalles, revisa el Apartado de la Clasificación de las publicaciones y los comentarios.

Moderación / Administración

Todas las acciones de los moderadores y administradores sobre los usuarios se realizan en los comentarios o entradas, haciendo clic en el icono de 3 puntos "Más".

Esto incluye:

  • Agregar / Eliminar mods y admins.
  • Eliminar / Restaurar comentarios.
  • Banear / Desbanear usuarios.

Todas las acciones de los administradores en las comunidades se realizan en la barra lateral de la comunidad. Esto actualmente sólo incluye la eliminación/restauración de comunidades.

Guía de Markdown

Enriquece todas tus publicaciones / comentarios aplicando el formato Markdown para que el texto no se vea tan aburrido.

TipoO… para obtener
*Italica*_Italica_Italica
**Negrita**__Negrita__Negrita
# Titulo 1Titulo 1
=========

Titulo 1

## Titulo 2Titulo 2
---------
Titulo 2
[enlace](http://a.com)[enlace][1]

[1]: http://b.org
enlace
![Imagen](http://url/a.png)![Imagen][1]

[1]: http://url/b.jpg
Markdown
> Cita en bloque
Cita en bloque
* Lista
* Lista
* Lista
- Lista
- Lista
- Lista
* Lista
* Lista
* Lista
1. Uno
2. Dos
3. Tres
1) Uno
2) Dos
3) Tres
1. Uno
2. Dos
3. Tres
Línea Horizontal
---
Línea Horizontal
***
Línea Horizontal

`Código en línea` con acento graveCódigo en línea con acento grave
```
# Bloque de código
print '3 acentos graves o'
print 'indentar 4 espacios'
```
····# Bloque de código
····print '3 acentos graves o'
····print 'indentar 4 espacios'
# Bloque de código
print '3 acentos graves o'
print 'indentar 4 espacios'
::: spoiler o nsfw oculto
mucho spoiler aquí
:::
spoiler o nsfw oculto

mucho spoiler aquí

Texto de ~subíndice~Texto de subíndice
Texto de ^superíndice^Texto de superíndice

Tutorial de CommonMark

Información Administrativa

Información para administradores de las instancias de Lemmy, y para aquellos que quieran gestionar un servidor.

Instalación

Métodos oficiales/soportados

Lemmy tiene dos métodos principales de instalación:

Recomendamos usar Ansible, porque simplifica la instalación y también facilita la actualización.

Otros métodos de instalación

⚠️ Bajo tu propio riesgo.

En algunos casos, puede ser necesario utilizar diferentes métodos de instalación. Pero no los recomendamos y no podemos dar soporte para ellos.

Instalación con Docker

Asegúrate de tener instalados tanto docker como docker-compose(>=1.24.0). En Ubuntu, simplemente ejecuta apt install docker-compose docker.io. Siguiente,

# crea una carpeta para los archivos de lemmy. La ubicación no importa, puede ser en cualquier sitio
mkdir /lemmy
cd /lemmy

# descarga los archivos de la configuración por defecto
wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/docker/prod/docker-compose.yml
wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/docker/lemmy.hjson
wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/docker/iframely.config.local.js

# Establece los permisos correctos para la carpeta pictrs
mkdir -p volumes/pictrs
sudo chown -R 991:991 volumes/pictrs

Abre tu docker-compose.yml, y asegúrate de que LEMMY_EXTERNAL_HOST para lemmy-ui esta configurado en el host correcto.

- LEMMY_INTERNAL_HOST=lemmy:8536
- LEMMY_EXTERNAL_HOST=your-domain.com
- LEMMY_HTTPS=false

Si quieres una contraseña de base de datos diferente, también debes cambiarla en el docker-compose.yml antes de tu primera ejecución.

Después de esto, echa un vistazo al archivo de configuración llamado lemmy.hjson, y ajústalo, en particular el nombre de host, y posiblemente la contraseña de la base de datos. Luego ejecuta:

docker-compose up -d

puedes acceder a la interfaz de usuario de lemmy (lemmy-ui) en http://localhost:1235

Para hacer que Lemmy esté disponible fuera del servidor, necesitas configurar un proxy inverso, como Nginx. Un ejemplo de configuración de ngix, podría ser establecido con:

wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/ansible/templates/nginx.conf
# Remplaza los {{ valores }}
# El valor por defecto para lemmy_port es 8536
# El valor por defecto para lemmy_ui_port es 1235
sudo mv nginx.conf /etc/nginx/sites-enabled/lemmy.conf

También necesitarás configurar el TLS, por ejemplo con Let's Encrypt. Después de esto necesitas reiniciar Nginx para recargar la configuración.

Actualizar

Para actualizar a la versión más reciente, puedes cambiar manualmente la versión en docker-compose.yml. De manera alternativa puedes obtener la última versión de nuestro repositorio git:

wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/docker/prod/docker-compose.yml
docker-compose up -d

Instalación con Ansible

Esto es lo mismo que la instalación con Docker, excepto que Ansible lo maneja todo automáticamente. También hace algunas cosas adicionales como la configuración de TLS y el correo electrónico para tu instancia Lemmy.

En primer lugar, necesitas instalar Ansible en tu computador local. Tambien necesitas instalar el SDK de Docker para Python usando pip install docker (más información en la documentación de Ansible).

A continuación, ejecuta los siguientes comandos en tu computador local:

git clone https://github.com/LemmyNet/lemmy.git
cd lemmy/ansible/
cp inventory.example inventory
nano inventory # ingresa tu servidor, dominio, correo electrónico de contacto
# Si el comando siguiente falla, es posible que tengas que comentar esta linea
# En el archivo ansible.cfg:
# interpreter_python=/usr/bin/python3
ansible-playbook lemmy.yml --become

Para actualizar a una nueva versión, simplemente ejecuta lo siguiente en tu repo local de Lemmy:

git pull origin main
cd ansible
ansible-playbook lemmy.yml --become

Instalar desde Cero

⚠️ Descargo de responsabilidad: este método de instalación no está recomendado por los desarrolladores de Lemmy. Si tienes algún problema, debes resolverlo tú mismo o preguntar a los respectivos autores. Si observas algún fallo de Lemmy en una instancia instalada de este modo, por favor, menciónalo en el informe de fallos.

Instalando Lemmy desde el código fuente

Instrucciones para instalar Lemmy de forma Nativa, sin depender de docker. Originalmente fue publicado en Some resources on setting Lemmy up from source - Lemmy dot C.A. La transcripción actual se ha adaptado para mejorar su legibilidad.

Importante

Las referencias de los paquetes de software a continuación son todas basadas en Gentoo - Hay información en los archivos de docker sobre lo que se requiere en los sistemas tipo debian, y para cualquier otra cosa probablemente podrás ajustar fácilmente como sea necesario.

Ten en cuenta que la construcción de Lemmy requiere de una gran cantidad de recursos de hardware. Si quieres ejecutar Lemmy en un pequeño VPS con una memoria RAM muy limitada (que parece una forma perfectamente aceptable para ejecutar una instancia de producción), es mejor seguir con la imagen docker, o usar un sistema que tenga más RAM. El uso de RAM es enorme con las builds de Rust.

Las versiones de etiqueta/lanzamiento incluidas en esta nota provienen de lemmy/docker/prod/docker-compose.yml y estaban actualizadas en el momento en que se creó este documento. Definitivamente ajustar a las versiones apropiadas como sea necesario.

Tuve que cambiar de usar sudo a su en algunos lugares ya que el usuario estaba haciendo algo raro/incompleto con el env de sudo para pictrs

Configuración

Dependencias
app-adminsudo
dev-vcsgit
dev-langrust
dev-dbpostgresql
www-serversnginx
sys-appsyarn
app-shellsbash-completion

Poner en marcha el postgresql

emerge --config dev-db/postgresql
rc-service postgresql-12 start
useradd -m -s /bin/bash lemmy
cd ~lemmy
sudo -Hu lemmy git clone https://github.com/LemmyNet/lemmy.git
cd lemmy

Lista las etiquetas(tags)/lanzamientos(releases) disponibles

sudo -Hu lemmy git tag -l
sudo -Hu lemmy git checkout tags/v0.11.0

Build para producción? (Remover --release para dev)

sudo -Hu lemmy cargo build --release
cd ..
sudo -Hu lemmy git clone https://github.com/LemmyNet/lemmy-ui.git
cd lemmy-ui

Lista las etiquetas(tags)/lanzamientos(releases) disponibles

sudo -Hu lemmy git tag -l
sudo -Hu lemmy git checkout tags/v0.8.10
sudo -Hu lemmy git submodule init
sudo -Hu lemmy git submodule update --remote

Construir el frontend

Esto es para desarrollo

sudo -Hu lemmy yarn

Esto es para producción

sudo -Hu lemmy yarn install --pure-lockfile
sudo -Hu lemmy yarn build:prod

Esto es solo para correr un entorno de desarrollo, pero creo que es preferible para producción - usar el script de inicio

sudo -Hu lemmy yarn dev

Para producción, usaremos el script de inicio, pero el comando para producción es:

sudo -Hu node dist/js/server.js

Configurar la base de datos

Ajustar la contraseña:

sudo -u postgres psql -c "create user lemmy with password 'password' superuser;" -U postgres
sudo -u postgres psql -c 'create database lemmy with owner lemmy;' -U postgres

Instalar iFramely

Son requeridos git y nodejs, pero nodejs debe ser instalado como dependencia de yarn.

En caso de que iFramely sea instalado en otro sistema

useradd -m -s /bin/bash iframely

cd ~iframely
sudo -Hu iframely git clone https://github.com/itteco/iframely.git
cd iframely
sudo -Hu iframely git tag -l
sudo -Hu iframely git checkout tags/v1.5.0
sudo -Hu iframely npm install

Opcional Remplazar puerto 80 por 8061; también remplazar o desabilitar el almacenamiento del cache por ahora (CACHE_ENGINE: 'no-cache')

sudo -Hu iframely cp ~lemmy/lemmy/docker/iframely.config.local.js ~lemmy/iframely/config.local.js

Iniciar el servidor iframely o, usar un script de inicio en su lugar, el cual es la mejor opción que correr esto manualmente.

sudo -Hu iframely node server

Instalar pict-rs

useradd -m -s /bin/bash pictrs
cp target/release/pict-rs .

Añadido hdri ya que magick_rust falla al compilar si no está. Mencionado en error[E0425]: cannot find value QuantumRange in module bindings

echo "media-gfx/imagemagick hdri jpeg lzma png webp" >> /etc/portage/package.use
echo "*/* -llvm_targets_NVPTX -llvm_targets_AMDGPU" >> /etc/portage/package.use

Instalar paquetes extra requeridos para pict-rs:

Paquetes
media-libsgexiv2
media-gfximagemagick
media-videoffmpeg
sys-develclang

Paquetes requeridos para pict-rs (en caso de un sistema separado):

Paquetes
dev-langrust

Opcional Hacer un script o ejecutarlo manualmente como usuario.

su - pictrs
git clone https://git.asonix.dog/asonix/pict-rs.git
cd pict-rs
git tag -l
git checkout tags/v0.2.5-r0

cargo build --release
cp target/release/pict-rs .
cd ~pictrs
mkdir pictrs-data

Falta algo en el README de pict-rs - creó y utilaza una carpeta pict-rs in /tmp

Si haces algo raro como yo (cambiar el usuario con el que se ejecuta pict-rs) y terminas con problemas de permisos (que los registros no te dicen Qué está teniendo un problema de permisos), este podría ser tu problema. Además, el tiempo dirá si esta carpeta se limpia adecuadamente o no.

Ejecutar pictrs de acuerdo a la siguiente línea:

pict-rs/pict-rs -a 127.0.0.1:9000 -p ~pictrs/pictrs-data/

Pero sólo usaremos el script init.

En este punto, corre todo a través de los scripts de inicio. Configura los scripts de inicio para que se ejecuten en el tiempo de arranque. Presumiblemente has configurado nginx y puedes llegar a tu instancia.


Actualizando

su - lemmy
cd lemmy

Haz BACKUP config/config.hjson en algún lugar.

git fetch
git tag -l
git checkout tags/WHATEVER

cargo build --release

cd ~/lemmy-ui

Lista las etiquetas(tags)/lanzamientos(releases) disponibles

git fetch
git tag -l
git checkout tags/WHATEVER
git submodule update --remote

Construir el frontend

Esto es para producción

yarn install --pure-lockfile   # Is this step really needed?
#yarn upgrade --pure-lockfile  # ?? Did I get it?
#yarn   # Is this step really needed?  One of these steps is for sure. (Should be unnecessary)
yarn build:prod

Reiniciar lemmy-ui

Actualizar iFramely

su - iframely
cd iframely
git fetch
git tag -l
git checkout tags/v1.6.0  # Or whatever the current appropriate release is
npm install

Reinicia iframely

Actualizar pict-rs

su - pictrs
cd pict-rs
git fetch
git tag -l
git checkout tags/v0.2.5-r0  # (or whatever is currently mentioned in the lemmy docker file)

cargo build --release
cp target/release/pict-rs .

Reinicia pictrs


Índice

configuración

ejemplo de config/config.hjson

{
  database: {
    user: "lemmy"
    password: "whatever"
    host: "localhost"
    port: 5432
    database: "lemmy"
    pool_size: 5
  }
  hostname: "lemmy.ca"
  bind: "127.0.0.1"
  port: 8536
  docs_dir: "/home/lemmy/lemmy/docs/book"
  pictrs_url: "http://localhost:9000"
  iframely_url: "http://localhost:8061"
  federation: {
    enabled: true
    allowed_instances: ""
    blocked_instances: ""
  }
  email: {
    smtp_server: "localhost:25"
    smtp_from_address: "lemmy@lemmy.ca"
    use_tls: false
  }
}

Scripts de inicio (init scripts)

init/iframely
#!/sbin/openrc-run

name="Iframely Daemon"

depend() {
        need localmount
        need net
}

start() {
        ebegin "Starting Iframely"
        start-stop-daemon --start --background --make-pidfile --user iframely --group iframely --pidfile /home/iframely/iframely.pid --chdir /home/iframely/iframely -3 /usr/bin/logger -4 /usr/bin/logger --exec node -- server
        eend $?
}

stop() {
        start-stop-daemon --stop --signal TERM --pidfile /home/iframely/iframely.pid
        eend $?
}
init/lemmy
#!/sbin/openrc-run

name="Lemmy Backend"

depend() {
        need localmount
        need net
}

start() {
        ebegin "Starting Lemmy"
        start-stop-daemon --start --background --make-pidfile --user lemmy --group lemmy --pidfile /home/lemmy/lemmy.pid --chdir /home/lemmy/lemmy -3 /usr/bin/logger -4 /usr/bin/logger --exec ~lemmy/lemmy/target/release/lemmy_server
        eend $?
}

stop() {
        start-stop-daemon --stop --signal TERM --pidfile /home/lemmy/lemmy.pid
        eend $?
}
init/lemmy-ui
#!/sbin/openrc-run

name="Lemmy UI"

depend() {
        need localmount
        need net
}

start() {
        ebegin "Starting Lemmy UI"
        start-stop-daemon --start --background --make-pidfile --user lemmy --group lemmy --pidfile /home/lemmy/lemmy-ui.pid --chdir /home/lemmy/lemmy-ui -3 /usr/bin/logger -4 /usr/bin/logger --exec node dist/js/server.js --env LEMMY_INTERNAL_HOST=127.0.0.1:8536 --env LEMMY_EXTERNAL_HOST=lemmy.ca --env LEMMY_HTTPS=true
        eend $?
}
init/pict-rs
#!/sbin/openrc-run

name="pict-rs Daemon"

depend() {
        need localmount
        need net
}

start() {
        ebegin "Starting pictrs"
        start-stop-daemon --start --background --make-pidfile --user pictrs --group pictrs --pidfile /home/pictrs/pictrs.pid --chdir /home/pictrs/pict-rs -3 /usr/bin/logger -4 /usr/bin/logger --exec /home/pictrs/pict-rs/pict-rs -- -a 127.0.0.1:9000 -p ~pictrs/pictrs-data
        eend $?
}

stop() {
        start-stop-daemon --stop --signal TERM --pidfile /home/pictrs/pictrs.pid
        eend $?
}

Instalando en AWS

⚠️ Descargo de responsabilidad: este método de instalación no está recomendado por los desarrolladores de Lemmy. Si tienes algún problema, debes resolverlo tú mismo o preguntar a los respectivos autores. Si observas algún fallo de Lemmy en una instancia instalada de este modo, por favor, menciónalo en el informe de fallos.

Lemmy AWS CDK

Contiene las definiciones de infraestructura necesarias para desplegar Lemmy en AWS su Cloud Development Kit.

Incluye:

  • ECS fargate cluster
    • Lemmy-UI
    • Lemmy
    • Pictrs
    • IFramely
  • CloudFront CDN
  • Almacenamiento EFS para subir imágenes.
  • Aurora Serverless Postgres DB
  • Bastion VPC host
  • Balanceadores de carga para Lemmy y IFramely
  • Registros DNS para tu sitio.

Inicio rápido

Clona el Lemmy-CDK.

Clona Lemmy y Lemmy-UI en el directorio de arriba.

cp example.env.local .env.local
# edit .env.local

Debes editar .env.local con la configuración de tu sitio.

npm install -g aws-cdk
npm install
cdk bootstrap
cdk deploy

Coste

Esta no es la forma más barata de ejecutar Lemmy. La base de datos sin servidor (serverless) Aurora puede costarte ~$90/mes (en dólares) si no duerme.

Comandos del CDK útiles

  • npm run build compila typescript a js
  • npm run watch vigila los cambios y compila
  • npm run test realiza las pruebas unitarias de jest
  • cdk deploy despliega esta pila en tu cuenta/región de AWS por defecto
  • cdk diff compara la pila desplegada con el estado actual
  • cdk synth emite la plantilla de CloudFormation sintetizada

Configuración

La configuración está basada en el archivo defaults.hjson. Este archivo también contiene la documentación de todas las opciones disponibles. Para anular los valores predeterminados, puedes copiar las opciones que deseas cambiar dentro de tu archivo local config.hjson.

Los archivos defaults.hjson y config.hjson se encuentran en config/defaults.hjson y config/config.hjson, respectivamente. Para cambiar estas localizaciones predeterminadas, puedes establecer las siguientes variables de entorno:

  • LEMMY_CONFIG_LOCATION # config.hjson
  • LEMMY_CONFIG_DEFAULTS_LOCATION # defaults.hjson

Adicionalmente, puedes sobrescribir cualquier archivo de configuración con las variables de entorno. Éstas tienen el mismo nombre que las opciones de configuración, llevando el prefijo LEMMY_. Por ejemplo, puedes sobrescribir el database.password con LEMMY_DATABASE__POOL_SIZE=10.

Una opción adicional LEMMY_DATABASE_URL está disponible, la cual puede ser usada con una cadena de conexión PostgreSQL como postgres://lemmy:password@lemmy_db:5432/lemmy, pasando todos los detalles de la conexión a la vez.

Si no se utiliza el contenedor Docker, cree manualmente la base de datos especificada anteriormente ejecutando los siguientes comandos:

cd server
./db-init.sh

Federación

Lemmy utiliza el protocolo ActivityPub (un estándar del W3C) para permitir la federación entre diferentes servidores (a menudo llamados instancias). Esto es muy parecido al funcionamiento del correo electrónico. Por ejemplo, si utilizas gmail.com, no sólo puedes enviar correos a otros usuarios de gmail.com, sino también a yahoo.com, yandex.ru, etc. El correo electrónico utiliza el protocolo SMTP para lograr esto, así que puedes pensar en ActivityPub como "SMTP para las redes sociales". La cantidad de acciones posibles en las redes sociales (publicar, comentar, gustar, compartir, etc.) hace que ActivityPub sea mucho más complicado que SMTP.

Al igual que con el correo electrónico, la federación de ActivityPub sólo se produce entre servidores. Así, si estás registrado en enterprise.lemmy.ml, sólo te conectas a la API de enterprise.lemmy.ml, mientras que el servidor se encarga de enviar y recibir datos de otras instancias (por ejemplo, voyager.lemmy.ml). La gran ventaja de este enfoque es que el usuario medio no tiene que hacer nada para utilizar la federación. De hecho, si está utilizando Lemmy, es probable que ya lo estés haciendo. Una forma de confirmarlo es ir a una comunidad o perfil de usuario. Si estás en enterprise.lemmy.ml y ves un usuario como @nutomic@voyager.lemmy.ml, o una comunidad como !main@ds9.lemmy.ml, entonces están federados, lo que significa que utilizan una instancia diferente a la tuya.

Una forma de aprovechar la federación es abrir una instancia diferente, como ds9.lemmy.ml, y navegar por ella. Si ves una comunidad, una publicación o un usuario interesante con el que quieres interactuar, sólo tienes que copiar su URL y pegarla en el campo de búsqueda de tu propia instancia (parte superior de página). Tu instancia se conectará a la otra (suponiendo que la lista de permitidos/bloqueados lo permita), y te mostrará directamente el contenido remoto, para que puedas seguir una comunidad o comentar un publicación. Estos son algunos ejemplos de búsquedas que funcionan:

  • !main@lemmy.ml (Comunidad)
  • @nutomic@lemmy.ml (Usuario)
  • https://lemmy.ml/c/programming (Comunidad)
  • https://lemmy.ml/u/nutomic (Usuario)
  • https://lemmy.ml/post/123 (Publicación)
  • https://lemmy.ml/comment/321 (Comentario)

Puedes ver la lista de instancias vinculadas siguiendo el enlace "Instancias" en la parte inferior de cualquier página de Lemmy.

Búsqueda de comunidades

Si buscas una comunidad por primera vez, inicialmente se obtienen 20 publicaciones. Sólo si al menos un usuario de tu instancia se suscribe a la comunidad remota, ésta enviará actualizaciones a tu instancia. Las actualizaciones incluyen:

  • Nuevas publicaciones / comentarios
  • Votos
  • Publicación, ediciones y supresiones de comentarios
  • Acciones de los modeladores

Puedes copiar la URL de la comunidad desde la barra de direcciones de tu navegador e insertarla en el campo de búsqueda. Espera unos segundos y la publicación aparecerá a continuación. Por el momento no hay un indicador de carga para la búsqueda, así que espera unos segundos si muestra "sin resultados".

Búsqueda de publicaciones

Pega la URL de una publicación en el campo de búsqueda de tu instancia de Lemmy. Espera unos segundos hasta que aparezca la publicación. Esto también recuperará el perfil de la comunidad y el perfil del creador de la publicación.

Búsqueda de comentarios

Si encuentras un comentario interesante bajo una publicación en otra instancia, puedes encontrar debajo del comentario en el menú de 3 puntos el símbolo del enlace. Copia este enlace. Se parece a https://lemmy.ml/post/56382/comment/40796. Elimina la parte post/XXX y ponlo en tu barra de búsqueda. Para este ejemplo, busqua https://lemmy.ml/comment/40796. Este comentario, todos los comentarios padre, usuarios, la comunidad y la publicación correspondiente se obtienen de la instancia remota, si no se conocen localmente.

Los comentarios hermanos no se obtienen. Si quieres más comentarios de publicaciones anteriores, tienes que buscar cada uno de ellos como se ha descrito anteriormente.

Solución de Problemas

Se muestran diferentes problemas que pueden ocurrir en una nueva instancia, y cómo resolverlos.

Muchas características de Lemmy dependen de una correcta configuración del proxy inverso. Asegúrate de que tu configuración es equivalente a nuestra configuración de nginx.

Generalidades

Registros

Para los problemas del frontend, revisa la consola del navegador para ver si hay mensajes de error.

Para los registros del servidor, ejecuta docker-compose logs -f lemmy en tu carpeta de instalación. También puedes hacer docker-compose logs -f lemmy lemmy-ui pictrs para obtener los registros de los diferentes servicios.

Si eso no da suficiente información, intenta cambiar la línea RUST_LOG=error en docker-compose.yml a RUST_LOG=info o RUST_LOG=verbose, y luego hacer docker-compose restart lemmy.

La creación del usuario administrador no funciona

Asegúrate de que el websocket está funcionando correctamente, revisa la consola del navegador en busca de errores. En nginx, las siguientes cabeceras son importantes para esto:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

Error de limite de velocidad cuando muchos usuarios acceden al sitio

Revisa que las cabeceras X-Real-IP y X-Forwarded-For son enviadas a Lemmy por el proxy inverso. De lo contrario, se contarán todas las acciones hacia el limite de velocidad de la IP del proxy inverso. En nginx debería verse así:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Federación

Otras instancias no pueden obtener objetos locales (comunidad, publicaciones, etc)

Tu proxy reverso (ejemplo nginx) necesita reenviar las solicitudes con la cabecera Accept: application/activity+json al backend. Esto es manejado por las siguientes líneas:

set $proxpass "http://0.0.0.0:{{ lemmy_ui_port }}";
if ($http_accept = "application/activity+json") {
set $proxpass "http://0.0.0.0:{{ lemmy_port }}";
}
if ($http_accept = "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") {
set $proxpass "http://0.0.0.0:{{ lemmy_port }}";
}
proxy_pass $proxpass;

Puedes probar que funciona correctamente ejecutando los siguientes comandos, todos ellos deberían devolver JSON válido:

curl -H "Accept: application/activity+json" https://your-instance.com/u/some-local-user
curl -H "Accept: application/activity+json" https://your-instance.com/c/some-local-community
curl -H "Accept: application/activity+json" https://your-instance.com/post/123 # the id of a local post
curl -H "Accept: application/activity+json" https://your-instance.com/comment/123 # the id of a local comment

La obtención de objetos remotos funciona, pero publicar/comentar en comunidades remotas falla

Comprueba que la federación está permitida en ambas instancias.

Asegúrate también de que la hora está ajustada con precisión en tu servidor. Las actividades están firmadas con una marca de tiempo, y serán descartadas si se desvía más de 10 segundos.

Guía de Copia de Seguridad Y Restauración

Docker y Ansible

Cuando se utiliza docker o ansible, debe haber una carpeta llamada volumes, la cual contiene tanto la Base de Datos como todas las Imágenes. Copia esta carpeta a la nueva instancia para restaurar tus datos.

Copia de seguridad incremental de la BD

Para hacer una copia de seguridad incremental de una base de datos en archivo .sql puedes ejecutar:

docker-compose exec postgres pg_dumpall -c -U lemmy >  lemmy_dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql

Un ejemplo de script de copia de seguridad

#!/bin/sh
# DB Backup
ssh MY_USER@MY_IP "docker-compose exec postgres pg_dumpall -c -U lemmy" >  ~/BACKUP_LOCATION/INSTANCE_NAME_dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql

# Volumes folder Backup
rsync -avP -zz --rsync-path="sudo rsync" MY_USER@MY_IP:/LEMMY_LOCATION/volumes ~/BACKUP_LOCATION/FOLDERNAME

Restauración de la BD

Si necesitas restaurar la base de datos a partir de un archivo pg_dumpall, primero necesitas borrar la base de datos existente

# Drop the existing DB
docker exec -i FOLDERNAME_postgres_1 psql -U lemmy -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"

# Restore from the .sql backup
cat db_dump.sql  |  docker exec -i FOLDERNAME_postgres_1 psql -U lemmy # restores the db

# This also might be necessary when doing a db import with a different password.
docker exec -i FOLDERNAME_postgres_1 psql -U lemmy -c "alter user lemmy with password 'bleh'"

Cambiar el nombre de dominio

Si aún no te has federado, puedes cambiar tu nombre de dominio en la base de datos. Advertencia: no haga esto después de haber federado o romperás la federación.

Entra al psql de tu docker:

docker-compose exec postgres psql -U lemmy

-- Post
update post set ap_id = replace (ap_id, 'old_domain', 'new_domain');
update post set url = replace (url, 'old_domain', 'new_domain');
update post set body = replace (body, 'old_domain', 'new_domain');
update post set thumbnail_url = replace (thumbnail_url, 'old_domain', 'new_domain');

-- Comments
update comment set ap_id = replace (ap_id, 'old_domain', 'new_domain');
update comment set content = replace (content, 'old_domain', 'new_domain');

-- User
update user_ set actor_id = replace (actor_id, 'old_domain', 'new_domain');
update user_ set inbox_url = replace (inbox_url, 'old_domain', 'new_domain');
update user_ set shared_inbox_url = replace (shared_inbox_url, 'old_domain', 'new_domain');
update user_ set avatar = replace (avatar, 'old_domain', 'new_domain');

-- Community
update community set actor_id = replace (actor_id, 'old_domain', 'new_domain');
update community set followers_url = replace (followers_url, 'old_domain', 'new_domain');
update community set inbox_url = replace (inbox_url, 'old_domain', 'new_domain');
update community set shared_inbox_url = replace (shared_inbox_url, 'old_domain', 'new_domain');

Más recursos

  • https://stackoverflow.com/questions/24718706/backup-restore-a-dockerized-postgresql-database

Federación

Visión General de la Federación

Este documento es para cualquiera que quiera saber como funciona la federación en Lemmy, sin ser demasiado técnico. Se pretende proporcionar una visión general de alto nivel de la federación ActivityPub en Lemmy. Si estás implementando ActivityPub por ti mismo y quieres ser compatible con Lemmy, lee nuestro esquema de la API de ActivityPub.

Convenciones de la documentación

Para mantener las cosas simples, a veces verás cosas formateadas como Crear/Nota Create/Note o Eliminar/Evento Delete/Event o Deshacer/Seguir Undo/Follow. La cosa antes de la barra es la Actividad, y la cosa después de la barra es el Objeto dentro de la Actividad, una propiedad del objeto objet. Así que estos deben ser leídos como sigue:

  • Create/Note: una actividad Create que contiene una Note en el campo del object
  • Delete/Event: una actividad Delete que contiene un Event en el campo del object
  • Undo/Follow: una actividad Undo que contiene un Follow en el campo del object

En Lemmy utilizamos algunos términos específicos para referirnos a los elementos de ActivityPub. Son esencialmente nuestras implementaciones específicas de conceptos conocidos de ActivityPub:

  • Comunidad (community): Grupo Group
  • Usuario (user): Persona Person
  • Publicación (post): Página Page
  • Comentario (comment): Nota Note

Este documento tiene tres secciones principales:

  • Filosofía de la federación: expone el modelo general de cómo se debe federar.
  • Actividades del usuario: describen las acciones que un usuario puede realizar para interactuar.
  • Actividades de la comunidad: describen lo que hace la comunidad en respuesta a determinadas acciones de los usuarios.

Filosofía de la federación

El actor principal de Lemmy es la Comunidad. Cada comunidad reside en una única instancia, y consiste en una lista de Publicaciones y una lista de seguidores. La interacción principal es la de un usuario que envía una actividad relacionada con una Publicación o un Comentario a la bandeja de entrada de la Comunidad, que la anuncia a todos sus seguidores.

Cada Comunidad tiene un Usuario creador específico, que es responsable de establecer las reglas, nombrar moderadores y eliminar el contenido que viola las reglas.

Además de la moderación a nivel de comunidad, cada instancia tiene un conjunto de Usuarios administradores, que tienen el poder de realizar eliminaciones y baneos en todo el sitio.

Los Usuarios siguen a las comunidades que les interesan para recibir Publicaciones y Comentarios. También votan las Publicaciones y los Comentarios, además de crear otros nuevos. Los Comentarios se organizan en una estructura de árbol y suelen ordenarse por número de votos. Los mensajes directos entre Usuarios también son compatibles.

Los Usuarios no pueden seguirse unos a otros, y las Comunidades tampoco pueden seguir nada.

Nuestra implementación de la federación ya está completa, pero hasta ahora no nos hemos centrado en absoluto en el cumplimiento de la especificación ActivityPub. Como tal, Lemmy probablemente no es compatible con las implementaciones que esperan enviar y recibir actividades válidas. Esto es algo que planeamos arreglar en un futuro próximo. Consulta el tema #698 para ver un resumen de nuestras desviaciones.

Actividades del usuario

Seguir a una Comunidad

Cada página de la Comunidad tiene un botón "Seguir". Al hacer clic en él, el usuario envía una actividad de Seguir Follow a la bandeja de entrada de la Comunidad. La Comunidad responderá automáticamente con una actividad de Aceptar/Seguir Accept/Follow a la bandeja de entrada del usuario. También añadirá al usuario a su lista de seguidores y le enviará cualquier actividad sobre las publicaciones/comentarios de la comunidad.

Dejar de seguir una Comunidad

Después de seguir una Comunidad, el botón "Seguir" se sustituye por "Dejar de seguir". Al hacer clic en él, se envía una actividad de Deshacer/Seguir Undo/Follow a la bandeja de entrada de la Comunidad. La Comunidad elimina al usuario de su lista de seguidores y ya no le envía ninguna actividad.

Crear una Publicación

Cuando un usuario crea una nueva publicación en una Comunidad determinada, se envía como Crear/Página Create/Page a la bandeja de entrada de la Comunidad.

Crear un Comentario

Cuando se crea un nuevo Comentario para una Publicación, tanto el ID de la Publicación como el ID del Comentario principal (si existe) se escriben en el campo in_reply_to. Esto permite asignarlo a la Publicación correcta y construir el árbol de Comentarios. A continuación, se envía a la bandeja de entrada de la Comunidad como Crear/Note Create/Note.

La instancia de origen también escanea el Comentario en busca de cualquier mención de Usuario, y envía el Crear/NotaCreate/Note a esos Usuarios también.

Editar una Publicación

Cambia el contenido de una Publicación existente. Sólo puede hacerlo el usuario que lo crea.

Editar un Comentario

Cambia el contenido de un Comentario existente. Sólo puede hacerlo el usuario que lo crea.

Me Gusta y No Me Gusta

Los usuarios pueden poner Me gustar o No me gusta de cualquier Publicación o Comentario. Estos se envían como Me gusta / Página like/Page, No me gusta / Nota Dislike/Note, etc. a la bandeja de entrada de la Comunidad.

Eliminaciones

El creador de una Publicación, Comentario o Comunidad puede eliminarla. Entonces se envía a los seguidores de la Comunidad. El elemento queda entonces oculto para todos los usuarios.

Remociones

Los mods pueden remover Publicaciones y Comentarios de sus Comunidades. Los administradores pueden remover cualquier Publicación o Comentario en todo el sitio. Las Comunidades también pueden ser removidas por los administradores. El elemento se oculta para todos los usuarios.

Las remociones se envían a todos los seguidores de la Comunidad, por lo que también tienen efecto allí. La excepción es si un administrador elimina un elemento de una Comunidad que está alojada en una instancia diferente. En este caso, la eliminación sólo tiene efecto a nivel local.

Revertir una acción anterior

No eliminamos nada de nuestra base de datos, sólo lo ocultamos a los usuarios. Las Comunidades/Publicaciones/Comentarios removidos o eliminados tienen un botón de "restauración". Este botón genera una actividad de Deshacer Undo que establece la actividad original de eliminar/remover como objeto, como Deshacer/Remover/Publicación Undo/Remove/Post o Deshacer/Eliminar/Comunidad Undo/Delete/Community.

Al hacer clic en el botón de "Voto positivo" (upvote) de una publicación/comentario ya votado (o en el botón de "Voto negativo" (downvote) de una publicación/comentario ya votado) también se genera un Deshacer Undo. En este caso Deshacer/Me gusta/Publicación Undo/Like/Post o Deshacer/No me gusta/Comentario Undo/Dislike/Comment.

Crear un mensaje privado

Los perfiles de los usuarios tienen un botón "Enviar mensaje", que abre un diálogo que permite enviar un mensaje privado a este usuario. Se envía como un Crear/Nota Create/Note a la bandeja de entrada del usuario. Los mensajes privados sólo pueden dirigirse a un único usuario.

Editar mensaje privado

Actualizar/Nota Update/Note cambia el texto de un mensaje enviado previamente.

Eliminar mensaje privado

Eliminar/Nota Delete/Note borra un mensaje privado.

Restaurar mensaje privado

Deshacer/Eliminar/Nota Undo/Delete/Note Revierte la eliminación de un mensaje privado.

Actividades de la Comunidad

La Comunidad es esencialmente un bot, que sólo hará algo en reacción a las acciones de los Usuarios. El usuario que creó la Comunidad por primera vez se convierte en el primer moderador, y puede añadir moderadores adicionales. En general, cada vez que la Comunidad recibe una actividad válida en su bandeja de entrada, esa actividad se reenvía a todos sus seguidores.

Aceptar seguir

Si la Comunidad recibe una actividad de Seguir Follow, responde automáticamente con Aceptar/Seguir Accept/Follow. También añade al Usuario a su lista de seguidores.

Dejar de seguir

Al recibir un Deshacer/Seguir Undo/Follow, la Comunidad elimina al Usuario de su lista de seguidores.

Anunciar

Si la Comunidad recibe cualquier actividad relacionada con una publicación o comentario (Crear, Actualizar, Me gusta, No me gusta, Eliminar, Borrar, Deshacer), lo anunciará a sus seguidores. Para ello, se crea un Anuncio con la Comunidad como actor, y la actividad recibida como objeto. De este modo, las instancias seguidoras se mantienen actualizadas sobre cualquier acción en las Comunidades que siguen.

Eliminar Comunidad

Si el creador o un administrador elimina la Comunidad, envía un Anuncio de Eliminar/Grupo Delete/Group a todos sus seguidores.

Recursos de ActivityPub

Documentos Oficiales

Explicaciones

Ejemplos y Bibliotecas

Protocolo de la Federación Lemmy

El protocolo de Lemmy (o Protocolo de la Federación Lemmy) es un subconjunto estricto del Protocolo ActivityPub. Cualquier desviación del protocolo ActivityPub es un error (bug) en Lemmy o en esta documentación (o ambos).

Este documento está dirigido a desarrolladores que están familiarizados con los protocolos ActivityPub y ActivityStreams. Ofrece un esquema detallado de los actores, objetos y actividades utilizados por Lemmy.

Antes de leerlo, echa un vistazo a nuestra Visión General de la Federación para hacerte una idea de cómo funciona la federación de Lemmy a alto nivel.

Lemmy todavía no sigue la especificación ActivityPub en todos los aspectos. Por ejemplo, no establecemos un contexto válido indicando nuestros campos de contexto. También ignoramos campos como la bandeja de entrada inbox, la bandeja de salida outbox o los puntos finales endpoints de los actores remotos, y asumimos que todo es Lemmy. Para una visión general de las desviaciones, lea el tema #698. Serán corregidas en un futuro próximo.

Lemmy también es realmente inflexible cuando se trata de actividades y objetos entrantes. Tienen que ser exactamente idénticos a los ejemplos de abajo. Cosas como tener un array en lugar de un solo valor, o un ID de objeto en lugar del objeto completo resultará en un error.

En las siguientes tablas, "obligatorio" se refiere a si Lemmy aceptará o no una actividad entrante sin este campo. El propio Lemmy siempre incluirá todos los campos no vacíos.

Contexto

{
    "@context": [
        "https://www.w3.org/ns/activitystreams",
        {
            "moderators": "as:moderators",
            "sc": "http://schema.org#",
            "stickied": "as:stickied",
            "sensitive": "as:sensitive",
            "pt": "https://join.lemmy.ml#",
            "comments_enabled": {
                "type": "sc:Boolean",
                "id": "pt:commentsEnabled"
            }
        },
        "https://w3id.org/security/v1"
    ]
}

El contexto es identico para todas las actividades y objetos.

Actores

Comunidad

Un actor automatizado. Los usuarios pueden enviarle mensajes o comentarios, que la comunidad reenvía a sus seguidores en forma de Anuncio Announce.

Envía actividades al usuario: Aceptar/Seguir Accept/Follow, Anunciar Announce.

Recibe actividades del usuario: Seguir Follow, Deshacer/Seguir Undo/Follow, Crear Create, Actualizar Update, Me gusta Like, No me gusta Dislike, Remover Remove (sólo admin/mod), Eliminar Delete (sólo creador), Deshacer Undo (sólo para acciones propias).

{
    "@context": ...,
    "id": "https://enterprise.lemmy.ml/c/main",
    "type": "Group",
    "preferredUsername": "main",
    "name": "The Main Community",
    "sensitive": false,
    "content": "Welcome to the default community!",
    "mediaType": "text/html",
    "source": {
        "content": "Welcome to the default community!",
        "mediaType": "text/markdown"
    },
    "icon": {
        "type": "Image",
        "url": "https://enterprise.lemmy.ml/pictrs/image/Z8pFFb21cl.png"
    },
    "image": {
        "type": "Image",
        "url": "https://enterprise.lemmy.ml/pictrs/image/Wt8zoMcCmE.jpg"
    },
    "inbox": "https://enterprise.lemmy.ml/c/main/inbox",
    "outbox": "https://enterprise.lemmy.ml/c/main/outbox",
    "followers": "https://enterprise.lemmy.ml/c/main/followers",
    "moderators": "https://enterprise.lemmy.ml/c/main/moderators",
    "endpoints": {
        "sharedInbox": "https://enterprise.lemmy.ml/inbox"
    },
    "published": "2020-10-06T17:27:43.282386+00:00",
    "updated": "2020-10-08T11:57:50.545821+00:00",
    "publicKey": {
        "id": "https://enterprise.lemmy.ml/c/main#main-key",
        "owner": "https://enterprise.lemmy.ml/c/main",
        "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9JJ7Ybp/H7iXeLkWFepg\ny4PHyIXY1TO9rK3lIBmAjNnkNywyGXMgUiiVhGyN9yU7Km8aWayQsNHOkPL7wMZK\nnY2Q+CTQv49kprEdcDVPGABi6EbCSOcRFVaUjjvRHf9Olod2QP/9OtX0oIFKN2KN\nPIUjeKK5tw4EWB8N1i5HOuOjuTcl2BXSemCQLAlXerLjT8xCarGi21xHPaQvAuns\nHt8ye7fUZKPRT10kwDMapjQ9Tsd+9HeBvNa4SDjJX1ONskNh2j4bqHHs2WUymLpX\n1cgf2jmaXAsz6jD9u0wfrLPelPJog8RSuvOzDPrtwX6uyQOl5NK00RlBZwj7bMDx\nzwIDAQAB\n-----END PUBLIC KEY-----\n"
    }
}
Nombre del CampoObligatorioDescripción
preferredUsernamesiNombre del actor
namesiTitulo de la comunidad
sensitivesiTrue indica que todas las publicaciones en la comunidad son nsfw
attributedTosiPrimero el creador de la comunidad, luego el resto de los moderadores
contentnoTexto para la barra lateral de lac comunidad, que suele contener una descripción y normas
iconnoIcono que aparece junto al nombre de la comunidad
imagenoImagen de banner, mostrada en la parte superior de la página de la comunidad
inboxnoURL de la bandeja de entrada de ActivityPub
outboxnoURL de la bandeja de salida de ActivityPub, sólo contiene las últimas 20 publicaciones sin comentarios, votos u otras actividades
followersnoURL de la colección de seguidores, sólo contiene el número de seguidores, sin referencias a seguidores individuales
endpointsnoContiene la URL de la bandeja de entrada compartida
publishednoFecha de creación de la comunidad
updatednoFecha de la última modificación de la comunidad
publicKeysiLa clave pública utilizada para verificar las firmas de este actor

Bandeja de Salida de la Comunidad

{
    "@context": ...,
    "items": [
      ...
    ],
    "totalItems": 3,
    "id": "https://enterprise.lemmy.ml/c/main/outbox",
    "type": "OrderedCollection"
}

La bandeja de salida sólo contiene las actividades Crear/Publicación Create/Post por ahora.

Seguidores de la Comunidad

{
  "totalItems": 2,
  "@context": ...,
  "id": "https://enterprise.lemmy.ml/c/main/followers",
  "type": "Collection"
}

La colección de seguidores sólo se utiliza para exponer el número de seguidores. Los ID de los actores no se incluyen, para proteger la privacidad de los usuarios.

Moderadores de la Comunidad

{
    "items": [
        "https://enterprise.lemmy.ml/u/picard",
        "https://enterprise.lemmy.ml/u/riker"
    ],
    "totalItems": 2,
    "@context": ...,
    "id": "https://enterprise.lemmy.ml/c/main/moderators",
    "type": "OrderedCollection"
}

Usuario

Una persona, interactúa principalmente con la comunidad en la que envía y recibe publicaciones/comentarios. También puede crear y moderar comunidades, y enviar mensajes privados a otros usuarios.

Envía actividades a la Comunidad: Seguir Follow, Deshacer/Seguir Undo/Follow, Crear Create, Actualizar Update, Me gusta Like, No me gusta Dislike, Remover Remove (sólo admin/mod), Eliminar Delete (sólo creador), Deshacer Undo (sólo para acciones propias)

Recibe actividades de la Comunidad: Aceptar/Seguir Accept/Follow, Anunciar Announce.

Envía y recibe actividades de/para otros usuarios: Crear/Nota Create/Note, Actualizar/Nota Update/Note, Eliminar/Nota Delete/Note, Deshacer/Eliminar/Nota Undo/Delete/Note (todas las relacionadas con mensajes privados).

{
    "@context": ...,
    "id": "https://enterprise.lemmy.ml/u/picard",
    "type": "Person",
    "preferredUsername": "picard",
    "name": "Jean-Luc Picard",
    "content": "The user bio",
    "mediaType": "text/html",
    "source": {
        "content": "The user bio",
        "mediaType": "text/markdown"
    },
    "icon": {
        "type": "Image",
        "url": "https://enterprise.lemmy.ml/pictrs/image/DS3q0colRA.jpg"
    },
    "image": {
        "type": "Image",
        "url": "https://enterprise.lemmy.ml/pictrs/image/XenaYI5hTn.png"
    },
    "inbox": "https://enterprise.lemmy.ml/u/picard/inbox",
    "endpoints": {
        "sharedInbox": "https://enterprise.lemmy.ml/inbox"
    },
    "published": "2020-10-06T17:27:43.234391+00:00",
    "updated": "2020-10-08T11:27:17.905625+00:00",
    "publicKey": {
        "id": "https://enterprise.lemmy.ml/u/picard#main-key",
        "owner": "https://enterprise.lemmy.ml/u/picard",
        "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyH9iH83+idw/T4QpuRSY\n5YgQ/T5pJCNxvQWb6qcCu3gEVigfbreqZKJpOih4YT36wu4GjPfoIkbWJXcfcEzq\nMEQoYbPStuwnklpN2zj3lRIPfGLht9CAlENLWikTUoW5kZLyU6UQtOGdT2b1hDuK\nsUEn67In6qYx6pal8fUbO6X3O2BKzGeofnXgHCu7QNIuH4RPzkWsLhvwqEJYP0zG\nodao2j+qmhKFsI4oNOUCGkdJejO7q+9gdoNxAtNNKilIOwUFBYXeZJb+XGlzo0X+\n70jdJ/xQCPlPlItU4pD/0FwPLtuReoOpMzLi20oDsPXJBvn+/NJaxqDINuywcN5p\n4wIDAQAB\n-----END PUBLIC KEY-----\n"
    }
}
Nombre del CampoObligatorioDescripción
preferredUsernamesiNombre del actor
namenoEl nombre para mostrar del usuario
contentnoLa biografía del usuario
iconnoEl avatar del usuario, que aparece junto al nombre del usuario
imagenoBanner del usuario, mostrada en la parte superior del perfil
inboxnoURL de la bandeja de entrada de ActivityPub
endpointsnoContiene la URL de la bandeja de entrada compartida
publishednoFecha de registro del usuario
updatednoFecha de la última actualización del perfil del usuario
publicKeysiLa clave pública utilizada para verificar las firmas de este actor

Bandeja de salida del Usuario

{
    "items": [],
    "totalItems": 0,
    "@context": ...,
    "id": "http://lemmy-alpha:8541/u/lemmy_alpha/outbox",
    "type": "OrderedCollection"
}

La bandeja de salida del usuario no está implementada todavía, y es sólo un marcador de posición para las implementaciones de ActivityPub que lo requieren.

Objetos

Publicación

Una página con título, y contenido opcional de URL y texto. La URL suele llevar a una imagen, en cuyo caso se incluye una miniatura. Cada entrada pertenece exactamente a una comunidad.

{
    "@context": ...,
    "id": "https://voyager.lemmy.ml/post/29",
    "type": "Page",
    "attributedTo": "https://voyager.lemmy.ml/u/picard",
    "to": [
      "https://voyager.lemmy.ml/c/main",
      "https://www.w3.org/ns/activitystreams#Public"
    ],
    "name": "Test thumbnail 2",
    "content": "blub blub",
    "mediaType": "text/html",
    "source": {
        "content": "blub blub",
        "mediaType": "text/markdown"
    },
    "url": "https://voyager.lemmy.ml:/pictrs/image/fzGwCsq7BJ.jpg",
    "image": {
        "type": "Image",
        "url": "https://voyager.lemmy.ml/pictrs/image/UejwBqrJM2.jpg"
    },
    "commentsEnabled": true,
    "sensitive": false,
    "stickied": false,
    "published": "2020-09-24T17:42:50.396237+00:00",
    "updated": "2020-09-24T18:31:14.158618+00:00"
}
Nombre del CampoObligatorioDescription
attributedTosiID del usuario que creó esta publicación
tosiID de la comunidad en la que se publicó
namesiTítulo de la publicación
contentnoCuerpo de la publicación
urlnoUn enlace arbitrario para compartir
imagenoMiniatura para la url, sólo aparece si es un enlace de imagen
commentsEnabledsiFalse indica que la publicación está bloqueada, y no se pueden añadir comentarios
sensitivesiTrue marca la publicación como NSFW,difumina la miniatura y la oculta a los usuarios con la configuración NSFW desactivada
stickiedsiTrue significa que se muestra en la parte superior de la comunidad
publishednoFecha de creación de la publicación
updatednoFecha en la que se editó la publicación (no está presente si nunca se editó)

Comentario

Una respuesta a una publicación, o una respuesta a otro comentario. Contiene sólo texto (incluyendo referencias a otros usuarios o comunidades). Lemmy muestra los comentarios en una estructura de árbol.

{
    "@context": ...,
    "id": "https://enterprise.lemmy.ml/comment/95",
    "type": "Note",
    "attributedTo": "https://enterprise.lemmy.ml/u/picard",
    "to": "https://www.w3.org/ns/activitystreams#Public",
    "content": "mmmk",
    "mediaType": "text/html",
    "source": {
        "content": "mmmk",
        "mediaType": "text/markdown"
    },
    "inReplyTo": [
        "https://enterprise.lemmy.ml/post/38",
        "https://voyager.lemmy.ml/comment/73"
    ],
    "published": "2020-10-06T17:53:22.174836+00:00",
    "updated": "2020-10-06T17:53:22.174836+00:00"
}
Nombre del CampoObligatorioDescripción
attributedTosiID del usuario que creó el comentario
tosiComunidad donde se hizo el comentario
contentsiEl texto del comentario
inReplyTosiID de la publicación donde se hizo el comentario, y el comentario padre. Si este es un comentario de nivel superior, inReplyTo sólo contiene la publicación
publishednoFecha de creación del comentario
updatednoFecha en la que se editó la publicación (no está presente si nunca se editó)

Mensaje Privado

Un mensaje directo de un usuario a otro. No puede incluir usuarios adicionales. Todavía no se ha implementado el hilo, por lo que falta el campo inReplyTo.

{
    "@context": ...,
    "id": "https://enterprise.lemmy.ml/private_message/34",
    "type": "Note",
    "attributedTo": "https://enterprise.lemmy.ml/u/picard",
    "to": "https://voyager.lemmy.ml/u/janeway",
    "content": "test",
    "source": {
        "content": "test",
        "mediaType": "text/markdown"
    },
    "mediaType": "text/markdown",
    "published": "2020-10-08T19:10:46.542820+00:00",
    "updated": "2020-10-08T20:13:52.547156+00:00"
}
Nombre del CampoObligatorioDescripción
attributedToID del usuario que creo este mensaje
toID del destinatario
contentsiEl texto del mensaje privado
publishednoFecha de creación del mensaje
updatednoFecha en la que se editó la publicación (no está presente si nunca se editó)

Actividades

Usuario a Comunidad

Seguir

Cuando el usuario hace clic en "Suscribirse" en una comunidad, se envía un Follow. La comunidad responde automáticamente con un Accept/Follow.

{
    "@context": ...,
    "id": "https://enterprise.lemmy.ml/activities/follow/2e4784b7-4edf-4fa1-a352-674d5d5f8891",
    "type": "Follow",
    "actor": "https://enterprise.lemmy.ml/u/picard",
    "to": "https://ds9.lemmy.ml/c/main",
    "object": "https://ds9.lemmy.ml/c/main"
}
Nombre del CampoObligatorioDescripción
actorsiEl usuario que envía la solicitud de seguimiento Follow
objectsiLa comunidad a seguir

Dejar de Seguir

Al pulsar el botón de "dar de baja" en una comunidad se envía un Undo/Follow. La comunidad retira al usuario de su lista de seguidores tras recibirlo.

{
    "@context": ...,
    "id": "http://lemmy-alpha:8541/activities/undo/2c624a77-a003-4ed7-91cb-d502eb01b8e8",
    "type": "Undo",
    "actor": "http://lemmy-alpha:8541/u/lemmy_alpha",
    "to": "http://lemmy-beta:8551/c/main",
    "object": {
        "@context": ...,
        "id": "http://lemmy-alpha:8541/activities/follow/f0d732e7-b1e7-4857-a5e0-9dc83c3f7ee8",
        "type": "Follow",
        "actor": "http://lemmy-alpha:8541/u/lemmy_alpha",
        "object": "http://lemmy-beta:8551/c/main"
    }
}

Crear o Actualizar Publicación

Cuando un usuario crea una nueva publicación, ésta se envía a la comunidad correspondiente. La edición de una publicación previamente creada envía una actividad casi idéntica, excepto que el tipo type es Actualizar Update. Todavía no admitimos las menciones en las publicaciones.

{
    "@context": ...,
    "id": "https://enterprise.lemmy.ml/activities/create/6e11174f-501a-4531-ac03-818739bfd07d",
    "type": "Create",
    "actor": "https://enterprise.lemmy.ml/u/riker",
    "to": "https://www.w3.org/ns/activitystreams#Public",
    "cc": [
      "https://ds9.lemmy.ml/c/main/"
    ],
    "object": ...
}
Nombre del CampoObligatorioDescripción
typesiCrear Create o Actualizar Update
ccsiComunidad donde se hizo la publicación
objectsiLa publicación que se crea

Crear o Actulizar Comentario

Una respuesta a una publicación, o a otro comentario. Puede contener menciones a otros usuarios. La edición de una publicación previamente creada envía una actividad casi idéntica, excepto que el tipo type es Actualizar Update.

{
    "@context": ...,
    "id": "https://enterprise.lemmy.ml/activities/create/6f52d685-489d-4989-a988-4faedaed1a70",
    "type": "Create",
    "actor": "https://enterprise.lemmy.ml/u/riker",
    "to": "https://www.w3.org/ns/activitystreams#Public",
    "tag": [{
        "type": "Mention",
        "name": "@sisko@ds9.lemmy.ml",
        "href": "https://ds9.lemmy.ml/u/sisko"
    }],
    "cc": [
        "https://ds9.lemmy.ml/c/main/",
        "https://ds9.lemmy.ml/u/sisko"
    ],
    "object": ...
}
Nombre del CampoObligatorioDescripción
tagnoLista de los usuarios que se mencionan en el comentario (como @usuario@ejemplo.com)
ccsiComunidad en la que se hace la publicación, el usuario al que se responde (creador de la publicación/comentario principal), así como los usuarios mencionados
objectsiEl comentario que se crea

Me gusta Publicación o Comentario

Un voto positivo para una publicación o un comentario

{
    "@context": ...,
    "id": "https://enterprise.lemmy.ml/activities/like/8f3f48dd-587d-4624-af3d-59605b7abad3",
    "type": "Like",
    "actor": "https://enterprise.lemmy.ml/u/riker",
    "to": "https://www.w3.org/ns/activitystreams#Public",
    "cc": [
        "https://ds9.lemmy.ml/c/main/"
    ],
    "object": "https://enterprise.lemmy.ml/p/123"
}
Nombre del CampoObligatorioDescripción
ccsiID de la comunidad en la que se encuentra la publicación/comentario
objectsiLa publicación o comentario que se ha votado

No me gusta Publicación o Comentario

Un voto negativo para una publicación o un comentario

{
    "@context": ...,
    "id": "https://enterprise.lemmy.ml/activities/dislike/fd2b8e1d-719d-4269-bf6b-2cadeebba849",
    "type": "Dislike",
    "actor": "https://enterprise.lemmy.ml/u/riker",
    "to": "https://www.w3.org/ns/activitystreams#Public",
    "cc": [
      "https://ds9.lemmy.ml/c/main/"
    ],
    "object": "https://enterprise.lemmy.ml/p/123"
}
Nombre del CampoObligatorioDescripción
ccsiID de la comunidad en la que se encuentra la publicación/comentario
objectsiLa publicación o comentario que se ha votado

Eliminar Publicación o Comentario

Elimina una publicación o comentario creado anteriormente. Esto sólo lo puede hacer el creador original de esa publicación/comentario.

{
    "@context": ...,
    "id": "https://enterprise.lemmy.ml/activities/delete/f1b5d57c-80f8-4e03-a615-688d552e946c",
    "type": "Delete",
    "actor": "https://enterprise.lemmy.ml/u/riker",
    "to": "https://www.w3.org/ns/activitystreams#Public",
    "cc": [
        "https://enterprise.lemmy.ml/c/main/"
    ],
    "object": "https://enterprise.lemmy.ml/post/32"
}
Nombre del CampoObligatorioDescripción
ccsiID de la comunidad en la que se encuentra la publicación/comentario
objectsiLa publicación o comentario que se está eliminando

Remover Publicación o Comentario

Remover una publicación o un comentario. Esto sólo puede hacerlo un mod de la comunidad, o un administrador en la instancia donde se aloja la comunidad.

{
    "@context": ...,
    "id": "https://ds9.lemmy.ml/activities/remove/aab93b8e-3688-4ea3-8212-d00d29519218",
    "type": "Remove",
    "actor": "https://ds9.lemmy.ml/u/sisko",
    "to": "https://www.w3.org/ns/activitystreams#Public",
    "cc": [
        "https://ds9.lemmy.ml/c/main/"
    ],
    "object": "https://enterprise.lemmy.ml/comment/32"
}
Nombre del CampoObligatorioDescripción
ccsiID de la comunidad en la que se encuentra la publicación/comentario
objectsiLa publicación o comentario que se está removiendo

Deshacer

Revierte una actividad anterior, sólo puede hacerlo el actor actor del objeto object. En caso de un Like o Dislike, se vuelve a cambiar el conteo de votos. En el caso de un Deleteo Remove, se restablece la publicación/comentario. El objeto se regenera desde cero, por lo que el ID de la actividad y otros campos son diferentes.

{
    "@context": ...,
    "id": "https://ds9.lemmy.ml/activities/undo/70ca5fb2-e280-4fd0-a593-334b7f8a5916",
    "type": "Undo",
    "actor": "https://ds9.lemmy.ml/u/sisko",
    "to": "https://www.w3.org/ns/activitystreams#Public",
    "cc": [
        "https://ds9.lemmy.ml/c/main/"
    ],
    "object": ...
}
Nombre del CampoObligatorioDescripción
objectsiCualquier actividad Like, Dislike, Delete o Remove tal como se ha descrito anteriormente

Agregar Moderador

Añade un nuevo mod (registrado en ds9.lemmy.ml) a la comunidad !main@enterprise.lemmy.ml. Tiene que ser enviado por un mod de la comunidad existente.

{
    "@context": ...,
    "id": "https://enterprise.lemmy.ml/activities/add/531471b1-3601-4053-b834-d26718da2a06",
    "type": "Add",
    "cc": [
        "https://enterprise.lemmy.ml/c/main"
    ],
    "to": "https://www.w3.org/ns/activitystreams#Public",
    "object": "https://ds9.lemmy.ml/u/sisko",
    "actor": "https://enterprise.lemmy.ml/u/picard",
    "target": "https://enterprise.lemmy.ml/c/main/moderators"
}

Remover Moderador

Remueve un mod existente de la comunidad. Tiene que ser enviado por un mod de la comunidad existente.

{
    "@context": ...,
    "id": "https://enterprise.lemmy.ml/activities/remove/63b9a5b2-d3f8-4371-a7eb-711c7928b3c0",
    "type": "Remove",
    "object": "https://ds9.lemmy.ml/u/sisko",
    "to": "https://www.w3.org/ns/activitystreams#Public",
    "actor": "https://enterprise.lemmy.ml/u/picard",
    "cc": [
        "https://enterprise.lemmy.ml/c/main"
    ],
    "target": "https://enterprise.lemmy.ml/c/main/moderators"
}

Comunidad a Usuario

Aceptar Seguir

Enviado automáticamente por la comunidad en respuesta a un Follow. Al mismo tiempo, la comunidad añade a este usuario a su lista de seguidores.

{
    "@context": ...,
    "id": "https://ds9.lemmy.ml/activities/accept/5314bf7c-dab8-4b01-baf2-9be11a6a812e",
    "type": "Accept",
    "actor": "https://ds9.lemmy.ml/c/main",
    "to": "https://enterprise.lemmy.ml/u/picard",
    "object": {
        "@context": ...,
        "id": "https://enterprise.lemmy.ml/activities/follow/2e4784b7-4edf-4fa1-a352-674d5d5f8891",
        "type": "Follow",
        "object": "https://ds9.lemmy.ml/c/main",
        "actor": "https://enterprise.lemmy.ml/u/picard"
    }
}
Nombre del CampoObligatorioDescripción
actorsiLa misma comunidad que en la actividad Follow
tonoID del usuario que envió el Follow
objectsiLa actividad de Follow enviada anteriormente

Anuncio

Cuando la comunidad recibe una actividad publicación o comentario, lo envuelve en un anuncio Announce y lo envía a todos los seguidores.

{
  "@context": ...,
  "id": "https://ds9.lemmy.ml/activities/announce/b98382e8-6cb1-469e-aa1f-65c5d2c31cc4",
  "type": "Announce",
  "actor": "https://ds9.lemmy.ml/c/main",
  "to": "https://www.w3.org/ns/activitystreams#Public",
  "cc": [
    "https://ds9.lemmy.ml/c/main/followers"
  ],
  "object": ...
}
Nombre del CampoObligatorioDescripción
objectsiCualquier actividad Create, Update, Like, Dislike, Delete, Remove o Undo tal como se ha descrito en la sección Usuario a Comunidad

Remover o Eliminar Comunidad

Un administrador de instancia puede remover la comunidad, o un mod puede eliminarla.

{
  "@context": ...,
  "id": "http://ds9.lemmy.ml/activities/remove/e4ca7688-af9d-48b7-864f-765e7f9f3591",
  "type": "Remove",
  "actor": "http://ds9.lemmy.ml/c/some_community",
  "cc": [
    "http://ds9.lemmy.ml/c/some_community/followers"
  ],
  "to": "https://www.w3.org/ns/activitystreams#Public",
  "object": "http://ds9.lemmy.ml/c/some_community"
}
Nombre del CampoObligatorioDescripción
typesiRemover Remove o Eliminar Delete

Restaurar Comunidad Removida o Eliminada

Revierte la remoción o eliminación

{
  "@context": ...,
  "id": "http://ds9.lemmy.ml/activities/like/0703668c-8b09-4a85-aa7a-f93621936901",
  "type": "Undo",
  "actor": "http://ds9.lemmy.ml/c/some_community",
  "to": "https://www.w3.org/ns/activitystreams#Public",
  "cc": [
    "http://ds9.lemmy.ml/c/testcom/followers"
  ],
  "object": {
    "@context": ...,
    "id": "http://ds9.lemmy.ml/activities/remove/1062b5e0-07e8-44fc-868c-854209935bdd",
    "type": "Remove",
    "actor": "http://ds9.lemmy.ml/c/some_community",
    "object": "http://ds9.lemmy.ml/c/testcom",
    "to": "https://www.w3.org/ns/activitystreams#Public",
    "cc": [
      "http://ds9.lemmy.ml/c/testcom/followers"
    ]
  }
}

Nombre del CampoObligatorioDescripción
object.typesiRemover Remove o Eliminar Delete

Usuario a Usuario

Crear o Actualizar Mensaje Privado

Crea un nuevo mensaje privado entre dos usuarios.

{
    "@context": ...,
    "id": "https://ds9.lemmy.ml/activities/create/202daf0a-1489-45df-8d2e-c8a3173fed36",
    "type": "Create",
    "actor": "https://ds9.lemmy.ml/u/sisko",
    "to": "https://enterprise.lemmy.ml/u/riker/inbox",
    "object": ...
}
Nombre del CampoObligatorioDescripción
typesiCrear Create o Actualizar Update
objectsiUn Mensaje Privado

Eliminar Mensaje Privado

Elimina un mensaje privado previo

{
    "@context": ...,
    "id": "https://ds9.lemmy.ml/activities/delete/2de5a5f3-bf26-4949-a7f5-bf52edfca909",
    "type": "Delete",
    "actor": "https://ds9.lemmy.ml/u/sisko",
    "to": "https://enterprise.lemmy.ml/u/riker/inbox",
    "object": "https://ds9.lemmy.ml/private_message/341"
}

Deshacer la Eliminación del Mensaje Privado

Restaura un mensaje privado previamente eliminado. El objeto object se regenera desde cero, por lo que el ID de actividad y otros campos son diferentes.

{
    "@context": ...,
    "id": "https://ds9.lemmy.ml/activities/undo/b24bc56d-5db1-41dd-be06-3f1db8757842",
    "type": "Undo",
    "actor": "https://ds9.lemmy.ml/u/sisko",
    "to": "https://enterprise.lemmy.ml/u/riker/inbox",
    "object": ...
}

Desarrollo de clientes

Esta sección es para cualquiera que quiera colaborar con la aplicación web oficial para Lemmy o quiera desarrollar su propio cliente para el ecosistema Lemmy.

Guía para Temas

Lemmy usa Bootstrap v4, y algunas clases css customizadas por lo que cualquier tema compatible con bootstrap v4 debería de funcionar.

Creación

  • Usa una herramienta, por ejemplo bootstrap.build para crear tú tema de bootstrap v4. Exporta el archivo bootstrap.min.css una vez terminado el tema, y conserva támbién el archivo generado _variables.scss.

Prueba

  • Para probar el tema, puedes también usar las herramientas del navegador web, o un plugin como stylus para copiar/pegar un tema, y verlo en Lemmy.

Subir / Publicar

  1. Haz un fork de lemmy-ui.
  2. Copia el archivo {nombre-de-mi-tema}.min.css a la carpeta src/assets/css/themes. (Aquí puedes copiar el archivo _variables.scss si lo deseas).
  3. Abre el archivo src/shared/utils.ts y agregas {nombre-de-mi-tema} a la lista de temas.
  4. Pruebalo localmente
  5. Haz pull request con los cambios que hiciste.

Referencia de la API

Lemmy tiene dos APIs entrelazadas:

Esta página describe conceptos que son comúnes para ambas.

Uso básico

Las cadenas de solicitud request y respuesta response están en formato JSON.

Tipos de datos

Tipos de Lemmy

Tipos de bajo nivel

  • ? designa una opción que puede omitirse en las solicitudes y no estar presenet en las respuestas. Será de tipo SomeType (AlgúnTipo).
  • [SomeType] es una lista que contiene objetos del tipo SomeType.
  • Las horas (times) y fechas (dates) son cadenas de marcas de tiempo (timestamp) en formato ISO 8601. Timestamps serán UTC, tú cliente debe hacer la conversión de UTC a local.

Límites de tasa por defecto

Estos límites pueden ser editados en tú archivo lemmy.hjson, copiando la sección relevante de defaults.hjson.

  • 3 por hora para inscripciones y creación de comunidades.
  • 6 por hora para publicación de imágenes.
  • 6 por 10 minutos para la creación de publicaciones.
  • 180 acciones por minuto para la votación de publicaciones y la creación de comentarios.

El resto no cuenta con límites de tasa.

Véase también: Limitación de la tasa para front-ends personalizados.

API del WebSocket

Documentación de la API del WebSocket de Lemmy

API HTTP de Lemmy

WebSocket vs API HTTP

La API HTTP de Lemmy es casi parecida a la API del Websocket:

  • API WebSocket necesita let send = { op: userOperation[op], data: form} como se muestra en la especificación de la API WebSocket
  • API HTTP necesita el formulario (datos) en el primer nivel; una operación HTTP (GET, PUT o POST) y endpoint (en http(s)://host/api/v2/endpoint). Por ejemplo:

POST {username_or_email: X, password: X}

Para más información. Véase el archivo http.ts .

El API del WebSocket debería considerarse como la fuente principal para la API HTPP, ya que también proporciona información sobre cómo formular las llamadas a la API HTTP.

Ejemplos

TypeScript

  async editComment(form: EditComment): Promise<CommentResponse> {
  return this.wrapper(HttpType.Put, '/comment', form);
  }
TipoURLTipo de cuerpoTipo de Retorno
PUT/commentEditCommentCommentResponse

Curl

Ejemplo GET

curl "http://localhost:8536/api/v2/community/list?sort=Hot"`

Ejemplo POST

curl -i -H \
"Content-Type: application/json" \
-X POST \
-d '{
  "comment_id": 374,
  "score": 1,
  "auth": eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MiwiaXNzIjoidGVzdC5sZW1teS5tbCJ9.P77RX_kpz1a_geY5eCp29sl_5mAm-k27Cwnk8JcIZJk
}' \
http://localhost:8536/api/v2/comment/like

Características exclusivas de la API HTTP

Estas características no pueden ser accesadas desde la API del WebSocket:

RSS/Atom feeds

  • All (Todo) - /feeds/all.xml?sort=Hot
  • Community (Comunidad) - /feeds/c/community-name.xml?sort=Hot
  • User (usuario) - /feeds/u/user-name.xml?sort=Hot

Imagenes

Leemy reenvía las peticiones de imagenes a un Pictrs que se ejecuta localmenet.

GET /pictrs/image/{filename}?format={webp, jpg, ...}&thumbnail={96}

El formato (format) y la miniatura (thumbnail) son opcionales

Crear (request)

El contenido subido debe ser un formulario (multipart/form-data) válido con una matriz de imagenes situada dentro de la clave images[].

Uploaded content must be valid multipart/form-data with an image array located within the images[] key.

POST /pictrs/image

Crear (response)

{
  "files": [
    {
      "delete_token": "{token}",
      "file": "{file}.jpg"
    }
  ],
  "msg": "ok"
}

Delete

GET /pictrs/image/delete/{delete_token}/{file}

Nota

Esta documentación puede tener un retraso con respecto a la actual API endpoints. La API misma debería ser considerada inestable (está sujeta a cambios en cualquier momento).

Crear un Frontend Personalizado

El backend y el frontend están completamente desacoplados y se ejecutan en contenedores Docker independientes. Solo se comunican a través de la API de Lemmy, lo que hace que sea bastante fácil escribir interfaces alternativas.

Esto crea un gran potencial para las interfaces personalizadas, que podrían cambiar gran parte del diseño y la experiencia del usuario de Lemmy. Por ejemplo, sería posible crear un frontend al estilo de un foro tradicional como phpBB, o un sitio de preguntas y respuestas como stackoverflow. Todo ello sin tener que pensar en las consultas a la base de datos, en la autentificación o en el ActivityPub, que esencialmente se obtiene de forma gratuita.

Desarrollo

Puedes utilizar cualquier lenguaje para crear un frontend personalizado. La opción más fácil sería hacer un fork de nuestro frontend oficial, lemmy-lite, o el lemmy-frontend-example. En cualquier caso, el principio es el mismo: enlazar con LEMMY_EXTERNAL_HOST (por defecto: localhost:8536) y gestionar las peticiones utilizando la API de Lemmy en LEMMY_INTERNAL_HOST (por defecto: lemmy:8536). Utilice también LEMMY_HTTPS para generar enlaces con el protocolo correcto.

El siguiente paso es construir una imagen Docker desde tu frontend. Si has bifurcado (fork) un proyecto existente, debería incluir un archivo Docker y las instrucciones para construirlo. Si no, intenta buscar para tu lenguaje en dockerhub, las imágenes oficiales suelen tener instrucciones para construir en su readme. Construye una imagen Docker con una etiqueta, luego busca la siguiente sección en docker/dev/docker-compose.yml:

  lemmy-ui:
    image: dessalines/lemmy-ui:v0.8.10
    ports:
      - "1235:1234"
    restart: always
    environment:
      - LEMMY_INTERNAL_HOST=lemmy:8536
      - LEMMY_EXTERNAL_HOST=localhost:8536
      - LEMMY_HTTPS=false
    depends_on: 
      - lemmy

Todo lo que tienes que hacer es sustituir el valor de image por la etiqueta de tu propia imagen Docker (y posiblemente las variables de entorno si necesitas otras diferentes). A continuación, ejecuta ./docker_update.sh, y después de la compilación, tu frontend estará disponible en http://localhost:1235. También puedes hacer el mismo cambio en docker/federation/docker-compose.yml y ejecutar ./start-local-instances.bash para probar la federación con tu frontend.

Desplegar con Docker

Después de construir la imagen Docker, necesitas empujarla (hacer push) a un registro Docker (como dockerhub). A continuación, actualiza el docker-compose.yml en tu servidor, sustituyendo la image por lemmy-ui, tal y como se ha descrito anteriormente. Ejecuta docker-compose.yml y, tras una breve espera, tu instancia utilizará el nuevo frontend.

Toma en cuenta que si tu instancia se despliega con Ansible, éste anulará (sobreescribirá) docker-compose.yml con cada ejecución, volviendo al frontend por defecto. En ese caso debes copiar la carpeta ansible/ de este proyecto a tu propio repositorio, y ajustar docker-compose.yml directamente en el repo.

También es posible utilizar varios frontends para la misma instancia de Lemmy, ya sea utilizando subdominios o subcarpetas. Para ello, no edites la sección lemmy-ui en docker-compose.yml, sino duplícala, ajustando el nombre, la imagen y el puerto para que sean distintos para cada uno. Luego edita tu configuración de nginx para pasar las peticiones al frontend apropiado, dependiendo del subdominio o la ruta.

Traducciones

Puedes añadir el repositorio lemmy-translations a tu proyecto como un submódulo git. De este modo, podrás aprovechar las mismas traducciones que se utilizan en el frontend oficial, y también recibirás las nuevas traducciones aportadas a través de weblate.

Limitación de la tasa

Lemmy limita la tasa de muchas acciones en función de la IP del cliente. Pero si haces alguna llamada a la API en el lado del servidor (por ejemplo, en el caso de la renderización del lado del servidor, o la pre-renderización de javascript), Lemmy tomará la IP del contenedor Docker. Lo que significa que todas las peticiones provienen de la misma IP, y obtienen la tasa limitada mucho antes. Para evitar este problema, es necesario pasar las cabeceras X-REAL-IP y X-FORWARDED-FOR a Lemmy (las cabeceras son establecidas por nuestra configuración de nginx).

Aquí hay un ejemplo recortado para NodeJS:

function setForwardedHeaders(
  headers: IncomingHttpHeaders
): { [key: string]: string } {
  let out = {
    host: headers.host,
  };
  if (headers['x-real-ip']) {
    out['x-real-ip'] = headers['x-real-ip'];
  }
  if (headers['x-forwarded-for']) {
    out['x-forwarded-for'] = headers['x-forwarded-for'];
  }

  return out;
}

let headers = setForwardedHeaders(req.headers);
let client = new LemmyHttp(httpUri, headers);

Contribuir al Proyecto

Información sobre como contribuir a Lemmy, ya sea traduciendo, probando, diseñando o programando.

Seguimiento de problemas (issues) / Repositorios

Traduciendo

Mira el Weblate de Lemmy para las traducciones. Tú también puedes ayudar traduciendo esta documentación.

Arquitectura

Front end

  • El front end está escrito en typescript, usando un framework similar a React llamado inferno. Todos los elementos de la interfaz de usuario (UI) son componentes .tsx reutilizables.
  • El repositorio del front end es lemmy-ui.
  • Las rutas están en src/shared/routes.ts.
  • Los componentes están localizados en src/shared/components.

Back end

  • El back end está escrito en rust, usando diesel, y actix.
  • El código fuente del servidor está divido en secciones main in src. Estos incluyen:
    • db - Las acciones de bajo nivel de la base de datos.
      • Las adiciones a la base de datos se realizan mediante migraciones. Ejecuta diesel migration generate xxxxx para añadir cosas nuevas.
    • api - Las iteracciones de alto nivel del usuario (cosas como CreateComment)
    • routes - Los puntos finales (endpoints) del servidor.
    • apub - Las conversiones activitypub.
    • websocket - Crea el sevidor del websocket.

Linting / Formateo

  • Cada commit del front end y back end se formatea automáticamente y luego se hace un linting usando husky, y lint-staged.
  • Rust con cargo fmt y cargo clippy.
  • Typescript con prettier y eslint.

Desarrollo con Docker

Dependencias

Distro basada en Debian

sudo apt install git docker-compose
sudo systemctl start docker
git clone https://github.com/LemmyNet/lemmy

Distro basada en Arch

sudo -S git docker-compose
sudo systemctl start docker
git clone https://github.com/LemmyNet/lemmy

Ejecución

cd docker/dev
./docker_update.sh

Finalmente abre la siguiente dirección en tu navegador: http://localhost:1235.

Nota: muchas características (como docs e imagenes) no funcionarán sin usar un perfil de nginx como en ansible/templates/nginx.conf.

Para acelerar la compilación de Docker, añade el siguiente código a /etc/docker/daemon.json y reinicia Docker.

{
  "features": {
    "buildkit": true
  }
}

Si la compilación sigue siendo muy lenta, tendrás que usar un desarrollo local en su lugar.

Desarrollo Local

Instalar requisitos

Instala Rust utilizando la opción recomendada en rust-lang.org (rustup).

Distro basada en Debian

sudo apt install git cargo libssl-dev pkg-config libpq-dev yarn curl gnupg2 espeak
# install yarn
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update && sudo apt install yarn

Distro basada en Arch

sudo pacman -S git cargo libssl-dev pkg-config libpq-dev yarn curl gnupg2 espeak
# install yarn (stable)
curl -o- -L https://yarnpkg.com/install.sh | bash

macOS

Instala Homebrew si aún no lo has instalado.

Finalmente, instala Node y Yarn.

brew install node yarn

Obtener el código fuente del back end

git clone https://github.com/LemmyNet/lemmy.git
# or alternatively from gitea
# git clone https://yerbamate.ml/LemmyNet/lemmy.git

Compila el backend (Rust)

cargo build
# para desarrollo, usa `cargo check` en su lugar)

Obtener el código fuente del front end

git clone https://github.com/LemmyNet/lemmy-ui.git --recurse-submodules

Configurar postgresql

Distro basada en Debian

sudo apt install postgresql
sudo systemctl start postgresql

# Either execute db-init.sh, or manually initialize the postgres database:
sudo -u postgres psql -c "create user lemmy with password 'password' superuser;" -U postgres
sudo -u postgres psql -c 'create database lemmy with owner lemmy;' -U postgres
export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy

Distro basada en Arch

sudo pacman -S postgresql
sudo systemctl start postgresql

# Either execute db-init.sh, or manually initialize the postgres database:
sudo -u postgres psql -c "create user lemmy with password 'password' superuser;" -U postgres
sudo -u postgres psql -c 'create database lemmy with owner lemmy;' -U postgres
export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy

macOS

brew install postgresql
brew services start postgresql
/usr/local/opt/postgres/bin/createuser -s postgres

# Either execute db-init.sh, or manually initialize the postgres database:
psql -c "create user lemmy with password 'password' superuser;" -U postgres
psql -c 'create database lemmy with owner lemmy;' -U postgres
export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy

Ejecutar una instancia de desarrollo local

cd lemmy
cargo run

Después abre localhost:1235 en tu navegador. Para recargar los cambios en el back-end, tendrás que volver ejecutar cargo run. Puedes usar cargo check como una manera mas rapida de econtrar errores de compilación.

Para hacer desarrollo front end:

cd lemmy-ui
yarn
yarn dev

Enseguida entra a localhost:1234. Al guardar cambios, el frond end se debe recargar automáticamenete.

Toma en cuenta que esta configuración no incluye la carga de imagenes ni la previsualización de enlaces (proporcionada por pict-rs y iframely respectivamente). Si quieres probarlos, debes de usar el desarrollo Docker.

Pruebas

Rust

Después de instalar las dependencias para el desarrollo local, ejecuta el siguiente comando:

psql -U lemmy -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
./test.sh

Federación

Instala las dependencias para el desarrollo local, y agrega las siguientes a /etc/hosts:

127.0.0.1       lemmy-alpha
127.0.0.1       lemmy-beta
127.0.0.1       lemmy-gamma
127.0.0.1       lemmy-delta
127.0.0.1       lemmy-epsilon

Después usa el siguiente script para correr las pruebas:

cd api_tests
./run-federation-test.bash

Desarrollo de la Federación

Ejecutando localmente

Instala las dependencias necesarias como esta descrito en el documento Desarrollo con Docker. Enseguida ejecuta lo siguiente:

cd docker/federation
./start-local-instances.bash

Las pruebas de federación establecen 5 instancias:

InstanciaNombre de usuarioLocalizaciónNotas
lemmy-alphalemmy_alpha127.0.0.1:8540federada con todas las demás instancias
lemmy-betalemmy_beta127.0.0.1:8550federada con todas las demás instancias
lemmy-gammalemmy_gamma127.0.0.1:8560federada con todas las demás instancias
lemmy-deltalemmy_delta127.0.0.1:8570solo permite federación con lemmy-beta
lemmy-epsilonlemmy_epsilon127.0.0.1:8580usa la lista de bloqueo, tiene lemmy-alpha bloqueada

Puedes registrarte en cada una usando el nombre de la instancia, y lemmy como la contraseña, ejemplo: (lemmy_alpha, lemmy).

Para iniciar la federación entre instancias, visita una de ellas y busca un usuario, comunidad o publicación, como en este ejemplo. Nota que el backend de Lemmy se ejecuta en un puerto diferente al del frontend, por lo que tienes que incrementar en uno el número de puerto de la barra de URL.

  • !main@lemmy-alpha:8541
  • http://lemmy-beta:8551/post/3
  • @lemmy-gamma@lemmy-gamma:8561

Los contenedores de Firefox son una buena forma de probar su interacción.

Ejecutando en un servidor

Ten en cuenta que la federación está actualmente en fase alfa. Únicamente utilícela para pruebas, no en un servidor de producción, y sé cuidadoso, que activar la federación puede romper tu instancia.

Sigue las instrucciones normales de instalación, ya sea con Ansible o manualmente con Docker. Luego reemplaza la linea image: dessalines/lemmy:v0.x.x en /lemmy/docker-compose.yml con image: dessalines/lemmy:federation. También añade lo siguiente en /lemmy/lemmy.hjson:

    federation: {
        enabled: true
        tls_enabled: true,
        allowed_instances: example.com,
    }

Después, y siempre que quieras actualizar a la última versión, ejecuta estos comandos en el servidor:

cd /lemmy/
sudo docker-compose pull
sudo docker-compose up -d

Modelo de seguridad

  • Verificación de la firma HTTP: Garantiza que la actividad proviene realmente de la actividad que afirma
  • check_is_apub_valid : Asegura que está en nuestra lista de instancias permitidas
  • Comprobaciones de nivel inferior: Para asegurarse de que el usuario que crea/actualiza/elimina una publicación está realmente en la misma instancia que esa publicación

Para el último punto, ten en cuenta que no estamos comprobando si el actor que envía la actividad de creación para una publicación es realmente idéntico al creador de la publicación, o si el usuario que elimina una entrada es un mod/admin. Estas cosas se comprueban por el código de la API, y es responsabilidad de cada instancia comprobar los permisos de los usuarios. Esto no deja ningún vector de ataque, ya que un usuario normal de la instancia no puede realizar acciones que violen las reglas de la API. El único que podría hacerlo es el administrador (y el software desplegado por el administrador). Pero el administrador puede hacer cualquier cosa en la instancia, incluso enviar actividades desde otras cuentas de usuario. Así que en realidad no ganaríamos nada de seguridad comprobando los permisos de los mods o similares.

Bifurcaciones y Liberaciones

Bifurcaciones

En general, nuestro manejo de las ramas es el descrito en Un modelo de bifurcación de líneal principal estable para Git. Una diferencia es que evitamos el rebase rebase, y en su lugar fusionamos merge la rama base en la rama de trabajo actual. Esto ayuda a evitar empujes push forzados y conflictos.

Liberaciones

  • Para una versión mayo major release: crea una nueva rama release/v0.x
  • Para una versión menor minor release: selecciona los cambios deseados en la rama release/v0.x
  • Hacer una versión beta beta o candidata release candidate con docker/prod/deploy.sh
  • Hacer lo mismo para lemmy-ui: ./deploy.sh 0.x.0-rc-x
  • Despliega en las instancias de prueba de la federación
    • Mantener una instancia en la última versión estable para probar la compatibilidad de la federación (automatizar esto con ansible)
    • ansible-playbook -i federation playbooks/site.yml --vault-password-file vault_pass -e rc_version=0.x.0-rc.x
  • Prueba que todo funciona como se espera, haz nuevas versiones beta/rc si es necesario
  • Despliega en lemmy.ml, para descubrir los problemas restantes
  • Si todo ha ido bien, haz la versión oficial 0.x.0 con docker/prod/deploy.sh
  • Anuncia el lanzamiento en Lemmy, Matrix, Mastodon

Código de Conducta

  • Nos comprometemos a proporcionar un entorno seguro, positivo y acogedor para todos, independientemente de su nivel de experiencia, identidad y expresión de género, orientación sexual, discapacidad, apariencia personal, tamaño corporal, raza, etnia, edad, religión, nacionalidad, u otra característica similar.
  • Evita el uso de apodos abiertamente sexuales u otros alias que puedan dificultar un entorno seguro, positivo y acogedor para todos.
  • Sé respetuoso y educado. No es necesario ser grosero o antipático.
  • Respeta el hecho de que la gente tiene diferencias de parecer, y de que cada opción de diseño o implementación tiene pros y contras, y costes diversos. Rara vez hay una respuesta correcta.
  • Evita las críticas imprecisas en lo posible. Si tienes ideas firmes con las que quieres expermientar, crea un fork y comprueba si funcionan.
  • Se te apartará de interaccionar con el resto si insultas, menosprecias o acosas a alguien. Este comportamiento no se admite. Nuestra interpretación del término "acoso" (harassment) está en línea con la definición del Citizen Code of Conduct; si tienes dudas respecto a qué se incluye en este concepto, lee dicha definición. En particular, no toleramos comportamientos que excluyan a grupos marginados socialmente.
  • El acoso en privado tampoco es aceptable. Seas quien seas, si crees que has sido o estás siendo acosado o te están haciendo sentir incómodo, contacta con uno de los administradores del canal o cualquiera en el equipo de moderación de Lemmy inmediatamente. Ya seas un contribuidor regular o un recién llegado, queremos hacer de esta comunidad un lugar seguro para ti y te ayudaremos.
  • De igual modo, el spam, el troleo, la provocación (flaming y baiting) u otros comportamientos para atraer atención no se permiten.

Contacta con el Equipo de Moderación en Mastodon

Envía un correo electrónico al Equipo de Moderación

Moderación

Estas son las políticas para hacer valer los estándares de conducta de nuestra comunidad. Si crees que un hilo necesita ser moderado, contacta con el equipo de moderación de Lemmy.

  1. Los comentarios que violen los estándares de conducta de Rust, incluyendo comentarios hirientes, opresivos, exclusivos o de odio, no están permitidos. (Las imprecaciones están permitidas, pero nunca contra otro usuario y nunca con contenido de odio).
  2. Los comentarios que los moderadores crean inapropiados, estén recogidos en el código de conducta o no, tampoco están permitidos.
  3. Los moderadores responderán a dichos comentarios con un aviso en primera instancia.
  4. Si el aviso es ignorado, el usuario será expulsado temporalmente del canal de comunicación para que se calme.
  5. Si el usuario retorna y continúa causando problemas, se le expulsará permanentemente.
  6. Los moderadores pueden elegir según su criterio levantar la expulsión al usuario si se trata de una primera ofensa y este se disculpa de forma genuina ante el afectado.
  7. Si crees que un moderador ha expulsado a alguien de forma injustificada, tráta el tema con dicho moderador u otro, en privado. Las discusiones sobre expulsiones dentro del propio canal no están permitidas.
  8. Los moderadores están sujetos a un estándar de conducta más exigente que el del resto de miembros de la comunidad. Si un moderador crea una situación inapropiada, debería esperar más severidad que para con el resto.

En la comunidad Lemmy aspiramos a superarnos en cuanto cómo nos tratamos entre nosotros. No intentes mantenerte intachable solo en lo técnico, trata de dar lo mejor de tí. En particular, evita los temas sensibles u ofensivos, especialmente si no guardan relación: muy a menudo llevan a disputas innecesarias, agravios y pérdida de confianza; aún peor, pueden apartar a gente de la comunidad por completo.

Si alguien se muestra en desacuerdo con algo que digas o hagas, resiste el reflejo de ponerte a la defensiva. Simplemente para de hacer lo que fuera que provocó la queja y discúlpate. Incluso si crees que ha habido un malentendido o acusado injustamente, es probable que hubiera algo que podrías haber comunicado mejor; recuerda que es tu responsabilidad hacer que los demás se sientan cómodos. Todos queremos llevarnos bien y todos estamos aquí principalmente porque queremos hablar de una tecnología maravillosa. Te darás cuenta de que la gente tiende a asumir buena fé y a perdonar siempre que te ganes su confianza.

Las políticas de moderación listadas más arriba se aplican en todos los canales oficiales de Lemmy; incluyendo los repositorios git bajo github.com/LemmyNet y yerbamate.ml/LemmyNet, el canal en Matrix; lemmy.ml y otras instancias bajo ese dominio. En otros proyectos que adopten el código de conducta de Lemmy, contacta con sus encargados para su aplicación. Si quieres usar este código de conducta en tu propio proyecto, valora si mencionar tu política de moderación explícitamente o hacer una copia con tu propia política de moderación para evitar confusiones.

Adaptado a partir del Código de Conducta de Rust, que se basa en la Node.js Policy on Trolling así como del Contributor Covenant v1.3.0.