Cloud & Infrastructure Développement

Bookshelf : ce qu’il faut savoir avant d’auto-héberger sa bibliothèque EPUB et PDF

8 min de lecture

Illustration conceptuelle montrant une bibliothèque numérique auto-hébergée reliée à un serveur local, à un stockage dans le cloud et à une liseuse.

Un serveur d’ebooks minimaliste, pensé pour l’auto-hébergement

Bookshelf se présente comme une bibliothèque auto-hébergée pour les ebooks que l’on possède déjà. Le projet prend en charge les fichiers EPUB et PDF, avec deux modes d’accès principaux : la lecture dans le navigateur et l’accès depuis des clients compatibles OPDS, y compris sur Kobo.

Sur le plan de l’architecture, l’idée est de rester simple. Bookshelf peut fonctionner soit comme un Cloudflare Worker au-dessus de R2, soit comme un serveur Node au-dessus d’un répertoire local. Le projet indique que ces deux modes reposent sur le même code et la même bibliothèque, ce qui réduit l’écart fonctionnel entre un déploiement orienté objet et un déploiement plus classique sur système de fichiers.

Cette approche intéressera surtout les équipes et les particuliers qui veulent publier une collection de livres sans base de données dédiée ni pile applicative lourde. Le dépôt est publié sous licence MIT, et sa page GitHub affichait 327 étoiles au moment des faits fournis.

Deux modes de déploiement, avec des contraintes à connaître

Le premier mode vise le stockage objet avec Cloudflare R2. Le second repose sur un fournisseur de type système de fichiers, qui conserve la bibliothèque dans un répertoire. La documentation positionne ce mode pour une machine sur son propre réseau ou pour un VPS sur lequel l’application tourne directement.

Un point important pour l’exploitation : bookshelf.config.json est lu au moment du build puis intégré au bundle. En pratique, si l’on change de répertoire avec le fournisseur système de fichiers, il faut reconstruire l’application pour que la modification soit prise en compte. La documentation précise aussi que les chemins relatifs sont résolus depuis la racine du projet.

Autre détail utile : la configuration versionnée pointe par défaut vers Cloudflare R2. Autrement dit, npm run sync enverra les données vers R2 tant que cette configuration n’a pas été modifiée.

Bookshelf demande Node 24 ou plus récent ainsi qu’un système de type Unix. Windows n’est pas pris en charge. Pour ceux qui veulent aller vite, l’image Docker est présentée comme le chemin le plus court et inclut les outils nécessaires à la génération des couvertures. Dans cette configuration, l’étagère locale est exposée par défaut sur http://localhost:3000.

Une mise en route rapide, mais pas orientée multi-utilisateur sécurisé

Le projet fournit un mode de démonstration : la commande npm run demo écrit neuf livres du domaine public générés dans le répertoire books/, dont huit EPUB et un PDF. C’est suffisant pour tester immédiatement les deux lecteurs et valider le pipeline de publication.

En revanche, Bookshelf n’est pas conçu comme une plateforme sécurisée pour un large public. Le README est explicite : il n’y a pas d’authentification. Toute personne capable d’atteindre une étagère peut télécharger tous les livres qu’elle contient. La même mise en garde vaut pour le catalogue OPDS, qui rend en plus la bibliothèque énumérable par machine.

Le projet précise également que rien n’est chiffré. Côté stockage, les clés d’objet sont dérivées de titres transformés en slug, ce qui signifie qu’un listing du stockage révèle déjà des informations sur le contenu de la bibliothèque. Pour un usage privé, cela change fortement la manière de déployer l’outil : exposition publique directe déconseillée, segmentation réseau, reverse proxy restreint ou accès limité à un cercle de confiance deviennent des prérequis pratiques, même si la documentation fournie ici ne détaille pas de mécanisme intégré pour cela.

OPDS : le vrai point fort pour les liseuses et applications de lecture

Le catalogue OPDS est disponible sur le chemin /opds. La documentation indique qu’il n’y a rien à activer ni à configurer : le flux est simplement là une fois l’étagère publiée. C’est probablement l’élément le plus intéressant pour les utilisateurs de liseuses et d’applications de lecture tierces.

Les clients explicitement mentionnés comme compatibles incluent KOReader sur Kobo, ainsi que Thorium, Calibre, Panels, Moon+ Reader et Aldiko. Concrètement, ces clients peuvent rechercher et télécharger les livres directement depuis l’étagère.

Bookshelf sert les deux versions du standard depuis la même URL : OPDS 1.2 et OPDS 2.0. La version 1.2, en Atom XML, est celle utilisée par défaut. La version 2.0 est fournie en JSON, notamment pour Thorium et d’autres clients plus récents.

