Cómo instalar Lemmy, el agregador de contenidos tipo Reddit, en Ubuntu 22.04

Lemmy es un agregador de contenidos de código abierto similar a Reddit y una plataforma de microblogging para el fediverso. Te permite crear y moderar comunidades y puede comunicarse con otros servicios de ActivityPub, como Mastodon, Pleroma y Peertube.

Aunque existen instancias populares de Lemmy a las que puedes unirte y utilizar, también puedes gestionar tu propia instancia de Lemmy para tus amigos y familiares. En este tutorial, aprenderás a instalar Lemmy en un servidor Ubuntu 22.04.

Requisitos previos

  • Un servidor con Ubuntu 22.04.
  • Un usuario sudo no root.
  • Un nombre de dominio completo (FQDN) como example.com.
  • Asegúrate de que todo está actualizado.
    $ sudo apt update
    $ sudo apt upgrade
    
  • Pocos paquetes que necesite tu sistema.
    $ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
    

    Puede que algunos de estos paquetes ya estén instalados en tu sistema.

Paso 1 – Configurar el Cortafuegos

El primer paso es configurar el cortafuegos. Ubuntu viene con ufw (Uncomplicated Firewall) por defecto.

Comprueba si el cortafuegos se está ejecutando.

$ sudo ufw status

Obtendrás la siguiente salida.

Status: inactive

Permite el puerto SSH para que el cortafuegos no rompa la conexión actual al activarlo.

$ sudo ufw allow OpenSSH

Permite también los puertos HTTP y HTTPS.

$ sudo ufw allow http
$ sudo ufw allow https

Habilita el cortafuegos

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Comprueba de nuevo el estado del cortafuegos.

$ sudo ufw status

Deberías ver un resultado similar.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Paso 2 – Instala Docker y Docker Compose

Ubuntu 22.04 incluye una versión antigua de Docker. Para instalar la última versión, importa primero la clave GPG de Docker.

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

Crea un archivo de repositorio de Docker.

$ echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Actualiza la lista de repositorios del sistema.

$ sudo apt update

Instala la última versión de Docker.

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Comprueba que se está ejecutando.

$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2023-08-04 07:48:20 UTC; 4min 29s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 2372 (dockerd)
      Tasks: 8
     Memory: 23.9M
        CPU: 295ms
     CGroup: /system.slice/docker.service
             ??2372 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Por defecto, Docker requiere privilegios de root. Si quieres evitar utilizar sudo cada vez que ejecutes el comando docker, añade tu nombre de usuario al grupo docker.

$ sudo usermod -aG docker $(whoami)

Tendrás que salir del servidor y volver a entrar como el mismo usuario para activar este cambio o utilizar el siguiente comando.

$ su - ${USER}

Confirma que tu usuario se ha añadido al grupo Docker.

$ groups
navjot wheel docker

Paso 3 – Crea y descarga los archivos de Lemmy

Crea una carpeta para Lemmy.

$ mkdir ~/lemmy

Cambia al directorio.

$ cd ~/lemmy

Coge el archivo Nginx personalizado para trabajar con Docker.

$ wget https://raw.githubusercontent.com/LemmyNet/lemmy-ansible/main/templates/nginx_internal.conf

Coge el archivo Docker compose.

$ wget https://raw.githubusercontent.com/LemmyNet/lemmy-ansible/main/templates/docker-compose.yml

Crea una carpeta para la aplicación Pictrs.

$ mkdir -p volumes/pict-rs

Establece los permisos correctos para el directorio.

$ sudo chown -R 991:991 volumes/pict-rs

Paso 4 – Configurar Lemmy

Antes de proceder con la instalación, tenemos que editar los archivos que hemos descargado.

Abre el archivo Docker compose para editarlo.

$ nano docker-compose.yml

