Use latest mdbook version, translate with gettext

This commit is contained in:
Felix Ableitner 2023-04-24 22:38:11 +02:00
parent 85e836adbb
commit c347476067
160 changed files with 33 additions and 7735 deletions

View file

@ -1,19 +1,6 @@
[book] [book]
authors = ["Felix Ableitner"] authors = ["Lemmy Developers"]
src = "src"
[language.en] [language.en]
name = "English" name = "English"
title = "Lemmy Documentation" title = "Lemmy Documentation"
[language.es]
name = "Español"
title = "Documentación Lemmy"
[language.ru]
name = "Русский"
title = "Документация Lemmy"
[language.id]
name = "Indonesia"
title = "Dokumentasi Lemmy"

View file

@ -1,3 +0,0 @@
[toolchain]
channel = "1.61"
targets = []

View file

@ -16,7 +16,7 @@ cd server
## Full config with default values ## Full config with default values
```hjson ```hjson
{{#include ../../../include/config/defaults.hjson}} {{#include ../../include/config/defaults.hjson}}
``` ```
## Lemmy-UI configuration ## Lemmy-UI configuration

View file

@ -1,33 +0,0 @@
# Summary
- [Acerca de](about/about.md)
- [Características](about/features.md)
- [Metas](about/goals.md)
- [Clasificación de las publicaciones y los comentarios](about/ranking.md)
- [Guía](about/guide.md)
- [Administración](administration/administration.md)
- [Instalación con Docker](administration/install_docker.md)
- [Instalación con Ansible](administration/install_ansible.md)
- [Instalar desde Cero](administration/from_scratch.md)
- [Instalar en AWS](administration/on_aws.md)
- [Configuración](administration/configuration.md)
- [Introducción a la Federación](administration/federation_getting_started.md)
- [Solución de Problemas](administration/troubleshooting.md)
- [Copia de Seguridad y Restauración](administration/backup_and_restore.md)
- [Federación](federation/federation.md)
- [Visión General de la Federación](federation/overview.md)
- [Recursos](federation/resources.md)
- [Protocolo de Lemmy](federation/lemmy_protocol.md)
- [Desarrollo de clientes](client_development/client_development.md)
- [Guía para Temas](client_development/theming.md)
- [Referencia de la API](client_development/api_reference.md)
- [API del WebSocket](client_development/websocket_api.md)
- [API HTTP](client_development/http_api.md)
- [Crear un Frontend Personalizado](client_development/custom_frontend.md)
- [Contribuir al Proyecto](contributing/contributing.md)
- [Desarrollo con Docker](contributing/docker_development.md)
- [Desarrollo Local](contributing/local_development.md)
- [Pruebas](contributing/tests.md)
- [Desarrollo de la Federación](contributing/federation_development.md)
- [Bifurcaciones y Liberaciones](contributing/release_process.md)
- [Código de Conducta](code_of_conduct.md)

View file

@ -1,30 +0,0 @@
## Acerca del proyecto
| Página de inicio | Página de publicación |
| ------------------------------------- | ------------------------------------ |
| ![captura principal](main_screen.png) | ![captura del chat](chat_screen.png) |
[Lemmy](https://github.com/LemmyNet/lemmy) es similar a sitios como [Menéame](https://meneame.net), [Reddit](https://reddit.com), [Lobste.rs](https://lobste.rs), [Raddle](https://raddle.me), o [Hacker News](https://news.ycombinator.com/): 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](https://es.wikipedia.org/wiki/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?
- Cantante principal de [Motörhead](https://invidio.us/watch?v=pWB5JZRGl0U).
- El [videojuego de la vieja escuela](https://es.wikipedia.org/wiki/Lemmings).
- El [Koopa de Super Mario](https://www.mariowiki.com/Lemmy_Koopa).
- Los [roedores peludos](http://sunchild.fpwc.org/lemming-the-little-giant-of-the-north/).
### Desarrollado Con
- [Rust](https://www.rust-lang.org)
- [Actix](https://actix.rs/)
- [Diesel](http://diesel.rs/)
- [Inferno](https://infernojs.org)
- [Typescript](https://www.typescriptlang.org/)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

View file

@ -1,37 +0,0 @@
# Características
- Código abierto, [Licencia AGPL](/LICENSE).
- Auto-hospedado, fácil de desplegar (deploy).
- Viene con [Docker](#docker) y [Ansible](#ansible).
- 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.

View file

@ -1,41 +0,0 @@
# 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?](https://flow-chat.com).
- 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
- [Diesel to Postgres data types](https://kotiri.com/2018/01/31/postgresql-diesel-rust-types.html)
- [helpful diesel examples](http://siciarz.net/24-days-rust-diesel/)
- [Recursive query for adjacency list for nested comments](https://stackoverflow.com/questions/192220/what-is-the-most-efficient-elegant-way-to-parse-a-flat-table-into-a-tree/192462#192462)
- https://github.com/sparksuite/simplemde-markdown-editor
- [Markdown-it](https://github.com/markdown-it/markdown-it)
- [Sticky Sidebar](https://stackoverflow.com/questions/38382043/how-to-use-css-position-sticky-to-keep-a-sidebar-visible-with-bootstrap-4/49111934)
- [RXJS websocket](https://stackoverflow.com/questions/44060315/reconnecting-a-websocket-in-angular-and-rxjs/44067972#44067972)
- [Rust JWT](https://github.com/Keats/jsonwebtoken)
- [Hierarchical tree building javascript](https://stackoverflow.com/a/40732240/1655478)
- [Hot sorting discussion](https://meta.stackexchange.com/questions/11602/what-formula-should-be-used-to-determine-hot-questions) [2](https://medium.com/hacking-and-gonzo/how-reddit-ranking-algorithms-work-ef111e33d0d9)
- [Classification types.](https://www.reddit.com/r/ModeratorDuck/wiki/subreddit_classification)
- [RES expando - Possibly make this into a switching react component.](https://github.com/honestbleeps/Reddit-Enhancement-Suite/tree/d21f55c21e734f47d8ed03fe0ebce5b16653b0bd/lib/modules/hosts)
- [Temp Icon](https://www.flaticon.com/free-icon/mouse_194242)
- [Rust docker build](https://shaneutt.com/blog/rust-fast-small-docker-image-builds/)
- [Zurb mentions](https://github.com/zurb/tribute)
- [TippyJS](https://github.com/atomiks/tippyjs)
- [SQL function indexes](https://sorentwo.com/2013/12/30/let-postgres-do-the-work.html)

View file

@ -1,66 +0,0 @@
# 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)
<iframe id='ivplayer' width='640' height='360' src='https://invidious.xyz/embed/5axSUJj0bBY' style='border:none;'></iframe>
## 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._
| Tipo | Descripción |
| ------------------ | ---------------------------------------------------------------------------------------- |
| Activo | Tendencias ordenadas en base a la puntuación, y la hora del comentario mas reciente. |
| Popular | Tendencias ordenadas en base a la puntuación, y la hora de creación de la publicación. |
| Nuevo | Las publicaciones más nuevas. |
| Más comentados | Las publicaciones con más comentarios. |
| Nuevos comentarios | Las publicaciones con los comentarios más recientes, es decir un ordenamiento tipo foro. |
| Top | Las 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](ranking.md).
## 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.
| Tipo | O | … para obtener |
| ------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
| \*Italica\* | \_Italica\_ | _Italica_ |
| \*\*Negrita\*\* | \_\_Negrita\_\_ | **Negrita** |
| \# Titulo 1 | Titulo 1 <br> ========= | <h4>Titulo 1</h4> |
| \## Titulo 2 | Titulo 2 <br>--------- | <h5>Titulo 2</h5> |
| \[enlace\](http://a.com) | \[enlace\]\[1\]<br><br>\[1\]: http://b.org | [enlace](https://commonmark.org/) |
| !\[Imagen\](http://url/a.png) | !\[Imagen\]\[1\]<br><br>\[1\]: http://url/b.jpg | ![Markdown](https://commonmark.org/help/images/favicon.png) |
| \> Cita en bloque | | <blockquote>Cita en bloque</blockquote> |
| \* Lista <br>\* Lista <br>\* Lista | \- Lista <br>\- Lista <br>\- Lista <br> | _ Lista <br>_ Lista <br>\* Lista <br> |
| 1\. Uno <br>2\. Dos <br>3\. Tres | 1) Uno<br>2) Dos<br>3) Tres | 1. Uno<br>2. Dos<br>3. Tres |
| Línea Horizontal <br>\--- | Línea Horizontal<br>\*\*\* | Línea Horizontal <br><hr> |
| \`Código en línea\` con acento grave | | `Código en línea` con acento grave |
| \`\`\`<br>\# Bloque de código <br>print '3 acentos graves o'<br>print 'indentar 4 espacios' <br>\`\`\` | ····\# Bloque de código<br>····print '3 acentos graves o'<br>····print 'indentar 4 espacios' | \# Bloque de código <br>print '3 acentos graves o'<br>print 'indentar 4 espacios' |
| ::: spoiler o nsfw oculto <br>_mucho spoiler aquí_<br>::: | | <details><summary> spoiler o nsfw oculto </summary><p><em>mucho spoiler aquí</em></p></details> |
| Texto de ~subíndice~ | | Texto de <sub>subíndice</sub> |
| Texto de ^superíndice^ | | Texto de <sup>superíndice</sup> |
[Tutorial de CommonMark](https://commonmark.org/help/tutorial/)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

View file

@ -1,47 +0,0 @@
# 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,](https://minimaxir.com/2016/11/first-comment/) 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](https://medium.com/hacking-and-gonzo/how-hacker-news-ranking-algorithm-works-1d9b0cf2c08d) 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.
![](rank_algorithm.png)
#### 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.

View file

@ -1,23 +0,0 @@
# 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:
- [Manual con Docker](install_docker.md)
- [Automatizado con Ansible](install_ansible.md).
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.
- [Instalar desde Cero](from_scratch.md)
- [En Amazon Web Services (AWS)](on_aws.md)

View file

@ -1,77 +0,0 @@
# 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:
```bash
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
```bash
#!/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
```bash
# 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

View file

@ -1,19 +0,0 @@
# Configuración
La configuración está basada en el archivo [defaults.hjson](https://yerbamate.ml/LemmyNet/lemmy/src/branch/main/config/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:
```bash
cd server
./db-init.sh
```

View file

@ -1,37 +0,0 @@
# 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.

View file

@ -1,391 +0,0 @@
# 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.](https://lemmy.ca/post/1066) **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-admin | sudo |
| dev-vcs | [git](https://git-scm.com/) |
| dev-lang | [rust](https://www.rust-lang.org/) |
| dev-db | [postgresql](https://www.postgresql.org/) |
| www-servers | [nginx](https://nginx.org/en/) |
| sys-apps | [yarn](https://yarnpkg.com/) |
| app-shells | bash-completion |
| | |
### Poner en marcha el postgresql
```bash
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
```bash
sudo -Hu lemmy git tag -l
sudo -Hu lemmy git checkout tags/v0.11.0
```
### Build para producción? (Remover --release para dev)
```bash
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
```bash
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
```bash
sudo -Hu lemmy yarn
```
#### Esto es para producción
```bash
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**
```bash
sudo -Hu lemmy yarn dev
```
Para producción, usaremos el [script de inicio](#initlemmy), pero el comando para producción es:
```bash
sudo -Hu node dist/js/server.js
```
### Configurar la base de datos
#### Ajustar la contraseña:
```bash
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
```bash
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')
```bash
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](#initiframely) en su lugar, el cual es la mejor opción que correr esto manualmente.
```bash
sudo -Hu iframely node server
```
### Instalar pict-rs
```bash
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](https://github.com/nlfiedler/magick-rust/issues/40)
```bash
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-libs | [gexiv2](https://gitlab.gnome.org/GNOME/gexiv2) |
| media-gfx | [imagemagick](https://imagemagick.org/index.php) |
| media-video | [ffmpeg](https://ffmpeg.org/) |
| sys-devel | [clang](https://clang.llvm.org/) |
Paquetes requeridos para pict-rs (en caso de un sistema separado):
| Paquetes | |
| -------- | ---------------------------------- |
| dev-lang | [rust](https://www.rust-lang.org/) |
**Opcional** Hacer un script o ejecutarlo manualmente como usuario.
```bash
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:
```bash
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](#scripts-de-inicio-init-scripts). 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
```bash
su - lemmy
cd lemmy
```
Haz BACKUP [config/config.hjson](#configuración-1) en algún lugar.
```bash
git fetch
git tag -l
git checkout tags/WHATEVER
cargo build --release
cd ~/lemmy-ui
```
### Lista las etiquetas(tags)/lanzamientos(releases) disponibles
```bash
git fetch
git tag -l
git checkout tags/WHATEVER
git submodule update --remote
```
### Construir el frontend
#### Esto es para producción
```bash
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
```bash
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
```bash
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
```json
{
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
```bash
#!/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
```bash
#!/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
```bash
#!/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
```bash
#!/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 $?
}
```

View file

@ -1,26 +0,0 @@
# Instalación con Ansible
Esto es lo mismo que la [instalación con Docker](install_docker.md), 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](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html). Tambien necesitas instalar el [SDK de Docker para Python](https://pypi.org/project/docker/) usando `pip install docker` ([más información en la documentación de Ansible](https://docs.ansible.com/ansible/latest/collections/community/docker/docker_compose_module.html#id4)).
A continuación, ejecuta los siguientes comandos en tu computador local:
```bash
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:
```bash
git pull origin main
cd ansible
ansible-playbook lemmy.yml --become
```

View file

@ -1,55 +0,0 @@
# 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,
```bash
# 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](configuration.md) 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](https://raw.githubusercontent.com/LemmyNet/lemmy/main/ansible/templates/nginx.conf), podría ser establecido con:
```bash
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](https://letsencrypt.org/). 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:
```bash
wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/docker/prod/docker-compose.yml
docker-compose up -d
```

View file

@ -1,54 +0,0 @@
# 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](https://github.com/LemmyNet/lemmy) en AWS su [Cloud Development Kit](https://docs.aws.amazon.com/cdk/latest/guide/home.html).
### 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](https://github.com/jetbridge/lemmy-cdk).
Clona [Lemmy](https://github.com/LemmyNet/lemmy) y [Lemmy-UI](https://github.com/LemmyNet/lemmy-ui) en el directorio de arriba.
```shell
cp example.env.local .env.local
# edit .env.local
```
Debes editar .env.local con la configuración de tu sitio.
```shell
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

View file

@ -1,67 +0,0 @@
# 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](https://github.com/LemmyNet/lemmy/blob/main/ansible/templates/nginx.conf).
## Generalidades
### Registros
Para los problemas del frontend, revisa la [consola del navegador](https://webmasters.stackexchange.com/a/77337) 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](../federation/administration.md#instance-allowlist-and-blocklist).
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.

View file

@ -1,50 +0,0 @@
# Referencia de la API
Lemmy tiene dos APIs entrelazadas:
- [WebSocket](https://join-lemmy.org/api/index.html)
- [HTTP](http_api.md)
Esta página describe conceptos que son comúnes para ambas.
<!-- toc -->
- [Uso básico](#uso-básico)
- [Tipos de datos](#tipos-de-datos)
- [Tipos de Lemmy](#tipos-de-lemmy)
- [Tipos de bajo nivel](#tipos-de-bajo-nivel)
- [Límites de tarifa por defecto](#límites-de-tarifa-por-defecto)
<!-- tocstop -->
## Uso básico
Las cadenas de solicitud `request` y respuesta `response` están en [formato JSON](https://www.json.org/json-es.html).
## Tipos de datos
### Tipos de Lemmy
- [tablas que tienen las columnas / campos](https://github.com/LemmyNet/lemmy-js-client/blob/main/src/interfaces/source.ts)
- [Aggregates (para cosas como las puntuaciones)](https://github.com/LemmyNet/lemmy-js-client/blob/main/src/interfaces/aggregates.ts)
- [Views (vistas) - The main lemmy return types](https://github.com/LemmyNet/lemmy-js-client/blob/main/src/interfaces/views.ts)
- [Los formularios de solicitud (Request) / respuesta (Responses)](https://github.com/LemmyNet/lemmy-js-client/tree/main/src/interfaces/api)
### 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](https://en.wikipedia.org/wiki/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](https://github.com/LemmyNet/lemmy/blob/main/config/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](custom_frontend.md#limitación-de-la-tasa).

View file

@ -1,8 +0,0 @@
# Desarrollo de clientes
Esta sección es para cualquiera que quiera colaborar con la [aplicación web oficial para Lemmy](https://github.com/LemmyNet/lemmy-ui) o quiera desarrollar su propio cliente para el ecosistema Lemmy.
- [Guía para Temas](client_development/theming.md)
- [Referencia de la API](client_development/api_reference.md)
- [API del WebSocket](https://join-lemmy.org/api/index.html)
- [API HTTP](client_development/http_api.md)

View file

@ -1,66 +0,0 @@
# 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](api_reference.md), 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](https://www.phpbb.com/), o un sitio de preguntas y respuestas como [stackoverflow](https://stackoverflow.com/). 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](https://github.com/LemmyNet/lemmy-ui), [lemmy-lite](https://github.com/IronOxidizer/lemmy-lite), o el [lemmy-frontend-example](https://github.com/LemmyNet/lemmy-front-end-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](https://hub.docker.com/), 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](https://hub.docker.com/)). 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](https://github.com/LemmyNet/lemmy-translations) a tu proyecto como un [submódulo git](https://git-scm.com/book/en/v2/Git-Tools-Submodules). 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](https://weblate.org/es/).
## 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:
```javascript
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);
```

View file

@ -1,120 +0,0 @@
# API HTTP de Lemmy
<!-- toc -->
- [Websocket vs API HTTP](#websocket-vs-api-http)
- [Ejemplos](#ejemplos)
- [TypeScript](#typescript)
- [Curl](#curl)
- [GET](#ejemplo-get)
- [POST](#ejemplo-post)
- [Características exclusivas de la API HTTP](#características-exclusivas-de-la-api-http)
- [RSS/Atom feeds](#rss-atom-feeds)
- [Imagenes](#imagenes)
- [Crear (request)](#crear-request)
- [Crear (response)](#crear-response)
* [Delete](#delete)
<!-- tocstop -->
## 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](https://join-lemmy.org/api/index.html)
- **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](https://github.com/LemmyNet/lemmy-js-client/blob/main/src/http.ts) .
[El API del WebSocket](https://join-lemmy.org/api/index.html) 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
```ts
async editComment(form: EditComment): Promise<CommentResponse> {
return this.wrapper(HttpType.Put, '/comment', form);
}
```
| Tipo | URL | Tipo de cuerpo | Tipo de Retorno |
| ----- | ---------- | -------------- | ----------------- |
| `PUT` | `/comment` | `EditComment` | `CommentResponse` |
### 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](#rss-atom-feeds)
- [Imagenes](#imagenes)
### 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](https://github.com/LemmyNet/lemmy-js-client/blob/main/src/http.ts). La API misma debería ser considerada inestable (está sujeta a cambios en cualquier momento).

View file

@ -1,19 +0,0 @@
# Guía para Temas
Lemmy usa [Bootstrap v4](https://getbootstrap.com/), 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](https://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](https://github.com/LemmyNet/lemmy-ui).
1. 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).
1. Abre el archivo `src/shared/utils.ts` y agregas `{nombre-de-mi-tema}` a la lista de temas.
1. Pruebalo localmente
1. Haz _pull request_ con los cambios que hiciste.

View file

@ -1,3 +0,0 @@
# API del WebSocket
[Documentación de la API del WebSocket de Lemmy](https://join-lemmy.org/api/index.html)

View file

@ -1,35 +0,0 @@
# 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](https://github.com/stumpsyn/policies/blob/master/citizen_code_of_conduct.md); 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**](https://mastodon.social/@LemmyDev)
[**Envía un correo electrónico al Equipo de Moderación**](mailto:contact@lemmy.ml)
## 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](https://github.com/LemmyNet) y [yerbamate.ml/LemmyNet](https://yerbamate.ml/LemmyNet), el [canal en Matrix](https://matrix.to/#/!BZVTUuEiNmRcbFeLeI:matrix.org); [lemmy.ml](https://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](https://www.rust-lang.org/es/policies/code-of-conduct), que se basa en la [Node.js Policy on Trolling](http://blog.izs.me/post/30036893703/policy-on-trolling) así como del [Contributor Covenant v1.3.0](https://www.contributor-covenant.org/version/1/3/0/).

View file

@ -1,39 +0,0 @@
# Contribuir al Proyecto
Información sobre como contribuir a Lemmy, ya sea traduciendo, probando, diseñando o programando.
## Seguimiento de problemas (issues) / Repositorios
- [GitHub (para issues y pull requests)](https://github.com/LemmyNet/lemmy)
- [Gitea (solo para pull requests)](https://yerbamate.ml/LemmyNet/lemmy)
- [Codeberg](https://codeberg.org/LemmyNet/lemmy)
## Traduciendo
Mira el [Weblate de Lemmy](https://weblate.yerbamate.ml/projects/lemmy/) para las traducciones. Tú también puedes ayudar [traduciendo esta documentación](https://github.com/LemmyNet/lemmy-docs#adding-a-new-language).
## Arquitectura
### Front end
- El front end está escrito en `typescript`, usando un framework similar a React llamado [inferno](https://infernojs.org/). Todos los elementos de la interfaz de usuario (UI) son componentes `.tsx` reutilizables.
- El repositorio del front end es [lemmy-ui](https://github.com/LemmyNet/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`.

View file

@ -1,42 +0,0 @@
# Desarrollo con Docker
## Dependencias
### Distro basada en Debian
```bash
sudo apt install git docker-compose
sudo systemctl start docker
git clone https://github.com/LemmyNet/lemmy
```
### Distro basada en Arch
```bash
sudo -S git docker-compose
sudo systemctl start docker
git clone https://github.com/LemmyNet/lemmy
```
## Ejecución
```bash
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](local_development.md) en su lugar.

View file

@ -1,63 +0,0 @@
# Desarrollo de la Federación
## Ejecutando localmente
Instala las dependencias necesarias como esta descrito en el documento [Desarrollo con Docker](docker_development.md). Enseguida ejecuta lo siguiente:
```bash
cd docker/federation
./start-local-instances.bash
```
Las pruebas de federación establecen 5 instancias:
| Instancia | Nombre de usuario | Localización | Notas |
| ------------- | ----------------- | --------------------------------------- | ---------------------------------------------------- |
| lemmy-alpha | lemmy_alpha | [127.0.0.1:8540](http://127.0.0.1:8540) | federada con todas las demás instancias |
| lemmy-beta | lemmy_beta | [127.0.0.1:8550](http://127.0.0.1:8550) | federada con todas las demás instancias |
| lemmy-gamma | lemmy_gamma | [127.0.0.1:8560](http://127.0.0.1:8560) | federada con todas las demás instancias |
| lemmy-delta | lemmy_delta | [127.0.0.1:8570](http://127.0.0.1:8570) | solo permite federación con lemmy-beta |
| lemmy-epsilon | lemmy_epsilon | [127.0.0.1:8580](http://127.0.0.1:8580) | usa 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](../administration/install_ansible.md) o
[manualmente con Docker](../administration/install_docker.md). 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.

View file

@ -1,114 +0,0 @@
# Desarrollo Local
### Instalar requisitos
Instala Rust utilizando [la opción recomendada en rust-lang.org](https://www.rust-lang.org/tools/install) (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](https://brew.sh/) 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](http://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](http://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](docker_development.md).

View file

@ -1,19 +0,0 @@
# 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](https://www.bitsnbites.eu/a-stable-mainline-branching-model-for-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

View file

@ -1,29 +0,0 @@
### Pruebas
#### Rust
Después de instalar las [dependencias para el desarrollo local](local_development.md), ejecuta el siguiente comando:
```bash
psql -U lemmy -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
./test.sh
```
### Federación
Instala las [dependencias para el desarrollo local](local_development.md), 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
```

View file

@ -1,28 +0,0 @@
# Federation Administration
Note: ActivityPub federation is still under development. We recommend that you only enable it on test instances for now.
To enable federation, change the setting `federation.enabled` to `true` in `lemmy.hjson`, and restart Lemmy.
Federation does not start automatically, but needs to be triggered manually through the search. To do this you have to enter a reference to a remote object, such as:
- `!main@lemmy.ml` (Community)
- `@nutomic@lemmy.ml` (User)
- `https://lemmy.ml/c/programming` (Community)
- `https://lemmy.ml/u/nutomic` (User)
- `https://lemmy.ml/post/123` (Post)
- `https://lemmy.ml/comment/321` (Comment)
For an overview of how federation in Lemmy works on a technical level, check out our [Federation Overview](contributing_federation_overview.md).
## Instance allowlist and blocklist
The federation section of Lemmy's config has two variables `allowed_instances` and `blocked_instances`. These control which other instances Lemmy will federate with. Both settings take a comma separated list of domains, eg `lemmy.ml,example.com`. You can either change those settings via `/admin`, or directly on the server filesystem.
It is important to note that these settings only affect sending and receiving of data between instances. If allow federation with a certain instance, and then remove it from the allowlist, this will not affect previously federated data. These communities, users, posts and comments will still be shown. They will just not be updated anymore. And even if an instance is blocked, it can still fetch and display public data from your instance.
By default, both `allowed_instances` and `blocked_instances` values are empty, which means that Lemmy will federate with every compatible instance. We do not recommend this, because the moderation tools are not yet ready to deal with malicious instances.
What we do recommend is putting a list of trusted instances into `allowed_instances`, and only federating with those. Note that both sides need to add each other to their `allowed_instances` to allow two-way federation.
Alternatively you can also use blocklist based federation. In this case, add the domains of instances you do _not_ want to federate with. You can only set one of `allowed_instances` and `blocked_instances`, as setting both doesn't make sense.

View file

@ -1 +0,0 @@
# Federación

View file

@ -1,782 +0,0 @@
# Protocolo de la Federación Lemmy
El protocolo de Lemmy (o Protocolo de la Federación Lemmy) es un subconjunto estricto del [Protocolo ActivityPub](https://www.w3.org/TR/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](overview.md) 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](https://github.com/LemmyNet/lemmy/issues/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.
<!-- toc -->
- [Contexto](#context)
- [Actores](#actors)
- [Comunidad](#community)
- [Bandeja de salida de la Comunidad](#community-outbox)
- [Seguidores de la Comunidad](#community-followers)
- [Moderadores de la Comunidad](#community-moderators)
- [Usuario](#user)
- [Bandeja de salida del Usuario](#user-outbox)
- [Objectos](#objects)
- [Publicación](#post)
- [Comentario](#comment)
- [Mensaje privado](#private-message)
- [Actividades](#activities)
- [Usuario a Comunidad](#user-to-community)
- [Seguir](#follow)
- [Dejar de seguir](#unfollow)
- [Crear o Actualizar Publicación](#create-or-update-post)
- [Crear o Actualizar Comentario](#create-or-update-comment)
- [Me gusta Publicación o Comentario](#like-post-or-comment)
- [No me gusta Publicación o Comentario](#dislike-post-or-comment)
- [Eliminar Publicación o Comentario](#delete-post-or-comment)
- [Remover Publicación o Comentario](#remove-post-or-comment)
- [Deshacer](#undo)
- [Comunidad a Usuario](#community-to-user)
- [Aceptar Seguir](#accept-follow)
- [Anunciar](#announce)
- [Remover o Eliminar Comunidad](#remove-or-delete-community)
- [Restaurar Comunidad Removida o Eliminada](#restore-removed-or-deleted-community)
- [Usuario a Usuario](#user-to-user)
- [Crear o Actualizar Mensaje Privado](#create-or-update-private-message)
- [Eliminar Mensaje Privado](#delete-private-message)
- [Deshacer la Eliminación del Mensaje Privado](#undo-delete-private-message)⏎
<!-- tocstop -->
## Contexto
```json
{
"@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).
```json
{
"@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 Campo | Obligatorio | Descripción |
| ------------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `preferredUsername` | si | Nombre del actor |
| `name` | si | Titulo de la comunidad |
| `sensitive` | si | True indica que todas las publicaciones en la comunidad son nsfw |
| `attributedTo` | si | Primero el creador de la comunidad, luego el resto de los moderadores |
| `content` | no | Texto para la barra lateral de lac comunidad, que suele contener una descripción y normas |
| `icon` | no | Icono que aparece junto al nombre de la comunidad |
| `image` | no | Imagen de banner, mostrada en la parte superior de la página de la comunidad |
| `inbox` | no | URL de la bandeja de entrada de ActivityPub |
| `outbox` | no | URL de la bandeja de salida de ActivityPub, sólo contiene las últimas 20 publicaciones sin comentarios, votos u otras actividades |
| `followers` | no | URL de la colección de seguidores, sólo contiene el número de seguidores, sin referencias a seguidores individuales |
| `endpoints` | no | Contiene la URL de la bandeja de entrada compartida |
| `published` | no | Fecha de creación de la comunidad |
| `updated` | no | Fecha de la última modificación de la comunidad |
| `publicKey` | si | La clave pública utilizada para verificar las firmas de este actor |
#### Bandeja de Salida de la Comunidad
```json
{
"@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
```json
{
"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
```json
{
"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).
```json
{
"@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 Campo | Obligatorio | Descripción |
| ------------------- | ----------- | ------------------------------------------------------------------ |
| `preferredUsername` | si | Nombre del actor |
| `name` | no | El nombre para mostrar del usuario |
| `content` | no | La biografía del usuario |
| `icon` | no | El avatar del usuario, que aparece junto al nombre del usuario |
| `image` | no | Banner del usuario, mostrada en la parte superior del perfil |
| `inbox` | no | URL de la bandeja de entrada de ActivityPub |
| `endpoints` | no | Contiene la URL de la bandeja de entrada compartida |
| `published` | no | Fecha de registro del usuario |
| `updated` | no | Fecha de la última actualización del perfil del usuario |
| `publicKey` | si | La clave pública utilizada para verificar las firmas de este actor |
#### Bandeja de salida del Usuario
```json
{
"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.
```json
{
"@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 Campo | Obligatorio | Description |
| ----------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------- |
| `attributedTo` | si | ID del usuario que creó esta publicación |
| `to` | si | ID de la comunidad en la que se publicó |
| `name` | si | Título de la publicación |
| `content` | no | Cuerpo de la publicación |
| `url` | no | Un enlace arbitrario para compartir |
| `image` | no | Miniatura para la `url`, sólo aparece si es un enlace de imagen |
| `commentsEnabled` | si | False indica que la publicación está bloqueada, y no se pueden añadir comentarios |
| `sensitive` | si | True marca la publicación como NSFW,difumina la miniatura y la oculta a los usuarios con la configuración NSFW desactivada |
| `stickied` | si | True significa que se muestra en la parte superior de la comunidad |
| `published` | no | Fecha de creación de la publicación |
| `updated` | no | Fecha 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.
```json
{
"@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 Campo | Obligatorio | Descripción |
| ---------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `attributedTo` | si | ID del usuario que creó el comentario |
| `to` | si | Comunidad donde se hizo el comentario |
| `content` | si | El texto del comentario |
| `inReplyTo` | si | ID 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 |
| `published` | no | Fecha de creación del comentario |
| `updated` | no | Fecha 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`.
```json
{
"@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"
}
```
<!-- Fix table in english version --->
| Nombre del Campo | Obligatorio | Descripción |
| ---------------- | ----------- | ---------------------------------------------------------------------------- |
| `attributedTo` | | ID del usuario que creo este mensaje |
| `to` | | ID del destinatario |
| `content` | si | El texto del mensaje privado |
| `published` | no | Fecha de creación del mensaje |
| `updated` | no | Fecha 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`.
```json
{
"@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 Campo | Obligatorio | Descripción |
| ---------------- | ----------- | --------------------------------------------------------- |
| `actor` | si | El usuario que envía la solicitud de seguimiento `Follow` |
| `object` | si | La 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.
```json
{
"@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.
```json
{
"@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 Campo | Obligatorio | Descripción |
| ---------------- | ----------- | -------------------------------------- |
| `type` | si | Crear `Create` o Actualizar `Update` |
| `cc` | si | Comunidad donde se hizo la publicación |
| `object` | si | La 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`.
```json
{
"@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 Campo | Obligatorio | Descripción |
| ---------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `tag` | no | Lista de los usuarios que se mencionan en el comentario (como `@usuario@ejemplo.com`) |
| `cc` | si | Comunidad 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 |
| `object` | si | El comentario que se crea |
#### Me gusta Publicación o Comentario
Un voto positivo para una publicación o un comentario
```json
{
"@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 Campo | Obligatorio | Descripción |
| ---------------- | ----------- | ------------------------------------------------------------------- |
| `cc` | si | ID de la comunidad en la que se encuentra la publicación/comentario |
| `object` | si | La 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
```json
{
"@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 Campo | Obligatorio | Descripción |
| ---------------- | ----------- | ------------------------------------------------------------------- |
| `cc` | si | ID de la comunidad en la que se encuentra la publicación/comentario |
| `object` | si | La 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.
```json
{
"@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 Campo | Obligatorio | Descripción |
| ---------------- | ----------- | ------------------------------------------------------------------- |
| `cc` | si | ID de la comunidad en la que se encuentra la publicación/comentario |
| `object` | si | La 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.
```json
{
"@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 Campo | Obligatorio | Descripción |
| ---------------- | ----------- | ------------------------------------------------------------------- |
| `cc` | si | ID de la comunidad en la que se encuentra la publicación/comentario |
| `object` | si | La 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 `Delete`o `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.
```json
{
"@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 Campo | Obligatorio | Descripción |
| ---------------- | ----------- | ------------------------------------------------------------------------------------------------ |
| `object` | si | Cualquier 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.
```json
{
"@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.
```json
{
"@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.
```json
{
"@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 Campo | Obligatorio | Descripción |
| ---------------- | ----------- | ----------------------------------------------- |
| `actor` | si | La misma comunidad que en la actividad `Follow` |
| `to` | no | ID del usuario que envió el `Follow` |
| `object` | si | La 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.
```json
{
"@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 Campo | Obligatorio | Descripción |
| ---------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `object` | si | Cualquier actividad `Create`, `Update`, `Like`, `Dislike`, `Delete`, `Remove` o `Undo` tal como se ha descrito en la sección [Usuario a Comunidad](#user-to-community) |
#### Remover o Eliminar Comunidad
Un administrador de instancia puede remover la comunidad, o un mod puede eliminarla.
```json
{
"@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 Campo | Obligatorio | Descripción |
| ---------------- | ----------- | ------------------------------------ |
| `type` | si | Remover `Remove` o Eliminar `Delete` |
#### Restaurar Comunidad Removida o Eliminada
Revierte la remoción o eliminación
```json
{
"@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 Campo | Obligatorio | Descripción |
| ---------------- | ----------- | ------------------------------------ |
| `object.type` | si | Remover `Remove` o Eliminar `Delete` |
### Usuario a Usuario
#### Crear o Actualizar Mensaje Privado
Crea un nuevo mensaje privado entre dos usuarios.
```json
{
"@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 Campo | Obligatorio | Descripción |
| ---------------- | ----------- | -------------------------------------- |
| `type` | si | Crear `Create` o Actualizar `Update` |
| `object` | si | Un [Mensaje Privado](#private-message) |
#### Eliminar Mensaje Privado
Elimina un mensaje privado previo
```json
{
"@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.
```json
{
"@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": ...
}
```

View file

@ -1,123 +0,0 @@
# 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](contributing_apub_api_outline.md).
## 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](https://github.com/LemmyNet/lemmy/issues/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/Nota`Create/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.

View file

@ -1,22 +0,0 @@
# Recursos de ActivityPub
## Documentos Oficiales
- [ActivityPub standard](https://www.w3.org/TR/activitypub/)
- [Activitypub vocabulary](https://www.w3.org/TR/activitystreams-vocabulary/)
## Explicaciones
- [ActivityPub - one protocol to rule them all?](https://schub.io/blog/2018/02/01/activitypub-one-protocol-to-rule-them-all.html)
- [A highly opinionated guide to learning about ActivityPub](https://tinysubversions.com/notes/reading-activitypub/)
- [Activitypub implementers guide](https://socialhub.activitypub.rocks/t/draft-guide-for-new-activitypub-implementers/479)
- [Mastodon Blog: How to implement a basic ActivityPub server](https://blog.joinmastodon.org/2018/06/how-to-implement-a-basic-activitypub-server/)
- [Mastodon Blog: Implementing an ActivityPub inbox](https://blog.joinmastodon.org/2018/07/how-to-make-friends-and-verify-requests/)
- [Data storage questions](https://socialhub.activitypub.rocks/t/data-storage-questions/579)
- [Activitypub as it has been understood](https://flak.tedunangst.com/post/ActivityPub-as-it-has-been-understood)
## Ejemplos y Bibliotecas
- [ActivityPub example server](https://github.com/tOkeshu/activitypub-example)
- [ActivityStreams crate](https://docs.rs/activitystreams/)
- [HTTP Signatures crate](https://git.asonix.dog/Aardwolf/http-signature-normalization)

View file

@ -53,7 +53,7 @@ Before reading this, have a look at our [Federation Overview](overview.md) to ge
## Context ## Context
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/context.json}} {{#include ../../include/crates/apub/assets/lemmy/context.json}}
``` ```
The context is identical for all activities and objects. The context is identical for all activities and objects.
@ -69,7 +69,7 @@ Sends activities to user: `Accept/Follow`, `Announce`
Receives activities from user: `Follow`, `Undo/Follow`, `Create`, `Update`, `Like`, `Dislike`, `Remove` (only admin/mod), `Delete` (only creator), `Undo` (only for own actions) Receives activities from user: `Follow`, `Undo/Follow`, `Create`, `Update`, `Like`, `Dislike`, `Remove` (only admin/mod), `Delete` (only creator), `Undo` (only for own actions)
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/objects/group.json}} {{#include ../../include/crates/apub/assets/lemmy/objects/group.json}}
``` ```
| Field Name | Description | | Field Name | Description |
@ -100,7 +100,7 @@ Receives activities from Community: `Accept/Follow`, `Announce`
Sends and receives activities from/to other users: `Create/Note`, `Update/Note`, `Delete/Note`, `Undo/Delete/Note` (all those related to private messages) Sends and receives activities from/to other users: `Create/Note`, `Update/Note`, `Delete/Note`, `Undo/Delete/Note` (all those related to private messages)
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/objects/person.json}} {{#include ../../include/crates/apub/assets/lemmy/objects/person.json}}
``` ```
| Field Name | Description | | Field Name | Description |
@ -123,7 +123,7 @@ The user inbox is not actually implemented yet, and is only a placeholder for Ac
Represents a Lemmy instance, and is used to federate global data like the instance description or site bans. It can be fetched from the root path. Represents a Lemmy instance, and is used to federate global data like the instance description or site bans. It can be fetched from the root path.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/objects/instance.json}} {{#include ../../include/crates/apub/assets/lemmy/objects/instance.json}}
``` ```
| Field Name | Description | | Field Name | Description |
@ -146,7 +146,7 @@ Represents a Lemmy instance, and is used to federate global data like the instan
A page with title, and optional URL and text content. The URL often leads to an image, in which case a thumbnail is included. Each post belongs to exactly one community. A page with title, and optional URL and text content. The URL often leads to an image, in which case a thumbnail is included. Each post belongs to exactly one community.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/objects/page.json}} {{#include ../../include/crates/apub/assets/lemmy/objects/page.json}}
``` ```
| Field Name | Description | | Field Name | Description |
@ -168,7 +168,7 @@ A page with title, and optional URL and text content. The URL often leads to an
A reply to a post, or reply to another comment. Contains only text (including references to other users or communities). Lemmy displays comments in a tree structure. A reply to a post, or reply to another comment. Contains only text (including references to other users or communities). Lemmy displays comments in a tree structure.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/objects/note.json}} {{#include ../../include/crates/apub/assets/lemmy/objects/note.json}}
``` ```
| Field Name | Description | | Field Name | Description |
@ -185,7 +185,7 @@ A reply to a post, or reply to another comment. Contains only text (including re
A direct message from one user to another. Can not include additional users. Threading is not implemented yet, so the `inReplyTo` field is missing. A direct message from one user to another. Can not include additional users. Threading is not implemented yet, so the `inReplyTo` field is missing.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/objects/chat_message.json}} {{#include ../../include/crates/apub/assets/lemmy/objects/chat_message.json}}
``` ```
| Field Name | Description | | Field Name | Description |
@ -201,7 +201,7 @@ A direct message from one user to another. Can not include additional users. Thr
### Community Outbox ### Community Outbox
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/collections/group_outbox.json}} {{#include ../../include/crates/apub/assets/lemmy/collections/group_outbox.json}}
``` ```
The outbox only contains `Create/Post` activities for now. The outbox only contains `Create/Post` activities for now.
@ -209,7 +209,7 @@ The outbox only contains `Create/Post` activities for now.
### Community Followers ### Community Followers
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/collections/group_followers.json}} {{#include ../../include/crates/apub/assets/lemmy/collections/group_followers.json}}
``` ```
The followers collection is only used to expose the number of followers. Actor IDs are not included, to protect user privacy. The followers collection is only used to expose the number of followers. Actor IDs are not included, to protect user privacy.
@ -217,13 +217,13 @@ The followers collection is only used to expose the number of followers. Actor I
### Community Moderators ### Community Moderators
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/collections/group_moderators.json}} {{#include ../../include/crates/apub/assets/lemmy/collections/group_moderators.json}}
``` ```
### User Outbox ### User Outbox
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/collections/person_outbox.json}} {{#include ../../include/crates/apub/assets/lemmy/collections/person_outbox.json}}
``` ```
## Activities ## Activities
@ -235,7 +235,7 @@ The followers collection is only used to expose the number of followers. Actor I
When the user clicks "Subscribe" in a community, a `Follow` is sent. The community automatically responds with an `Accept/Follow`. When the user clicks "Subscribe" in a community, a `Follow` is sent. The community automatically responds with an `Accept/Follow`.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/following/follow.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/following/follow.json}}
``` ```
#### Unfollow #### Unfollow
@ -243,7 +243,7 @@ When the user clicks "Subscribe" in a community, a `Follow` is sent. The communi
Clicking on the unsubscribe button in a community causes an `Undo/Follow` to be sent. The community removes the user from its follower list after receiving it. Clicking on the unsubscribe button in a community causes an `Undo/Follow` to be sent. The community removes the user from its follower list after receiving it.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/following/undo_follow.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/following/undo_follow.json}}
``` ```
#### Report Post or Comment #### Report Post or Comment
@ -251,7 +251,7 @@ Clicking on the unsubscribe button in a community causes an `Undo/Follow` to be
Reports a post or comment for rule violation, so that mods/admins review it. Reports a post or comment for rule violation, so that mods/admins review it.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/community/report_page.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/community/report_page.json}}
``` ```
### Community to User ### Community to User
@ -261,7 +261,7 @@ Reports a post or comment for rule violation, so that mods/admins review it.
Automatically sent by the community in response to a `Follow`. At the same time, the community adds this user to its followers list. Automatically sent by the community in response to a `Follow`. At the same time, the community adds this user to its followers list.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/following/accept.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/following/accept.json}}
``` ```
#### Announce #### Announce
@ -269,7 +269,7 @@ Automatically sent by the community in response to a `Follow`. At the same time,
When the community receives a post or comment activity, it wraps that into an `Announce` and sends it to all followers. When the community receives a post or comment activity, it wraps that into an `Announce` and sends it to all followers.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/community/announce_create_page.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/community/announce_create_page.json}}
``` ```
### Announcable ### Announcable
@ -281,7 +281,7 @@ All of these activities are sent from a user to a community. The community then
When a user creates a new post, it is sent to the respective community. Editing a previously created post sends an almost identical activity, except the `type` being `Update`. We don't support mentions in posts yet. When a user creates a new post, it is sent to the respective community. Editing a previously created post sends an almost identical activity, except the `type` being `Update`. We don't support mentions in posts yet.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/create_or_update/create_page.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/create_or_update/create_page.json}}
``` ```
#### Create or Update Comment #### Create or Update Comment
@ -289,7 +289,7 @@ When a user creates a new post, it is sent to the respective community. Editing
A reply to a post, or to another comment. Can contain mentions of other users. Editing a previously created post sends an almost identical activity, except the `type` being `Update`. A reply to a post, or to another comment. Can contain mentions of other users. Editing a previously created post sends an almost identical activity, except the `type` being `Update`.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/create_or_update/create_note.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/create_or_update/create_note.json}}
``` ```
#### Like Post or Comment #### Like Post or Comment
@ -297,7 +297,7 @@ A reply to a post, or to another comment. Can contain mentions of other users. E
An upvote for a post or comment. An upvote for a post or comment.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/voting/like_note.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/voting/like_note.json}}
``` ```
#### Dislike Post or Comment #### Dislike Post or Comment
@ -305,7 +305,7 @@ An upvote for a post or comment.
A downvote for a post or comment. A downvote for a post or comment.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/voting/dislike_page.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/voting/dislike_page.json}}
``` ```
#### Undo Like or Dislike Post or Comment #### Undo Like or Dislike Post or Comment
@ -313,7 +313,7 @@ A downvote for a post or comment.
Remove a vote that was previously done by the same user. Remove a vote that was previously done by the same user.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/voting/undo_like_note.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/voting/undo_like_note.json}}
``` ```
#### Delete Post or Comment #### Delete Post or Comment
@ -321,7 +321,7 @@ Remove a vote that was previously done by the same user.
Deletes a previously created post or comment. This can only be done by the original creator of that post/comment. Deletes a previously created post or comment. This can only be done by the original creator of that post/comment.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/deletion/delete_page.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/deletion/delete_page.json}}
``` ```
#### Remove Post or Comment #### Remove Post or Comment
@ -329,7 +329,7 @@ Deletes a previously created post or comment. This can only be done by the origi
Removes a post or comment. This can only be done by a community mod, or by an admin on the instance where the community is hosted. The difference to delete is that remove activities have a summary field, which contains the reason for removal, as provided by the mod/admin. Removes a post or comment. This can only be done by a community mod, or by an admin on the instance where the community is hosted. The difference to delete is that remove activities have a summary field, which contains the reason for removal, as provided by the mod/admin.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/deletion/remove_note.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/deletion/remove_note.json}}
``` ```
#### Undo Delete or Remove #### Undo Delete or Remove
@ -337,7 +337,7 @@ Removes a post or comment. This can only be done by a community mod, or by an ad
Reverts the action done by the activity in the object field. In this example, the removed Note is restored. Reverts the action done by the activity in the object field. In this example, the removed Note is restored.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/deletion/undo_remove_note.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/deletion/undo_remove_note.json}}
``` ```
#### Add Mod #### Add Mod
@ -345,7 +345,7 @@ Reverts the action done by the activity in the object field. In this example, th
Add a new mod to the community. Has to be sent by an existing community mod, or an admin of the community's instance. Add a new mod to the community. Has to be sent by an existing community mod, or an admin of the community's instance.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/community/add_mod.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/community/add_mod.json}}
``` ```
#### Remove Mod #### Remove Mod
@ -353,7 +353,7 @@ Add a new mod to the community. Has to be sent by an existing community mod, or
Remove an existing mod from the community. Has to be sent by an existing community mod, or an admin of the community's instance. Remove an existing mod from the community. Has to be sent by an existing community mod, or an admin of the community's instance.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/community/remove_mod.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/community/remove_mod.json}}
``` ```
#### Block User #### Block User
@ -362,7 +362,7 @@ Blocks a user so he can't participate anymore. The scope is determined by the `t
be deleted. be deleted.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/block/block_user.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/block/block_user.json}}
``` ```
#### Undo Block User #### Undo Block User
@ -370,7 +370,7 @@ be deleted.
Reverts a previous user block. Reverts a previous user block.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/block/undo_block_user.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/block/undo_block_user.json}}
``` ```
### User to User ### User to User
@ -380,7 +380,7 @@ Reverts a previous user block.
Creates a new private message between two users. Creates a new private message between two users.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/create_or_update/create_private_message.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/create_or_update/create_private_message.json}}
``` ```
#### Delete Private Message #### Delete Private Message
@ -388,7 +388,7 @@ Creates a new private message between two users.
Deletes a previous private message. Deletes a previous private message.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/deletion/delete_private_message.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/deletion/delete_private_message.json}}
``` ```
#### Undo Delete Private Message #### Undo Delete Private Message
@ -396,5 +396,5 @@ Deletes a previous private message.
Restores a previously deleted private message. The `object` is regenerated from scratch, as such the activity ID and other fields are different. Restores a previously deleted private message. The `object` is regenerated from scratch, as such the activity ID and other fields are different.
```json ```json
{{#include ../../../include/crates/apub/assets/lemmy/activities/deletion/undo_delete_private_message.json}} {{#include ../../include/crates/apub/assets/lemmy/activities/deletion/undo_delete_private_message.json}}
``` ```

View file

@ -1,31 +0,0 @@
# Summary
- [About](about/about.md)
- [Features](about/features.md)
- [Goals](about/goals.md)
- [Post and Comment Ranking](about/ranking.md)
- [Guide](about/guide.md)
- [Administration](administration/administration.md)
- [Install with Docker](administration/install_docker.md)
- [Install with Ansible](administration/install_ansible.md)
- [Other Installation Methods](administration/other_installation_methods.md)
- [Configuration](administration/configuration.md)
- [Getting started with Federation](administration/federation_getting_started.md)
- [Troubleshooting](administration/troubleshooting.md)
- [Backup and Restore](administration/backup_and_restore.md)
- [Federation](federation/federation.md)
- [Federation Overview](federation/overview.md)
- [Resources](federation/resources.md)
- [Lemmy Protocol](federation/lemmy_protocol.md)
- [Client Development](client_development/client_development.md)
- [Theming Guide](client_development/theming.md)
- [API reference](client_development/api_reference.md)
- [WebSocket API](client_development/websocket_api.md)
- [HTTP API](client_development/http_api.md)
- [Creating a Custom Frontend](client_development/custom_frontend.md)
- [Contributing](contributing/contributing.md)
- [Docker Development](contributing/docker_development.md)
- [Local Development](contributing/local_development.md)
- [Tests](contributing/tests.md)
- [Federation Development](contributing/federation_development.md)
- [Code of Conduct](code_of_conduct.md)

View file

@ -1,30 +0,0 @@
## À propos du pojet
| Première page | Publication |
| ------------------------------- | ------------------------------- |
| ![main screen](main_screen.png) | ![chat screen](chat_screen.png) |
[Lemmy](https://github.com/LemmyNet/lemmy) est similaire à des sites comme [Reddit](https://reddit.com), [Lobste.rs](https://lobste.rs), [Raddle](https://raddle.me) ou [Hacker News](https://news.ycombinator.com/) : vous vous abonnez aux forums qui vous intéressent, vous publiez des liens et des discussions, puis vous votez et commentez. Dans les coulisses, c'est très différent : n'importe qui peut facilement gérer un serveur, et tous ces serveurs sont fédérés (pensez au courrier électronique) et connectés au même univers, appelé le [Fediverse] (https://en.wikipedia.org/wiki/Fediverse).
Pour un agrégateur de liens, cela signifie qu'un utilisateur enregistré sur un serveur peut s'abonner à des forums sur n'importe quel autre serveur, et peut avoir des discussions avec des utilisateurs enregistrés ailleurs.
L'objectif global est de créer une alternative facilement auto-hébergeable et décentralisée à Reddit et à d'autres agrégateurs de liens, en dehors du contrôle et de l'ingérence des entreprises.
Chaque serveur lemmy peut définir sa propre politique de modération, en nommant des administrateurs pour l'ensemble du site et des modérateurs de communauté afin d'écarter les trolls et de favoriser un environnement sain et non toxique où chacun peut se sentir à l'aise pour contribuer.
_Note: La Fédération est toujours en développement actif_
### Pourquoi "Lemmy" ?
- Lead singer from [Motörhead](https://invidio.us/watch?v=pWB5JZRGl0U).
- The old school [video game](<https://en.wikipedia.org/wiki/Lemmings_(video_game)>).
- The [Koopa from Super Mario](https://www.mariowiki.com/Lemmy_Koopa).
- The [furry rodents](http://sunchild.fpwc.org/lemming-the-little-giant-of-the-north/).
### Construit avec
- [Rust](https://www.rust-lang.org)
- [Actix](https://actix.rs/)
- [Diesel](http://diesel.rs/)
- [Inferno](https://infernojs.org)
- [Typescript](https://www.typescriptlang.org/)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

View file

@ -1,35 +0,0 @@
# Features
- Open source, [AGPL License](/LICENSE).
- Auto-hébergeable, facil à déployer.
- Fourni avec [Docker](#docker) et [Ansible](#ansible).
- Interface propre et conviviale pour les téléphones portables.
- Il suffit d'un nom d'utilisateur et d'un mot de passe pour s'inscrire !
- Prise en charge des avatars des utilisateurs.
- Mise à jour en temps réel des fils de commentaires.
- Scores de vote `(+/-)` comme l'ancien reddit.
- Thèmes, y compris clair, sombre, et solarisé.
- Emojis avec support de l'autocomplétion. Commencez en tapant `:`
- Metion des utilisateurs avec `@`, mention de la communauté avec `!`.
- Téléchargement d'images intégré dans les messages et les commentaires.
- Un message peut être composé d'un titre et de toute combinaison de texte, d'une URL ou de rien d'autre.
- Notifications, sur les réponses aux commentaires et lorsque vous êtes metionné.
- Les notifications peuvent être envoyé par courriel
- i18n / Prise en charge d l'internationalisation.
- RSS / Flux Atom pour "Tous", "Abonnés", "Boîte de réception", "Utilisateur" et "Communauté".
- Prise en charge du publipostage croisé.
- Une _recherche de messages similaires_ lors de la création de nouveaux messages. Idéal pour les communautés de questions/réponses.
- Capacités de modération.
- Logs de modération publics.
- Peut épingler des messages en haut des communautés.
- Administrateurs du site et les modérateurs de communauté, qui peuvent nommer d'autres modérateurs.
- Peut verrouiller, supprimer et restaurer les messages et les commentaires.
- Peut bannir et débannir des utilisateurs des communautés et du site.
- Peut transférer le site et les communautés à d'autres.
- Peut effacer complètement vos données, en remplaçant tous les messages et commentaires.
- Prise en charge pour les messages NSFW et les communautés.
- Haute performance.
- Le serveur est écrit en rust.
- L'interface est `~80kB` gzippée.
- Front-end fonctionne sans javascript (lecture seule).
- Prise en charge d' arm64 / Raspberry Pi.

View file

@ -1,41 +0,0 @@
# Objectifs
_Cette section contient des idées et des ressources de l'équipe qui développe Lemmy_. Similaire à un bloc-notes
- Trouver un nom / nom de code.
- Doit avoir des communautés.
- Doit avoir des commentaires en fil de discussion.
- Doit être fédéré : aimer et suivre les communautés à travers les instances.
- Doit être actualisé en temps réel : avoir un panneau de droite pour les nouveaux commentaires, et un panneau principal pour la vue complète du fil de discussion.
- Utiliser des websockets pour envoyer et recevoir des messages dans votre propre instance.
# Questions
- Comment fonctionne le vote ? Devrions-nous revenir à l'ancienne méthode qui consistait à compter les votes positifs et négatifs ? Ou juste un score ?
- Décider de la technologie à utiliser
- Backend : Actix, Diesel.
- Front-end : inferno, typescript et bootstrap pour le moment.
- Doit-on autoriser les robots ?
- Les commentaires / votes doivent-ils être statiques, ou ressembler à un chat, comme [flowchat ?] (https://flow-chat.com).
- Modèle à deux volets - le volet de droite contient les commentaires en direct, le volet de gauche est l'arborescence en direct.
- Sur mobile, permettre de passer de l'un à l'autre. Par défaut ?
# Ressources / Bibliothèques potentielles
- [Diesel to Postgres data types](https://kotiri.com/2018/01/31/postgresql-diesel-rust-types.html)
- [helpful diesel examples](http://siciarz.net/24-days-rust-diesel/)
- [Recursive query for adjacency list for nested comments](https://stackoverflow.com/questions/192220/what-is-the-most-efficient-elegant-way-to-parse-a-flat-table-into-a-tree/192462#192462)
- https://github.com/sparksuite/simplemde-markdown-editor
- [Markdown-it](https://github.com/markdown-it/markdown-it)
- [Sticky Sidebar](https://stackoverflow.com/questions/38382043/how-to-use-css-position-sticky-to-keep-a-sidebar-visible-with-bootstrap-4/49111934)
- [RXJS websocket](https://stackoverflow.com/questions/44060315/reconnecting-a-websocket-in-angular-and-rxjs/44067972#44067972)
- [Rust JWT](https://github.com/Keats/jsonwebtoken)
- [Hierarchical tree building javascript](https://stackoverflow.com/a/40732240/1655478)
- [Hot sorting discussion](https://meta.stackexchange.com/questions/11602/what-formula-should-be-used-to-determine-hot-questions) [2](https://medium.com/hacking-and-gonzo/how-reddit-ranking-algorithms-work-ef111e33d0d9)
- [Classification types.](https://www.reddit.com/r/ModeratorDuck/wiki/subreddit_classification)
- [RES expando - Possibly make this into a switching react component.](https://github.com/honestbleeps/Reddit-Enhancement-Suite/tree/d21f55c21e734f47d8ed03fe0ebce5b16653b0bd/lib/modules/hosts)
- [Temp Icon](https://www.flaticon.com/free-icon/mouse_194242)
- [Rust docker build](https://shaneutt.com/blog/rust-fast-small-docker-image-builds/)
- [Zurb mentions](https://github.com/zurb/tribute)
- [TippyJS](https://github.com/atomiks/tippyjs)
- [SQL function indexes](https://sorentwo.com/2013/12/30/let-postgres-do-the-work.html)

View file

@ -1,56 +0,0 @@
# Guide de Lemmy
Commencez à taper...
- `@nom_utilisateur` pour obtenir une liste de noms d'utilisateurs.
- `!a_communauté` pour obtenir une liste de communautés.
- `:emoji` pour obtenir une liste d'emojis.
## Triage
_Applique aux messages et aux commentaires_.
| Type | Description |
| --------------------- | -------------------------------------------------------------------------------- |
| Actif | Tendance triée en fonction du score et de l'heure du commentaire le plus récent. |
| Hot | Tendance de tri basée sur le score et l'heure de création du message. |
| Nouveau | Les éléments les plus récents. |
| Plus de commentaires | Les messages avec le plus de commentaires. |
| Nouveaux commentaires | Les messages avec les commentaires les plus récents, IE un tri de style forum. |
| Top | Les éléments les mieux notés dans la période donnée. |
Pour plus de détails, consultez le [Classement des messages et des commentaires] (ranking.md).
## Modération / Administration
Toutes les actions de modération et d'administration sur les utilisateurs sont effectuées sur les commentaires ou les messages, en cliquant sur l'icône à 3 points "Plus".
Cela inclut :
- Ajouter / Supprimer des modérateurs ou des administrateurs.
- Supprimer / Restaurer des commentaires.
- Bannir / Débannir des utilisateurs.
Toutes les actions d'administration sur les communautés sont effectuées sur la barre latérale de la communauté. Actuellement, cela ne comprend que la suppression et la restauration des communautés.
## Markdown Guide
| Tapez | ou | ... pour obtenir |
| ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| \*Italique\* | \_Italique\_ | _Italique_ |
| \*\*Gras\*\* | \_\_Gras\_\_ | **Gras** |
| \# Rubrique 1 | Rubrique 1 <br> ========= | <h4>Rubrique 1</h4> |
| \## Rubrique 2 | Rubrique 2 <br>--------- | <h5>Rubrique 2</h5> |
| \[lien\](http://a.com) | \[lien\]\[1\]<br><br>\[1\]: http://b.org | [lien](https://commonmark.org/) |
| !\[Image\](http://url/a.png) | !\[Image\]\[1\]<br><br>\[1\]: http://url/b.jpg | ![Markdown](https://commonmark.org/help/images/favicon.png) |
| \> Citation en bloc | | <blockquote>Citation en bloc</blockquote> |
| \* Liste <br>\* Liste <br>\* Liste | \- Liste <br>\- Liste <br>\- Liste <br> | _ Liste <br>_ Liste <br>\* Liste <br> |
| 1\. Un <br>2\. Deux <br>3\. Trois | 1) Un<br>2) Deux<br>3) Trois | 1. Une<br>2. Deux<br>3. Trois |
| Règle horizontale <br>\--- | Règle horizontale<br>\*\*\* | Règle horizontale <br><hr> |
| \`Code Inline\` avec des backticks | | `Code Inline` avec des backticks |
| \`\`\`<br>\# bloc de code <br>print '3 backticks ou'<br>print 'retrait de 4 espaces' <br>\`\`\` | ····\# bloc de code<br>····print '3 backticks ou'<br>····print 'retrait de 4 espaces' | \# bloc de code <br>print '3 backticks ou'<br>print 'retrait de 4 espaces' |
| ::: spoiler caché ou trucs nsfw<br>_un tas de spoilers ici_<br>::: | | <details><summary> spoiler caché ou trucs nsfw </summary><p><em>un tas de spoilers ici</em></p></details> |
| Certains texte \~indice\~ | | Certains texte <sub>indice</sub> |
| Quelques texte ^indice^ | | Quelques texte <sup>indice</sup> |
[Tutoriel CommonMark](https://commonmark.org/help/tutorial/)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

View file

@ -1,47 +0,0 @@
# Tendances / Chaud / Meilleur algorithme de tri (algorithme de tri)
## Objectifs
- Au cours de la journée, les nouveaux messages et les commentaires devraient se trouver en tête de liste, afin de pouvoir être soumis au vote.
- Après un jour ou deux, le facteur temps devrait disparaître.
- Utilisez une échelle logarithmique, car les votes ont tendance à faire boule de neige, et donc les 10 premiers votes sont tout aussi importants que les 100 suivants.
## Implémentations
### Reddit
Ne tient pas compte de la durée de vie du fil de discussion, [ce qui donne aux premiers commentaires un avantage écrasant sur les derniers](https://minimaxir.com/2016/11/first-comment/), l'effet étant encore pire dans les petites communautés. Les nouveaux commentaires sont regroupés au bas du fil de discussion, ce qui a pour effet de tuer la discussion et de faire de chaque fil de discussion une course au commentaire précoce. Cela diminue la qualité de la conversation et récompense les commentaires répétitifs et les spams.
### Hacker News
Bien qu'il soit de loin supérieur à l'implémentation de Reddit en ce qui concerne la décroissance des scores dans le temps, l'algorithme de classement de [Hacker News](https://medium.com/hacking-and-gonzo/how-hacker-news-ranking-algorithm-works-1d9b0cf2c08d) n'utilise pas d'échelle logarithmique pour les scores.
### Lemmy
Contrebalance l'effet boule de neige des votes au fil du temps avec une échelle logarithmique. Annule l'avantage inhérent aux premiers commentaires tout en garantissant que les votes comptent toujours sur le long terme, sans nuire aux commentaires populaires plus anciens.
```
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 utilise le même algorithme de `Rank` ci-dessus, en deux sortes : `Active`, et `Hot`.
- Actif" utilise les votes du message, et le temps du dernier commentaire (limité à deux jours).
- `Hot` utilise les votes du message, et l'heure de publication du message.
- Utilisez Max(1, score) pour vous assurer que tous les commentaires sont affectés par la dégradation du temps.
- Ajoutez 3 au score, pour que tout ce qui a moins de 3 downvotes semble nouveau. Sinon, tous les nouveaux commentaires resteraient à zéro, près du fond.
- Le signe et l'abs du score sont nécessaires pour traiter le log des scores négatifs.
- Un facteur d'échelle de 10k permet d'obtenir le rang sous forme de nombre entier.
Un graphique du rang sur 24 heures, des scores de 1, 5, 10, 100, 1000, avec un facteur d'échelle de 10k.
![](rank_algorithm.png)
#### Comptage des utilisateurs actifs
Lemmy affiche également le nombre d'utilisateurs actifs de votre site et de ses communautés. Ceux-ci sont comptés au cours du dernier jour, de la dernière semaine, du dernier mois et des six derniers mois, et sont mis en cache au démarrage de Lemmy, ainsi que toutes les heures.
Un utilisateur actif est quelqu'un qui a posté ou commenté sur notre instance ou notre communauté au cours de la dernière période donnée. Pour le décompte des sites, seuls les utilisateurs locaux sont comptés. Pour les comptes de la communauté, les utilisateurs fédérés sont inclus.

View file

@ -1,11 +0,0 @@
# Infos d'administration
Informations pour les administrateurs d'une instance Lemmy, et ceux qui veulent faire fonctionner un serveur.
## Installation
Lemmy a deux méthodes d'installation principales, [manuellement avec Docker](install_docker.md), et [automatiquement avec Ansible](install_ansible.md). Nous recommandons d'utiliser Ansible, car il simplifie l'installation et facilite les mises à jour.
## Autres méthodes d'installation
Dans certains cas, il peut être nécessaire d'utiliser [différentes méthodes d'installation](other_installation_methods.md). Mais nous ne le recommandons pas et ne pouvons pas fournir de support pour ces méthodes.

View file

@ -1,76 +0,0 @@
# Guide de sauvegarde et de restauration
## Docker et Ansible
Lorsque vous utilisez docker ou ansible, il devrait y avoir un dossier `volumes`, qui contient à la fois la base de données, et toutes les images. Copiez ce dossier dans la nouvelle instance pour restaurer vos données.
### Sauvegarde incrémentale de la base de données
Pour sauvegarder de manière incrémentielle la base de données dans un fichier `.sql`, vous pouvez exécuter :
```bash
docker-compose exec postgres pg_dumpall -c -U lemmy > lemmy_dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql
```
### Un exemple de script de sauvegarde
```bash
#!/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
# Dossier Volumes Sauvegarde
rsync -avP -zz --rsync-path="sudo rsync" MY_USER@MY_IP:/LEMMY_LOCATION/volumes ~/BACKUP_LOCATION/FOLDERNAME
```
### Restauration de la BD
Si vous avez besoin de restaurer à partir d'un fichier `pg_dumpall`, vous devez d'abord vider votre base de données existante.
```bash
# Abandon de la BD existante
docker exec -i FOLDERNAME_postgres_1 psql -U lemmy -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
# Restauration à partir de la sauvegarde .sql
cat db_dump.sql | docker exec -i FOLDERNAME_postgres_1 psql -U lemmy # restores the db
# Cela peut également être nécessaire lors de l'importation d'une base de données avec un mot de passe différent.
docker exec -i FOLDERNAME_postgres_1 psql -U lemmy -c "alter user lemmy with password 'bleh'"
```
### Changer votre nom de domaine
Si vous ne vous êtes pas encore fédéré, vous pouvez changer votre nom de domaine dans la base de données. **Attention : ne faites pas cela après vous être fédéré, ou cela brisera la fédération.**
Entrez dans `psql` pour votre docker :
`docker-compose exec postgres psql -U lemmy`
```
-- Post
update post set ap_id = replace (ap_id, 'ancien_domaine', 'nouveau_domaine');
update post set url = replace (url, 'ancien_domaine', 'nouveau_domaine');
update post set body = replace (body, 'ancien_domaine', 'nouveau_domaine');
update post set thumbnail_url = replace (thumbnail_url, 'ancien_domaine', 'nouveau_domaine');
-- Comments
update comment set ap_id = replace (ap_id, 'ancien_domaine', 'nouveau_domaine');
update comment set content = replace (content, 'ancien_domaine', 'nouveau_domaine');
-- User
update user_ set actor_id = replace (actor_id, 'ancien_domaine', 'nouveau_domaine');
update user_ set inbox_url = replace (inbox_url, 'ancien_domaine', 'nouveau_domaine');
update user_ set shared_inbox_url = replace (shared_inbox_url, 'ancien_domaine', 'nouveau_domaine');
update user_ set avatar = replace (avatar, 'ancien_domaine', 'nouveau_domaine');
-- Community
update community set actor_id = replace (actor_id, 'ancien_domaine', 'nouveau_domaine');
update community set followers_url = replace (followers_url, 'ancien_domaine', 'nouveau_domaine');
update community set inbox_url = replace (inbox_url, 'ancien_domaine', 'nouveau_domaine');
update community set shared_inbox_url = replace (shared_inbox_url, 'ancien_domaine', 'nouveau_domaine');
```
## Plus de ressources
- https://stackoverflow.com/questions/24718706/backup-restore-a-dockerized-postgresql-database

View file

@ -1,14 +0,0 @@
# Configuration
La configuration est basée sur le fichier [config.hjson](https://github.com/lemmynet/lemmy/blob/main/config/config.hjson). Ce fichier contient également la documentation de toutes les options disponibles. Les instructions d'installation vous indiquent comment remplacer les valeurs par défaut.
Le fichier `config.hjson` est situé à `config/config.hjson`. Pour changer l'emplacement par défaut, vous pouvez définir la variable d'environnement `LEMMY_CONFIG_LOCATION`.
Une variable d'environnement supplémentaire `LEMMY_DATABASE_URL` est disponible, qui peut être utilisée avec une chaîne de connexion PostgreSQL comme `postgres://lemmy:password@lemmy_db:5432/lemmy`, en passant tous les détails de connexion en une fois.
Si le conteneur Docker n'est pas utilisé, créez manuellement la base de données spécifiée ci-dessus en exécutant les commandes suivantes :
```bash
cd server
./db-init.sh
```

View file

@ -1,37 +0,0 @@
# Fédération
Lemmy utilise le protocole ActivityPub (un standard du W3C) pour permettre la fédération entre différents serveurs (souvent appelés instances). Ceci est très similaire à la façon dont le courrier électronique fonctionne. Par exemple, si vous utilisez gmail.com, vous pouvez non seulement envoyer des e-mails à d'autres utilisateurs de gmail.com, mais aussi à yahoo.com, yandex.ru, etc. Le courrier électronique utilise le protocole SMTP pour y parvenir. Vous pouvez donc considérer ActivityPub comme un "SMTP pour les médias sociaux". La quantité d'actions différentes possibles sur les médias sociaux (poster, commenter, aimer, partager, etc.) signifie que ActivityPub est beaucoup plus compliqué que SMTP.
Comme pour le courrier électronique, la fédération ActivityPub se fait uniquement entre serveurs. Ainsi, si vous êtes enregistré sur `enterprise.lemmy.ml`, vous ne vous connectez qu'à l'API de `enterprise.lemmy.ml`, tandis que le serveur se charge d'envoyer et de recevoir des données d'autres instances (par exemple `voyager.lemmy.ml`). Le grand avantage de cette approche est que l'utilisateur moyen n'a rien à faire pour utiliser la fédération. En fait, si vous utilisez Lemmy, vous l'utilisez probablement déjà. Une façon de le confirmer est d'aller dans une communauté ou un profil d'utilisateur. Si vous êtes sur `enterprise.lemmy.ml` et que vous voyez un utilisateur comme `@nutomic@voyager.lemmy.ml`, ou une communauté comme `!main@ds9.lemmy.ml`, alors ceux-ci sont fédérés, ce qui signifie qu'ils utilisent une instance différente de la vôtre.
Une façon de profiter de la fédération est d'ouvrir une instance différente, comme `ds9.lemmy.ml`, et de la parcourir. Si vous voyez une communauté, un message ou un utilisateur intéressant avec lequel vous voulez interagir, copiez simplement son URL et collez-la dans la recherche de votre propre instance. Votre instance se connectera à l'autre (en supposant que la liste d'autorisation/de blocage le permette), et vous affichera directement le contenu distant, afin que vous puissiez suivre une communauté ou commenter un message. Voici quelques exemples de recherches qui fonctionnent :
- `!main@lemmy.ml` (Communauté)
- `@nutomic@lemmy.ml` (Utilisateur)
- `https://lemmy.ml/c/programming` (Communauté)
- `https://lemmy.ml/u/nutomic` (Utilisateur)
- `https://lemmy.ml/post/123` (Publication)
- `https://lemmy.ml/comment/321` (Commentaire)
Vous pouvez voir la liste des instances liées en suivant le lien "Instances" au bas de n'importe quelle page de Lemmy.
## Recherche de communautés
Si vous recherchez une communauté pour la première fois, 20 messages sont récupérés initialement. Ce n'est que si au moins un utilisateur de votre instance s'inscrit à la communauté distante que celle-ci enverra des mises à jour à votre instance. Les mises à jour incluent :
- Nouveaux messages, commentaires
- Votes
- Modifications et suppressions de messages et de commentaires
- Actions des modérateurs
Vous pouvez copier l'URL de la communauté depuis la barre d'adresse de votre navigateur et l'insérer dans votre champ de recherche. Attendez quelques secondes, le message apparaîtra ci-dessous. Pour l'instant, il n'y a pas d'indicateur de chargement pour la recherche, donc attendez quelques secondes si elle n'affiche "aucun résultat".
## Récupération des messages
Collez l'URL d'un message dans le champ de recherche de votre instance Lemmy. Attendez quelques secondes jusqu'à ce que le message apparaisse. Cette opération permet également de récupérer le profil de la communauté et celui de l'auteur du message.
## Récupération des commentaires
Si vous trouvez un commentaire intéressant sous un post sur une autre instance, vous pouvez trouver le symbole d'un lien sous le commentaire dans le menu à 3 points. Copiez ce lien. Il ressemble à `https://lemmy.ml/post/56382/comment/40796`. Enlevez la partie `post/XXX` et mettez-le dans votre barre de recherche. Pour cet exemple, recherchez `https://lemmy.ml/comment/40796`. Ce commentaire, tous les commentaires parents, les utilisateurs, la communauté et le message correspondant sont récupérés depuis l'instance distante, s'ils ne sont pas connus localement.
Les commentaires parents ne sont pas récupérés ! Si vous voulez plus de commentaires sur des articles plus anciens, vous devez rechercher chacun d'entre eux comme décrit ci-dessus.

View file

@ -1,26 +0,0 @@
# Installation Ansible
Ceci est la même chose que l'[installation Docker](install_docker.md), sauf qu'Ansible s'occupe de tout automatiquement. Il fait aussi des choses supplémentaires comme la configuration de TLS et de l'email pour votre instance Lemmy.
Tout d'abord, vous devez [installer Ansible sur votre ordinateur local](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html). Vous devez également installer le [Docker SDK pour Python](https://pypi.org/project/docker/) en utilisant `pip install docker` ([plus d'informations dans la documentation Ansible](https://docs.ansible.com/ansible/latest/collections/community/docker/docker_compose_module.html#id4)).
Exécutez ensuite les commandes suivantes sur votre ordinateur local :
```bash
git clone https://github.com/LemmyNet/lemmy.git
cd lemmy/ansible/
cp inventory.example inventory
nano inventory # entrez votre serveur, domaine, email de contact
# Si la commande ci-dessous échoue, vous devrez peut-être décommenter cette ligne
# Dans le fichier ansible.cfg :
# interpreter_python=/usr/bin/python3
ansible-playbook lemmy.yml --become
```
Pour mettre à jour une nouvelle version, il suffit d'exécuter la commande suivante dans votre dépôt Lemmy local :
```bash
git pull origin main
cd ansible
ansible-playbook lemmy.yml --become
```

View file

@ -1,55 +0,0 @@
# Installation de Docker
Assurez-vous que vous avez à la fois docker et docker-compose(>=`1.24.0`) installés. Sur Ubuntu, exécutez simplement `apt install docker-compose docker.io`. Suivant,
```bash
# créez un dossier pour les fichiers lemmy. l'emplacement n'a pas d'importance, vous pouvez le mettre où vous voulez
mkdir /lemmy
cd /lemmy
# télécharger les fichiers de configuration par défaut
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
# Définir les permissions correctes pour le dossier pictrs
mkdir -p volumes/pictrs
sudo chown -R 991:991 volumes/pictrs
```
Ouvrez votre `docker-compose.yml`, et assurez-vous que `LEMMY_EXTERNAL_HOST` pour `lemmy-ui` est réglé sur votre hôte correct.
```
- LEMMY_INTERNAL_HOST=lemmy:8536
- LEMMY_EXTERNAL_HOST=votre-domaine.com
- LEMMY_HTTPS=false
```
Si vous souhaitez un mot de passe différent pour la base de données, vous devez également le changer dans le fichier `docker-compose.yml` **avant** votre première exécution.
Après cela, jetez un oeil au [fichier de configuration](configuration.md) nommé `lemmy.hjson`, et ajustez-le, en particulier le nom d'hôte, et éventuellement le mot de passe de la base de données. Puis lancez :
`docker-compose up -d`
Vous pouvez accéder au lemmy-ui à l'adresse `http://localhost:1235`.
Pour rendre Lemmy disponible en dehors du serveur, vous devez configurer un proxy inverse, comme Nginx. Un exemple de configuration de Nginx (https://raw.githubusercontent.com/LemmyNet/lemmy/main/ansible/templates/nginx.conf), peut être configuré avec :
```bash
wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/ansible/templates/nginx.conf
# Remplacer les {{ variables}}
# Le lemmy_port par défaut est 8536
# Le lemmy_ui_port par défaut est 1235
sudo mv nginx.conf /etc/nginx/sites-enabled/lemmy.conf
```
Vous devrez également configurer TLS, par exemple avec [Let's Encrypt](https://letsencrypt.org/). Après cela, vous devez redémarrer Nginx pour recharger la configuration.
## Mise à jour
Pour mettre à jour la dernière version, vous pouvez changer manuellement la version dans `docker-compose.yml`. Alternativement, récupérez la dernière version depuis notre dépôt git :
```bash
wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/docker/prod/docker-compose.yml
docker-compose up -d
```

View file

@ -1,15 +0,0 @@
# Autres méthodes d'installation
Disclaimer : ces méthodes d'installation ne sont pas recommandées par les développeurs de Lemmy. Si vous rencontrez des problèmes, vous devez les résoudre vous-même ou demander aux auteurs respectifs. Si vous remarquez des bugs de Lemmy sur une instance installée de cette manière, veuillez le mentionner dans le rapport de bug.
## Installation de Lemmy sans Docker
Instructions pour installer Lemmy nativement, sans s'appuyer sur Docker.
[https://lemmy.ca/post/1066](https://lemmy.ca/post/1066)
## Installation sur Amazon Web Services (AWS)
Ce document contient les définitions de l'infrastructure nécessaire pour déployer Lemmy sur [AWS](https://aws.amazon.com/) à l'aide de leur [Cloud Development Kit](https://docs.aws.amazon.com/cdk/latest/guide/home.html).
[https://github.com/jetbridge/lemmy-cdk](https://github.com/jetbridge/lemmy-cdk)

View file

@ -1,67 +0,0 @@
# Dépannage
Différents problèmes qui peuvent survenir sur une nouvelle instance, et comment les résoudre.
De nombreuses fonctionnalités de Lemmy dépendent d'une configuration correcte du reverse proxy. Assurez-vous que la vôtre est équivalente à notre [configuration nginx](https://github.com/LemmyNet/lemmy/blob/main/ansible/templates/nginx.conf).
## Général
### Logs
Pour les problèmes frontaux, vérifiez la [console du navigateur](https://webmasters.stackexchange.com/a/77337) pour tout message d'erreur.
Pour les logs du serveur, exécutez `docker-compose logs -f lemmy` dans votre dossier d'installation. Vous pouvez aussi faire `docker-compose logs -f lemmy lemmy-ui pictrs` pour obtenir les logs de différents services.
Si cela ne donne pas assez d'informations, essayez de changer la ligne `RUST_LOG=error` dans `docker-compose.yml` en `RUST_LOG=info` ou `RUST_LOG=verbose`, puis faites `docker-compose restart lemmy`.
### La création de l'utilisateur admin ne fonctionne pas
Assurez-vous que le websocket fonctionne correctement, en vérifiant les erreurs dans la console du navigateur. Dans nginx, les en-têtes suivants sont importants pour cela :
```
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
```
### Erreur de limite de débit lorsque de nombreux utilisateurs accèdent au site
Vérifiez que les en-têtes `X-Real-IP` et `X-Forwarded-For` sont envoyés à Lemmy par le reverse proxy. Sinon, il comptabilisera toutes les actions dans la limite de débit de l'IP du reverse proxy. Dans nginx, cela devrait ressembler à ceci :
```
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
```
## Fédération
### Les autres instances ne peuvent pas récupérer les objets locaux (communauté, post, etc)
Votre reverse proxy (par exemple nginx) doit transmettre les requêtes avec l'en-tête `Accept : application/activity+json` au backend. Ceci est géré par les lignes suivantes :
```
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;
```
Vous pouvez vérifier qu'il fonctionne correctement en exécutant les commandes suivantes, qui devraient toutes renvoyer un JSON valide :
```
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 récupération d'objets distants fonctionne, mais la publication/le commentaire dans les communautés distantes échoue.
Vérifiez que [la fédération est autorisée sur les deux instances](../federation/administration.md#instance-allowlist-and-blocklist).
Assurez-vous également que l'heure est correctement réglée sur votre serveur. Les activités sont signées avec un horodatage et seront rejetées si l'écart est supérieur à 10 secondes.

View file

@ -1,3 +0,0 @@
# WebSocket API
[Lemmy WebSocket API 2.0 documentation](https://join-lemmy.org/api/index.html)

View file

@ -1,35 +0,0 @@
# Code of Conduct
- Nous nous engageons à mettre à disposition un environnement amical, sain et accueillant pour tous, sans distinction de niveau d'expérience, d'identité et d'expression de genre, d'orientation sexuelle, de handicap, d'apparence corporelle, de corpulence, de race, d'ethnie, d'âge, de religion, de nationalité ou de toute autre caractéristique similaire.
- Nous vous remercions déviter d'utiliser une identité ayant une quelconque connotation sexuelle ou autres pseudonymes qui pourraient écarter d'un environnement amical, sain et accueillant pour tous.
- Nous vous remercions aussi dêtre gentil et courtois. Il n'y a pas besoin d'être méchant ou malpoli.
- Respectez le fait que les personnes ont des opinions différentes et que chaque choix de concept ou d'implémentation comporte de nombreux compromis et différents coûts. Il y a rarement une bonne réponse pour tout le monde.
- Veillez à éviter la critique non structurée dès que possible. Si vous avez de solides idées avec lesquelles expérimenter, faites un fork et voyez comment cela fonctionne.
- Nous vous exclurons des interactions si vous insultez, rabaissez ou harcelez quelqu'un. Ceci n'est pas un comportement toléré. Nous interprétons le terme harcèlement comme incluant la définition du [Citizen Code of Conduct](https://github.com/stumpsyn/policies/blob/master/citizen_code_of_conduct.md); si le concept de harcèlement ne vous paraît pas parfaitement clair, s'il vous plaît lisez cette définition. En particulier nous ne tolérons pas les comportements qui excluent les gens dans des groupes sociaux marginalisés.
- Le harcèlement privé est lui aussi inacceptable. Peu importe qui vous êtes, si vous avez le sentiment que vous avez été harcelé ou mis en situation inconfortable par un membre de la communauté, contactez immédiatement un des opérateurs du canal de discussion ou n'importe qui de L'équipe de modération de Lemmy . Que vous soyez un contributeur régulier ou un nouveau, nous tenons à faire de la communauté un endroit sain, et nous sommes là pour vous aider.
- De même, les comportements comme le spam, le troll, l'injure, la provocation ou tout autre mécanisme de détournement d'attention ne sont pas les bienvenus.
[**Écrire à l'équipe de modération sur Mastodon**](https://mastodon.social/@LemmyDev)
[**Contacter l'équipe de modération par courriel**](mailto:contact@lemmy.ml)
## Moderation
Ici se trouvent les politiques de maintien de nos standards de conduite communautaire. Si vous pensez quun fil nécessite une modération, contactez l'équipe de modération Lemmy.
1. Les remarques qui enfreignent les standards de conduite de Lemmy, incluant les remarques haineuses, blessantes, oppressives ou excluantes ne sont pas autorisées. (Jurer est autorisé, mais jamais envers une autre personne, et jamais de façon haineuse.)
2. Les remarques que la modération considère inappropriées, quelles soient listées dans le code de conduite ou pas, ne sont pas non plus autorisées.
3. La modération répondra dabord à ce genre de remarques par un avertissement.
4. Si lavertissement est ignoré, la personne sera « exclue », c.-à-d. éjectée du canal de communication pour se calmer.
5. Si la personne revient et continue à causer des problèmes, elle sera bannie, c.-à-d. définitivement exclue.
6. Les modérateurs peuvent choisir à leur discrétion de débannir une personne si cétait sa première infraction et quelle offre une véritable excuse à la personne offensée.
7. Si un·e modérateur/trice bannit quelquun·e et vous pensez que cest injustifié, adressez-vous à ce·tte modérateur/trice ou un·e autre, en privé. Les plaintes sur le canal à propos des bannissements ne sont pas autorisées.
8. La modération est tenue à un plus haut standard que le reste des membres de la communauté. Si un·e modérateur/trice cause une situation inappropriée, moins de marge lui sera donnée que les autres.
Dans la communauté Lemmy, nous nous efforçons de nous occuper les uns des autres. Nessayez pas simplement dêtre techniquement irréprochable, essayez de faire au mieux. En particulier, évitez de jouer avec des sujet offensants ou sensibles, en particulier si cest hors-sujet; cela mène trop souvent à des disputes inutiles, des sentiments heurtés et une confiance endommagée; pire, cela peut faire totalement partir des gens de la communauté.
Et si une personne relève quelque chose que vous avez dit ou fait, ne soyez pas sur la défensive. Arrêtez simplement de faire ce qui vous a été reproché et excusez-vous. Même si vous pensez avoir été mal interprété ou accusé injustement, il y a probablement quelque chose que vous pourriez avoir mieux communiqué — rappelez-vous que cest votre responsabilité de mettre à laise les autres Rustacé·e·s. Tout le monde veut bien sentendre et nous sommes ici en premier lieu car nous voulons parler de technologie cool. Vous verrez que les gens accepteront votre bonne foi et vous pardonneront si vous faites en sorte de gagner leur confiance.
Les règles dapplication listées ci-dessus sappliquent à tous les lieux officiels de Lemmy; incluant les dépôts git [github.com/LemmyNet](https://github.com/LemmyNet) et [yerbamate.ml/LemmyNet](https://yerbamate.ml/LemmyNet), la [chaîne Matrix](https://matrix.to/#/!BZVTUuEiNmRcbFeLeI:matrix.org); [lemmy.ml](https://lemmy.ml) et autres instances sous le même nom de domaine. Pour les autres projets adoptant le code de conduite Lemmy, contactez la maintenance de ces projets pour son application. Si vous souhaitez utiliser ce code de conduite pour votre propre projet, envisagez de mentionner explicitement votre politique de modération ou faites une copie avec votre propre politique de modération pour éviter toute confusion.
Adapté du [Rust Code of Conduct](https://www.rust-lang.org/policies/code-of-conduct), qui est lui-même basé du [Node.js Policy on Trolling](http://blog.izs.me/post/30036893703/policy-on-trolling) ainsi que [Contributor Covenant v1.3.0](https://www.contributor-covenant.org/version/1/3/0/).

View file

@ -1,28 +0,0 @@
# Administration de la fédération
Note : La fédération ActivityPub est encore en cours de développement. Nous vous recommandons de ne l'activer que sur les instances de test pour le moment.
Pour activer la fédération, changez le paramètre `federation.enabled` en `true` dans `lemmy.hjson`, et redémarrez Lemmy.
La fédération ne démarre pas automatiquement, mais doit être déclenchée manuellement par la recherche. Pour ce faire, vous devez entrer une référence à un objet distant, tel que :
- `!main@lemmy.ml` (Communauté)
- `@nutomic@lemmy.ml` (Utilisateur)
- `https://lemmy.ml/c/programming` (Communauté)
- `https://lemmy.ml/u/nutomic` (Utilisateur)
- `https://lemmy.ml/post/123` (Publication)
- `https://lemmy.ml/comment/321` (Commentaire)
Pour un aperçu du fonctionnement technique de la fédération dans Lemmy, consultez notre [Aperçu de la fédération](contributing_federation_overview.md).
## Allowlist et blocklist de l'instance
La section fédération de la configuration de Lemmy a deux variables `allowed_instances` et `blocked_instances`. Celles-ci contrôlent avec quelles autres instances Lemmy va se fédérer. Les deux paramètres prennent une liste de domaines séparés par des virgules, par exemple `lemmy.ml,exemple.com`. Vous pouvez modifier ces paramètres soit via `/admin`, soit directement sur le système de fichiers du serveur.
Il est important de noter que ces paramètres n'affectent que l'envoi et la réception de données entre les instances. Si vous autorisez la fédération avec une certaine instance, puis la supprimez de la liste d'autorisation, cela n'affectera pas les données fédérées précédemment. Ces communautés, utilisateurs, messages et commentaires seront toujours affichés. Ils ne seront simplement plus mis à jour. Et même si une instance est bloquée, elle peut toujours récupérer et afficher les données publiques de votre instance.
Par défaut, les valeurs `allowed_instances` et `blocked_instances` sont vides, ce qui signifie que Lemmy se fédérera avec toute instance compatible. Nous ne recommandons pas cela, car les outils de modération ne sont pas encore prêts à traiter les instances malveillantes.
Ce que nous recommandons est de mettre une liste d'instances de confiance dans `allowed_instances`, et de ne se fédérer qu'avec celles-ci. Notez que les deux parties doivent s'ajouter mutuellement à leurs `allowed_instances` pour permettre une fédération bidirectionnelle.
Alternativement, vous pouvez aussi utiliser une fédération basée sur une liste de blocage. Dans ce cas, ajoutez les domaines des instances avec lesquelles vous ne voulez _pas_ vous fédérer. Vous ne pouvez définir que l'un des deux, `allowed_instances` et `blocked_instances`, car définir les deux n'a pas de sens.

View file

@ -1,782 +0,0 @@
# Protocole de la Fédération Lemmy
Le protocole Lemmy (ou protocole de la fédération Lemmy) est un sous-ensemble strict du [protocole ActivityPub](https://www.w3.org/TR/activitypub/). Toute déviation du protocole ActivityPub est un bug dans Lemmy ou dans cette documentation (ou les deux).
Ce document s'adresse aux développeurs qui sont familiers avec les protocoles ActivityPub et ActivityStreams. Il donne un aperçu détaillé des acteurs, objets et activités utilisés par Lemmy.
Avant de lire ce document, jetez un coup d'œil à notre [Aperçu de la fédération](contributing_federation_overview.md) pour avoir une idée du fonctionnement de la fédération Lemmy à un haut niveau.
Lemmy ne suit pas encore la spécification ActivityPub à tous égards. Par exemple, nous ne définissons pas un contexte valide en indiquant nos champs de contexte. Nous ignorons également les champs comme `inbox`, `outbox` ou `endpoints` pour les acteurs distants, et supposons que tout est Lemmy. Pour un aperçu des déviations, lisez [#698](https://github.com/LemmyNet/lemmy/issues/698). Elles seront corrigées dans un futur proche.
Lemmy est également très peu flexible en ce qui concerne les activités et les objets entrants. Ils doivent être exactement identiques aux exemples ci-dessous. Des choses comme avoir un tableau au lieu d'une valeur unique, ou un ID d'objet au lieu de l'objet complet entraîneront une erreur.
Dans les tableaux suivants, le terme "obligatoire" indique si Lemmy accepte ou non une activité entrante sans ce champ. Lemmy lui-même inclura toujours tous les champs non vides.
<!-- toc -->
- [Contexte](#contexte)
- [Acteurs](#acteurs)
- [Communauté](#communauté)
- [Boîte de sortie communautaire](#boîte-de-sortie-communautaire)
- [Suiveurs de la communauté](#suiveurs-de-la-communauté)
- [Modérateurs de la communauté](#modérateurs-de-la-communauté)
- [Utilisateur](#utilisateur)
- [Boîte de sortie de l'utilisateur](#boîte-de-sortie-de-lutilisateur)
- [Objets](#objets)
- [Publication](#publication)
- [Commentaire](#commentaire)
- [Message privé](#message-privé)
- [Activités](#activités)
- [De l'utilisateur à la communauté](#utilisateur-à-la-communauté)
- [Suivre](#suivre)
- [Ne pas suivre](#ne-pas-suivre)
- [Créer ou mettre à jour un poste](#créer-ou-mettre-à-jour-un-message)
- [Créer ou mettre à jour un commentaire](#créer-ou-mettre-à-jour-un-commentaire)
- [Aimer le message ou le commentaire](#jaime-un-message-ou-un-commentaire)
- [Ne pas aimer le message ou le commentaire](#naime-pas-le-message-ou-le-commentaire)
- [Supprimer un message ou un commentaire](#supprimer-un-message-ou-un-commentaire)
- [Retirer un message ou le commentaire](#retirer-un-message-ou-le-commentaire)
- [Défaire](#defaire)
- [Ajouter un modérateur](#ajouter-un-mod)
- [Supprimer un modérateur](#supprimer-un-mod)
- [De la communauté à l'utilisateur](#communauté-à-lutilisateur)
- [Accepter Suivre](#accepter-un-suivi)
- [Annoncer](#annoncer)
- [Retirer ou supprimer une communauté](#retirer-ou-supprimer-une-communauté)
- [Restaurer une communauté retiré ou effacée](#rétablir-la-communauté-supprimée-ou-retirée)
- [D'utilisateur à utilisateur](#utilisateur-à-utilisateur)
- [Créer ou mettre à jour un message privé](#créer-ou-mettre-à-jour-un-message-privé)
- [Supprimer un message privé](#supprimer-un-message-privé)
- [Défaire Supprimer un message privé](#annuler-la-suppression-dun-message-privé)⏎
<!-- tocstop -->
## Contexte
```json
{
"@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"
]
}
```
Le contexte est identique pour toutes les activités et tous les objets.
## Acteurs
### Communauté
Un acteur automatisé. Les utilisateurs peuvent lui envoyer des messages ou des commentaires, que la communauté transmet à ses adeptes sous la forme d'un `Announce`.
Envoie des activités à l'utilisateur : `Accept/Follow`, `Announce`.
Reçoit des activités de l'utilisateur : `Follow`, `Undo/Follow`, `Create`, `Update`, `Like`, `Dislike`, `Remove` (seulement admin/mod), `Delete` (seul créateur), `Undo` (uniquement pour ses propres actions).
```json
{
"@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"
}
}
```
| Nom du champ | Obligatoire | Description |
| ------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `preferredUsername` | oui | Nom de l'acteur |
| `name` | oui | Titre de la communauté |
| `sensitive` | oui | True indique que tous les messages dans la communauté sont nsfw |
| `attributedTo` | oui | D'abord le créateur de la communauté, puis tous les autres modérateurs. |
| `content` | non | Texte pour la barre latérale de la communauté, contenant généralement une description et des règles. |
| `icon` | non | Icône, affichée à côté du nom de la communauté |
| `image` | non | Image de bannière, affichée en haut de la page de la communauté |
| `inbox` | non | URL de la boîte de réception ActivityPub |
| `outbox` | non | ActivityPub URL de la boîte de sortie, contient uniquement les 20 derniers messages, sans commentaires, votes ou autres activités. |
| `followers` | non | URL de la collection de suiveurs, contenant uniquement le nombre de suiveurs, sans référence à des suiveurs individuels. |
| `endpoints` | non | Contient l'URL de la boîte de réception partagée |
| `published` | non | Date à laquelle la communauté a été créée pour la première fois |
| `updated` | non | Date à laquelle la communauté a été modifiée pour la dernière fois |
| `publicKey` | oui | La clé publique utilisée pour vérifier les signatures de cet acteur. |
#### Boîte de sortie communautaire
```json
{
"@context": ...,
"items": [
...
],
"totalItems": 3,
"id": "https://enterprise.lemmy.ml/c/main/outbox",
"type": "OrderedCollection"
}
```
La boîte d'envoi ne contient pour l'instant que les activités Créer/Poster `Create/Post`.
#### Suiveurs de la communauté
```json
{
"totalItems": 2,
"@context": ...,
"id": "https://enterprise.lemmy.ml/c/main/followers",
"type": "Collection"
}
```
La collection de followers est uniquement utilisée pour exposer le nombre de followers. Les identifiants des acteurs ne sont pas inclus, afin de protéger la vie privée des utilisateurs.
#### Modérateurs de la communauté
```json
{
"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"
}
```
### Utilisateur
Une personne, interagit principalement avec la communauté où elle envoie et reçoit des messages/commentaires. Peut également créer et modérer des communautés, et envoyer des messages privés à d'autres utilisateurs.
Envoie des activités à la communauté : Suivre `Follow`, Annuler/Suivre `Undo/Follow`, Créer `Create`, Mettre à jour `Update`, Aimer `Like`, Ne pas aimer `Dislike`, Retirer `Remove` (seulement admin/mod), Supprimer `Delete` (seulement créateur), Défaire `Undo` (seulement pour ses propres actions).
Reçoit des activités de la communauté : Accepter/Suivre `Accept/Follow`, Annoncer `Announce`.
Envoie et reçoit des activités de/vers d'autres utilisateurs : Créer/Note `Create/Note`, Mettre à jour/Note `Update/Note`, Supprimer/Note `Delete/Note`, Défaire/Supprimer/Note `Undo/Delete/Note` (toutes celles relatives aux messages privés)
```json
{
"@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"
}
}
```
| Nom du champ | Obligatoire | Description |
| ------------------- | ----------- | ------------------------------------------------------------------------ |
| `preferredUsername` | oui | Nom de l'acteur |
| `name` | non | Nom d'affichage de l'utilisateur |
| `content` | non | Biographie de l'utilisateur |
| `icon` | non | L'avatar de l'utilisateur, affiché à côté de son nom d'utilisateur |
| `image` | non | La bannière de l'utilisateur, affichée en haut du profil |
| `inbox` | non | URL de la boîte de réception d'ActivityPub |
| `endpoints` | non | Contient l'URL de la boîte de réception partagée |
| `published` | non | La date de l'inscription de l'utilisateur. |
| `updated` | non | Date à laquelle le profil de l'utilisateur a été modifié en dernier lieu |
| `publicKey` | oui | La clé publique utilisée pour vérifier les signatures de cet acteur |
#### Boîte de sortie de l'utilisateur
```json
{
"items": [],
"totalItems": 0,
"@context": ...,
"id": "http://lemmy-alpha:8541/u/lemmy_alpha/outbox",
"type": "OrderedCollection"
}
```
La boîte de réception de l'utilisateur n'a pas encore été implémentée et n'est qu'un substitut pour les implémentations de ActivityPub qui en ont besoin.
## Objets
### Publication
Une page avec un titre, une URL facultative et un contenu textuel. L'URL mène souvent à une image, auquel cas une vignette est incluse. Chaque message appartient à une seule communauté.
```json
{
"@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"
}
```
| Nom du champ | Obligatoire | Description |
| ----------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------- |
| `attributedTo` | oui | ID de l'utilisateur qui a créé ce message |
| `to` | oui | ID de la communauté où il a été posté |
| `name` | oui | Titre du message |
| `content` | non | Corps du message |
| `url` | non | Un lien arbitraire à partager |
| `image` | non | Miniature pour `url`, seulement présent si c'est un lien d'image |
| `commentsEnabled` | oui | False indique que le message est verrouillé, et qu'aucun commentaire ne peut être ajouté |
| `sensitive` | oui | True marque le message comme NSFW, brouille la vignette et la cache aux utilisateurs dont le paramètre NSFW est désactivé |
| `stickied` | oui | Le message est affiché en haut de la page de la communauté. |
| `published` | non | La date et l'heure de création de l'article. |
| `updated` | non | La date à laquelle le message a été édité (non présent s'il n'a jamais été édité). |
### Commentaire
Une réponse à un message, ou une réponse à un autre commentaire. Ne contient que du texte (y compris des références à d'autres utilisateurs ou communautés). Lemmy affiche les commentaires sous forme d'arborescence.
```json
{
"@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"
}
```
| Nom du champ | Obligatoire | Description |
| -------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `attributedTo` | oui | ID de l'utilisateur qui a créé le commentaire |
| `to` | oui | Communauté où le commentaire a été fait |
| `content` | oui | Le texte du commentaire |
| `inReplyTo` | oui | IDs du message où ce commentaire a été fait, et du commentaire parent. S'il s'agit d'un commentaire de haut niveau, `inReplyTo` ne contient que l'article. |
| `published` | non | La date de création du commentaire. |
| `updated` | non | Date à laquelle le commentaire a été modifié (non présent s'il n'a jamais été modifié) |
### Message privé
Un message direct d'un utilisateur à un autre. Il ne peut pas inclure d'autres utilisateurs. Le threading n'est pas encore implémenté, donc le champ `inReplyTo` est manquant.
```json
{
"@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"
}
```
| Nom du champ | Obligatoire | Description |
| -------------- | ----------------------------------------------- | ---------------------------------------------------------------------------------- |
| `attributedTo` | ID de l'utilisateur qui a créé ce message privé |
| `to` | ID du destinataire |
| `content` | oui | Le texte du message privé |
| `published` | non | Date à laquelle le message a été créé |
| `updated` | non | Date à laquelle le message a été modifié (non présent s'il n'a jamais été modifié) |
## Activités
### Utilisateur à la communauté
#### Suivre
Lorsque l'utilisateur clique sur "Subscribe" dans une communauté, un `Follow` est envoyé. La communauté répond automatiquement par un `Accept/Follow`.
```json
{
"@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"
}
```
| Nom du champ | Obligatoire | Description |
| ------------ | ----------- | --------------------------------------------- |
| `actor` | oui | L'utilisateur qui envoie la demande de suivi. |
| `object` | oui | La communauté à suivre |
#### Ne pas suivre
Cliquer sur le bouton de désabonnement d'une communauté provoque l'envoi d'un `Undo/Follow`. La communauté supprime l'utilisateur de sa liste de followers après l'avoir reçu.
```json
{
"@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"
}
}
```
#### Créer ou mettre à jour un message
Lorsqu'un utilisateur crée un nouveau message, celui-ci est envoyé à la communauté concernée. La modification d'un message précédemment créé envoie une activité presque identique, sauf que le type `type` est Mise à jour `Update`. Nous ne supportons pas encore les mentions dans les messages.
```json
{
"@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": ...
}
```
| Nom du champ | Obligatoire | Description |
| ------------ | ----------- | --------------------------------- | --- |
| `type` | oui | soit `Create`, soit `Update` | ... |
| `cc` | oui | Communauté où le message est créé |
| `object` | oui | Le message en cours de création |
#### Créer ou mettre à jour un commentaire
Une réponse à un article ou à un autre commentaire. Peut contenir des mentions d'autres utilisateurs. La modification d'un message précédemment créé envoie une activité presque identique, sauf que le type `type` est Mise à jour `Update`.
```json
{
"@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": ...
}
```
| Nom du champ | Obligatoire | Description |
| ------------ | ----------- | ---------------------------------------------------------------------------------------- |
| `tag` | non | Liste des utilisateurs mentionnés dans le commentaire (comme `@utilisateur@exemple.com`) |
| `cc` | oui | La liste des utilisateurs mentionnés dans le commentaire (par exemple, `@`). |
| `object` | oui | Le commentaire en cours de création |
#### J'aime un message ou un commentaire
Un vote positif pour un message ou un commentaire.
```json
{
"@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"
}
```
| Nom du champ | Obligatoire | Description |
| ------------ | ----------- | ---------------------------------------------------------- |
| `cc` | oui | L'ID de la communauté où se trouve le message/commentaire. |
| `object` | oui | Le message ou le commentaire en cours de validation |
#### N'aime pas le message ou le commentaire
Un vote négatif pour un message ou un commentaire.
```json
{
"@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"
}
```
| Nom du champ | Obligatoire | Description |
| ------------ | ----------- | ---------------------------------------------------------- |
| `cc` | oui | L'ID de la communauté où se trouve le message/commentaire. |
| `object` | oui | Le message ou le commentaire en cours de validation |
#### Supprimer un message ou un commentaire
Supprime un message ou un commentaire précédemment créé. Ceci ne peut être fait que par le créateur original de ce message ou commentaire.
```json
{
"@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"
}
```
| Nom du champ | Obligatoire | Description |
| ------------ | ----------- | ---------------------------------------------------------- |
| `cc` | oui | L'ID de la communauté où se trouve le message/commentaire. |
| `object` | oui | ID du message ou du commentaire à supprimer |
#### Supprimer un message ou un commentaire
Supprime un message ou un commentaire. Cela ne peut être fait que par un mod de la communauté, ou par un administrateur sur l'instance où la communauté est hébergée.
```json
{
"@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"
}
```
| Nom du champ | Obligatoire | Description |
| ------------ | ----------- | ---------------------------------------------------------- |
| `cc` | oui | L'ID de la communauté où se trouve le message/commentaire. |
| `object` | oui | ID du message ou du commentaire à supprimer |
#### Défaire
Défait une activité précédente, ne peut être fait que par l'acteur `actor` de l'objet`object`. Dans le cas d'un "J'aime" `Like` ou "Je n'aime pas" `Dislike`, le nombre de votes est modifié. Dans le cas d'un Supprimer `Delete` ou Retirer `Remove`, le message/commentaire est restauré. L'objet est régénéré à partir de zéro, l'ID de l'activité et les autres champs sont donc différents.
```json
{
"@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": ...
}
```
| Nom du champ | Obligatoire | Description |
| ------------ | ----------- | ----------------------------------------------------------------------------- |
| `object` | oui | Toute activité `Like`, `Dislike`, `Delete` ou `Remove` comme décrit ci-dessus |
#### Ajouter un mod
Ajoute un nouveau mod (enregistré sur `ds9.lemmy.ml`) à la communauté `!main@enterprise.lemmy.ml`. Doit être envoyé par un mod existant de la communauté.
```json
{
"@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"
}
```
#### Supprimer un mod
Supprime un mod existant de la communauté. Doit être envoyé par un mod existant de la communauté.
```json
{
"@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"
}
```
### Communauté à l'utilisateur
#### Accepter un suivi
Envoyé automatiquement par la communauté en réponse à un `Follow`. En même temps, la communauté ajoute cet utilisateur à sa liste de followers.
```json
{
"@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"
}
}
```
| Nom du champ | Obligatoire | Description |
| ------------ | ----------- | --------------------------------------------------- |
| `actor` | oui | La même communauté que celle de l'activité `Follow` |
| `to` | non | L'ID de l'utilisateur qui a envoyé le `Follow` |
| `object` | oui | L'activité `Follow` précédemment envoyée |
#### Annoncer
Lorsque la communauté reçoit une activité de post ou de commentaire, elle l'intègre dans une `Announce` et l'envoie à tous les followers.
```json
{
"@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": ...
}
```
| Nom du champ | Obligatoire | Description |
| ------------ | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `object` | oui | Toute activité de type `Create`, `Update`, `Like`, `Dislike`, `Delete` `Remove` ou `Undo` décrite dans la section [User to Community](#user-to-community) |
#### Retirer ou supprimer une communauté
Un administrateur d'instance peut supprimer la communauté, ou un mod peut la supprimer.
```json
{
"@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"
}
```
| Nom du champ | Obligatoire | Description |
| ------------ | ----------- | --------------------------- |
| `type` | oui | Soit `Remove` soit `Delete` |
#### Rétablir la communauté supprimée ou retirée
Rétablit le retrait ou la suppression.
```json
{
"@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"
]
}
}
```
| Nom du champ | Obligatoire | Description |
| ------------- | ----------- | ------------------------- |
| `object.type` | oui | Soit `Remove` ou `Delete` |
### Utilisateur à Utilisateur
#### Créer ou mettre à jour un message privé
Crée un nouveau message privé entre deux utilisateurs.
```json
{
"@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": ...
}
```
| Nom du champ | Obligatoire | Description |
| ------------ | ----------- | ------------------------------------- | --- |
| `type` | oui | Soit `Create`, soit `Update` | ... |
| `object` | oui | A [Private Message](#private-message) |
#### Supprimer un message privé
Supprime un message privé précédent.
```json
{
"@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"
}
```
#### Annuler la suppression d'un message privé
Restaure un message privé précédemment supprimé. L'objet est régénéré à partir de zéro, l'ID d'activité et les autres champs sont donc différents.
```json
{
"@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": ...
}
```

View file

@ -1,123 +0,0 @@
# Aperçu de la fédération
Ce document est destiné à tous ceux qui veulent savoir comment fonctionne la fédération Lemmy, sans être trop technique. Il est destiné à fournir un aperçu de haut niveau de la fédération ActivityPub dans Lemmy. Si vous implémentez ActivityPub vous-même et souhaitez être compatible avec Lemmy, lisez notre [ActivityPub API outline](contributing_apub_api_outline.md).
## Conventions de documentation
Pour garder les choses simples, vous verrez parfois des choses formatées comme `Create/Note`, `Delete/Event` ou `Undo/Follow`. La chose avant le slash est l'activité, et la chose après le slash est l'objet à l'intérieur de l'activité, dans une propriété `object`. Il faut donc les lire comme suit :
- `Create/Note` : une activité `Create` contenant une `Note` dans le champ `object`.
- `Delete/Event` : une activité `Delete` contenant un `Event` dans le champ `object`.
- `Undo/Follow` : une activité `Undo` contenant un `Follow` dans le champ `object`.
Dans Lemmy, nous utilisons certains termes spécifiques pour désigner les éléments ActivityPub. Il s'agit essentiellement de nos implémentations spécifiques de concepts ActivityPub bien connus :
- Communauté (community) : `Group`
- Utilisateur (user) : `Person`
- Poste (post) : `Page`
- Commentaire (comment) : `Note`
Ce document comporte trois sections principales :
- **Philosophie de la fédération** expose le modèle général de la manière dont le projet est censé se fédérer.
- **Les activités des utilisateurs** décrivent les actions qu'un utilisateur peut entreprendre pour interagir.
- **Activités de la communauté** décrit ce que la communauté fait en réponse à certaines actions de l'utilisateur.
## Philosophie de la Fédération
L'acteur principal de Lemmy est la communauté. Chaque communauté réside sur une seule instance, et se compose d'une liste de messages et d'une liste de followers. L'interaction principale est celle d'un utilisateur qui envoie une activité liée à un message ou à un commentaire à la boîte de réception de la communauté, qui l'annonce ensuite à tous ses suiveurs.
Chaque communauté a un utilisateur créateur spécifique, qui est responsable de la définition des règles, de la nomination des modérateurs et de la suppression du contenu qui viole les règles.
Outre la modération au niveau de la communauté, chaque instance dispose d'un ensemble d'utilisateurs administrateurs, qui ont le pouvoir de supprimer et d'interdire des contenus sur l'ensemble du site.
Les utilisateurs suivent les communautés qui les intéressent, afin de recevoir des messages et des commentaires. Ils votent également sur les messages et les commentaires, et en créent de nouveaux. Les commentaires sont organisés en une structure arborescente et généralement triés par nombre de votes. Les messages directs entre utilisateurs sont également pris en charge.
Les utilisateurs ne peuvent pas se suivre les uns les autres, et les communautés ne peuvent pas non plus suivre quoi que ce soit.
Notre mise en œuvre de la fédération est déjà complète, mais jusqu'à présent nous ne nous sommes pas du tout concentrés sur la conformité à la spécification ActivityPub. En tant que tel, Lemmy n'est probablement pas compatible avec les implémentations qui s'attendent à envoyer et recevoir des activités valides. C'est un point que nous prévoyons de corriger dans un avenir proche. Consultez [#698](https://github.com/LemmyNet/lemmy/issues/698) pour un aperçu de nos déviations.
## Activités des utilisateurs
### Suivre une communauté
Chaque page de communauté a un bouton "Suivre". Cliquer sur ce bouton déclenche l'envoi d'une activité "Suivre" `Follow` de l'utilisateur vers la boîte de réception de la communauté. La communauté répondra automatiquement par une activité "Accepter/Suivre" `Accept/Follow` dans la boîte de réception de l'utilisateur. Elle ajoutera également l'utilisateur à sa liste de suiveurs et lui transmettra toutes les activités relatives aux messages et commentaires de la communauté.
### Annuler le suivi d'une communauté
Après avoir suivi une communauté, le bouton "Follow" est remplacé par "Unfollow". En cliquant sur ce bouton, vous envoyez une activité Annuler/Suivre `Undo/Follow` dans la boîte de réception de la communauté. La communauté supprime l'utilisateur de sa liste de followers et ne lui envoie plus d'activités.
### Créer un message
Quand un utilisateur crée un nouveau message dans une communauté donnée, il est envoyé comme Créer/Page `Create/Page` à la boîte de réception de la communauté.
### Créer un commentaire
Quand un nouveau commentaire est créé pour un message, l'ID du message et l'ID du commentaire parent (s'il existe)
sont écrits dans le champ `in_reply_to`. Cela permet de l'assigner au bon article, et de construire
l'arbre des commentaires. Il est ensuite envoyé dans la boîte de réception de la Communauté sous le nom de Créer/Noter `Create/Note`.
L'instance d'origine recherche également dans le commentaire toute mention d'utilisateur et envoie le `Create/Note` à ces utilisateurs.
à ces utilisateurs.
### Modifier un message
Modifie le contenu d'un message existant. Ne peut être fait que par l'utilisateur qui l'a créé.
### Modifier un commentaire
Modifie le contenu d'un commentaire existant. Ne peut être fait que par l'utilisateur qui l'a créé.
### J'aime et je n'aime pas
Les utilisateurs peuvent aimer ou ne pas aimer un message ou un commentaire. Ces commentaires sont envoyés sous forme de "J'aime/Page" `like/Page`, "Je n'aime pas/Note" `Dislike/Note`, etc. dans la boîte de réception de la communauté.
### Suppression
Le créateur d'un message, d'un commentaire ou d'une communauté peut le supprimer. La suppression est alors envoyée aux suiveurs de la communauté. L'élément est alors caché de tous les utilisateurs.
Les mods peuvent supprimer les messages et les commentaires de leurs communautés. Les administrateurs peuvent supprimer tout message ou commentaire sur l'ensemble du site. Les communautés peuvent également être supprimées par les administrateurs. L'élément est alors caché à tous les utilisateurs.
Les suppressions sont envoyées à tous les adeptes de la communauté, de sorte qu'elles y prennent également effet. L'exception est le cas où un administrateur supprime un élément d'une communauté qui est hébergée sur une instance différente. Dans ce cas, la suppression ne prend effet que localement.
### Revenir sur une action précédente
Nous ne supprimons rien de notre base de données, nous le cachons simplement aux utilisateurs. Les Communautés/Paroles/Commentaires supprimés ou retirés ont un bouton "restaurer". Ce bouton génère une activité `Undo` qui définit l'activité originale de suppression/suppression comme objet, comme `Undo/Remove/Post` ou `Undo/Delete/Community`.
Cliquer sur le bouton "+" d'un message ou d'un commentaire déjà noté (ou sur le bouton "-" d'un message ou d'un commentaire déjà noté) génère également un `Undo`. Dans ce cas, il s'agit d'un `Undo/Like/Post` ou d'un `Undo/Dislike/Comment`.
### Créer un message privé
Les profils d'utilisateurs ont un bouton "Envoyer un message", qui ouvre une boîte de dialogue permettant d'envoyer un message privé à cet utilisateur. Le message est envoyé sous la forme d'une `Create/Note` dans la boîte de réception de l'utilisateur. Les messages privés ne peuvent être adressés qu'à un seul utilisateur.
v## Modifier un message privé
`Update/Note` modifie le texte d'un message précédemment envoyé.
### Supprimer un message privé
`Delete/Note` supprime un message privé.
### Restaurer un message privé
`Undo/Delete/Note` rétablit la suppression d'un message privé.
## Activités de la Communauté
La communauté est essentiellement un robot, qui n'agit qu'en réaction aux actions des utilisateurs. L'utilisateur qui a créé la communauté devient le premier modérateur, et peut ajouter d'autres modérateurs. En général, lorsque la communauté reçoit une activité valide dans sa boîte de réception, cette activité est transmise à tous ses suiveurs.
### Accepter le suivi
Si la communauté reçoit une activité "Follow", elle répond automatiquement par "Accept/Follow". Elle ajoute également l'utilisateur à sa liste de suiveurs.
### Unfollow
À la réception d'un `Undo/Follow`, la communauté supprime l'utilisateur de sa liste de followers.
#### Annoncer
Si la communauté reçoit une activité liée à un message ou à un commentaire (créer, mettre à jour, aimer, détester, retirer, supprimer, annuler), elle l'annoncera à ses membres. Pour cela, une Annonce est créée avec la Communauté comme acteur, et l'activité reçue comme objet. Les instances qui suivent restent ainsi informées de toutes les actions des communautés qu'elles suivent.
### Supprimer une communauté
Si le créateur ou un administrateur supprime la communauté, il envoie un `Delete/Group` à tous ses suiveurs.

View file

@ -1,22 +0,0 @@
# Ressources de l'ActivityPub
## Documents officiels
- [Norme ActivityPub](https://www.w3.org/TR/activitypub/)
- [Vocabulaire de l'ActivityPub](https://www.w3.org/TR/activitystreams-vocabulary/)
## Explications
- [ActivityPub - one protocol to rule them all?](https://schub.io/blog/2018/02/01/activitypub-one-protocol-to-rule-them-all.html)
- [A highly opinionated guide to learning about ActivityPub](https://tinysubversions.com/notes/reading-activitypub/)
- [Activitypub implementers guide](https://socialhub.activitypub.rocks/t/draft-guide-for-new-activitypub-implementers/479)
- [Mastodon Blog: How to implement a basic ActivityPub server](https://blog.joinmastodon.org/2018/06/how-to-implement-a-basic-activitypub-server/)
- [Mastodon Blog: Implementing an ActivityPub inbox](https://blog.joinmastodon.org/2018/07/how-to-make-friends-and-verify-requests/)
- [Data storage questions](https://socialhub.activitypub.rocks/t/data-storage-questions/579)
- [Activitypub as it has been understood](https://flak.tedunangst.com/post/ActivityPub-as-it-has-been-understood)
## Exemples et bibliothèques
- [ActivityPub example server](https://github.com/tOkeshu/activitypub-example)
- [ActivityStreams crate](https://docs.rs/activitystreams/)
- [HTTP Signatures crate](https://git.asonix.dog/Aardwolf/http-signature-normalization)

View file

@ -1,31 +0,0 @@
# Ringkasan
- [Tentang](about/about.md)
- [Fitur](about/features.md)
- [Peringkat Pos dan Komentar](about/ranking.md)
- [Panduan](about/guide.md)
- [Administrasi](administration/administration.md)
- [Pasang Menggunakan Docker](administration/install_docker.md)
- [Pasang Menggunakan Ansible](administration/install_ansible.md)
- [Pasang dari Awal](administration/from_scratch.md)
- [Pasang di AWS](administration/on_aws.md)
- [Langkah Pertama](administration/first_steps.md)
- [Konfigurasi](administration/configuration.md)
- [Memulai dengan Federasi](administration/federation_getting_started.md)
- [Penyelesaian Masalah](administration/troubleshooting.md)
- [Pencadangan dan Pemulihan](administration/backup_and_restore.md)
- [Federasi](federation/federation.md)
- [Tinjauan Federasi](federation/overview.md)
- [Protokol Lemmy](federation/lemmy_protocol.md)
- [Pengembangan Klien](client_development/client_development.md)
- [Ekstra API HTTP](client_development/http_api_extras.md)
- [Panduan Membuat Tema](client_development/theming.md)
- [Membuat Antarmuka Kustom](client_development/custom_frontend.md)
- [Kontribusi](contributing/contributing.md)
- [Pengembangan Docker](contributing/docker_development.md)
- [Pengembangan Lokal](contributing/local_development.md)
- [Pengujian](contributing/tests.md)
- [Pengembangan Federasi](contributing/federation_development.md)
- [Proses Rilis](contributing/release_process.md)
- [Sumber/Pustaka](contributing/resources.md)
- [Kode Etik](code_of_conduct.md)

View file

@ -1,34 +0,0 @@
## Tentang Proyek Ini
| Halaman Depan | Pos |
| ------------------------------- | ------------------------------------ |
| ![layar utama](main_screen.png) | ![layar percakapan](chat_screen.png) |
[Lemmy](https://github.com/LemmyNet/lemmy) serupa seperti situs seperti [Reddit](https://reddit.com), [Lobste.rs](https://lobste.rs), [Raddle](https://raddle.me), atau [Hacker News](https://news.ycombinator.com/): Anda berlangganan ke forum yang Anda tertarik kepada mereka, pos tautan dan diskusi, kemudian pilih, dan komentar di sana. Di belakang layar, itu sangat berbeda; semua orang bisa dengan mudah menjalankan sebuah peladen dan semua peladen tersebut terfederasi (seperti surel) dan terhubung ke semesta yang sama, yaitu [Fediverse](https://en.wikipedia.org/wiki/Fediverse).
_Kata “fediverse” (federated universe) merujuk kepada jaringan dari semua peladen Lemmy [dan proyek lainnya](https://blog.joinmastodon.org/2018/06/why-activitypub-is-the-future/), yang dimana pengguna bisa berbicara satu sama lain dengan seamlessly._
Seperti surel, entah Anda mendaftar di Gmail atau Outlook, Anda tahu Anda akan bisa mengirim surel ke semua yang Anda butuhkan, asalkan Anda tahu alamat mereka. Di Lemmy, Anda bisa berlangganan ke komunitas di peladen mana pun lainnya dan bisa mengikuti diskusi dengan pengguna terdaftar dimana pun.
Tujuan utama proyek ini adalah untuk membuat alternatif dari Reddit dan pengumpul tautan lainnya yang mudah dihos sendiri dan desentralisasi, tanpa satu pun perusahaan yang menjalankan pertunjukan.
Tidak ada pemegang modal dan tidak ada iklan tertarget: hanya orang yang membagikan hal yang mereka ingin bagikan dengan yang lainnya.
Setiap peladen Lemmy bisa menentukan kebijakan moderasinya sendiri-sendiri; mengangkat admin tingkat situs, moderator komunitas untuk waspada terhadap _troll_, dan memupuk lingkungan yang sehat di mana semua bisa dengan nyaman berkontribusi.
_Catatan: Federasi masih dalam pengembangan aktif_
### Kenapa dinamai Lemmy?
- Penyanyi utama [Motörhead](https://invidio.us/watch?v=pWB5JZRGl0U).
- [Permainan video klasik](<https://en.wikipedia.org/wiki/Lemmings_(video_game)>).
- [Koopa dari Super Mario](https://www.mariowiki.com/Lemmy_Koopa).
- [Hewan pengerat berbulu](http://sunchild.fpwc.org/lemming-the-little-giant-of-the-north/).
### Dibangun menggunakan
- [Rust](https://www.rust-lang.org)
- [Actix](https://actix.rs/)
- [Diesel](http://diesel.rs/)
- [Inferno](https://infernojs.org)
- [Typescript](https://www.typescriptlang.org/)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

View file

@ -1,35 +0,0 @@
# Fitur
- Sumber terbuka, [Lisensi AGPL](/LICENSE).
- Bisa disetel sendiri, mudah untuk dipasang.
- Dibundel dengan [Docker](../administration/install_docker.md) dan [Ansible](../administration/install_ansible.md).
- Tampilan yang bersih dan ramah ponsel.
- Yang dibutuhkan untuk mendaftar adalah nama pengguna dan kata sandi!
- Dukungan avatar pengguna.
- Utas komentar dengan pembaruan langsung.
- Skor pilihan penuh `(+/-)` seperti Reddit yang lama.
- Banyak tema, termasuk terang, gelap, dan solarized.
- Emoji dengan dukungan ketik otomatis. Mulai mengetik `:`
- Tandai pengguna menggunakan `@`, tandai komunitas menggunakan `!`.
- Pengunggahan gambar terintegrasi baik di pos atau komentar.
- Sebuah pos bisa terdiri dari sebuah judul dan kombinasi dari teks subjek, URL, atau tidak ada teks sama sekali.
- Notifikasi di balasan komentar dan ketika Anda ditandai.
- Notifikasi bisa dikirim lewat surel.
- i18n/dukungan penginternasionalan
- Umpan RSS/Atom untuk `Semua`, `Berlangganan`, `Kotak Masuk`, `Pengguna`, dan `Komunitas`.
- Dukungan pos-lintas.
- Sebuah _pencarian pos serupa_ ketika membuat pos baru. Bagus untuk komunitas tanya/jawab.
- Kemampuan moderasi.
- Log Moderasi Publik.
- Bisa melengketkan pos ke bagian atas komunitas.
- Baik admin situs dan moderator komunitas dapat menunjuk moderator lain.
- Bisa mengunci, menghapus, dan memulihkan pos dan komentar.
- Bisa melarang dan batal melarang pengguna dari komunitas dan situs.
- Bisa memindah situs dan komunitas ke yang lain.
- Bisa menghapus seluruhnya data Anda, menggantikan seluruh pos dan komentar.
- Dukungan pos/komunitas NSFW
- Performa tinggi.
- Peladen ditulis dengan Rust.
- Antarmuka `~80kB` gzipped.
- Antarmuka bekerja tanpa JavaScript (hanya-baca)
- Mendukung arm64/Raspberry Pi.

View file

@ -1,95 +0,0 @@
# Panduan Mulai Cepat Lemmy
Jadi Anda ingin bergabung dengan Lemmy dan mulai mengepos. Bagus! Begini cara untuk meluncur masuk.
## Di mana saya mendaftar?
Hal pertama yang Anda harus lakukan adalah **memilih peladen Anda**. Ini merupakan langkah tambahan dibandingkan dengan situs seperti Reddit, tapi tidak sesulit yang dikira.
_Seperti surel, identitas Anda dihos oleh peladen yang dimana Anda mendaftar. Jadi sebagai contoh, saya gabung ke lemmy.ml, jadi untuk menyebutkan saya, Anda bisa mengetikkan @retiolus@lemmy.ml di pos Anda._
Jika apa yang ingin Anda bicarakan sesuai dengan kategori yang jelas (mungkin itu permainan video atau seni atau kehidupan aneh atau pengkodean atau fiksi, dll.) maka mungkin ada baiknya membuat peladen pertama Anda di mana yang terutama akan menampung konten semacam itu akan lebih mudah untuk membuat koneksi dan menemukan orang-orang yang berpikiran sama. Pikirkan peladen Anda sebagai lingkungan atau tempat, di mana obrolan umum tersebut dapat memiliki fokus khusus.
_Anda memiliki kemampuan untuk melihat semua pos lokal publik yang dibuat oleh orang di peladen Anda di bilah "Lokal"._
Jika Anda tidak di sini untuk menempel ke satu topik, Anda mungkin ingin memilih peladen yang melayani percakapan umum. Apa pun itu, ada daftar peladen yang berguna di [join-lemmy.org](https://join-lemmy.org/instances).
**Jangan panik!** Anda bisa berbicara kepada orang di peladen lainnya, tidak peduli apa yang Anda pilih. Ingat, ini seperti surel dan, contohnya, Anda masih bisa mengirim surel kepada ibu Anda di akun Yahoo kuno dari Gmail Anda.
## Ketahui peladen Anda
Luangkan waktu sejenak sebelum mendaftar untuk memeriksa peraturan dari peladen pilihan Anda dan pastikan mereka sesuai dengan bagaimana Anda ingin mengepos.
Peladen biasanya mendefinisikan peraturan mereka dengan cara yang simpel di bilah sisi kanan dari situs. Dari atas ke bawah, Anda akan biasanya menemukan daftar "Komunitas Sedang Tren" diikuti oleh "Berlangganan ke komunitas," deskripsi singkat peladen, peraturan, beberapa statistik, dan nama pengguna dari admin.
Admin merupakan orang yang sangat ramah yang bisanya menjalankan peladen dari dompet mereka sendiri, jadi merupakan hal yang bagus untuk mengenal mereka. Banyak dari mereka yang menerima donasi untuk menutupi biaya operasional dan jika Anda bisa berkontribusi maka hal itu selalu dihargai.
## Sepertinya saya menemukan rumah baru saya!
Pergi ke halaman Masuk `(https://your.server/login)` dari peladen Anda dan pilih nama pengguna dan kata sandi di formulir pendaftaran. Anda tidak perlu sebuah surel untuk mendaftar, tapi itu merupakan satu-satunya cara untuk mengatur ulang kata sandi Anda jika Anda kehilangannya.
Hal selanjutnya untuk dilakukan adalah mengunggah gambar profil Anda, berikan halaman pengaturan `(https://your.server/settings)` sebuah utak-atik (dan kembali melakukannya ketika Anda sudah di Lemmy selama beberapa pekan atau hanya untuk utak-atik yang mungkin membantu pengalaman Anda) dan bersiaplah untuk mengenalkan diri Anda.
_Beberapa pengaturan yang menarik untuk diperiksa adalah: jenis filter umpan baku antara berlangganan, lokal, atau semua dan jenis pengurutan baku Anda_
Meskipun Anda bisa hanya santai membaca Lemmy, keseruan yang asli dimulai ketika Anda meluncur dan mulai berpartisipasi dengan mengepos, mengeluarkan pilihan, dan berkomentar
Untuk membagikan sebuah pos, klik tombol "Buat Pos" di sisi atas dari layar. Anda akan dibawa ke sebuah formulir di mana Anda bisa memasukkan URL dari tautan atau mengunggah gambar Anda dan memasukkan judul dan badan pos. Anda juga akan diharuskan untuk memasukkan sebuah komunitas di mana Anda ingin pos Anda muncul. Sebelum melakukan itu, merupakan ide yang bagus untuk menuju ke halaman komunitas tersebut dan membaca panduan mengepos yang ada di sebelah kanan layar. Ini akan memastikan bahwa Anda patuh terhadap etos tertentu dari sebuah komunitas. Contohnya, di komunitas [`!privacy@lemmy.ml`](https://lemmy.ml/c/privacy), Anda tidak boleh untuk mempromosikan perangkat lunak tidak bebas.
Ketika semua bagian sudah diisi, klik "Buat" dan pos Anda akan muncul.
Ketika menulis sebuah pos atau komentar baru, mulai mengetik...
- `@a_user_name` untuk mendapatkan daftar nama pengguna.
- `!a_community` untuk mendapatkan daftar komunitas.
- `:emoji` untuk mendapatkan daftar emoji.
## Pengenalan cepat tampilan web
![interface.png](interface.png)
Tampilan standar Lemmy memiliki satu umpan. Anda bisa mengubah konten dari umpan tersebut menggunakan filter:
**Berlangganan** termasuk pos dari peladen Anda dan peladen lainnya, yang terpenting adalah komunitas yang Anda ikuti.
**Lokal** adalah umpan dari semua pos di komunitas di peladen Anda. Di banyak peladen, terutama yang kecil-kecil dan terfokus ke topik tertentu, di sinilah sihir terjadi. Anda bisa membalas ke orang dari sana dan di sana merupakan tempat yang bagus untuk bertemu dengan orang yang berbagi minat yang sama denganmu.
**Semua** atau **lini masa terfederasi** adalah untuk melihat semua pos publik yang peladen Anda ketahui dari seluruh jaringan (termasuk yang lokal). Alasan yang paling umum ketika sesuatu tampil di lini masa terfederasi adalah ada seseorang dari peladen Anda mengikuti komunitas yang ada di peladen lainnya.
| Jenis | Deskripsi |
| ---------------------- | -------------------------------------------------------------------- |
| Pos | Hanya tampilkan publikasi (pos) |
| Komentar | Hanya tampilkan komentar |
| \-\-\- | \-\-\- |
| Aktif | Urut yang tren berdasarkan skor dan waktu komentar yang paling baru. |
| Hangat | Urut yang tren berdasarkan skor dan waktu pembuatan pos. |
| Baru | Yang terbaru. |
| Paling Banyak Komentar | Pos dengan komentar paling banyak. |
| Komentar Terbaru | Pos dengan komentar yang paling baru, alias urut gaya-forum. |
| Teratas | Skor terbesar di jangka waktu tertentu. |
Untuk detail lebih lanjut, periksa [detail Ranking Pos dan Komentar](ranking.md).
## Menggunakan Markdown
Pos Lemmy ditulis menggunakan Markdown, tentu saja ada pintasan untuk Anda gunakan ketika menulis, di bawah ini merupakan tabel untuk membantu Anda jika Anda ingin tahu lebih lanjut.
| Ketik | Atau | … untuk mendapatkan |
| ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------- |
| \*Miring\* | \_Miring\_ | _Miring_ |
| \*\*Tebal\*\* | \_\_Tebal\_\_ | **Tebal** |
| \# Tajuk 1 | Tajuk 1 <br> ========= | <h4>Tajuk 1</h4> |
| \## Tajuk 2 | Tajuk 2 <br>--------- | <h5>Tajuk 2</h5> |
| \[Tautan\](http://a.com) | \[Tautan\]\[1\]<br><br>\[1\]: http://b.org | [Tautan](https://commonmark.org/) |
| !\[Gambar\](http://url/a.png) | !\[Gambar\]\[1\]<br><br>\[1\]: http://url/b.jpg | ![Markdown](https://commonmark.org/help/images/favicon.png) |
| \> Kutipan | | <blockquote>Kutipan</blockquote> |
| \* Daftar <br>\* Daftar <br>\* Daftar | \- Daftar <br>\- Daftar <br>\- Daftar <br> | _ Daftar <br>_ Daftar <br>\* Daftar <br> |
| 1\. Satu <br>2\. Dua <br>3\. Tiga | 1) Satu<br>2) Dua<br>3) Tiga | 1. Satu<br>2. Dua<br>3. Tiga |
| Garis Horizontal <br>\--- | Garis Horizontal<br>\*\*\* | Garis Horizontal <br><hr> |
| \`Kode di pos\` dengan petik terbalik | | `Kode di pos` dengan petik terbalik |
| \`\`\`<br>\# blok kode <br>print '3 petik terbalik or'<br>print 'indentasi 4 spasi' <br>\`\`\` | ····\# blok kode<br>····print '3 petik terbalik or'<br>····print 'indentasi 4 spasi' | \# blok kode <br>print '3 petik terbalik or'<br>print 'indentasi 4 spasi' |
| ::: spoiler sembunyi atau sesuatu porno<br>_sesuatu untuk disembunyikan_<br>::: | | <details><summary> sembunyi atau sesuatu porno </summary><p><em>sesuatu untuk disembunyikan</em></p></details> |
| Teks ~bawah~ garis | | Teks <sub>bawah</sub> garis |
| Teks ^atas^ garis | | Teks <sup>atas</sup> garis |
[Tutorial CommonMark](https://commonmark.org/help/tutorial/)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

View file

@ -1,47 +0,0 @@
# Algoritma Pengurutan Tren/Hangat/Terbaik
## Tujuan
- Saat hari pertama, pos dan komentar baru harus berada di atas, sehingga mereka bisa dipilih atas/bawah.
- Setelah sekitar satu hari, faktor waktu akan hilang.
- Gunakan skala log, karena suara cenderung menggelinding, dan 10 suara pertama sama pentingnya dengan seratus berikutnya.
## Implementasi
### Reddit
Tidak memperhitungkan masa hidup utas, [memberikan komentar awal keuntungan besar terhadap yang setelahnya](https://minimaxir.com/2016/11/first-comment/), berefek lebih buruk di komunitas kecil. Jajak komentar baru berada di bawah utas, secara efektif membunuh diskusi dan membuat setiap utas balapan untuk komentar lebih dulu. Ini menurunkan kualitas pembicaraan dan menghargai komentar yang repetitif dan spam.
### Hacker News
Meskipun jauh lebih unggul daripada implementasi Reddit karena pembusukan skornya dari waktu ke waktu, [algoritma peringkat Hacker News](https://medium.com/hacking-and-gonzo/how-hacker-news-ranking-algorithm-works-1d9b0cf2c08d) tidak menggunakan skala logaritmik untuk skor.
### Lemmy
Menyeimbangkan efek bola salju suara dari waktu ke waktu dengan skala logaritmik. Meniadakan keuntungan yang melekat dari komentar awal sambil tetap memastikan bahwa suara tetap penting dalam jangka panjang, tidak menghapus komentar populer yang lama.
```
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 menggunakan algoritma `Rank` yang sama di atas, dengan dua cara: `Active` dan `Hot`
- `Active` menggunakan suara pos, dan waktu komentar terakhir (dibatasi hingga dua hari).
- `Hot` menggunakan suara pos, dan waktu pos diterbitkan.
- Menggunakan Max(1, score) untuk memastikan semua komentar terpengaruh pembusukan waktu.
- Tambahkan 3 ke skor, sehingga semua yang memiliki kurang dari 3 pilih bawah akan tampak baru. Atau tidak, semua komentar baru akan tetap nol, dekat di bawah.
- Tanda dan abs skor diperlukan untuk menangani log skor negatif.
- Faktor skala 10 ribu menggenapkan peringkat dalam bentuk bilangan bulat.
Plot peringkat lebih dari 24 jam, dengan skor 1, 5, 10, 100, 1000, dengan faktor skala 10 ribu.
![](rank_algorithm.png)
#### Penghitungan Pengguna Aktif
Lemmy juga menampilkan jumlah _pengguna aktif_ untuk situs Anda, dan komunitasnya. Ini dihitung dalam `hari`, `pekan`, `bulan`, dan `setengah tahun` terakhir, dan ditembolokkan dalam pemulaian Lemmy, dan setiap jam.
Pengguna aktif merupakan seseorang yang mempos atau berkomentar di peladen atau komunitas dalam jangka waktu terakhir yang ditentukan. Untuk penghitungan situs, hanya pengguna lokal yang dihitung. Untuk penghitungan komunitas, pengguna terfederasi juga dihitung.

View file

@ -1,23 +0,0 @@
# Informasi Administrasi
Informasi untuk admin peladen Lemmy dan mereka yang ingin menjalankan sebuah peladen.
## Pasang
### Metode Resmi/Didukung
Lemmy memiliki dua metode pemasangan utama:
- [Manual dengan Docker](install_docker.md)
- [Otomatis dengan Ansible](install_ansible.md)
Kami merekomendasikan menggunakan Ansible, karena menyederhanakan instalasi dan juga membuat pembaruan lebih mudah.
### Metode pemasangan lainnya
> ⚠️ **Hati-hati! Risiko Anda sendiri**
Dalam beberapa kasus, mungkin perlu menggunakan metode pemasangan yang berbeda. Tetapi kami tidak merekomendasikan ini, dan tidak dapat memberikan dukungan untuk mereka.
- [Dari Awal](from_scratch.md)
- [Di Amazon Web Services (AWS)](on_aws.md)

View file

@ -1,76 +0,0 @@
# Petunjuk Pencadangan dan Pemulihan
## Docker dan Ansible
Ketika menggunakan Docker atau Ansible, seharusnya ada folder `volumes` yang mengandung baik basis data dan seluruh gambar. Salin folder ini ke peladen baru untuk memulihkan data Anda
### Pencadangan basis data bertahap
Untuk pencadangan DB bertahap ke berkas `.sql`, Anda bisa menjalankan:
```bash
docker-compose exec postgres pg_dumpall -c -U lemmy > lemmy_dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql
```
### Contoh skrip pencadangan
```bash
#!/bin/sh
# Pencadangan DB
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
# Pencadangan folder volumes
rsync -avP -zz --rsync-path="sudo rsync" MY_USER@MY_IP:/LEMMY_LOCATION/volumes ~/BACKUP_LOCATION/FOLDERNAME
```
### Memulihkan DB
Jika Anda perlu untuk memulihkan dari berkas `pg_dumpall`, pertama-tama Anda perlu membersihkan basis data telah ada Anda.
```bash
# 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'"
```
### Mengubah nama domain Anda
Jika Anda belum terfederasi, Anda bisa mengubah nama domain Anda di DB. **Peringatan: jangan lakukan ini setelah Anda terfederasi atau itu akan merusak federasi.**
Pergi ke `psql` dari Docker Anda:
`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');
```
## Lihat juga
- https://stackoverflow.com/questions/24718706/backup-restore-a-dockerized-postgresql-database

Some files were not shown because too many files have changed in this diff Show more