Deployn

Calibre-Web Alternative: E-Book-Server im Vergleich mit Docker

Calibre-Web, Calibre-Web Automated, Kavita, Komga, Grimmory, BookOrbit und Storyteller auf einem Debian-Server installiert und verglichen: RAM, Image-Größe, Formate und Reader.

Calibre-Web Alternative: E-Book-Server im Vergleich mit Docker hero image
Inhalt
Getestet mit
Calibre-Web 0.6.27Calibre-Web Automated 4.0.8Kavita 0.9.1Komga 1.30Grimmory 3.5BookOrbit 3.7Storyteller 2.14Docker 29.9Debian 13
Zuletzt geprüft am

Calibre-Web ist für viele der Einstieg in einen eigenen E-Book-Server. Die Oberfläche wirkt altmodisch, und die Bibliothek hängt an einer Calibre-Datenbank. Inzwischen gibt es genug Alternativen, die Bücher, PDFs, Comics und teils sogar Hörbücher in einer Oberfläche zusammenführen.

Ich habe sieben davon auf einem frischen Debian-Server installiert: Calibre-Web, Calibre-Web Automated, Kavita, Komga, Grimmory, BookOrbit und Storyteller. Alle laufen mit Docker Compose und bekamen Bücher aus demselben Satz. Für Storyteller kam ein Hörbuch dazu. Hier steht, wie die Installation läuft, was jede App verbraucht und für wen sie sich eignet. Wenn du Calibre-Web selbst aufsetzen willst, findest du die Anleitung in Calibre und Calibre-Web mit Docker.

Kurz und knapp: welche App für wen?

Du willst Nimm
Eine bestehende Calibre-Bibliothek im Browser lesen Calibre-Web
Neue Bücher in einen Ordner werfen und fertig Calibre-Web Automated
Bücher, PDFs und Comics in einer schlanken App Kavita
Comics und Manga mit viel Metadaten, dazu EPUB und PDF Komga
Moderne Oberfläche mit Kobo- und KOReader-Sync Grimmory oder BookOrbit
Text und Hörbuch synchron (Readaloud) Storyteller

Testaufbau

  • Server: Hetzner CX33 mit 4 vCPU, 8 GB RAM und Debian 13.
  • Software: Docker 29.9 mit dem Compose-Plugin.
  • Bücher: Drei EPUBs und zwei PDFs, dazu ein CBZ mit fünf Seiten aus Pepper&Carrot von David Revoy (CC BY).
  • Hörbuch: Für Storyteller das EPUB von Project Gutenberg und das LibriVox-Hörbuch “The Gift of the Magi”, 13 Minuten.
  • Messung: sudo docker stats --no-stream, nachdem die Bibliothek gescannt und ein Buch im Reader geöffnet war. Es lief immer nur eine App.

Die Ordner für die Apps lege ich unter /srv/apps/<name> an, die Bücher liegen in /srv/library:

Terminalbash
sudo mkdir -p /srv/apps /srv/library/ebooks /srv/library/comics
sudo chown -R $USER:$USER /srv/apps /srv/library

Die Docker-Befehle im Beitrag führst du jeweils im Ordner der App aus.

Messwerte im Überblick

App Datenbank Image RAM nach Scan und Lesen
Calibre-Web SQLite 1,15 GB 183 MiB
Calibre-Web Automated SQLite 2,44 GB 203 MiB
Kavita SQLite 900 MB 411 MiB
Komga SQLite 800 MB 931 MiB
Grimmory MariaDB (eigener Container) 718 MB + 467 MB 436 MiB + 160 MiB
BookOrbit PostgreSQL (eigener Container) 1,33 GB + 631 MB 227 MiB + 44 MiB
Storyteller SQLite 2,88 GB 411 MiB im Leerlauf, 870 MiB beim Alignment