Realiza los siguientes cambios en el archivo:

  • Sustituye la variable {{ lemmy_port }} por 8536 en el archivo.
  • Sustituye la variable {{ lemmy_docker_image }} por dessalines/lemmy:0.18.3 en el archivo. Puedes obtener la última versión de la imagen Docker de Lemmy en su página Docker Hub. La página requiere que tengas una cuenta Docker. También puedes obtener la versión en su página de versiones de Github.
  • Sustituye la variable {{ lemmy_docker_ui_image }} por dessalines/lemmy-ui:0.18.3 en el archivo. Asegúrate de que la versión coincide con la imagen Docker de Lemmy, de lo contrario, no funcionará.
  • Genera una clave API para pict-rs utilizando el siguiente comando.
    $ openssl rand -base64 32
    lRLcaM5rovxzmztlDvtkGijJyBtg4KlEKC6HRb3dn7s=
    

    La clave PICTRS__API_KEY en el atributo de entorno del servicio pictrs está mal configurada para decir que debe ser la contraseña de PostgreSQL. Sustituye la variable {{ postgres_password }} en la variable clave API por la clave generada en el comando anterior.

  • Sustituye la variable {{ domain }} del archivo por el nombre de dominio completo de tu instancia de Lemmy.
  • Sustituye {{ postgres_password }} por una contraseña segura de tu elección para el servidor PostgreSQL.
  • Sustituye la variable de entorno existente RUST_LOG por lo siguiente.
    - RUST_LOG="warn,lemmy_server=debug,lemmy_api=debug,lemmy_api_common=debug,lemmy_api_crud=debug,lemmy_apub=debug,lemmy_db_schema=debug,lemmy_db_views=debug,lemmy_db_views_actor=debug,lemmy_db_views_moderator=debug,lemmy_routes=debug,lemmy_utils=debug,lemmy_websocket=debug"
    - RUST_BACKTRACE=full
    
  • Añade la siguiente sección en la propiedad hostname del servicio PostgreSQL.
    command:
      [
        "postgres",
        "-c",
        "session_preload_libraries=auto_explain",
        "-c",
        "auto_explain.log_min_duration=5ms",
        "-c",
        "auto_explain.log_analyze=true",
        "-c",
        "track_activity_query_size=1048576",
      ]
    ports:
      # use a different port so it doesnt conflict with potential postgres db running on the host
      - "5433:5432"
    

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite una vez hayas terminado. A continuación, crea y abre el archivo lemmy.hjson para editarlo.

$ nano lemmy.hjson

Pega el siguiente código.

