Cómo instalar Umami Analytics en Debian 12

Umami es una solución analítica web muy ligera, de código abierto y autoalojada. Es una buena alternativa centrada en la privacidad a Google Analytics y otras soluciones analíticas de pago. Una de las principales ventajas de utilizar Umami es que no coloca ninguna cookie en el navegador del usuario, lo que significa que no necesitas poner el molesto banner de las cookies en tu sitio web.

En este tutorial, aprenderemos a instalar Umami analytics en un servidor Debian 12 y a utilizarlo para rastrear sitios web.

Requisitos previos

  • Un servidor con Debian 12.
  • Un usuario no root con privilegios sudo.
  • Un nombre de dominio completo (FQDN) como umami.example.com que apunte al servidor.
  • El cortafuegos sin complicaciones (UFW) está activado y en funcionamiento.
  • Actualiza todo.
    $ sudo apt update && sudo apt upgrade
    
  • Instala los paquetes esenciales que necesita tu sistema. Puede que algunos de estos paquetes ya estén instalados en tu sistema.
    $ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring unzip -y
    

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

Deberías obtener 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 Git

Se necesita Git para clonar el repositorio oficial de Umami. Instala Git.

$ sudo apt install git

Verifica la instalación.

$ git --version
git version 2.39.2

Establece las variables de configuración iniciales.

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

Paso 3 – Instalar Node

Umami es una aplicación JavaScript que se ejecuta en Nodejs. Para instalar Node, utilizaremos el instalador de Nodesource. Como Node v16.0 es la versión estable actual, la instalaremos.

Descarga e importa la clave GPG de Nodesource

$ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/nodesource.gpg

Crea el repositorio Deb de Node.

$ NODE_MAJOR=18
$ echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list

Actualiza la lista de repositorios de paquetes del sistema Debian.

$ sudo apt update

Instala Node.

$ sudo apt install nodejs

Verifica la instalación de Node.

$ node --version
v18.18.0

Paso 4 – Instalar el servidor MariaDB

Debian 12 no incluye MySQL por defecto y aún no han publicado un paquete oficial para ello. Por lo tanto, utilizaremos MariaDB para ello.

Debian 12 incluye MariaDB 10.11.4, que instalaremos. No obstante, puedes instalar la última versión desde el repositorio.

$ sudo apt install mariadb-server

Comprueba la versión de MySQL.

$ mysql --version
mysql  Ver 15.1 Distrib 10.11.4-MariaDB, for debian-linux-gnu (x86_64) using  EditLine wrapper

Ejecuta el script de instalación segura de MariaDB.

$ sudo mariadb-secure-installation

Se te pedirá la contraseña de root. Pulsa Intro porque no le hemos puesto ninguna contraseña.

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):

A continuación, se te preguntará si quieres cambiar al método de autenticación por socket Unix. El complemento unix_socket te permite utilizar las credenciales de tu sistema operativo para conectarte al servidor MariaDB. Como ya tienes una cuenta raíz protegida, introduce n para continuar.

OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] n

A continuación, se te preguntará si quieres cambiar la contraseña de root. En Debian 12, la contraseña de root está estrechamente ligada al mantenimiento automatizado del sistema, por lo que conviene no modificarla. Escribe n para continuar.

 ... skipping.

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] n

A continuación, se te harán algunas preguntas para mejorar la seguridad de MariaDB. Escribe Y para eliminar los usuarios anónimos, desautorizar los inicios de sesión remotos de root, eliminar la base de datos de prueba y recargar las tablas de privilegios.

 ... skipping.

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Puedes entrar en el intérprete de comandos de MariaDB escribiendo sudo mysql o sudo mariadb en la línea de comandos.

Paso 5 – Descarga Umami

El primer paso es instalar el gestor de paquetes Yarn. Podemos instalarlo utilizando NPM.

$ sudo npm install -g yarn

Como Umami es una aplicación Node y no tiene un directorio webroot público, no necesitamos alojarlo mediante el directorio /var/www.

Clona el repositorio GitHub de Umami.

$ git clone https://github.com/mikecao/umami.git

Cambia al directorio recién creado.

$ cd umami

Instala los módulos de Umami.

$ yarn install

Paso 6 – Configurar Umami

Crea las credenciales MySQL y rellena la base de datos

Entra en el shell de MySQL. Introduce tu contraseña de root para continuar.

