Kavita is a comics, manga and ebook server that stays out of your way once the library is laid out the way it expects — and that layout matters more than any setting in the web UI.Kavita ist ein Comic-, Manga- und E-Book-Server, der dir aus dem Weg geht, sobald die Bibliothek so aufgebaut ist, wie er es erwartet — und dieser Aufbau zählt mehr als jede Einstellung in der Web-Oberfläche.
Kavita is a .NET application with a bundled SQLite database, not a single small binary like some of the other apps in this series, so it idles heavier than Navidrome does — comfortably within even the cheapest tier we sell, in the low hundreds of megabytes of RAM. The exception is a very large first scan: thumbnailing tens of thousands of files at once is a real memory burst that can briefly push a 1 GiB Starter past that idle number — add a swap file first, import in batches, or move up to vps-basic if a scan is visibly swapping. Otherwise there is no ongoing transcoding workload: Kavita serves pages and panels it already has, not re-encoding video the way a media server does.Kavita ist eine .NET-Anwendung mit eingebetteter SQLite-Datenbank, keine einzelne kleine Binary wie manche der anderen Apps in dieser Reihe, daher liegt sie im Leerlauf höher als Navidrome — bequem noch innerhalb des günstigsten Tarifs, den wir verkaufen, im niedrigen dreistelligen Megabyte-Bereich an RAM. Die Ausnahme ist ein sehr großer erster Scan: Für Zehntausende Dateien auf einmal Thumbnails zu erzeugen ist ein echter Speicherschub, der einen 1-GiB-Starter kurzzeitig über diesen Leerlaufwert hinaustreiben kann — leg vorher eine Swap-Datei an, importiere in Etappen, oder wechsle zu vps-basic, wenn ein Scan sichtbar swappt. Ansonsten gibt es keine laufende Transcoding-Last: Kavita liefert Seiten und Panels aus, die es bereits hat, statt Video neu zu kodieren, wie es ein Medienserver tut.
Our vps-starter tier — 1 vCPU, 1 GiB RAM, 25 GB disk — runs Kavita itself without strain. Whatever strain shows up later is disk, because a comics-and-books library is disk, and 25 GB fills faster than expected once real collections land.Unser vps-starter-Tarif — 1 vCPU, 1 GiB RAM, 25 GB Speicher — betreibt Kavita selbst ohne Anstrengung. Was später an Belastung auftaucht, ist die Platte, denn eine Comic-und-Bücher-Bibliothek ist Plattenplatz, und 25 GB füllen sich schneller als erwartet, sobald echte Sammlungen landen.
Work backwards from what you actually have, because EPUB, CBZ/CBR and PDF are not remotely the same size for the same content:Arbeite von dem aus, was du tatsächlich hast, denn EPUB, CBZ/CBR und PDF sind für denselben Inhalt keineswegs gleich groß:
Kavita's own data — the SQLite database, cached cover thumbnails, bookmarks and reading progress — stays small, in the tens to low hundreds of megabytes even for a big library, so it is never what fills the disk. The library is. If you already know your collection is mostly EPUBs, vps-starter's 25 GB is plenty. If it is scanned comics or manga at real volume, either move up to a tier with more disk or add storage as its own volume and keep the cheap compute tier; add extra storage to your VPS covers how that works on our machines.Kavitas eigene Daten — die SQLite-Datenbank, zwischengespeicherte Cover-Thumbnails, Lesezeichen und Lesefortschritt — bleiben klein, im zweistelligen bis niedrigen dreistelligen Megabyte-Bereich selbst bei einer großen Bibliothek, sodass nie das die Platte füllt. Die Bibliothek tut das. Wenn du schon weißt, dass deine Sammlung größtenteils aus EPUBs besteht, reichen die 25 GB von vps-starter locker. Sind es gescannte Comics oder Manga in echtem Umfang, wechsle entweder zu einem Tarif mit mehr Speicher oder füge Speicher als eigenes Volume hinzu und behalte den günstigen Rechen-Tarif; zusätzlichen Speicher zu deinem VPS hinzufügen beschreibt, wie das auf unseren Maschinen funktioniert.
A fresh VPS has no library folder yet, and rsync will not create more than the last missing directory on the far side, so make the paths first over SSH, using your VPS's dedicated SSH port, not port 22:Ein frischer VPS hat noch keinen Bibliotheksordner, und rsync legt auf der Zielseite höchstens das letzte fehlende Verzeichnis an, also leg die Pfade zuerst per SSH an, über den dedizierten SSH-Port deines VPS, nicht Port 22:
ssh -p 2222 user@your-vps-ip "mkdir -p /srv/kavita/library/Manga /srv/kavita/library/Comics /srv/kavita/library/Books"
Then sync each collection over the same encrypted connection:Synchronisiere dann jede Sammlung über dieselbe verschlüsselte Verbindung:
rsync -avP -e "ssh -p 2222" ./Manga/ user@your-vps-ip:/srv/kavita/library/Manga/
-a preserves timestamps and permissions, -P shows progress and resumes an interrupted transfer instead of restarting from zero — worth having once you are moving tens of gigabytes rather than a handful of test files. connect to your VPS over SSH covers finding your actual port if you have not connected before.-a erhält Zeitstempel und Rechte, -P zeigt den Fortschritt und setzt eine unterbrochene Übertragung fort, statt bei null neu zu beginnen — wertvoll, sobald du zig Gigabyte statt einer Handvoll Testdateien bewegst. Verbindung zu deinem VPS per SSH beschreibt, wie du deinen tatsächlichen Port findest, falls du noch nie verbunden warst.
Kavita scans folders, not filenames alone, and it groups everything under one series folder into that series. Keep each title in its own folder, and keep volume or chapter numbers in the filename so Kavita's natural sort puts them in order:Kavita scannt Ordner, nicht nur Dateinamen, und gruppiert alles unter einem Serienordner zu dieser Serie. Halte jeden Titel in seinem eigenen Ordner und behalte Band- oder Kapitelnummern im Dateinamen, damit Kavitas natürliche Sortierung sie in die richtige Reihenfolge bringt:
Manga/
One Title (2019)/
Volume 01.cbz
Volume 02.cbz
Another Title/
Chapter 001.cbz
Chapter 002.cbz
A flat folder of mixed titles with no series-level grouping produces a Kavita library nobody wants to browse — sort this out before the first scan, since Kavita's metadata matching improves once the folder name gives it something to match against, and re-parenting hundreds of files later is tedious.Ein flacher Ordner mit gemischten Titeln ohne Gruppierung auf Serienebene ergibt eine Kavita-Bibliothek, durch die niemand stöbern möchte — kläre das vor dem ersten Scan, denn Kavitas Metadatenabgleich verbessert sich, sobald der Ordnername ihm etwas zum Abgleichen gibt, und Hunderte Dateien später neu zuzuordnen ist mühsam.
Kavita's own documentation describes one config volume for its database and settings, plus whichever library folders you point it at — read-only is the right choice for the library, since Kavita only ever needs to read comics and books to scan and serve them:Kavitas eigene Dokumentation beschreibt ein Konfigurations-Volume für Datenbank und Einstellungen, plus die Bibliotheksordner, auf die du sie zeigst — Read-only ist die richtige Wahl für die Bibliothek, da Kavita Comics und Bücher nur lesen muss, um sie zu scannen und auszuliefern:
services:
kavita:
image: ghcr.io/kareadita/kavita:0.8.3 # check Kavita's own install docs (wiki.kavitareader.com) for the current tag and registry
restart: unless-stopped
volumes:
- kavita_config:/kavita/config
- /srv/kavita/library:/library:ro
ports:
- "127.0.0.1:5000:5000"
volumes:
kavita_config:
name: kavita_config
The name: kavita_config line is the thing that bites later if you skip it: Compose normally prefixes a named volume with the project directory's name, so the volume created on disk isn't literally kavita_config unless you pin it. The backup command further down assumes that exact name — skip the pin and it silently creates and tars a new, empty volume instead of the one Kavita is using, with no error to tell you.Die Zeile name: kavita_config ist das, was dich später beißt, wenn du sie weglässt: Compose stellt einem benannten Volume normalerweise den Namen des Projektverzeichnisses voran, sodass das auf der Platte angelegte Volume nicht wörtlich kavita_config heißt, sofern du es nicht festnagelst. Der Backup-Befehl weiter unten setzt genau diesen Namen voraus — lässt du die Festlegung weg, legt er still ein neues, leeres Volume an und sichert es, statt des Volumes, das Kavita tatsächlich nutzt, ohne jede Fehlermeldung.
The published port is bound to 127.0.0.1, same as every other web app in this series: Caddy on the same host is the only thing that should reach port 5000 directly. Once the stack is up, add the library folder inside the container (/library/Manga, and so on) as a library from Kavita's own admin dashboard — the bind mount only makes the files visible; Kavita still needs each folder added as a library and typed (Manga, Comic or Book).Der veröffentlichte Port ist an 127.0.0.1 gebunden, wie bei jeder anderen Web-App in dieser Reihe: Nur Caddy auf demselben Host soll Port 5000 direkt erreichen. Sobald der Stack läuft, füge den Bibliotheksordner im Container (/library/Manga und so weiter) über Kavitas eigenes Admin-Dashboard als Bibliothek hinzu — der Bind-Mount macht die Dateien nur sichtbar; Kavita muss jeden Ordner trotzdem noch als Bibliothek hinzugefügt und typisiert bekommen (Manga, Comic oder Book).
docker compose up -d
Open the server once, either through an SSH tunnel or straight from the box before Caddy is in front of it. Kavita's first-run screen asks you to create the initial account, which is the server's administrator — there is no separate admin bootstrap step. Create it deliberately, with a real password, before the port is reachable from anywhere but your own connection; don't leave a fresh install open on the public internet while you decide on a username.Öffne den Server einmal, entweder über einen SSH-Tunnel oder direkt von der Maschine aus, bevor Caddy davor steht. Kavitas Ersteinrichtungsbildschirm bittet dich, den initialen Account anzulegen, der der Administrator des Servers ist — es gibt keinen separaten Admin-Bootstrap-Schritt. Leg ihn bewusst an, mit einem echten Passwort, bevor der Port von irgendwoher außer deiner eigenen Verbindung erreichbar ist; lass eine frische Installation nicht offen im öffentlichen Internet stehen, während du dich für einen Benutzernamen entscheidest.
books.example.com {
reverse_proxy 127.0.0.1:5000
}
That is the whole file. Caddy requests and renews the certificate itself the first time it sees a request for that hostname, as long as the domain's A record already points at the box.Das ist die ganze Datei. Caddy fordert das Zertifikat selbst an und erneuert es, sobald es zum ersten Mal eine Anfrage für diesen Hostnamen sieht, solange der A-Eintrag der Domain schon auf die Maschine zeigt.
The catch is not about Kavita at all — it is about the network under it. Our VPS plans forward a small number of ports besides the dedicated SSH port, and whether 80 and 443 are among them depends on the plan, so check what your specific plan actually forwards before you point a domain at the box: NAT IPv4, ports and forwarding. If 443 is forwarded, the Caddyfile above works unchanged. If it is not, Caddy can still serve on whatever port you do have — Kavita's web UI and any OPDS-reading app both accept a port appended to the address — but Caddy still needs port 80 or 443 reachable to complete the ACME certificate challenge in the first place; a forwarded high port alone gives it neither. A dedicated IPv4 removes the question entirely, since 80 and 443 are then yours; on our plans that's arranged by e-mail.Die Falle hat mit Kavita gar nichts zu tun — sie liegt im Netzwerk darunter. Unsere VPS-Pläne leiten neben dem dedizierten SSH-Port eine kleine Anzahl weiterer Ports weiter, und ob 80 und 443 dazugehören, hängt vom Plan ab, also prüfe, was dein konkreter Plan tatsächlich weiterleitet, bevor du eine Domain auf die Maschine zeigen lässt: NAT IPv4, Ports und Weiterleitung. Ist 443 weitergeleitet, funktioniert die Caddyfile oben unverändert. Ist es das nicht, kann Caddy trotzdem auf jedem Port ausliefern, den du hast — Kavitas Web-UI und jede OPDS-lesende App akzeptieren beide einen an die Adresse angehängten Port —, aber Caddy braucht trotzdem Port 80 oder 443 erreichbar, um die ACME-Zertifikatsprüfung überhaupt abzuschließen; ein weitergeleiteter hoher Port allein gibt ihm keines von beidem. Eine dedizierte IPv4 räumt die Frage ganz aus dem Weg, da 80 und 443 dann dir gehören; bei unseren Plänen wird das per E-Mail geregelt.
Kavita exposes an OPDS feed so dedicated reader apps — on a tablet, an e-ink device, whatever you actually read on — can browse and download from your library without opening a browser. Turn it on under the server's admin settings (Enable OPDS), then open your own account settings in Kavita to get your personal OPDS URL, which carries your API key baked into it. Paste that whole URL into an OPDS-compatible reader as the feed address; the key in the URL is the authentication, there is no separate login step.Kavita stellt einen OPDS-Feed bereit, damit dedizierte Reader-Apps — auf einem Tablet, einem E-Ink-Gerät, worauf auch immer du tatsächlich liest — deine Bibliothek durchstöbern und daraus herunterladen können, ohne einen Browser zu öffnen. Schalte das in den Admin-Einstellungen des Servers ein (Enable OPDS), öffne dann deine eigenen Kontoeinstellungen in Kavita, um deine persönliche OPDS-URL zu bekommen, in die dein API-Key bereits eingebacken ist. Füge diese komplette URL in einen OPDS-kompatiblen Reader als Feed-Adresse ein; der Key in der URL ist die Authentifizierung, es gibt keinen separaten Login-Schritt.
Treat that URL like a password. Anyone holding it can browse and download from your library through the feed without ever logging in through the web UI, so if a reader app or device that had it is lost, regenerate the key rather than assume the old URL is harmless once forgotten.Behandle diese URL wie ein Passwort. Wer sie besitzt, kann über den Feed deine Bibliothek durchstöbern und daraus herunterladen, ohne sich je über die Web-UI einzuloggen — geht also eine Reader-App oder ein Gerät verloren, das sie hatte, generiere den Key neu, statt anzunehmen, die alte URL sei harmlos, sobald sie vergessen ist.
The library is large and usually replaceable — you own it, or bought it, and could re-acquire it. The kavita_config volume is the opposite: small, and the one thing genuinely painful to lose, since it holds the SQLite database with every user, reading list, bit of progress and rating.Die Bibliothek ist groß und normalerweise ersetzbar — sie gehört dir, oder du hast sie gekauft, und könntest sie erneut beschaffen. Das Volume kavita_config ist das Gegenteil: klein, und das eine, das wirklich schmerzhaft zu verlieren ist, da es die SQLite-Datenbank mit jedem Nutzer, jeder Leseliste, jedem bisschen Fortschritt und jeder Bewertung enthält.
Stop the container first — a plain file copy of a SQLite database taken while the process is still writing to it is not guaranteed to be consistent, and stopping it for the few seconds a tar of a small volume takes is cheap insurance:Stoppe zuerst den Container — eine einfache Dateikopie einer SQLite-Datenbank, während der Prozess noch hineinschreibt, ist nicht garantiert konsistent, und ihn für die paar Sekunden zu stoppen, die ein Tar eines kleinen Volumes braucht, ist billige Versicherung:
docker compose stop kavita
docker run --rm \
-v kavita_config:/config:ro \
-v "$PWD":/backup \
alpine:3.21 tar czf /backup/kavita-config-$(date +%F).tar.gz -C /config .
docker compose start kavita
Copy that tarball off the VPS on a schedule; a backup on the same disk as the service it protects doesn't survive that disk failing. back up your VPS covers what off-machine backup means in practice on any provider.Kopiere diesen Tarball regelmäßig vom VPS herunter; ein Backup auf derselben Platte wie der Dienst, den es schützt, übersteht keinen Ausfall dieser Platte. Backup deines VPS beschreibt, was Backup abseits der Maschine bei jedem Anbieter in der Praxis bedeutet.
docker compose pull
docker compose up -d
Bump the pinned tag deliberately rather than tracking latest, and take the backup above first. Kavita runs its own database migrations against the SQLite file on startup, and a migration you can roll back from is one backed up minutes earlier, not taken after something already looked wrong.Erhöhe den gepinnten Tag bewusst, statt latest zu verfolgen, und mach vorher das Backup von oben. Kavita führt seine eigenen Datenbankmigrationen gegen die SQLite-Datei beim Start aus, und eine Migration, von der du zurückrollen kannst, ist eine, deren Backup Minuten vorher entstanden ist, nicht eines, das erst gemacht wird, nachdem schon etwas falsch aussah.
Full disclosure: this is what we sell. A vps-starter (1 vCPU / 1 GiB / 25 GB) reads comics, manga and books fine; the reason to move up is never CPU or RAM, it is running out of the 25 GB disk once the library grows.Zur vollen Transparenz: Das ist, was wir verkaufen. Ein vps-starter (1 vCPU / 1 GiB / 25 GB) liest Comics, Manga und Bücher problemlos; der Grund, hochzustufen, ist nie CPU oder RAM, sondern dass die 25 GB Speicher ausgehen, sobald die Bibliothek wächst.
Linux KVM VPS — EUR 4.99 to EUR 59.99 a month, on our own single-tenant bare metal in Dallas, TX and Charlotte, NC. Full hardware virtualisation (KVM), your own kernel, full root. Six tiers, vps-starter to vps-ultra. Starter is 1 vCPU, 1 GiB RAM, 25 GB disk.Linux-KVM-VPS — 4,99 bis 59,99 EUR im Monat, auf unserer eigenen Single-Tenant-Bare-Metal-Hardware in Dallas, TX und Charlotte, NC. Vollständige Hardware-Virtualisierung (KVM), eigener Kernel, volles Root. Sechs Tarife, vps-starter bis vps-ultra. Starter hat 1 vCPU, 1 GiB RAM, 25 GB Speicher.
You order in the shop, pay by card (Stripe) or SEPA bank transfer, and your login details are e-mailed to you once the service is set up. Support is e-mail, run by one person, with no guaranteed response time. All prices are final totals under the German small-business rule (§19 UStG); no VAT is added or shown.Du bestellst im Shop, zahlst per Karte (Stripe) oder SEPA-Überweisung, und deine Zugangsdaten werden dir per E-Mail zugeschickt, sobald der Dienst eingerichtet ist. Support läuft per E-Mail, von einer einzelnen Person betrieben, ohne garantierte Reaktionszeit. Alle Preise sind Endpreise. Gemäß § 19 UStG wird keine Umsatzsteuer ausgewiesen.
Order vps-starter → · Linux KVM VPS overviewvps-starter bestellen → · Übersicht Linux-KVM-VPS
Written by the person who runs overnight.host: a small, honest hosting company on dedicated bare metal — Linux VPS, game servers, web hosting. Live status at up.overnight.host.Geschrieben von der Person, die overnight.host betreibt: ein kleines, ehrliches Hosting-Unternehmen auf dedizierter Bare-Metal-Hardware — Linux-VPS, Gameserver, Webhosting. Live-Status unter up.overnight.host.
No. It embeds SQLite in the config volume, so there's nothing else to run or size — the database never pushes you toward a bigger tier, the library does.Nein. Es bettet SQLite im Config-Volume ein, sodass nichts anderes läuft oder dimensioniert werden muss — die Datenbank treibt dich nie zu einem größeren Tarif, das macht die Bibliothek.
Scanning thousands of files and thumbnailing all of them is the heaviest single moment Kavita puts on a box, taking real minutes rather than seconds on one vCPU. On a 1 GiB Starter, tens of thousands of files at once can push memory hard enough to swap — if so, add a swap file, import in batches, or move up to vps-basic. It then settles back down; this is not an ongoing load like a media server's transcoding.Tausende Dateien zu scannen und für alle Thumbnails zu erzeugen ist der schwerste einzelne Moment, den Kavita einer Maschine zumutet, das dauert echte Minuten statt Sekunden auf einem vCPU. Auf einem 1-GiB-Starter können Zehntausende Dateien auf einmal den Speicher so stark belasten, dass geswappt wird — falls das passiert, leg eine Swap-Datei an, importiere in Etappen, oder wechsle zu vps-basic. Danach beruhigt es sich wieder; das ist keine laufende Last wie das Transcoding eines Medienservers.
This guide covers the self-hosted, free path: enabling OPDS in server settings and using your account's per-user feed URL. Whether any other paid features exist is worth checking in Kavita's own documentation directly, since that changes between releases.Diese Anleitung deckt den selbst gehosteten, kostenlosen Weg ab: OPDS in den Servereinstellungen aktivieren und die pro Nutzer geltende Feed-URL deines Accounts verwenden. Ob es sonst kostenpflichtige Funktionen gibt, lohnt sich direkt in Kavitas eigener Dokumentation nachzuschauen, da sich das zwischen Releases ändert.
Check format before item count. A few thousand EPUBs fit easily; the same shelf space in scanned CBZ or CBR comics, manga especially, commonly fills 25 GB — no CPU or RAM upgrade changes that, only more disk does.Prüfe das Format, bevor du die Stückzahl zählst. Ein paar Tausend EPUBs passen locker; dasselbe Regalfach an gescannten CBZ- oder CBR-Comics, besonders Manga, füllt 25 GB üblicherweise auf — kein CPU- oder RAM-Upgrade ändert daran etwas, nur mehr Speicher tut das.
Every user account, reading list, bookmark and bit of reading progress is gone, because it all lives in that one SQLite database. The library itself is untouched — it's a separate read-only mount — but re-adding it and losing months of progress is exactly what the backup above exists to prevent.Jeder Benutzeraccount, jede Leseliste, jedes Lesezeichen und jedes bisschen Lesefortschritt ist weg, weil alles in dieser einen SQLite-Datenbank lebt. Die Bibliothek selbst bleibt unberührt — sie ist ein separater Read-only-Mount —, aber sie neu hinzuzufügen und Monate an Fortschritt zu verlieren, ist genau das, was das Backup oben verhindern soll.
Prices are final totals; no VAT is shown (§19 UStG). Need something the shop does not list? Email us for a written offer.Alle Preise sind Endpreise ohne ausgewiesene USt. (§19 UStG). Du brauchst etwas, das nicht im Shop steht? Schreib uns für ein schriftliches Angebot.
Order now →Jetzt bestellen → Request a custom configIndividuelle Konfiguration anfragen