Le flux /opds/books liste tous les livres, avec une pagination de 50 éléments par page. Les pages suivantes commencent à ?page=2. La recherche s’effectue en ajoutant le paramètre ?q= à un flux de livres.

Chaque entrée de livre contient les métadonnées extraites du fichier : auteurs, éditeur, date, langue, sujets, nombre de pages et identifiant. Chaque format disponible expose aussi son propre lien de téléchargement avec la taille du fichier, ce qui permet au client d’afficher le poids avant le téléchargement. Les couvertures du catalogue sont en WebP.

Les limites fonctionnelles à anticiper

Bookshelf fait des choix simples qui ont des conséquences concrètes. D’abord, chaque livre du flux OPDS est daté selon la dernière publication du catalogue, et non selon la date d’ajout du livre lui-même. La raison donnée est qu’aucune information ne conserve la date d’ajout individuelle. Résultat : il n’existe pas de vue Recently added.

Ensuite, un livre sans fichier téléchargeable est omis du flux OPDS au lieu d’être listé. Cela évite des entrées inexploitables, mais suppose que le catalogue reflète uniquement des contenus immédiatement récupérables.

Les flux OPDS sont mis en cache pendant une minute. Si un changement semble ne pas apparaître immédiatement, ce délai est la première explication à vérifier.

Le projet mentionne aussi un comportement de résolution de conflit très simple pour les profils : si deux appareils lisent le même profil en même temps, la règle est last-write-wins. Pour un usage personnel, cela peut suffire. Pour un usage partagé entre plusieurs appareils ou plusieurs personnes, il faut accepter le risque d’écrasement de position de lecture.

Le mode lecture seule et les variables utiles en exploitation

Bookshelf prévoit un mode lecture seule via la variable BOOKSHELF_READ_ONLY. Lorsqu’elle vaut 1, le stockage continue de servir le contenu mais n’accepte plus les écritures. Dans ce mode, les profils ne peuvent plus être ajoutés, renommés ou supprimés, et les positions de lecture restent dans le navigateur.

Ce réglage peut être utile pour publier une bibliothèque figée, réduire les risques de modification involontaire ou séparer plus clairement une phase de génération d’une phase de diffusion.

Une autre variable, BOOKSHELF_PROVIDER, permet de remplacer le fournisseur pour lequel le build a été réalisé. C’est un point notable, car la configuration principale est sinon intégrée au bundle au moment de la construction.

Enfin, le chemin /opds est interdit dans robots.txt, ce qui vise à tenir les robots d’indexation à l’écart. Cela améliore la discrétion vis-à-vis des crawlers, mais ne doit pas être confondu avec un mécanisme de sécurité : l’absence d’authentification reste entière.

À qui Bookshelf convient vraiment

Bookshelf paraît bien adapté à un besoin précis : exposer simplement une collection personnelle d’EPUB et de PDF, avec une bonne compatibilité OPDS et une architecture légère. Pour un développeur ou un administrateur qui veut contrôler son hébergement, le projet a des atouts clairs : même base de code entre les modes de déploiement, documentation structurée, et intégration directe avec des clients de lecture connus.

En revanche, il faut l’aborder comme un outil de publication simple, pas comme une bibliothèque numérique sécurisée. L’absence d’authentification, l’absence de chiffrement, l’énumérabilité du catalogue et la visibilité des noms d’objets imposent une discipline d’exploitation stricte. Si l’objectif est de partager une bibliothèque privée sur Internet avec contrôle d’accès fin, les faits fournis ici montrent que Bookshelf ne traite pas ce besoin nativement.

Autrement dit, le projet semble convaincant pour un usage personnel ou restreint, surtout sur réseau local, VPS contrôlé ou stockage objet bien cloisonné. Son intérêt principal n’est pas la sophistication, mais la simplicité de publication et la compatibilité de lecture.

À retenir

  • Bookshelf est une bibliothèque auto-hébergée pour EPUB et PDF, lisible dans le navigateur et via OPDS, y compris sur Kobo.
  • Le projet peut tourner soit comme Cloudflare Worker sur R2, soit comme serveur Node sur un répertoire, avec la même base de code.
  • Node 24 ou plus récent est requis, sur système Unix-like uniquement ; Windows n’est pas pris en charge.
  • Le catalogue OPDS est disponible sur /opds sans configuration supplémentaire, avec prise en charge d’OPDS 1.2 et 2.0.
  • Il n’y a ni authentification ni chiffrement : toute personne ayant accès à l’instance peut parcourir et télécharger toute la bibliothèque.
  • Le mode lecture seule via BOOKSHELF_READ_ONLY=1 permet de servir le contenu sans accepter d’écritures.

Sources