$ sudo mysql

Crea el usuario umami. Asegúrate de que la contraseña cumple los requisitos establecidos anteriormente.

mysql> CREATE USER 'umamiuser'@'localhost' IDENTIFIED BY 'YourPassword';

Crea la base de datos umami.

mysql> CREATE DATABASE umami;

Concede al usuario privilegios en la base de datos umami.

mysql> GRANT ALL PRIVILEGES ON umami.* TO 'umamiuser'@'localhost';

Como no vamos a modificar el usuario root, debes crear otro usuario SQL para realizar tareas administrativas que empleen autenticación por contraseña. Elige una contraseña segura para éste.

MariaDB> GRANT ALL ON *.* TO 'navjot'@'localhost' IDENTIFIED BY 'Yourpassword32!' WITH GRANT OPTION;

Vacía los privilegios.

mysql> FLUSH PRIVILEGES;

Sal del Shell.

mysql> exit

Configura las variables de entorno de Umami

Necesitamos un secreto de App fuerte a efectos de registro. Para ello, utilizaremos el comando OpenSSL.

$ openssl rand 30 | openssl base64 -A
bu4orqfdlG+Dh3Otau4oWSBbI9kGWSkGfYc/WiH/

Crea un archivo .env para almacenar las variables de entorno de la instalación de Umami.

$ touch .env

Abre el archivo para editarlo.

$ nano .env

Pega en él el siguiente código. Tendrás que codificar los caracteres especiales de tu contraseña para la URL de la base de datos. Utiliza para ello el codificador meyerweb. En nuestro caso, el # se traduce a %23. La URL de la base de datos termina con el nombre de la base de datos a la que necesitamos conectarnos. Utiliza el app secret generado anteriormente para la variable APP_SECRET. La opción DISABLE_TELEMETRY=1 desactiva el envío de datos anónimos por parte de la app a los servidores de Umami. La variable TRACKER_SCRIPT_NAME es útil para evitar que tu script sea bloqueado por los bloqueadores de anuncios. Dale un nombre que sea único para tu sitio web.

DATABASE_URL=mysql://umamiuser:YourPassword@localhost:3306/umami
APP_SECRET=bu4orqfdlG+Dh3Otau4oWSBbI9kGWSkGfYc/WiH/
DISABLE_TELEMETRY=1
TRACKER_SCRIPT_NAME=custom

Paso 7 – Ejecutar Umami

Ahora que todo está configurado, crea la aplicación Umami.

$ yarn build

El siguiente paso es iniciar la aplicación. Podemos iniciar la aplicación utilizando el comando yarn start pero eso significaría que necesitas mantener el terminal abierto para que Umami se ejecute. Por lo tanto, necesitamos una forma de ejecutar Umami en segundo plano. Para ello, instalaremos PM2 (Gestor Avanzado de Procesos de Producción para Node).

Instala PM2.

$ sudo yarn global add pm2

Las opciones global significan que estamos instalando PM2 globalmente, y por tanto, necesitamos privilegios sudo para ejecutar el comando.

Inicia la aplicación Umami.

$ pm2 start yarn --name umami -- start

Obtendrás la siguiente salida.

[PM2] Starting /usr/bin/yarn in fork_mode (1 instance)
[PM2] Done.
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? id ? name     ? namespace   ? version ? mode    ? pid      ? uptime ? ?    ? status    ? cpu      ? mem      ? user     ? watching ?
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
? 0  ? umami    ? default     ? N/A     ? fork    ? 2020     ? 0s     ? 0    ? online    ? 0%       ? 18.8mb   ? navjot   ? disabled ?
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

Guarda la aplicación Umami con PM2 para su uso posterior.

$ pm2 save
[PM2] Saving current process list...
[PM2] Successfully saved in /home/navjot/.pm2/dump.pm2

Umami se reiniciará automáticamente si se bloquea o se mata, pero no si se reinicia el sistema. Tenemos que crear un script systemd para asegurarnos de que se reinicia al reiniciar el sistema. Ejecuta el siguiente comando para generar un script de inicio.

$ pm2 startup

La salida resultante te dará un comando para configurar PM2 para que se ejecute al arrancar. La salida, en tu caso, te dará el nombre de usuario actual. Ejecuta el siguiente comando para generar el script de arranque.

