A veces para hacer mantenimiento de nuestro nodo de Mastodon, necesitamos liberar espacio eliminando usuarios que no se han conectado en cierto tiempo. Por lo general, muchos nodos eliminan las cuentas que por ejemplo llevan 6 meses sin acceder.

Mirando de automatizar este proceso, he creado un script escrito en NodeJS para que a partir de una lista de usuarios en formato JSON, poder enviar una plantilla escrita en PUG con un texto explicando que si no se accede a la cuenta en los próximos 15 días procederemos a eliminar la cuenta.

Extraer listado de usuarios

Para extraer la lista de usuarios, lo primero tenemos que hacer lo que se indica en este otro tutorial, sin llegar a hacer todo el tutorial (menos la parte de eliminar usuarios):

Mantenimiento de Mastodon: Eliminar usuarios que no se han conectado desde una fecha concreta
Ser administrador de un nodo de Mastodon, es una tarea bastante compleja de llevar. Todo va a depender también del número de usuarios que tengas. Pero con estas últimas oleadas por la compra de la red social del pájaro, la limpieza de la base de datos es algo importante.
💡
Primero queremos sacar una lista de usuarios que llevan 6 meses sin conectarse, luego, procederemos ha enviar un aviso por e-mail para que tengan 15 días para dar señales de vida en su cuenta. Si tras ese proceso, no se han conectado, entonces procederemos a eliminar su cuenta de nuestro nodo.

El procedimiento de este tutorial de más arriba sobre como Eliminar usuarios que no se han conectado desde una fecha concreta consta de los siguientes pasos:

  • Exportar base de datos en el nodo en producción.
  • Copiar el servidor en un postgres en desarrollo e importarlo.
  • Conectarnos remotamente y extraer el listado que nos interesa.

Una vez tengamos el listado de usuarios para exportar, en DBeaver seleccionaremos todos los datos y haremos clic derecho Export Data:

Seleccionaremos la opción de JSON y le daremos a Next. En en resto de ventanas también le daremos a Next y lo dejaremos todo por defecto. Al final deberemos de hacer clic en Process y obtendremos un fichero en formato JSON con los datos:

🛠️
Para que el proceso funcione correctamente, debes de eliminar la línea 2 del fichero, donde se muestra la consulta ejecutada. El fichero debe de empezar en la primera línea con [ y acabar con la última línea con ].

Mastodon Reminder Node: Un script para enviar e-mails recordatorios

Desde ./voidNull hemos creado este script en NodeJS para enviar un correo electrónico utilizando una plantilla HTML en formato PUG totalmente personalizable.

Aquí tenéis el repositorio:

T3rr0rZ0n3 / mastodon-reminder-node · GitLab
GitLab.com

Lo primero que haremos será copiar el repositorio en el servidor donde tenemos el nodo de Mastodon:

git clone https://gitlab.com/t3rr0rz0n3/mastodon-reminder-node.git

Y luego instalaremos las librerías necesarias:

npm install

Tendremos que modificar dos ficheros principalmente, el primero será la configuración del servicio de SMTP:

cp .env-sample .env

Si editamos el fichero .env, tendremos lo siguiente para rellenar con nuestros datos:

HOST=
PORT=
AUTH_USER=
AUTH_PASS=
FROM=
SUBJECT=
  • HOST: Aquí debemos de poner el hostname del servidor de SMTP (por ejemplo: smtp.midominio.com o mail.midominio.com).
  • PORT: El puerto SMTP que se utiliza (Normalmente 25 o 587)
  • AUTH_USER: Cuenta de correo que utilizaremos para enviar el correo.
  • AUTH_PASS: La contraseña de la cuenta de correo.
  • FROM: La cuenta de correo que queremos que aparezca en el e-mail (por ejemplo podemos usar no-reply@midominio.com)
  • SUBJECT: Asunto del e-mail, sé simpático y amable :)
💡
Todos estos parámetros son obligatorios

El otro fichero se trata de la plantilla llamado template.pug en formato PUG para enviar, en el repositorio contiene lo siguiente:

