Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung Docker 17.10.2026 · 10 min Lesezeit

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

KI-Titelbild: Komga selbst hosten, Comic- und Manga-Server mit Docker, mit Karten für Bibliotheken, Backup und Updates

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.

EckdatenWert
Imagegotson/komga:1.29.1 (Release vom 14.10.2026, MIT-Lizenz)
Port25600 (Weboberfläche, REST-API, OPDS)
Volumes/config Datenbank, Index, Logs; /data Bücher
EnvTZ, JAVA_TOOL_OPTIONS=-Xmx1g, optional jede Konfigurationsvariable
Benutzeruser: "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.

Komga-Dialog Bibliothek hinzufügen mit Name E-Books und Stammordner /data/ebooks
Neue Bibliothek anlegen: Name und Stammordner unterhalb von /data eintragen, dann Weiter.

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.

Komga-Sammlung Marker-Sammlung 2026 mit drei Testserien
Eine Sammlung fasst Serien aus mehreren Bibliotheken zusammen.

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.

Komga-Buchdetail mit Format CBZ, Dateipfad und Schaltflächen Lesen und Herunterladen
Buchdetail mit Dateipfad, Format und Zuordnung zur Leseliste.

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.

Komga-Benutzerverwaltung mit zwei Konten und Tabelle der Anmeldeversuche
Benutzerverwaltung mit Protokoll der Anmeldungen.

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 Ordner config gehört nicht der ID aus user:. Im Test mit einem root-eigenen Ordner zählte Docker nach 30 Sekunden sechs Neustarts; davor steht Failed 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 Log Reset password for user erscheint, beenden Sie ihn und starten den Dienst mit docker compose restart komga neu. 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: config liegt 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.

Weiterführende Anleitungen und Quellen

KomgaDocker ComposeSelfhostingComicsMangaE-BooksBackup