Trilium Notes es una aplicación de notas jerárquica pensada para construir una base de conocimiento personal: organiza las notas en un árbol sin límite de profundidad, permite clonar una nota en varias ramas, incluye editor de texto enriquecido, notas de código, mapas mentales y scripts en JavaScript. El proyecto lo mantiene hoy la comunidad TriliumNext. En este tutorial desplegarás el servidor de Trilium con Docker Compose en Ubuntu 24.04, lo publicarás en tu dominio con Nginx y HTTPS, sincronizarás la aplicación de escritorio y revisarás cómo funcionan las copias de seguridad.
Requisitos previos
- Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con al menos 1 GB de RAM.
- Un usuario no root con privilegios
sudo. - Docker Engine y el plugin Docker Compose instalados desde el repositorio oficial de Docker.
- Un subdominio (en esta guía,
notas.tu_dominio) con un registro DNS A que apunte a la IP pública del servidor. - UFW activo con SSH permitido.
Paso 1: Crear el directorio del proyecto
Crea un directorio para el archivo de Compose y otro para los datos. En data vivirán la base de datos SQLite (document.db), el archivo config.ini, los registros y las copias automáticas:
mkdir -p ~/trilium/data
cd ~/trilium
Paso 2: Escribir el archivo de Docker Compose
Crea el archivo compose.yaml:
nano ~/trilium/compose.yaml
services:
trilium:
image: triliumnext/trilium:latest
container_name: trilium
restart: unless-stopped
ports:
- "127.0.0.1:8080:8080"
volumes:
- ./data:/home/node/trilium-data
environment:
- TZ=Europe/Madrid
Puntos a tener en cuenta:
triliumnext/triliumes la imagen actual del proyecto. Las guías antiguas usanzadam/trilium(el proyecto original, ya sin mantenimiento) otriliumnext/notes, el nombre anterior de la imagen de TriliumNext./home/node/trilium-dataes el directorio de datos dentro del contenedor.- El puerto se publica solo en
127.0.0.1. Docker se salta las reglas de UFW, así que publicar8080:8080dejaría Trilium accesible por HTTP sin cifrar desde Internet. El acceso externo irá por Nginx.
Notasi tienes una base de datos de Trilium antigua, no la abras con una versión más reciente sin hacer antes una copia. Trilium migra el esquema al arrancar y no permite volver atrás.
Paso 3: Arrancar el contenedor
Inicia Trilium:
docker compose up -d
Comprueba el estado del contenedor:
docker compose ps --format "table {{.Name}}\t{{.Status}}\t{{.Ports}}"
NAME STATUS PORTS
trilium Up 30 seconds 127.0.0.1:8080->8080/tcp
Verifica que responde en local:
curl -sI http://127.0.0.1:8080 | head -n 1
Deberías obtener una línea HTTP/1.1 200 OK o una redirección 302 hacia la página de configuración inicial. Si no hay respuesta, revisa los registros con docker compose logs trilium.
Paso 4: Publicar Trilium con Nginx y HTTPS
Instala Nginx y Certbot:
sudo apt update
sudo apt install nginx certbot python3-certbot-nginx
Crea el bloque de servidor:
sudo nano /etc/nginx/sites-available/trilium
server {
listen 80;
listen [::]:80;
server_name notas.tu_dominio;
client_max_body_size 100M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300s;
}
}
Trilium usa WebSocket para enviar los cambios al navegador y a los clientes sincronizados, por eso son necesarias las cabeceras Upgrade y Connection. client_max_body_size permite subir adjuntos e importaciones grandes; el valor por defecto de Nginx (1 MB) haría fallar la importación de un ZIP de notas.
Activa el sitio y recarga Nginx:
sudo ln -s /etc/nginx/sites-available/trilium /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Abre los puertos web y solicita el certificado. Certbot añade la configuración TLS y la redirección a HTTPS:
sudo ufw allow 'Nginx Full'
sudo certbot --nginx -d notas.tu_dominio
Congratulations! You have successfully enabled HTTPS on https://notas.tu_dominio
Paso 5: Completar la configuración inicial
Abre https://notas.tu_dominio. En el primer acceso Trilium pregunta cómo quieres empezar:
- Elige la opción de nuevo usuario para crear un documento vacío. La opción de sincronizar desde otra instancia sirve para cuando ya tienes una base de datos en un escritorio o en otro servidor y quieres copiarla aquí.
- Define la contraseña. Protege el acceso web, la sincronización y el cifrado de las notas protegidas, así que usa una contraseña robusta.
- Inicia sesión.
Trilium es de un solo usuario: una instancia equivale a una base de conocimiento. Si varias personas necesitan notas propias, despliega una instancia por persona con su propio directorio de datos y puerto.
Los ajustes del servidor se guardan en ~/trilium/data/config.ini. Consúltalo para ver el puerto y otras opciones de red:
cat ~/trilium/data/config.ini
Si cambias este archivo, reinicia el contenedor con docker compose restart para aplicar los cambios.
Paso 6: Sincronizar la aplicación de escritorio
La aplicación de escritorio de Trilium (Linux, Windows y macOS) guarda una copia completa de las notas en local y se sincroniza con el servidor, así que puedes trabajar sin conexión. Descárgala desde la página de versiones del repositorio TriliumNext/Trilium en GitHub y usa la misma versión que el servidor: servidor y cliente deben coincidir en la versión de sincronización.
Hay dos formas de configurar la sincronización:
- Escritorio nuevo, servidor con datos: en el primer arranque de la app, elige la opción de sincronizar con un servidor existente, introduce
https://notas.tu_dominioy la contraseña. La app descargará todas las notas. - Escritorio con notas, servidor recién instalado: en el servidor, elige en el paso 5 la opción de sincronizar desde otra instancia. Después, en la app de escritorio, abre Opciones > Sincronizar, escribe la dirección del servidor, guarda y pulsa el botón de probar la sincronización. Trilium enviará las notas al servidor.
El icono de sincronización de la barra superior indica el estado. Para comprobarlo desde el servidor, busca actividad de sincronización en los registros:
docker compose logs trilium | grep -i sync
Paso 7: Instalar el web clipper y usar ETAPI
El Trilium Web Clipper es una extensión para Firefox y Chrome que guarda en Trilium la página actual, una selección de texto o una captura de pantalla. En sus opciones, indica la URL del servidor (https://notas.tu_dominio) y la contraseña; la extensión obtiene un token y deja de pedirla.
Para automatizaciones externas, Trilium ofrece ETAPI, una API REST. Crea un token en Opciones > ETAPI y compruébalo con el endpoint de información de la aplicación:
curl -s https://notas.tu_dominio/etapi/app-info -H "Authorization: your_etapi_token"
{"appVersion":"0.97.2","dbVersion":232,"syncVersion":36,...}
La respuesta muestra la versión del servidor, útil para saber qué versión de la app de escritorio descargar.
Trilium también ejecuta scripts internos: una nota de tipo código con lenguaje «JS frontend» o «JS backend» se puede lanzar desde la interfaz o asociar a eventos mediante atributos. Por ejemplo, este script de frontend muestra un aviso al ejecutarlo:
api.showMessage("Hola desde un script de Trilium");
Paso 8: Copias de seguridad y actualizaciones
Trilium crea copias automáticas de la base de datos en ~/trilium/data/backup/: una diaria, una semanal y una mensual, que se sobrescriben en cada ciclo. Compruébalo tras el primer día de funcionamiento:
ls -lh ~/trilium/data/backup/
-rw-r--r-- 1 1000 1000 4.2M Sep 25 03:10 backup-daily.db
-rw-r--r-- 1 1000 1000 4.2M Sep 25 03:10 backup-weekly.db
-rw-r--r-- 1 1000 1000 4.2M Sep 25 03:10 backup-monthly.db
Desde Opciones > Copia de seguridad puedes activar o desactivar cada una y crear una copia manual en cualquier momento.
Esas copias están en el mismo disco que el original, así que no protegen ante la pérdida del servidor. Para una copia completa, detén el contenedor, empaqueta el directorio y guarda el archivo fuera del servidor:
cd ~/trilium
docker compose stop
sudo tar -czf ~/trilium-backup-$(date +%F).tar.gz -C ~ trilium
docker compose start
Para actualizar, haz antes esa copia y después descarga la imagen nueva y recrea el contenedor. Actualiza también la app de escritorio a la misma versión:
cd ~/trilium
docker compose pull
docker compose up -d
Solución de problemas
La app de escritorio no sincroniza y muestra un error de versión. Servidor y cliente usan versiones de sincronización distintas. Consulta syncVersion con ETAPI (paso 7) o en Ayuda > Acerca de, e instala la misma versión en ambos lados.
La importación de un ZIP falla con 413 Request Entity Too Large. Falta o es pequeño client_max_body_size en el bloque de Nginx. Auméntalo y recarga Nginx.
Errores de permisos en los registros al arrancar. El proceso del contenedor no puede escribir en ./data. Comprueba el propietario del directorio con ls -ln ~/trilium y ajústalo al UID con el que corre el contenedor, que aparece en los registros de arranque.
Las notas no se actualizan en tiempo real en el navegador. La conexión WebSocket no llega al servidor. Revisa que el bloque location incluye proxy_http_version 1.1 y las cabeceras Upgrade y Connection.
Conclusión
Tienes un servidor de Trilium Notes accesible por HTTPS, sincronizado con la aplicación de escritorio y con copias automáticas de la base de datos. Como siguientes pasos puedes programar la copia externa del directorio data con un temporizador de systemd, importar tus notas en Markdown con clic derecho sobre una nota y la opción de importar, o explorar las plantillas y los atributos para automatizar tu base de conocimiento.