doctype html
head
  title Hola, ¿Sigues ahí? ¡Te echamos de menos!
  meta(content='text/html; charset=utf-8' http-equiv='Content-Type')
  meta(content='width=device-width, initial-scale=1.0, shrink-to-fit=no' name='viewport')
  link(rel='preconnect' href='https://fonts.googleapis.com')
  link(rel='preconnect' href='https://fonts.gstatic.com' crossorigin='')
  link(href='https://fonts.googleapis.com/css2?family=Nunito:wght@200;800&display=swap' rel='stylesheet')
  style.
    body {font-family: 'Nunito', sans-serif; background-color: #313543; color: #FFF;}
    .page {border-radius: 4px;}
    .title, .content, .footer {padding: 25px; text-align:center;}
    .title {background-color: #17191f;}
    .content {background-color: #282C37;}
    .btn {background-color: #5455FF; padding: 5px 16px; border: none; color: #FFF; font-weight: bold; letter-spacing: 2px; text-decoration: none; color: #FFF; line-height: 26px; border-radius:4px}
    .footer {background-color: #1F232B; padding-left: 25px; padding-right:25px}
    footer {font-size: 12px; color: #737d99; text-align:center; padding: 20px;}
    footer p a {text-decoration: none; color: #737d99; cursor:point;}
.page
  .title
    h1 ¡Hola, #{name}!
  .content
    h2 ¿Sigues ahí? ¡Te echamos de menos!
    p ¿Te acuerdas de Mastodon? ¡Hace tiempo que no nos vemos!
    p Hace un tiempo, un montón de gente vino de Twitter a Mastodon, y eso te incluye.
    h3 Te registraste con este usuario, ¿Te acuerdas?
    a.btn(href='https://xarxa.cloud/') @#{account}
  .footer
    p Te registraste el #{date} en el nodo xarxa.cloud.
    p
      | Hace ya 6 meses desde la última vez que te conectaste, y nos pareció una buena ocasión para decirte cuánto valoramos tu presencia y participación en nuestro nodo en el Fediverso.
    p
      | Estamos realizando tareas de mantenimiento y queremos eliminar las cuentas que no se van a utilizar, si quieres mantener tu cuenta debes de acceder a tu cuenta.
    p
      | ¡Te pedimos que accedas a tu cuenta en los próximos 15 días para evitar la eliminación! Valoramos tu presencia y no queremos perderte como miembro de nuestra comunidad.
    hr
    p
      | Recuerda que, a la hora de iniciar sesión, el correo electrónico de tu cuenta es este a donde te estamos escribiendo, pero si no recuerdas tu contraseña, pulsa a continuación y te mandaremos una nueva para que puedar volver a entrar.
    a.btn(href='https://xarxa.cloud/auth/password/new') Recordar contraseña
footer
  p
    | Equipo de 
    a(href='https://xarxa.cloud') xarxa.cloud

Si lo visualizamos, en formato HTML se verá así una vez se envíe:

Evidentemente deberéis de modificar todo el contenido a vuestro gusto, pero debéis de respetar las tres variables que se utilizan:

#{name}
#{account}
#{date}

En orden, corresponden al nombre, a la cuenta de Mastodon y a la fecha de registro, que se obtendrán del fichero JSON que hemos creado anteriormente. Así que siéntete libre de modificar la plantilla a tu gusto.

Finalmente deberemos de copiar el fichero exportado en DBeaver en formato JSON bajo el nombre usuarios.json.

Ejecutando Script

Una vez tenemos la configuración de SMTP finalizada y hemos configurado la plantilla a nuestro gusto, podemos ejecutar el comando para lanzar el script:

node index.js

Y si todo está bien, iniciará el envío de e-mails:

Y con esto ya avisaremos a los usuarios.

Siguientes pasos

Ahora tocará esperar los días que hemos indicado en el e-mail, en mi caso 15 días. Pasados esos 15 días, deberemos de realizar la consulta en la base de datos para exportar de nuevo los usuarios. Los que se hayan conectado alguna vez desde el e-mail, ya no deberían de aparecer. Esa será la lista definitiva para eliminar las cuentas de Mastodon.

Eliminar usuarios en Mastodon

Ahora es cuando viene lo divertido. Cuando toca eliminar de verdad todos esos usuarios. Ahora que ya tenemos el listado de usuarios (con su e-mail) lo que haremos será copiar todos esos usuarios en un fichero llamado list_users_to_remove:

fulanito
menganito
t3rr0rz0n3
voidnull
...

Luego podemos crear un script que recorra línea por línea y ejecute el comando para eliminar el usuario:

tootctl accounts delete [USUARIO]

Para ello creamos un script bajo el nombre remove_mastodon_users.sh y añadimos lo siguiente:

#!/bin/bash

while read line
do
        user=`echo $line | cut -d" " -f1`
        echo $user
        RAILS_ENV=production ./bin/tootctl accounts delete $user
done<list_users_to_remove
🚨
He notado que para hacer este proceso, Redis consume mucha RAM del servidor. Por lo que es importante tener suficiente RAM para realizar este proceso. Si no recomiendo ejecutar el comando en bloques de 100 usuarios o menos.

Y podemos lanzar el script para que vaya eliminando todos los usuarios del listado. 🎉

Conclusión

Después de hacer la limpieza en mi nodo, hemos pasado de ser +3000 usuarios a +800 usuarios. Se han eliminado muchos usuarios que se registraron en la gran oleada de noviembre del año pasado:

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación