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.
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.
Visita la página de configuración y haz clic en Añadir sitio web para empezar.
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.
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.
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.