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.

Inhalt
Calibre-Web 0.6.27Calibre-Web Automated 4.0.8Kavita 0.9.1Komga 1.30Grimmory 3.5BookOrbit 3.7Storyteller 2.14Docker 29.9Debian 13Calibre-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:
sudo mkdir -p /srv/apps /srv/library/ebooks /srv/library/comics
sudo chown -R $USER:$USER /srv/apps /srv/libraryDie 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.
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 *.pdfCalibre 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:
calibredb list --with-library /srv/apps/calibre-web/library -f title
calibredb add_format --with-library /srv/apps/calibre-web/library 3 youdontknowjs_upandgoing.pdfDie compose.yaml ist kurz:
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:/bookssudo docker compose up -dBeim 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.

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

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.
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:roBeim 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.cbzMit dieser Struktur waren alle sechs Serien samt Cover sofort da.

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

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.
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:roBeim 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.

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

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:
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: 10mkdir -p data bookdrop config
sudo docker compose up -dDas 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.

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:
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.ymlIn der .env setzt du mindestens diese Werte:
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:
sudo docker compose up -dIm 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.

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

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.
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:rwDen 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.

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.