Die Zahlen gelten für fünf Bücher. Bei einer großen Bibliothek wachsen sie. Komga und Grimmory laufen auf Java und reservieren sich Speicher, der in docker stats als belegt auftaucht. Wenn dein Server nur 2 GB hat, planst du besser mit Calibre-Web, Kavita oder BookOrbit.

Calibre-Web

Calibre-Web ist die Oberfläche zu einer Calibre-Bibliothek. Calibre brauchst du nur einmal, um die Datenbank (metadata.db) anzulegen. Das ist der größte Unterschied zu den anderen Apps: Es gibt keinen “Ordner angeben, Scan starten”. Weitere Bücher lädst du danach direkt im Browser hoch.

Ich lege die Bibliothek mit calibredb an. Für eine leere Bibliothek reicht calibredb list --with-library /srv/apps/calibre-web/library, das Programm erzeugt dabei die metadata.db. Im Test habe ich die ersten Bücher gleich mit calibredb add hinzugefügt. Auf Debian steckt das Programm im Paket calibre. Das Paket calibre-bin enthält nur die Dokumentation.

Terminalbash
sudo apt install --no-install-recommends calibre
mkdir -p /srv/apps/calibre-web/library /srv/apps/calibre-web/config
cd /srv/library/ebooks
QT_QPA_PLATFORM=offscreen calibredb add --with-library /srv/apps/calibre-web/library *.epub *.pdf

Calibre erkennt Bücher mit gleichem Titel und Autor als Duplikat. Das PDF von “You Don’t Know JS” wurde deshalb übersprungen. Du hängst es als zweites Format an das EPUB. Die ID des Buchs zeigt calibredb list:

Terminalbash
calibredb list --with-library /srv/apps/calibre-web/library -f title
calibredb add_format --with-library /srv/apps/calibre-web/library 3 youdontknowjs_upandgoing.pdf

Die compose.yaml ist kurz:

yaml
services:
    calibre-web:
        image: lscr.io/linuxserver/calibre-web:latest
        container_name: calibre-web
        restart: unless-stopped
        environment:
            - PUID=1000
            - PGID=1000
            - TZ=Europe/Berlin
        ports:
            - "8083:8083"
        volumes:
            - ./config:/config
            - ./library:/books
Terminalbash
sudo docker compose up -d

Beim ersten Start meldest du dich mit admin und admin123 an und änderst das Passwort sofort. Danach fragt Calibre-Web nach dem Pfad der Datenbank, hier /books. Nach dem Speichern sind alle vier Bücher da.

Uploads sind ab Werk aus. Du schaltest sie unter Admin > “Basis-Einstellungen editieren” > “Feature-Konfiguration” mit “Hochladen aktivieren” ein. Danach erscheint in der Kopfzeile ein Upload-Button, und neue Bücher landen ohne calibredb in der Bibliothek. Der Benutzer braucht dafür die Berechtigung “Hochladen erlauben” in seinem Profil, und der Ordner library muss für PUID und PGID beschreibbar sein.

Startseite von Calibre-Web mit vier Büchern im Raster

Der Reader öffnet sich über “Read in Browser” in einem neuen Tab und zeigt EPUBs in einer Zwei-Seiten-Ansicht. Die Oberfläche ist schlicht, sie lädt schnell und braucht am wenigsten RAM im Test. Wer Calibre ohnehin nutzt, bleibt hier am besten.

Calibre-Web Automated

Calibre-Web Automated (CWA) ist ein Fork von Calibre-Web mit einem Ingest-Ordner. Du kopierst Dateien in den Ordner, CWA legt sie in der Calibre-Bibliothek ab, holt Metadaten und löscht die Quelldatei. calibredb brauchst du nicht.

yaml
services:
    cwa:
        image: crocodilestick/calibre-web-automated:latest
        container_name: cwa
        restart: unless-stopped
        environment:
            - PUID=1000
            - PGID=1000
            - TZ=Europe/Berlin
        ports:
            - "8083:8083"
        volumes:
            - ./config:/config
            - ./ingest:/cwa-book-ingest
            - ./library:/calibre-library
