Komga mit Docker Compose selbst hosten: Comic- und Manga-Server mit Backup
Schritt für Schritt: Komga als Server für Comics, Mangas und E-Books mit Docker Compose betreiben. Mit Claim des Administratorkontos, Bibliotheken, Benutzerrechten, getestetem Backup und Restore der Konfiguration, Update von 1.29.0 auf 1.29.1 und echten Fehlerbildern aus dem Testlauf.
Mit KI erstellt – redaktionelle Prüfung ausstehend
WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

Komga ist ein Medienserver für Comics, Mangas, Magazine und E-Books. Er liest CBZ, CBR, PDF und EPUB direkt aus Ihren Ordnern, legt daraus Serien und Bücher an und stellt sie im Browser, per OPDS und über Apps wie Mihon oder KOReader bereit. Für Vereine, Bibliotheken, Schulen oder ein kleines Büro mit digitalem Fachzeitschriftenarchiv ist das eine schlanke Alternative zu Cloud-Lesediensten: Die Dateien bleiben auf Ihrem Server, Benutzer und Leserechte verwalten Sie selbst. Diese Anleitung führt Sie durch Installation mit Docker Compose, Erstkonfiguration, Betrieb, Backup mit echtem Restore, Update und Fehlerdiagnose. Alle Befehle und Ausgaben stammen aus einem Testlauf mit Komga 1.29.1 vom 17. Oktober 2026.
Voraussetzungen
Komga ist genügsam. Im Test belegte der Container nach dem Start rund 430 MiB RAM, die Java-Grenze lag bei 1 GB. Planen Sie für den Betrieb Folgendes ein:
- Linux-Server, VM oder Mini-PC mit Docker Engine und Compose-Plugin, x86_64 oder ARM64
- 2 CPU-Kerne und 2 GB RAM für kleine bis mittlere Sammlungen, 4 GB bei großen Archiven oder vielen gleichzeitigen Lesern
- Lokaler Datenträger für
config: SQLite darf laut Doku nicht auf NFS oder SMB liegen, Komga bricht den Start sonst ab - Speicher für Ihre Bücher; das Verzeichnis darf auch ein eingebundenes NAS-Laufwerk sein
- Für den Zugriff von außen ein Reverse Proxy mit HTTPS, zum Beispiel Caddy oder Traefik
- Eigene oder lizenzierte Dateien; für einen ersten Test genügen selbst erstellte CBZ-Archive
Schritt 1: Projektordner und Compose-Datei anlegen
Komga veröffentlicht seine Images auf Docker Hub als gotson/komga und auf ghcr.io. Neben latest gibt es 1.x und feste Versionen wie 1.29.1. Schreiben Sie die Version fest, damit ein Neustart nicht unbemerkt eine neue Version zieht.
| Eckdaten | Wert |
|---|---|
| Image | gotson/komga:1.29.1 (Release vom 14.10.2026, MIT-Lizenz) |
| Port | 25600 (Weboberfläche, REST-API, OPDS) |
| Volumes | /config Datenbank, Index, Logs; /data Bücher |
| Env | TZ, JAVA_TOOL_OPTIONS=-Xmx1g, optional jede Konfigurationsvariable |
| Benutzer | user: "1000:1000", muss Eigentümer von config sein |
mkdir -p /opt/komga/config /opt/komga/data/comics /opt/komga/data/manga
cd /opt/komga
sudo chown -R 1000:1000 config data
Legen Sie die Datei compose.yaml an:
services:
komga:
image: gotson/komga:1.29.1
container_name: komga
user: "1000:1000"
ports:
- "25600:25600"
volumes:
- ./config:/config
- ./data:/data:ro
environment:
- TZ=Europe/Berlin
- JAVA_TOOL_OPTIONS=-Xmx1g
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:25600/actuator/health >/dev/null 2>&1 || curl -fs http://localhost:25600/actuator/health >/dev/null"]
interval: 30s
timeout: 10s
retries: 5
start_period: 120s
restart: unless-stopped
Das Image bringt keinen eigenen Healthcheck mit, enthält aber curl und wget. Der Endpunkt /actuator/health antwortet ohne Anmeldung mit {"status":"UP"}. Das :ro am Datenordner verhindert, dass Komga Bücher verändert oder löscht. Wollen Sie später die Import- oder Papierkorbfunktion nutzen, entfernen Sie es bewusst.
Verifizieren: docker compose config --quiet gibt nichts aus und endet mit Status 0. ls -ln zeigt für config die Eigentümer-ID 1000.
Schritt 2: Starten und Administrator anlegen
docker compose up -d
docker compose logs -f komga
Beim ersten Start legt Komga per Flyway 94 Datenbankmigrationen an. Im Test war die API nach 9 Sekunden erreichbar, spätere Neustarts dauerten 6 bis 8 Sekunden; das Log meldete Started ApplicationKt in 5.764 seconds. Der start_period von 120 Sekunden lässt auch langsamer Hardware genug Luft.
Solange kein Konto existiert, kann jeder, der Port 25600 erreicht, den Server übernehmen. Legen Sie das Administratorkonto deshalb sofort und lokal auf dem Server an, bevor Sie den Reverse Proxy freischalten:
curl -s localhost:25600/api/v1/claim
{"isClaimed":false}
read -rs KPW
curl -s -X POST localhost:25600/api/v1/claim \
-H "X-Komga-Email: admin@example.de" \
-H "X-Komga-Password: $KPW"
Die Antwort enthält das Konto mit den Rollen ADMIN, FILE_DOWNLOAD, PAGE_STREAMING und weiteren. Ein zweiter Claim-Versuch scheitert mit HTTP 400 und This server has already been claimed. Mit read -rs landet das Passwort nicht in der Shell-History.
Verifizieren: docker compose ps zeigt Up (healthy). curl -s -o /dev/null -w '%{http_code}' -u admin@example.de:$KPW localhost:25600/api/v2/users/me liefert 200, dasselbe mit falschem Passwort 401 und ohne Zugangsdaten ebenfalls 401.
Schritt 3: Bibliotheken einrichten
Eine Bibliothek ist ein Stammordner unterhalb von /data. Komga macht aus jedem Unterordner eine Serie und aus jeder Datei ein Buch. Stammordner dürfen sich nicht überlappen: /data/comics und /data/manga nebeneinander sind erlaubt, /data zusätzlich nicht. Melden Sie sich im Browser an und klicken Sie in der Seitenleiste auf das Plus neben Bibliotheken.