$ sudo env PATH=$PATH:/usr/bin /usr/local/share/.config/yarn/global/node_modules/pm2/bin/pm2 startup systemd -u navjot --hp /home/navjot

Paso 8 – Instalar Nginx

Debian 12 incluye una versión antigua de Nginx. Para instalar la última versión, tienes que 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] \
http://nginx.org/packages/debian `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. En sistemas Debian, el siguiente comando sólo funcionará con sudo.

$ sudo 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; preset: enabled)
     Active: active (running) since Tue 2023-10-10 11:19:45 UTC; 9s ago
       Docs: https://nginx.org/en/docs/
    Process: 3646 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 3647 (nginx)
      Tasks: 3 (limit: 4652)
     Memory: 2.4M
        CPU: 8ms
     CGroup: /system.slice/nginx.service
             ??3647 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??3648 "nginx: worker process"
             ??3649 "nginx: worker process"

Oct 10 11:19:45 umami systemd[1]: Starting nginx.service - nginx - high performance web server...
Oct 10 11:19:45 umami systemd[1]: Started nginx.service - nginx - high performance web server.

Paso 9 – Instalar SSL con Let’s Encrypt

Necesitamos instalar Certbot para generar certificados SSL gratuitos ofrecidos por Let’s Encrypt.

Puedes instalar Certbot utilizando el repositorio de Debian u obtener la última versión utilizando la herramienta Snapd. Nosotros utilizaremos la versión Snapd.

Debian 12 no viene con Snapd instalado. Instala el paquete Snapd.

$ sudo apt install snapd

Asegúrate de que tu versión de Snapd está actualizada.

$ sudo snap install core 
$ sudo snap refresh core

Instala Certbot.

$ sudo snap install --classic certbot

Asegúrate 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

Verifica la instalación.

$ certbot --version
certbot 2.7.0

Genera el certificado SSL.

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

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/umami.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
.....
Tue 2023-10-10 14:24:00 UTC 1h 55min left -                           -            snap.certbot.renew.timer   snap.certbot.renew.service
Wed 2023-10-11 00:00:00 UTC 11h left      -                           -            dpkg-db-backup.timer       dpkg-db-backup.service
Wed 2023-10-11 00:00:00 UTC 11h left      Tue 2023-10-10 00:00:04 UTC 12h ago      exim4-base.timer           exim4-base.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 10 – Configurar Nginx

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

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

Pega en él el siguiente código.

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

    access_log  /var/log/nginx/umami.access.log;
    error_log   /var/log/nginx/umami.error.log;
    
    # SSL
    ssl_certificate      /etc/letsencrypt/live/umami.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/umami.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/umami.example.com/chain.pem;
    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    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;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    resolver 8.8.8.8;

    location / {
      proxy_pass http://localhost:3000;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}
# enforce HTTPS
server {
    listen       80;
    listen       [::]:80;
    server_name  umami.example.com;
    return 301   https://$host$request_uri;
}

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 para habilitar la nueva configuración.

$ sudo systemctl restart nginx

Paso 11 – Configurar un Sitio y Recopilar Estadísticas

Abre la URL https://umami.example.com en tu navegador, y tendrá el siguiente aspecto.

Página de inicio de sesión de Umami

Umami genera una cuenta de administrador por defecto con el nombre de usuario admin y la contraseña umami durante la instalación. Utiliza estas credenciales para iniciar sesión.

Una vez iniciada la sesión, aparecerá la siguiente página.

Panel Umami

Visita la página de configuración y haz clic en Añadir sitio web para empezar.

Página web de Umami Add

Una vez que hayas añadido el sitio, haz clic en el botón Editar y luego pasa a la pestaña Código de seguimiento para obtener el código.

Código de seguimiento Umami

Pega el código entre las etiquetas HTML de tu encabezado o pie de página y, en unos minutos, Umami empezará a obtener datos.

Estadísticas Umami

Paso 12 – Actualizar Umami

Para actualizar Umami, desplázate al directorio de instalación de Umami.

$ cd ~/umami

Detén la aplicación Umami.

$ pm2 stop umami

Instala las dependencias nuevas o actualizadas.

$ yarn install

Reconstruye la aplicación Umami.

$ yarn build

Inicia la aplicación Umami.

$ pm2 start umami

Conclusión

Con esto concluye nuestro tutorial sobre la instalación y configuración de la herramienta Umami Analytics en un servidor Debian 12. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...