Terminalbash
mkdir -p config ingest library
sudo docker compose up -d
cp /srv/library/ebooks/* /srv/library/comics/*.cbz ingest/

Sechs Dateien (drei EPUB, zwei PDF, ein CBZ) waren nach etwa 66 Sekunden aufgenommen, der Ingest-Ordner war danach leer. Der Login ist wie bei Calibre-Web admin und admin123.

Eines musst du wissen: CWA wandelt PDFs und CBZs beim Ingest in der Standardkonfiguration in EPUB um. Das PDF “Jump Start Git” und das Pepper&Carrot-Comic lagen danach als EPUB mit generiertem Cover in der Bibliothek, das Original war weg. Für Comics ist das keine gute Wahl. Das PDF und das EPUB von “You Don’t Know JS” stehen als zwei getrennte Bücher da.

Startseite von Calibre-Web Automated mit sechs Büchern und generierten Covern

Das Image ist mit 2,44 GB das zweitgrößte im Test, weil Calibre zur Konvertierung mitgeliefert wird. Der Verbrauch bleibt mit 203 MiB niedrig.

Kavita

Kavita liest EPUB, PDF und Comic-Archive in einer Oberfläche und kommt ohne zusätzliche Datenbank aus.

yaml
services:
    kavita:
        image: ghcr.io/kareadita/kavita:latest
        container_name: kavita
        restart: unless-stopped
        ports:
            - "5000:5000"
        environment:
            - TZ=Europe/Berlin
        volumes:
            - ./config:/kavita/config
            - /srv/library/kavita/books:/books:ro
            - /srv/library/kavita/comics:/comics:ro

Beim ersten Aufruf legst du den Admin-Account an. Danach erstellst du unter Einstellungen > Libraries eine Bibliothek pro Typ: “Book” für EPUB und PDF, “Comic” für das CBZ.

Kavita verlangt eine feste Ordnerstruktur. Liegen Dateien direkt im Wurzelordner, zeigt der Dialog “One or more folders contains files at the root. Kavita does not support this.” Jedes Buch und jede Serie braucht einen eigenen Unterordner:

/srv/library/kavita/
├── books/
│   ├── CSS - The Definitive Guide/css_thedefinitiveguide.epub
│   ├── Illustrated Guide to Python 3/illustratedguidetopython3.epub
│   └── Jump Start Git/jumpstartgit2e_V2.pdf
└── comics/
    └── Pepper and Carrot/Pepper-and-Carrot-01.cbz

Mit dieser Struktur waren alle sechs Serien samt Cover sofort da.

Startseite von Kavita mit den Büchern und dem Comic

Der Buch-Reader zeigt oben eine Leiste, unten Seitenzahl, Fortschritt und die geschätzte Restlesezeit. Der Comic-Reader scrollt die Seiten untereinander.

Der Comic-Reader von Kavita mit drei Panels von Pepper&Carrot

Kavita eignet sich, wenn du Bücher und Comics in einer schlanken App haben willst und deine Dateien ohnehin in Ordnern sortierst.

Komga

Komga stammt aus der Comic-Welt und liest ebenfalls EPUB, PDF und CBZ. Es braucht keine zusätzliche Datenbank, belegt aber am meisten Arbeitsspeicher im Test.

yaml
services:
    komga:
        image: gotson/komga:latest
        container_name: komga
        restart: unless-stopped
        user: "1000:1000"
        ports:
            - "25600:25600"
        environment:
            - TZ=Europe/Berlin
        volumes:
            - ./config:/config
            - /srv/library/kavita:/data:ro

Beim ersten Aufruf legst du ein Konto mit E-Mail und Passwort an. Die Anmeldeseite zeigt dann “Email required”, bis du das Formular ausgefüllt hast. Anschließend legst du pro Ordner eine Bibliothek an. Der Dialog hat vier Tabs: General, Scanner, Options und Metadata. Auf dem ersten Tab trägst du Name und Wurzelordner ein, danach klickst du bis “Add”.

Wie bei Kavita ist jeder Unterordner eine Serie. Ich konnte deshalb dieselbe Ordnerstruktur nutzen und habe /data/books und /data/comics als zwei Bibliotheken eingetragen. Der Scan war in wenigen Sekunden fertig. Bei zwei EPUBs stand zunächst “To be analyzed” statt des Covers, das kam nach kurzer Zeit nach.

Startseite von Komga mit zuletzt hinzugefügten Büchern und Serien

Der Comic-Reader von Komga zeigt das CBZ als lange Seitenansicht.

Der Comic-Reader von Komga mit drei Panels von Pepper&Carrot

Mit 931 MiB nach dem Scan ist Komga der hungrigste Kandidat. Auf einem Server mit 2 GB RAM bleibt neben Komga kaum Platz für andere Dienste.

Grimmory

Grimmory knüpft an Booklore an, die Compose-Vorlage beschreibt den Umstieg. Die Lizenz ist AGPL-3.0. Laut Projektseite liest es EPUB, MOBI, AZW, AZW3, FB2, PDF, CBZ, CBR, CB7 und Hörbücher, synchronisiert mit Kobo und KOReader und bietet OPDS und einen Überwachungsordner namens BookDrop.

Die compose.yaml kommt mit einer MariaDB, die Zugangsdaten setzt du selbst:

yaml
services:
    grimmory:
        image: ghcr.io/grimmory-tools/grimmory:latest
        container_name: grimmory
        restart: unless-stopped
        environment:
            - USER_ID=1000
            - GROUP_ID=1000
            - TZ=Europe/Berlin
            - DATABASE_URL=jdbc:mariadb://mariadb:3306/grimmory
            - DATABASE_USERNAME=grimmory
            - DATABASE_PASSWORD=dein_sicheres_passwort
        depends_on:
            mariadb:
                condition: service_healthy
        ports:
            - "6060:6060"
        volumes:
            - ./data:/app/data
            - /srv/library/ebooks:/books
            - ./bookdrop:/bookdrop

    mariadb:
        image: lscr.io/linuxserver/mariadb:11.4.8
        restart: unless-stopped
        environment:
            - PUID=1000
            - PGID=1000
            - TZ=Europe/Berlin
            - MYSQL_ROOT_PASSWORD=dein_root_passwort
            - MYSQL_DATABASE=grimmory
            - MYSQL_USER=grimmory
            - MYSQL_PASSWORD=dein_sicheres_passwort
        volumes:
            - ./config:/config
        healthcheck:
            test: ["CMD", "mariadb-admin", "ping", "-h", "localhost"]
            interval: 5s
            timeout: 5s
            retries: 10
Terminalbash
mkdir -p data bookdrop config
sudo docker compose up -d

Das Passwort in DATABASE_PASSWORD und MYSQL_PASSWORD muss identisch sein. Nach dem Start legst du den Admin ohne Token an. Die Bibliothek legst du über einen Ordner-Browser im Dialog an, ich habe /books ausgewählt. Alle fünf Bücher waren nach rund zehn Sekunden mit Covern da.

Bibliothek in Grimmory mit EPUB- und PDF-Covern

Der Reader zeigt EPUBs direkt im Browser, PDFs laut Projektseite ebenfalls. Das 91-MB-EPUB “CSS: The Definitive Guide” brauchte beim ersten Öffnen einige Sekunden, danach blätterte es normal.

BookOrbit

BookOrbit ist die jüngste App im Test und liefert die längste Funktionsliste. Laut Projektseite liest es EPUB, KEPUB, MOBI, AZW3, FB2, PDF, CBZ, CBR, CB7 und Hörbücher, synchronisiert mit Kobo und KOReader, bietet OPDS, OIDC, Send-to-Kindle und eine iOS-App. Die Lizenz ist AGPL-3.0.

Die Installation läuft mit einer Vorlage aus dem Repository:

Terminalbash
mkdir bookorbit && cd bookorbit
mkdir -p data/app data/postgres
curl -fsSLo .env https://raw.githubusercontent.com/bookorbit/bookorbit/main/.env.example
curl -fsSLo compose.yaml https://raw.githubusercontent.com/bookorbit/bookorbit/main/docker-compose.yml

In der .env setzt du mindestens diese Werte:

Terminalbash
APP_URL=http://deine-server-ip:3000
BOOKS_HOST_PATH=/srv/library
POSTGRES_PASSWORD=
JWT_SECRET=
SETUP_BOOTSTRAP_TOKEN=

Die drei leeren Werte erzeugst du mit openssl rand -hex 24 (Passwort), openssl rand -hex 32 (JWT_SECRET) und openssl rand -hex 16 (Token). Dann startest du:

Terminalbash
sudo docker compose up -d

Im Setup-Wizard trägst du den SETUP_BOOTSTRAP_TOKEN ein, damit nicht jeder den ersten Admin anlegen kann. Eine Bibliothek braucht einen Namen, ein Symbol und einen Ordner. Den Ordner (/books/ebooks) bestätigst du im Dialog am besten mit Enter. Der Scan von fünf Dateien dauerte etwa drei Sekunden.

Bibliothek in BookOrbit mit PDF- und EPUB-Covern

Der Reader zeigt EPUBs als Doppelseite mit Abbildungen, unten stehen Seitenzahl und Fortschritt.

Der Reader von BookOrbit mit einer Doppelseite aus dem Python-Buch

BookOrbit verbraucht mit 227 MiB für die App und 44 MiB für die Datenbank wenig und bringt die meisten Funktionen mit. Das Projekt ist jung, die Version 3.7 erschien am 8. November 2026. Prüfe vor dem Einsatz, ob dir die Update-Frequenz recht ist.

Storyteller

Storyteller löst ein anderes Problem. Es nimmt ein EPUB und ein Hörbuch derselben Geschichte und richtet beide aufeinander aus. Heraus kommt ein “Readaloud”-EPUB, in dem beim Hören der jeweils gesprochene Satz markiert wird.

yaml
services:
    storyteller:
        image: registry.gitlab.com/storyteller-platform/storyteller:latest
        container_name: storyteller
        restart: unless-stopped
        ports:
            - "8001:8001"
        environment:
            - STORYTELLER_SECRET_KEY=${STORYTELLER_SECRET_KEY}
        volumes:
            - ./data:/data:rw

Den Schlüssel erzeugst du mit openssl rand -base64 32 und legst ihn in eine .env neben der compose.yaml. Die Doku nennt 8 GB RAM als Minimum und bis zu vier CPU-Kerne.

Nach dem Start legst du den Admin an und importierst die Bücher. Ich habe EPUB und MP3 in /data/import-src gelegt und sie über “Add books > Import books from server” eingelesen. Storyteller fügt beide Dateien zu einem Buch zusammen, bei dem EPUB und Audio getrennt stehen. Ein Klick auf “Create readaloud” startet die Verarbeitung.

Beim Gift of the Magi mit 13 Minuten Hörbuch dauerte die Transkription mit whisper.cpp 1 Minute 27 Sekunden, insgesamt war der Lauf nach etwa zwei Minuten fertig. Währenddessen lagen alle vier Kerne bei rund 390 % Auslastung und der Container bei etwa 870 MiB RAM. Das Ergebnis ist ein 6,2 MB großes Readaloud-EPUB.

Im Reader (/books/<id>/read) läuft der Text neben einem Player mit Geschwindigkeit und Sprung zum vorherigen oder nächsten Satzfragment. Der aktuelle Satz ist gelb markiert.

Der Reader von Storyteller mit gelb markiertem Satz während der Wiedergabe

Bei langen Hörbüchern rechnest du mit deutlich mehr Zeit, die Doku nennt rund 1 GB Platz pro Buch. Storyteller ist kein Ersatz für die anderen Apps. Du nutzt es zusätzlich, wenn du Bücher hörst und liest.

Typische Stolpersteine

Kavita meldet Dateien im Wurzelordner. Lege für jedes Buch einen Unterordner an, wie oben gezeigt.

Calibre-Web zeigt nach dem Start nur die Datenbank-Konfiguration. Der Pfad im Container muss auf den Ordner mit der metadata.db zeigen. Mit dem Volume ./library:/books ist das /books.

CWA wandelt Comics in EPUB um. Wenn du CBZs im Original behalten willst, nutze Kavita oder Komga dafür.

Berechtigungen. PUID und PGID müssen zu dem Benutzer passen, dem die Ordner gehören. Bei einem Benutzer mit der ID 1000 ist das der Standardwert. Prüfe das mit id und mit ls -n im Ordner.

Port erreichbar, aber ohne HTTPS. Alle Apps laufen im Test auf HTTP. Stelle für den echten Betrieb einen Reverse Proxy wie Caddy davor, zum Beispiel nach Caddy als Reverse Proxy.

Welche App passt zu dir?

  • Du hast schon eine Calibre-Bibliothek: Bleib bei Calibre-Web, oder nimm Calibre-Web Automated, wenn du den Ingest-Ordner willst.
  • Du hast nur EPUBs und PDFs: Kavita oder Grimmory. Kavita kommt ohne zusätzliche Datenbank aus, Grimmory bringt Kobo- und KOReader-Sync mit.
  • Du liest Comics und Manga: Kavita oder Komga. Beide lassen CBZ im Original.
  • Du willst eine App für alles inklusive Kobo und iOS: BookOrbit hat die längste Funktionsliste und kam im Test mit rund 270 MiB für App und Datenbank aus.
  • Du hörst Hörbücher zu deinen Büchern: Storyteller zusätzlich zu einer der anderen Apps.

Wenn du unsicher bist, starte Kavita und BookOrbit nacheinander auf demselben Server. Beide laufen mit wenigen Zeilen Compose, und mit sudo docker compose down ist der Test wieder weg.

FAQ

Häufige Fragen

Was ist die beste Alternative zu Calibre-Web?

Das hängt vom Einsatz ab. Für Bücher und PDFs sind Kavita, Grimmory und BookOrbit gute Kandidaten. Für Comics und Manga passen Kavita und Komga. Wer eine Calibre-Bibliothek behalten will, nutzt Calibre-Web Automated.

Braucht Calibre-Web eine Calibre-Datenbank?

Nur für die Initialisierung. Calibre-Web braucht eine bestehende metadata.db und legt sie nicht selbst an. Du erzeugst sie einmal mit calibredb, oder du nutzt Calibre-Web Automated, das sie beim Ingest selbst anlegt. Danach lädst du Bücher in Calibre-Web direkt im Browser hoch, sobald du Uploads aktiviert hast.

Kann Kavita Bücher aus einem Ordner ohne Unterordner lesen?

Nein. Kavita lehnt Dateien direkt im Wurzelordner ab. Jedes Buch oder jede Serie braucht einen eigenen Unterordner.

Wandelt Calibre-Web Automated meine Dateien um?

In der Standardkonfiguration ja. PDFs und CBZs werden beim Ingest in EPUB konvertiert, das Original geht dabei verloren. Prüfe die Einstellungen, bevor du Comics importierst.

Wie viel RAM brauchen die E-Book-Server?

Im Test lagen sie zwischen 183 MiB (Calibre-Web) und 931 MiB (Komga) bei einer kleinen Bibliothek. Grimmory und BookOrbit brauchen zusätzlich einen Datenbank-Container.

Was macht Storyteller?

Storyteller richtet ein EPUB und das passende Hörbuch aufeinander aus. Im Reader wird der gesprochene Satz markiert. Dafür braucht es laut Doku mindestens 8 GB RAM.