Unter Optionen lohnt sich Hash für Dateien berechnen: Ohne Datei-Hash funktionieren weder die Wiederherstellung aus dem Papierkorb noch die Dublettenerkennung. Bei sehr großen Archiven auf schwacher Hardware kostet das spürbar Zeit beim ersten Scan. Die Oberfläche stellen Sie unten links unter Sprache auf Deutsch um. Alternativ legen Sie Bibliotheken per API an, praktisch für Skripte:
curl -s -u admin@example.de:$KPW -H 'Content-Type: application/json' \
-X POST localhost:25600/api/v1/libraries \
-d '{"name":"Comics","root":"/data/comics","hashFiles":true}'
Im Test erkannte Komga sechs selbst erzeugte CBZ-Dateien innerhalb weniger Sekunden als drei Serien. Sammlungen fassen Serien zusammen, Leselisten ordnen einzelne Bücher in eine feste Reihenfolge.

Verifizieren: curl -s -u admin@example.de:$KPW localhost:25600/api/v1/series | jq .totalElements nennt die erwartete Zahl an Serien, und im Browser erscheinen Cover statt Platzhaltern.
Schritt 4: Benutzer und Betrieb
Unter Server, Benutzer legen Sie weitere Konten an. Die Rolle Seiten-Streaming erlaubt das Lesen im Browser, Datei herunterladen den Download. Über Einschränkungen bearbeiten begrenzen Sie ein Konto auf einzelne Bibliotheken, Altersfreigaben oder Labels. Im Test durfte ein reines Lesekonto lesen, der Versuch, eine Bibliothek anzulegen, endete mit HTTP 403.

