Biblioteca personal con Grimmory
¿Tienes cientos de ebooks y audiolibros dispersos? Aprende a instalar Grimmory en tu NAS o servidor usando Docker. Una guía completa para gestionar tu colección, leer desde el navegador y mantener tus estadísticas de lectura bajo tu propio control.
Si tienes muchos libros en formato digital y te ha surgido la idea de tener tu propia biblioteca, tal vez este artículo sea para ti.
¿Qué es Grimmory?
Básicamente, es una aplicación web que puedes autohospedar en tu propio servidor o equipo, que te permite gestionar y manejar tu colección de libros personales.
Algunas de las características que considero interesantes a tener en cuenta son:
- Soporta los formatos más comunes tanto de libros como de audiolibros
- Lector integrado para leer nuestros libros
- Reproductor para escuchar nuestros audiolibros
- Estadísticas sobre nuestra biblioteca y sobre nuestras lecturas
- Es multiusuario, con biblioteca y preferencias independientes
Puedes consultar más en su repositorio de GitHub.
Instalación
Básicamente, el requisito que necesitamos para instalarlo es tener docker y docker compouse instalado, y una conexión a internet. En mi caso en particular, realizaré el procedimiento en un NAS con sistema operativo UGOS.
Docker
Ingresamos y verificamos que tengamos instalado Docker. Esto es muy fácil, básicamente, si aparece el icono de Docker en el escritorio, lo tenemos instalado.
En caso de que no aparezca, nos dirigiremos al Centro de Apps y buscamos Docker
Si nos aparece instalar, lo instalaremos. Si nos aparece abrir, ya está instalado y veremos que en la carpeta compartida aparece una llamada docker
teniendo Docker instalado, vamos a crear los archivos necesarios para realizar el despliegue.
Archivo de entorno
En el repositorio tenemos una guía de inicio con los pasos para realizar el despliegue.
Primero debemos crear un archivo .env y nos proporcionan el siguiente contenido para que lo modifiquemos a nuestras necesidades:
# Application
APP_USER_ID=1000
APP_GROUP_ID=1000
TZ=Etc/UTC
# Database
DATABASE_URL=jdbc:mariadb://mariadb:3306/grimmory
DB_USER=grimmory
DB_PASSWORD=ChangeMe_Grimmory_2025!
# Storage: LOCAL (default) or NETWORK (disables file operations; see Network Storage section)
DISK_TYPE=LOCAL
# MariaDB
DB_USER_ID=1000
DB_GROUP_ID=1000
MYSQL_ROOT_PASSWORD=ChangeMe_MariaDBRoot_2025!
MYSQL_DATABASE=grimmory
ID
Lo primero a tener en cuenta es USER_ID y el GROUP_ID. Para recordar un poco, en muchos entornos Docker se usa UID = 1000 y GID = 1000 porque normalmente ese es el primer usuario “real” creado en un sistema Linux (no root).
En la mayoría de las distribuciones Linux tenemos que:
UID 0→ usuario rootUID 1–999→ usuarios del sistema (servicios, demonios, etc.)UID 1000→ primer usuario normal (el que creas al instalar el sistema)
Por ejemplo, en Ubuntu, Debian, Fedora, etc., tu usuario suele ser UID 1000. Lo anterior es importante porque Docker no “traduce” usuarios, sino que los contenedores usan los mismos UID y GID numéricos que el host.
Si utilizas un UID diferente al de tu host, tu contenedor puede tener problemas, como el editar o borrar archivos o tener problemas de servicios.
Por lo anterior, tenemos que averiguar cuál es nuestro ID de usuario y de grupo y es tan sencillo como ejecutar en una terminal el comando:
id
Obviamente, lo tendremos que hacer en el dispositivo donde realizaremos el despliegue, en este caso en nuestro NAS. Para eso debemos activar una sesión remota en la terminal.
Debemos ingresar al Panel de Control y dirigirnos a Terminal
Veremos que tenemos dos opciones para conectarnos:
- Telnet: es un protocolo menos seguro y no se recomienda activarlo, ya que es muy fácil capturar datos, usuarios y contraseñas
- SSH: cifra la comunicación que lo hace más seguro de usar.
Esta última será la que habilitemos; al hacerlo, nos dará una advertencia.
Una vez lo habilitemos, podremos ajustar el cierre automático y recomiendo revisar la Configuración avanzada.
Y habilitar la opción de Solo permitir el acceso a la red local
Guardamos y, por último, aplicamos los cambios
Ahora desde nuestro equipo nos conectamos por SSH, para esto lo podemos hacer abriendo una terminal y usando el comando:
ssh Usuario@dirección_del_servidor
Nos pedirá la contraseña:
Nota:
Si lo prefieres, puedes usar alguna aplicación para conectarte remotamente. Personalmente te recomiendo que pruebes Muon SSH o RustConn
Al ingresar la contraseña, iniciaremos sesión, y utilizaremos el comando:
id
Con estos datos modificaremos:
APP_USER_ID=1000
APP_GROUP_ID=100
...
DB_USER_ID=1000
DB_GROUP_ID=100
Zona horaria
El siguiente parámetro a modificar es la zona horaria. Esta no tiene mucho misterio, es poner la zona horaria en la que nos encontramos.
Puedes consultar la zona horaria de tu sistema con el comando:
timedatectl
Y podemos ver el listado de las zonas horarias con el comando:
timedatectl list-timezones
En mi caso usaré la de Colombia
TZ=America/Bogota
Contraseñas
Obviamente, lo más importante que debemos cambiar son las contraseñas por unas seguras; el resto de datos podremos cambiarlos si es lo que queremos.
Así quedaría el archivo .env
.envTe dejo el archivo .env que usé para que lo descargues y lo modifiques.
Archivo compose
Ahora debemos crear un archivo docker-compose.yml
El contenido que nos proporciona el repositorio es el siguiente:
services:
grimmory:
image: grimmory/grimmory:latest
# Convenience tag:
# image: grimmory/grimmory:<release-version>
# Alternative: ghcr.io/grimmory-tools/grimmory:<release-version>
# To build from source instead: comment out 'image' and uncomment below
# build: .
container_name: grimmory
environment:
- USER_ID=${APP_USER_ID}
- GROUP_ID=${APP_GROUP_ID}
- TZ=${TZ}
- DATABASE_URL=${DATABASE_URL}
- DATABASE_USERNAME=${DB_USER}
- DATABASE_PASSWORD=${DB_PASSWORD}
depends_on:
mariadb:
condition: service_healthy
ports:
- "6060:6060"
volumes:
- ./data:/app/data
- ./books:/books
- ./bookdrop:/bookdrop
healthcheck:
test: wget -q -O - http://localhost:6060/api/v1/healthcheck
interval: 60s
retries: 5
start_period: 60s
timeout: 10s
restart: unless-stopped
mariadb:
image: lscr.io/linuxserver/mariadb:11.4.5
container_name: mariadb
environment:
- PUID=${DB_USER_ID}
- PGID=${DB_GROUP_ID}
- TZ=${TZ}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASSWORD}
volumes:
- ./mariadb/config:/config
restart: unless-stopped
healthcheck:
test: ["CMD", "mariadb-admin", "ping", "-h", "localhost"]
interval: 5s
timeout: 5s
retries: 10
Volumes
Este archivo es más sencillo de modificar; solo tendremos que ajustar los volúmenes para que coincidan con los nuestros, pero primero debemos crear los directorios o carpetas en nuestro servidor. Para esto, en la carpeta docker crearemos una carpeta grimmory.
Dentro de esta carpeta debemos crear la siguiente estructura de carpetas
Una vez las tengamos creadas, modificaremos el archivo en el contenedor de grimmory y remplazamos por:
volumes:
- /volume1/docker/grimmory/data:/app/data
- /volume1/docker/grimmory/books:/books
- /volume1/docker/grimmory/bookdrop:/bookdrop
Y en el contenedor de mariadb debemos modificarlo por lo siguiente:
volumes:
- /volume1/docker/grimmory/mariadb/config:/config
Así quedaría el archivo:
docker-compose.ymlTe dejo el archivo que utilicé para que lo descargues y lo modifiques.
Despliegue
Subiremos estos dos archivos a la carpeta grimmory que creamos
.env no aparezca y esto es lo normal; si queremos verlo, deberemos dar clic en el engranaje para abrir los ajustes, dirigirnos a la parte de ocultar los archivos y quitar Empieza por (.) guardamos; esto permitirá ver el archivo.Ahora en nuestro servidor debemos abrir Docker y dirigirnos a Proyecto y presionamos sobre Crear.
Pondremos un nombre a nuestro proyecto y debemos seleccionar una ruta de almacenamiento
Seleccionaremos la carpeta grimmory que creamos y nos aparecerá un mensaje: "Ya existe una configuración Compose para esta ruta, vuelve a seleccionar la ruta o importe la configuración"; daremos clic sobre este.
Esto abrirá el archivo que creamos en el editor; presionaremos en Desplegar.
Iniciará el despliegue
Al terminar, veremos que nuestro proyecto biblioteca se encuentra en ejecución.
Si abrimos el proyecto, veremos los dos contenedores que lo componen.
Debemos esperar un rato mientras los servicios suben antes de ingresar.
Abriendo Grimmory por primera vez
Para ingresar a Grimmory debemos hacerlo por la dirección http:\\direccion_ip_o_nombre_del_dominio:6060
Si todo sale bien, veremos la pantalla de bienvenida de Grimmory.
Aquí deberemos proporcionar los datos de todos los campos y presionar sobre crear cuenta de administrador.
Veremos el inicio de sesion
Ingresamos con el usuario que acabamos de crear y veremos la pantalla de inicio
Creando una biblioteca
Grimmory permite tener diferentes bibliotecas y esto es una característica interesante; para lograrlo debemos crear dentro de la carpeta books las carpetas para organizar nuestros libros.
Deduzco que sería una buena opción el crear carpetas por género o tema, como Ficcion, Manuales, infantil, etc.
Digo que deduzco porque aún no está disponible la documentación de Grimmory, así que asumiré que es así; entonces crearé dos carpetas para ilustrar el punto.
Dentro de la carpeta books que creamos, agregaremos la carpeta ciencia e infantil
Ahora en la app de Grimmory presionamos sobre crear nueva biblioteca, le pondremos un nombre, un icono y agregaremos las carpetas que componen esa biblioteca.
Esto es muy interesante porque cada biblioteca que creemos tendrá acceso a las carpetas que elijamos, así que podríamos crear un usuario que tenga acceso a una biblioteca, la cual tendrá determinados libros, y otro a otra biblioteca totalmente separada.
Tenemos mas opciones como el modo de organización, el cual personalmente prefiero dejar en un libro por carpeta, ya que asi es como tengo mis libros organizados, o los formatos que tendra esa biblioteca, entre otras que podemos modificar
Al presionar sobre crear tendremos nuestra primera biblioteca creada
Ahora solo nos falta agregar neustros libros
Agregando libros
Tenemos dos formas de agregar los libros. Una es subiendo los libros a través de la aplicación y la otra es poniendo nuestros libros en las carpetas que creamos.
Subiendo los libros a través de Grimmory
En la parte superior damos clic al icono de Subir libro.
Se nos abrirá el gestor para subir libros, donde seleccionaremos a qué biblioteca y a qué carpeta de esa biblioteca se debe subir el libro.
Poniendo los libros directamente en la carpeta del servidor
Prefiero esta forma, porque ya tengo mis libros organizados y siento que es más rápido.
Entonces ponemos nuestros libros directamente en la carpeta; en mi caso, con arrastrar y soltar los subirá.
Los libros que usé son de dominio público, así que te dejaré los libros para que hagas tus pruebas.
Si al crear la biblioteca habilitamos la opción de vigilar carpetas, veremos cómo Grimmory los agrega automáticamente.
Ahora podemos disfrutar de nuestra biblioteca.
Un vistazo a algunas características
Iconos de formato
Tenemos un pequeño icono en la parte superior de nuestros libros que nos muestra el formato.
Lector integrado
Si nos paramos sobre un libro, veremos que aparecen dos iconos; uno es el del icono que abrirá el lector integrado.
Dependiendo del tipo de archivo, se abrirá el lector apropiado.
Así se vería el lector integrado de archivos .epub
.epubReproductor de audiolibros integrado
Al igual que en los libros, si te paras sobre un audiolibro, verás dos iconos y uno será el de reproducir el audiolibro.
Así se ve el reproductor de audiolibros integrado.
Editor de metadatos
Podemos editar los metadatos de nuestros libros o audiolibros, y es un editor con lo necesario; podemos incluso buscar metadatos en línea.
Estadisticas
Tenemos disponibles estadísticas tanto de nuestro progreso de lectura como de nuestra biblioteca en general.
Este programa tiene muchas características y configuraciones interesantes, como ser un servidor OPDS, sincronizar progresos de lectura con KOreader, entre muchas otras; es interesante y espero ver cómo evoluciona este proyecto.


