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 }}
por8536
en el archivo. - Sustituye la variable
{{ lemmy_docker_image }}
pordessalines/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 }}
pordessalines/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 serviciopictrs
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.
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.
Haz clic en el enlace Iniciar sesión de la parte superior para acceder a la página de inicio de sesión.
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.
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.