--- title: pyShelf created: 2026-06-07 updated: 2026-06-07 type: app tags: [catalogue, books, ebook, server, terminal, python, self-hosted, calibre-alternative] confidence: medium contested: false sources: [https://selfh.st/apps/?tag=books, https://github.com/th3r00t/pyShelf, https://noted.lol/3-self-hosted-ebook-hosts-and-readers/] --- # 🐍 pyShelf > **Serveur d'ebooks léger et terminal-first, sans dépendance X** : hébergez votre bibliothèque EPUB/MOBI, scannez récursivement vos dossiers, cherchez par fuzzy matching, téléchargez. Idéal pour les serveurs headless. ## 📋 Informations Générales | Champ | Valeur | | :--- | :--- | | **Site web** | [github.com/th3r00t/pyShelf](https://github.com/th3r00t/pyShelf) | | **GitHub** | [th3r00t/pyShelf](https://github.com/th3r00t/pyShelf) | | **Licence** | GPL-3.0 | | **Langage** | Python 3, JavaScript (UI web) | | **Étoiles GitHub** | 525 ⭐ | | **Dernière MAJ** | 2025-08 (v0.8.0) | | **Catégorie** | [[cat-books]] | ## 📝 Description **pyShelf** est né d'une frustration exprimée dès le README : « Vous n'avez pas besoin d'un serveur X pour héberger un site web, des films ou des séries, alors pourquoi devriez-vous en avoir un pour héberger des ebooks ? ». L'auteur venait de Calibre, qu'il trouvait lourd à administrer sur un serveur sans interface graphique, et a décidé d'écrire un serveur de livres numériques **100% headless, sans dépendance X11**. Concrètement, pyShelf propose un **scan récursif** de votre dossier `/mnt/books` (ou n'importe quel chemin configurable), extrait les **métadonnées** des fichiers EPUB/MOBI, **agrège les couvertures**, et expose une **interface web** minimaliste avec **recherche fuzzy** (par titre, auteur, tag) et **système de téléchargement**. Les **collections automatiques** sont générées à partir de la structure de dossiers (pratique si vous organisez déjà vos ebooks par auteur/série/genre). L'installation se fait **en une ligne** : `curl -fsSL https://raw.githubusercontent.com/th3r00t/pyShelf/.../install.sh | sudo bash`, et pyShelf s'installe comme **service systemd** (`pyshelf.service`) avec activation automatique. Pas de Docker obligatoire, pas de base de données externe, pas de runtime exotique. C'est du **Python pur avec SQLite** : ça tourne sur n'importe quel Linux, même un Pi Zero. **Points forts** : extrêmement léger, pas de Docker requis, pas de X11, installation one-liner, systemd natif, search fuzzy, collections auto par arborescence. **Points faibles** : formats limités (EPUB/MOBI, pas de PDF/AZW3/CBR), pas d'OPDS, pas de lecteur intégré (uniquement téléchargement), pas de gestion de prêts/lecteurs multiples, pas d'auth utilisateur (mono-utilisateur), UI web très spartiate, roadmap (auth, OPDS, plus de formats) en suspens. ## 🚀 Installation ### Option recommandée : install one-liner + systemd ```bash curl -fsSL https://raw.githubusercontent.com/th3r00t/pyShelf/refs/heads/master/install.sh | sudo bash systemctl status pyshelf ``` Le script crée `/etc/pyShelf/config.json`, installe le service systemd et démarre pyShelf. ### Option Docker (manuelle) Il n'existe **pas d'image officielle** sur Docker Hub, mais un `Dockerfile` maison se construit facilement : ```dockerfile FROM python:3.12-slim RUN apt-get update && apt-get install -y git curl && rm -rf /var/lib/apt/lists/* RUN git clone https://github.com/th3r00t/pyShelf.git /app WORKDIR /app RUN pip install --no-cache-dir -r requirements.txt EXPOSE 8000 CMD ["python", "-m", "pyShelf"] ``` ```yaml # docker-compose.yml services: pyshelf: build: . container_name: pyshelf restart: unless-stopped volumes: - /mnt/books:/books:ro - pyshelf_data:/data ports: - "8000:8000" environment: - PYSHELF_BOOK_PATH=/books - PYSHELF_DATA_PATH=/data volumes: pyshelf_data: ``` ### Configuration Le fichier `/etc/pyShelf/config.json` (ou `/app/config.json` en Docker) contrôle le chemin des livres, le port et la base SQLite. ## ⚙️ Configuration Initiale 1. **Modifier** `/etc/pyShelf/config.json` pour pointer sur votre dossier d'ebooks (`/mnt/books` par défaut). 2. **Redémarrer** : `sudo systemctl restart pyshelf`. 3. **Accéder à l'UI** : `http://IP_DU_SERVEUR:8000`. 4. **Tester la recherche** : `author:Tolkien`, `tag:fiction`, `title:"Hunt for Red October"`. 5. **Ajouter un reverse proxy HTTPS** (Caddy/Nginx) si accès distant. 6. **Sauvegarder** le volume `pyshelf_data` (SQLite + cache couvertures). ## 🔄 Alternatives ### Open Source - **Calibre + Calibre-Web** — référence, plus complet, mais demande X pour l'admin - [[app-kavita]] — moderne, multi-formats, lecteur intégré - [[app-teemii]] — orienté manga, scraper intégré - **COPS** (Calibre OPDS PHP Server) — léger, OPDS seulement - **BicBucStriim** — Calibre sans Calibre, interface web minimale ### Propriétaires - **Calibre (desktop)** — la référence, mais lourd - **Kindle Cloud / Kobo** — clouds fermés - **Google Play Livres** — écosystème Google - **Apple Books** — écosystème Apple ## 🔐 Sécurité - ⚠️ **Pas d'authentification native** : prévoir un reverse proxy avec Authelia/Basic Auth - ✅ **Volume `books` monté en lecture seule** dans le conteneur - ✅ **Pas de télémétrie**, projet 100% local - ✅ **HTTPS obligatoire** si exposition WAN - ⚠️ **Service systemd root** : à harden si multi-utilisateurs sur l'hôte - ⚠️ **Mono-utilisateur** par conception - ✅ SQLite local, pas de base réseau à sécuriser ## 📚 Ressources - [GitHub th3r00t/pyShelf](https://github.com/th3r00t/pyShelf) - [Reddit r/selfhosted — v0.6.0 Docker release](https://www.reddit.com/r/selfhosted/comments/ivjshf/) - [Discord pyShelf](https://discord.gg/H9TbNJS) - [Sponsor th3r00t sur GitHub](https://github.com/sponsors/th3r00t) ## Pages Liées - [[cat-books]] — Catégorie Books - [[app-calibre-web]] — Interface web Calibre - [[app-kavita]] — Lecteur moderne multi-formats - [[app-caddy]] — Reverse proxy HTTPS - [[app-authelia]] — SSO pour ajouter de l'auth - [[recettes-docker-compose]] — Templates Docker