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.

Biblioteca personal con Grimmory

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.

Docker
Docker

En caso de que no aparezca, nos dirigiremos al Centro de Apps y buscamos Docker

Centro de Apps
Centro de Apps

Si nos aparece instalar, lo instalaremos. Si nos aparece abrir, ya está instalado y veremos que en la carpeta compartida aparece una llamada docker

Carpeta compartida
Carpeta compartida

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 root
  • UID 1–999 → usuarios del sistema (servicios, demonios, etc.)
  • UID 1000primer 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

Panel de Control
Panel de Control

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.

Habilitar el servicio SSH
Habilitar el servicio SSH

Una vez lo habilitemos, podremos ajustar el cierre automático y recomiendo revisar la Configuración avanzada.

Configuración avanzada servicio SSH
Configuración avanzada servicio SSH

Y habilitar la opción de Solo permitir el acceso a la red local

Acceso local
Acceso 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:

Abrir conexión SSH
Abrir conexión SSH

Nota:
Si lo prefieres, puedes usar alguna aplicación para conectarte remotamente. Personalmente te recomiendo que pruebes Muon SSH o RustConn

Muon SSH

RustConn

Al ingresar la contraseña, iniciaremos sesión, y utilizaremos el comando:

id
Comando id
Comando id
🗒️
NOTA: Como esto es solo un ejercicio de práctica para conocer la aplicación usaré el usuario 1000 y el grupo 100; sin embargo, si quisiéramos realizar un despliegue serio como buena práctica de seguridad deberíamos crear un usuario y grupo específico para el contenedor, puedes leer más en Docker Docks, Broadcom Docs o XDA.

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
timedatectl
timedatectl

Y podemos ver el listado de las zonas horarias con el comando:

timedatectl list-timezones
timedatectl list-timezones
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

Archivo .env
Archivo .env

Te dejo el archivo .env que usé para que lo descargues y lo modifiques.

.env

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.

Carpeta grimmory
Carpeta grimmory

Dentro de esta carpeta debemos crear la siguiente estructura de carpetas

Estructura de carpetas
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.yml
docker-compose.yml

Te dejo el archivo que utilicé para que lo descargues y lo modifiques.

docker-compose.yaml

Despliegue

Subiremos estos dos archivos a la carpeta grimmory que creamos

🗒️
Nota: Es posible que al subir el archivo .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.

Docker > Proyecto
Docker > Proyecto

Pondremos un nombre a nuestro proyecto y debemos seleccionar una ruta de almacenamiento

Proyecto
Proyecto

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.

Importar configuración
Importar configuración

Esto abrirá el archivo que creamos en el editor; presionaremos en Desplegar.

Desplegar proyecto
Desplegar proyecto

Iniciará el despliegue

Despliegue
Despliegue

Al terminar, veremos que nuestro proyecto biblioteca se encuentra en ejecución.

Proyecto en ejecución
Proyecto en ejecución

Si abrimos el proyecto, veremos los dos contenedores que lo componen.

Contenedores en ejecución
Contenedores en ejecución

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.

Bienvenida de Grimmory.
Bienvenida de Grimmory.

Aquí deberemos proporcionar los datos de todos los campos y presionar sobre crear cuenta de administrador.

Veremos el inicio de sesion

Inicio de sesión de Grimmory
Inicio de sesión de Grimmory

Ingresamos con el usuario que acabamos de crear y veremos la pantalla de inicio

Grimmory
Grimmory

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

Carpetas de categoría
Carpetas de categoría

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.

Nueva Biblioteca
Nueva 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

Opciones
Opciones

Al presionar sobre crear tendremos nuestra primera biblioteca creada

Biblioteca
Biblioteca

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.

Subir libro
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.

Subir libro
Subir 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á.

Copiando libros a carpeta
Copiando libros a carpeta

Los libros que usé son de dominio público, así que te dejaré los libros para que hagas tus pruebas.

Libros.7z

Si al crear la biblioteca habilitamos la opción de vigilar carpetas, veremos cómo Grimmory los agrega automáticamente.

Libros
Libros

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.

iconos de formato
iconos de 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

Lector de .epub
Lector de .epub

Reproductor 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.

Reproductor de audiolibros
Reproductor de audiolibros

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.

Editor de metadata
Editor de metadata

Estadisticas

Tenemos disponibles estadísticas tanto de nuestro progreso de lectura como de nuestra biblioteca en general.

Estadistiacas de biblioteca
Estadistiacas de biblioteca

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.

Vídeo