Die Tabelle Authentifizierungsaktivität zeigt jede Anmeldung mit IP und User-Agent. Hinter der Docker-Portweiterleitung erscheint dort nur die Adresse der Docker-Bridge (im Test 172.18.0.1); echte Client-Adressen sehen Sie erst hinter einem Reverse Proxy, der X-Forwarded-For setzt. Sitzungen laufen standardmäßig nach 30 Minuten Inaktivität ab, ändern lässt sich das mit SERVER_SERVLET_SESSION_TIMEOUT=7d. Wird Komga unter einem Unterpfad betrieben, setzen Sie SERVER_SERVLET_CONTEXTPATH=/komga.

Läuft der Java-Prozess bei großen PDF-Dateien in einen OutOfMemoryError, erhöhen Sie JAVA_TOOL_OPTIONS=-Xmx2g. Die Logs liegen zusätzlich als Datei unter config/logs/komga.log.
Verifizieren: Ein neues Lesekonto meldet sich mit curl -u an /api/v2/users/me mit 200 an, und docker stats --no-stream komga zeigt einen Speicherverbrauch unterhalb der gesetzten Java-Grenze plus Overhead.
Schritt 5: Backup erstellen
Alles, was Komga selbst erzeugt, liegt in config: database.sqlite mit Bibliotheken, Benutzern, Lesefortschritt, Sammlungen und Leselisten, dazu tasks.sqlite, sessions.sqlite, der Suchindex lucene und die Logs. Die Bücher in data sichern Sie getrennt mit Ihrer normalen Dateisicherung. Stoppen Sie den Container für ein konsistentes Backup kurz, damit SQLite seine WAL-Dateien zurückschreibt:
cd /opt/komga
docker compose stop komga
mkdir -p /backup/komga
tar czf /backup/komga/komga-config-$(date +%F).tar.gz -C /opt/komga config
docker compose start komga
tar tzf /backup/komga/komga-config-*.tar.gz | grep sqlite
Im Test war das Archiv mit drei Serien 75 KB groß und enthielt nach dem Stopp nur noch database.sqlite, tasks.sqlite und sessions.sqlite ohne -wal-Dateien. Die Unterbrechung dauerte wenige Sekunden. Kopieren Sie das Archiv anschließend auf ein anderes System.
Verifizieren: tar tzf listet die drei SQLite-Dateien, und nach dem Start meldet /actuator/health wieder UP.
Schritt 6: Restore durchführen
Ein Backup ist erst etwas wert, wenn die Wiederherstellung funktioniert. Im Test lagen vor dem Backup eine Sammlung Marker-Sammlung 2026, eine Leseliste Marker-Leseliste und ein zweites Konto vor. Nach dem Backup wurden alle drei gelöscht, danach wurde config komplett geleert. Komga startete mit leerer Datenbank und meldete {"isClaimed":false}, die Bibliotheken waren weg. So stellen Sie den Stand wieder her:
cd /opt/komga
docker compose down
rm -rf config
tar xzf /backup/komga/komga-config-2026-10-17.tar.gz -C /opt/komga
ls -ln config
docker compose up -d
tar übernimmt die numerischen Eigentümer aus dem Archiv, die Dateien gehörten im Test wieder der ID 1000. Nach 7 Sekunden war Komga bereit, und die Abfrage lieferte:
claimed: {"isClaimed":true}
sammlungen: ["Marker-Sammlung 2026"]
leselisten: ["Marker-Leseliste"]
serien: 3
leser login: 200
Auch das gelöschte Lesekonto meldete sich wieder mit seinem alten Passwort an. Haben Sie das Archiv auf einem anderen System entpackt, prüfen Sie den Eigentümer und korrigieren ihn bei Bedarf mit chown -R 1000:1000 config.
Verifizieren: Sammlungen, Leselisten und Benutzer stimmen mit dem Stand vor dem Backup überein, docker compose logs zeigt Started ApplicationKt ohne ERROR.
Schritt 7: Komga aktualisieren
Lesen Sie vor jedem Update die Release Notes auf GitHub und erstellen Sie ein Backup nach Schritt 5. Danach tragen Sie das neue Tag in compose.yaml ein:
sed -i 's#gotson/komga:1.29.0#gotson/komga:1.29.1#' compose.yaml
docker compose pull
docker compose up -d
docker compose logs komga | grep -E "Starting ApplicationKt|Schema"
Im Test lief zuerst 1.29.0 mit einer gescannten Bibliothek. Nach dem Wechsel meldete das Log Starting ApplicationKt v1.29.1 und Schema "main" is up to date, beide Serien waren unverändert vorhanden. Alte Images entfernen Sie mit docker image prune. Für automatische Hinweise auf neue Versionen eignet sich ein Update-Melder statt automatischer Updates.
Verifizieren: Unten links in der Seitenleiste steht die neue Versionsnummer, und die Zahl der Serien entspricht dem Stand vor dem Update.
Troubleshooting
- Container startet ständig neu, im Log
[SQLITE_CANTOPEN] Unable to open the database file: Der Ordnerconfiggehört nicht der ID aususer:. Im Test mit einem root-eigenen Ordner zählte Docker nach 30 Sekunden sechs Neustarts; davor stehtFailed to create parent directories for [/config/logs/komga.log]. Abhilfe:chown -R 1000:1000 config. This server has already been claimed: Es existiert bereits ein Konto. Haben Sie das Passwort vergessen, nutzen Sie den Passwort-Reset unten statt die Datenbank zu löschen.- Passwort vergessen: Komga kennt einen Kommandozeilen-Reset. Im Test funktionierte
docker compose run --rm komga --reset=admin@example.de --newpassword=NeuesPasswort. Der Hilfscontainer startet Komga vollständig; sobald im LogReset password for usererscheint, beenden Sie ihn und starten den Dienst mitdocker compose restart komganeu. Danach gilt das alte Passwort nicht mehr (401), das neue schon (200). Löschen Sie anschließend die Shell-History-Zeile. database should be on a local filesystem:configliegt auf NFS oder SMB. Verschieben Sie es auf einen lokalen Datenträger.- Neue Dateien erscheinen nicht: Starten Sie im Bibliotheksmenü einen Scan oder einen Tiefenscan, wenn Ihr Dateisystem die Änderungszeit von Ordnern nicht aktualisiert.
- HTTP 401 bei API-Aufrufen: Falsches Passwort oder fehlende Zugangsdaten. Komga antwortet in beiden Fällen gleich, prüfen Sie deshalb den Benutzernamen in der Authentifizierungsaktivität.
Häufige Fragen
Welche Formate unterstützt Komga?
CBZ, ZIP, CBR, RAR, PDF und EPUB. Metadaten liest Komga aus ComicInfo.xml und aus EPUB-Dateien, deshalb kann ein angezeigter Titel vom Dateinamen abweichen.
Kann ich mit Apps auf dem Smartphone lesen?
Ja. Komga bietet einen OPDS-Katalog sowie Anbindungen für Mihon, KOReader und Kobo-Sync. Für die App melden Sie sich mit einem eigenen Lesekonto an, nicht mit dem Administrator.
Muss ich den Datenordner mitsichern?
Ja, aber getrennt. Komga verändert die Bücher bei schreibgeschützter Einbindung nicht, das Konfigurationsarchiv enthält nur Verwaltungsdaten. Ohne die Bücher im gleichen Pfad zeigt eine wiederhergestellte Datenbank Einträge ohne Dateien.
Reicht ein Snapshot des laufenden Containers?
Ein Dateisystem-Snapshot im laufenden Betrieb kann eine inkonsistente WAL-Datei erfassen. Der kurze Stopp aus Schritt 5 ist der sichere Weg und kostet nur Sekunden.
Fazit
Komga ist mit einem Container, zwei Verzeichnissen und einem Claim-Aufruf schnell betriebsbereit und braucht wenig Ressourcen. Wichtig sind drei Punkte: das Administratorkonto vor jeder Freigabe anlegen, die Eigentümer von config passend zur Benutzer-ID setzen und config regelmäßig im gestoppten Zustand sichern. Der Restore-Test zeigt, dass ein einfaches Tar-Archiv genügt, um Benutzer, Sammlungen und Leselisten nach einem Totalverlust zurückzuholen.