{
  # for more info about the config, check out the documentation
  # https://join-lemmy.org/docs/en/administration/configuration.html

  database: {
    host: "postgres"
    user: "lemmy"
    password: "yourpsqlpassword"
    database: "lemmy"
    port: 5432
  }
  hostname: "example.com"
  pictrs: {
    url: "http://pictrs:8080/"
     # Set a custom pictrs API key. ( Required for deleting images )
    api_key: "lRLcaM5rovxzmztlDvtkGijJyBtg4KlEKC6HRb3dn7s="
  }
  email: {
    smtp_server: "email-smtp.us-west-2.amazonaws.com:465"
    smtp_login: "AmazonSESUserID"
    smtp_password:"AmazonSESPassword"
    smtp_from_address: "[email protected]"
    # Whether or not smtp connections should use tls. Can be none, tls, or starttls
    tls_type: "tls"
  }
  setup: {
    # Username for the admin user
    admin_username: "admin"
    # Password for the admin user. It must be at least 10 characters.
    admin_password: "tf6HHDS4RolWfFhk4Rq9"
    # Name of the site (can be changed later)
    site_name: "Howtoforge Lemmy"
    # Email for the admin user (optional, can be omitted and set later through the website)
    admin_email: "[email protected]"
  }
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida una vez hayas terminado.

El siguiente paso es crear un archivo de configuración PostgreSQL personalizado para optimizar la base de datos. Visita el sitio web PGTune para generar valores en función del tamaño de tu servidor.

Página web de PGTune

Introduce los valores del servidor y pulsa el botón Generar para crear la configuración personalizada.

Crea y abre el archivo customPostgresql.conf para editarlo.

$ nano customPostgresql.conf

Pega el código que has obtenido de PGTune.

# DB Version: 15
# OS Type: linux
# DB Type: web
# Total Memory (RAM): 2 GB
# CPUs num: 2
# Connections num: 100
# Data Storage: ssd

max_connections = 100
shared_buffers = 512MB
effective_cache_size = 1536MB
maintenance_work_mem = 128MB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 100
random_page_cost = 1.1
effective_io_concurrency = 200
work_mem = 2621kB
min_wal_size = 1GB
max_wal_size = 4GB

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Paso 5 – Instala Lemmy

Ahora que todos los archivos están configurados, es el momento de ejecutar Lemmy. Ejecuta el siguiente comando para lanzar los contenedores docker.

$ docker compose up -d

Comprueba el estado de los contenedores.

$ docker ps
CONTAINER ID   IMAGE                        COMMAND                  CREATED          STATUS          PORTS                                               NAMES
75443bb3db3e   nginx:1-alpine               "/docker-entrypoint.…"   32 seconds ago   Up 29 seconds   80/tcp, 0.0.0.0:8536->8536/tcp, :::8536->8536/tcp   lemmy-proxy-1
8393c8d625af   dessalines/lemmy-ui:0.18.1   "docker-entrypoint.s…"   32 seconds ago   Up 30 seconds   1234/tcp                                            lemmy-lemmy-ui-1
ea743c8279f7   dessalines/lemmy:0.18.1      "/app/lemmy"             32 seconds ago   Up 26 seconds                                                       lemmy-lemmy-1
78855ae7871e   postgres:15-alpine           "docker-entrypoint.s…"   33 seconds ago   Up 31 seconds   5432/tcp                                            lemmy-postgres-1
9556b57afdb9   asonix/pictrs:0.4.0          "/sbin/tini -- /usr/…"   33 seconds ago   Up 31 seconds   6669/tcp, 8080/tcp                                  lemmy-pictrs-1

También puedes comprobar el estado utilizando Docker Compose.

$ docker compose ps
NAME                IMAGE                        COMMAND                  SERVICE             CREATED              STATUS              PORTS
lemmy-lemmy-1       dessalines/lemmy:0.18.1      "/app/lemmy"             lemmy               About a minute ago   Up About a minute
lemmy-lemmy-ui-1    dessalines/lemmy-ui:0.18.1   "docker-entrypoint.s…"   lemmy-ui            About a minute ago   Up About a minute   1234/tcp
lemmy-pictrs-1      asonix/pictrs:0.4.0          "/sbin/tini -- /usr/…"   pictrs              About a minute ago   Up About a minute   6669/tcp, 8080/tcp
lemmy-postgres-1    postgres:15-alpine           "docker-entrypoint.s…"   postgres            About a minute ago   Up About a minute   5432/tcp
lemmy-proxy-1       nginx:1-alpine               "/docker-entrypoint.…"   proxy               About a minute ago   Up About a minute   80/tcp, 0.0.0.0:8536->8536/tcp, :::8536->8536/tcp

Puedes hacer una prueba abriendo la URL http://<server_IP>:8536/ y deberías ver la página principal de Lemmy. Eso concluye que todo está bien. El siguiente paso es instalar Nginx y Certbot para servir a Lemmy a través de un nombre de dominio.

Paso 6 – Instalar Nginx

Ubuntu 22.04 viene con una versión antigua de Nginx. Para instalar la última versión, necesitas descargar el repositorio oficial de Nginx.

Importa la clave de firma de Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Añade el repositorio de la versión estable de Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

Actualiza los repositorios del sistema.

$ sudo apt update

Instala Nginx.

$ sudo apt install nginx

Verifica la instalación.

$ nginx -v
nginx version: nginx/1.24.0

Inicia Nginx.

$ sudo systemctl start nginx

Comprueba el estado del servicio.

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2023-08-04 09:01:56 UTC; 3s ago
       Docs: https://nginx.org/en/docs/
    Process: 5297 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 5298 (nginx)
      Tasks: 2 (limit: 2308)
     Memory: 1.9M
        CPU: 7ms
     CGroup: /system.slice/nginx.service
             ??5298 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??5299 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

Paso 7 – Instalar SSL

Necesitamos instalar Certbot para generar el certificado SSL. Puedes instalar Certbot utilizando el repositorio de Ubuntu o descargar la última versión utilizando la herramienta Snapd. Nosotros utilizaremos la versión Snapd.

Ubuntu 22.04 viene con Snapd instalado por defecto. Ejecuta los siguientes comandos para asegurarte de que tu versión de Snapd está actualizada.

$ sudo snap install core && sudo snap refresh core

Instala Certbot.

$ sudo snap install --classic certbot

Utiliza el siguiente comando para asegurarte de que se puede ejecutar el comando Certbot creando un enlace simbólico al directorio /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Ejecuta el siguiente comando para generar un certificado SSL.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d example.com

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/example.com de tu servidor.

Genera un certificado de grupo Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Comprueba el servicio programador de renovaciones de Certbot.

$ sudo systemctl list-timers

Encontrarás snap.certbot.renew.service como uno de los servicios programados para ejecutarse.

NEXT                        LEFT          LAST                        PASSED       UNIT                       ACTIVATES
Fri 2023-08-04 09:50:30 UTC 46min left    Fri 2023-08-04 01:49:37 UTC 7h ago       apt-daily.timer            apt-daily.service
Sat 2023-08-05 00:00:00 UTC 14h left      Wed 2023-06-28 04:41:28 UTC 5h 7min ago  dpkg-db-backup.timer       dpkg-db-backup.service
Fri 2023-08-04 18:54:00 UTC 9h left       n/a                         n/a          snap.certbot.renew.timer   snap.certbot.renew.service

Realiza una ejecución en seco del proceso para comprobar si la renovación SSL funciona correctamente.

$ sudo certbot renew --dry-run

Si no ves ningún error, ya está todo listo. Tu certificado se renovará automáticamente.

Paso 8 – Configurar Nginx

Crea y abre el archivo /etc/nginx/conf.d/lemmy.conf para editarlo.

$ sudo nano /etc/nginx/conf.d/lemmy.conf

Pega en él el siguiente código.

limit_req_zone $binary_remote_addr zone=example.com_ratelimit:10m rate=1r/s;

server {
    listen 80;
    listen [::]:80;
    server_name example.com;
    # Hide nginx version
    server_tokens off;
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com;

    access_log  /var/log/nginx/lemmy.access.log;
    error_log   /var/log/nginx/lemmy.error.log;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    # use https://blog.cloudflare.com/announcing-1111 Cloudfare+Apnic labs, It is free and secure
    resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] valid=300s;

    # Hide nginx version
    server_tokens off;

    # Enable compression for JS/CSS/HTML bundle, for improved client load times.
    # It might be nice to compress JSON, but leaving that out to protect against potential
    # compression+encryption information leak attacks like BREACH.
    gzip on;
    gzip_types text/css application/javascript image/svg+xml;
    gzip_vary on;

    # Various content security headers
    add_header Referrer-Policy "same-origin";
    add_header X-Content-Type-Options "nosniff";
    add_header X-Frame-Options "DENY";
    add_header X-XSS-Protection "1; mode=block";


    location / {
      proxy_pass http://localhost:8536;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Observa que el directorio raíz que se utilizará en la configuración de Nginx es /var/www/html/Lemmy/public/.

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida una vez hayas terminado.

Abre el archivo /etc/nginx/nginx.conf para editarlo.

$ sudo nano /etc/nginx/nginx.conf

Añade la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Verifica la sintaxis del archivo de configuración de Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Reinicia el servicio Nginx.

$ sudo systemctl restart nginx

Paso 9 – Accede a Lemmy

Abre la URL https://example.com y obtendrás la siguiente página de inicio de Lemmy.

Página de Lemmy

Haz clic en el enlace Iniciar sesión de la parte superior para acceder a la página de inicio de sesión.

Página de inicio de sesión de Lemmy

Introduce las credenciales utilizadas en el paso 4 y haz clic en el botón Iniciar sesión para continuar. Volverás a la página principal de Lemmy. A partir de aquí puedes empezar a utilizar Lemmy.

Página de inicio de sesión de Lemmy

Paso 10 – Actualizar Lemmy

Para actualizar Lemmy, abre el archivo docker-compose.yml en la carpeta ~/lemmy.

$ cd ~/lemmy
$ nano docker-compose.yml

Cambia los números de versión de las aplicaciones, Lemmy, Lemmy-UI y Pictrs en el archivo. Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida una vez hayas terminado.

Apaga los contenedores Lemmy.

$ docker compose down --remove-orphan

Vuelve a poner en marcha los contenedores con la nueva configuración.

$ docker compose up -d

Paso 11 – Copia de seguridad y restauración de Lemmy

Para hacer una copia de seguridad de Lemmy, tenemos que hacer un volcado tanto de la base de datos como de la carpeta de volúmenes. Ejecuta los siguientes comandos para hacer una copia de seguridad de la base de datos.

$ cd ~/lemmy
$ docker compose exec postgres pg_dumpall -c -U lemmy | gzip > lemmy_dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql.gz

En el comando anterior postgres es el nombre del servicio para PostgreSQL en el archivo de composición.

A continuación, haz una copia de seguridad de la carpeta de volúmenes utilizando el siguiente comando.

$ sudo rsync -avP volumes ~/backup/lemmy

Puedes utilizar el siguiente script de copia de seguridad y ejecutarlo desde tu sistema local para realizar la copia de seguridad de forma remota.

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

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

Restaurar la base de datos Lemmy

Para restaurar la base de datos en una nueva instalación de Lemmy, ejecuta el siguiente conjunto de comandos.

# Start only the PostgreSQL container first
$ docker compose up -d postgres

# Restore from the .sql.gz backup
$ gunzip < db_dump.sql  |  docker-compose exec -T postgres psql -U lemmy

# Note: You may need to change the permissions on the postgres directory, depending on your system.
$ chown -R $USER volumes
$ docker compose restart postgres

# Continue with the startup
$ docker compose up -d

Si por error has iniciado Lemmy primero, tienes que borrar la base de datos existente utilizando los siguientes comandos.

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

# 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'"

Ahora puedes seguir con los comandos de restauración anteriores.

Conclusión

Con esto concluye nuestro tutorial sobre la instalación de Lemmy, agregador de contenidos tipo Reddit, en un servidor Ubuntu 22.04. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...