Karakeep mit Docker installieren: Bookmark-Everything-App mit KI-Auto-Tagging
Karakeep ist eine selbst gehostete Bookmark-Everything-App: Links, Notizen, Bilder und PDFs in einem zentralen, per KI verschlagworteten und volltextdurchsuchbaren Speicher, per Docker Compose in etwa 15 Minuten eingerichtet.
Werbung Mit * 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

Wer Links, Notizen, Bilder und PDFs aus dem Alltag zuverlässig wiederfinden will, braucht mehr als einen Browser-Lesezeichenordner. Karakeep ist eine selbst gehostete „Bookmark-Everything“-App, die drei Funktionen vereint: vollständiges Seiten-Archiving per Headless-Browser, Volltextsuche über alle gespeicherten Inhalte und KI-gestütztes Auto-Tagging, das neue Einträge automatisch kategorisiert. Karakeep steht unter AGPL-3.0 und liefert Images für AMD64 und ARM64. Diese Anleitung richtet Karakeep mit Docker Compose auf einem Linux-Host, NAS oder VPS in etwa 15 Minuten ein.
Voraussetzungen
- Docker Engine ≥ 24.x und Docker Compose Plugin ≥ 2.x (
docker compose-Syntax) auf dem Host installiert. Fehlt beides, lesen Sie zuerst die Docker-und-Compose-Grundlage. - Linux-Host, VM oder NAS mit Docker-Support (Ubuntu, Debian, Synology mit Container Manager); AMD64 oder ARM64.
- Mindestens 2 CPU-Kerne und 2 GB RAM frei für alle drei Container (Chrome belegt beim Crawlen spürbar Speicher); etwa 2 GB Speicherplatz für die Images.
- Genügend Datenspeicher für Assets und gecrawlte Seiten, je nach Nutzung 10 GB und mehr.
opensslauf dem Host (zur Secret-Generierung); auf allen gängigen Linux-Systemen vorinstalliert.- Optional: Reverse Proxy (Nginx Proxy Manager, Traefik oder Caddy) für HTTPS-Betrieb. Tipp: Traefik als Docker-Reverse-Proxy zeigt die HTTPS-Anbindung.
- Optional: OpenAI-API-Key oder laufende Ollama-Instanz für KI-Funktionen.
Schritt 1: Projektordner anlegen
Erstellen Sie einen eigenen Ordner für den Karakeep-Stack. Er enthält die Konfigurationsdateien, die Daten liegen in benannten Docker-Volumes.
$ mkdir -p /opt/karakeep
$ cd /opt/karakeepls /opt/karakeep zeigt das leere Verzeichnis ohne Fehlermeldung.
Schritt 2: Secrets generieren und .env anlegen
Karakeep benötigt zwei zufällige Secrets. Erzeugen Sie beide mit openssl:
$ openssl rand -base64 36# Ausgabe 1 kopieren → NEXTAUTH_SECRET
$ openssl rand -base64 36# Ausgabe 2 kopieren → MEILI_MASTER_KEYLegen Sie die .env-Datei im Projektordner an und tragen Sie die Werte ein:
# /opt/karakeep/.env
# --- Image-Version festlegen; "release" folgt automatisch der neuesten Version ---
KARAKEEP_VERSION=0.34.0
# --- Pflicht-Secrets (niemals triviale Strings!) ---
NEXTAUTH_SECRET=HIER_ERZEUGTEN_WERT_1_EINTRAGEN
MEILI_MASTER_KEY=HIER_ERZEUGTEN_WERT_2_EINTRAGEN
# --- Basis-URL (PFLICHT: bei Reverse-Proxy auf öffentliche HTTPS-URL ändern) ---
NEXTAUTH_URL=http://localhost:3000
# --- KI-Features (optional, aber empfohlen für Auto-Tagging) ---
# OPENAI_API_KEY=sk-...
# Alternativ Ollama (NICHT localhost verwenden, siehe Troubleshooting):
# OLLAMA_BASE_URL=http://host.docker.internal:11434
# INFERENCE_TEXT_MODEL=llama3
# --- Sicherheit: nach Anlegen des ersten Kontos auf true setzen ---
DISABLE_SIGNUPS=false
# --- SQLite-Performance (empfohlen) ---
DB_WAL_MODE=trueSchützen Sie die Datei vor unbefugtem Lesen:
$ chmod 600 /opt/karakeep/.envls -la /opt/karakeep/.env zeigt Berechtigungen -rw-------. grep -c HIER_ /opt/karakeep/.env liefert 0, beide Platzhalter sind also ersetzt.
Schritt 3: compose.yaml anlegen
Erstellen Sie die compose.yaml im Projektordner. Der Stack besteht aus drei Services: web (Karakeep-Haupt-Container mit Web-UI und Worker), chrome (Headless-Browser für Crawling und Screenshots, seit August 2026 ein eigenes Karakeep-Image statt des nicht mehr gepflegten Alpine-Chrome) und meilisearch (Volltext-Suchindex). Gegenüber der offiziellen Datei ergänzt diese Fassung depends_on, damit Suche und Browser vor der App starten.
# /opt/karakeep/compose.yaml
services:
web:
image: ghcr.io/karakeep-app/karakeep:${KARAKEEP_VERSION:-release}
restart: unless-stopped
volumes:
- data:/data
ports:
# Nur im LAN nutzen; für Internetzugriff Reverse Proxy und 127.0.0.1 (Schritt 7)
- "3000:3000"
env_file:
- .env
environment:
MEILI_ADDR: http://meilisearch:7700
BROWSER_WEB_URL: http://chrome:9222
DATA_DIR: /data
depends_on:
meilisearch:
condition: service_started
chrome:
condition: service_started
chrome:
image: ghcr.io/karakeep-app/karakeep-chrome:154.0.8037.57-r1
restart: unless-stopped
init: true
command:
- --disable-gpu
- --disable-dev-shm-usage
- --hide-scrollbars
- --disable-blink-features=AutomationControlled
- --window-size=1440,900
meilisearch:
image: getmeili/meilisearch:v1.41.0
restart: unless-stopped
env_file:
- .env
environment:
MEILI_NO_ANALYTICS: "true"
volumes:
- meilisearch:/meili_data
volumes:
data:
meilisearch:Die wichtigsten Eckdaten des Stacks im Überblick:
| Parameter | Wert | Hinweis |
|---|---|---|
| Image (Karakeep) | ghcr.io/karakeep-app/karakeep:0.34.0 | Multi-Arch AMD64/ARM64 |
| Image (Suche) | getmeili/meilisearch:v1.41.0 | Vom Projekt festgelegte Version, nicht eigenständig aktualisieren |
| Image (Browser) | ghcr.io/karakeep-app/karakeep-chrome:154.0.8037.57-r1 | Google Chrome für Crawling |
| Port nach außen | 3000 | Web-UI und API; Pflicht |
| Ports intern | 7700, 9222 | Nur Container-intern, nicht freigeben |
Volume data | /data im Container | SQLite-DB + Assets; Pflicht-Backup |
Volume meilisearch | /meili_data im Container | Suchindex; bei Verlust neu indexieren |
| Datenbank | SQLite | Kein separater DB-Server nötig |
Prüfen Sie die Syntax mit docker compose -f /opt/karakeep/compose.yaml config. Die Ausgabe zeigt die aufgelöste Konfiguration ohne Fehlermeldung.
Schritt 4: Stack starten
Starten Sie alle drei Container im Hintergrund. Beim ersten Start lädt Docker die Images, je nach Verbindung 1 bis 3 Minuten.
$ cd /opt/karakeep
$ docker compose up -dPrüfen Sie danach den Status:
$ docker compose psErwartete Ausgabe (alle Services Up oder running):
NAME IMAGE STATUS
karakeep-web-1 ghcr.io/karakeep-app/karakeep:0.34.0 Up
karakeep-chrome-1 ghcr.io/karakeep-app/karakeep-chrome:154.0.8037.57-r1 Up
karakeep-meilisearch-1 getmeili/meilisearch:v1.41.0 UpPrüfen Sie die Logs auf Fehler:
$ docker compose logs --tail=50 web
$ docker compose logs --tail=20 meilisearchcurl -I http://localhost:3000 liefert HTTP/1.1 200 OK oder einen 302-Redirect auf die Login-Seite. Im Web-Log erscheinen keine Fehler zu fehlenden Umgebungsvariablen oder Volume-Problemen.
Schritt 5: Erst-Einrichtung im Browser
Öffnen Sie http://<HOST-IP>:3000 im Browser und registrieren Sie über „Sign Up“ das erste Konto; es erhält Administratorrechte. Danach fügen Sie Bookmarks per URL oder Drag & Drop hinzu, legen Notizen an und laden Bilder hoch.
Sperren Sie danach neue Registrierungen, sonst kann jeder mit Zugriff auf Port 3000 ein Konto anlegen. Setzen Sie in /opt/karakeep/.env:
DISABLE_SIGNUPS=truedocker compose restart reicht nicht, Umgebungsvariablen liest Docker erst beim Neuanlegen der Container:
$ cd /opt/karakeep
$ docker compose up -dBrowser-Erweiterungen und die Apps für iOS und Android verbinden Sie mit Ihrer Instanz, indem Sie dort die Server-URL eintragen.
Legen Sie testweise einen Bookmark an. Nach wenigen Sekunden erscheinen Vorschaubild und Seiteninhalt. Die Registrierungsseite zeigt nach der Sperre keinen „Sign Up“-Knopf mehr.
Schritt 6: KI-Auto-Tagging aktivieren (optional)
Karakeep läuft ohne KI-Anbindung; manuelles Tagging und Volltextsuche funktionieren immer. Für automatisches Tagging und Zusammenfassen gibt es zwei Wege:
Option A, OpenAI: Tragen Sie Ihren API-Key in die .env ein:
OPENAI_API_KEY=sk-...
INFERENCE_TEXT_MODEL=gpt-4o-mini
INFERENCE_IMAGE_MODEL=gpt-4o-miniOption B, Ollama (lokal, ohne Cloud-Dienst): Voraussetzung ist eine laufende Ollama-Instanz. localhost zeigt im Container auf den Container selbst. Nutzen Sie die IP des Ollama-Hosts; host.docker.internal funktioniert unter Linux nur mit extra_hosts: ["host.docker.internal:host-gateway"] im Dienst web. Ollama muss dafür auf einer erreichbaren Adresse lauschen (OLLAMA_HOST=0.0.0.0: Port 11434 nicht ins Internet freigeben):
OLLAMA_BASE_URL=http://host.docker.internal:11434
INFERENCE_TEXT_MODEL=llama3Erstellen Sie die Container nach jeder .env-Änderung mit docker compose up -d neu. Eine eigene Ollama-Instanz richtet die Anleitung Ollama und Open WebUI mit Docker ein.
Fügen Sie einen neuen Bookmark hinzu und warten Sie 10 bis 30 Sekunden. In der Detailansicht erscheinen automatisch erzeugte Tags. Bei Fehlern: docker compose logs web | grep -i error.
Schritt 7: Reverse Proxy und HTTPS (Produktionsbetrieb)
Für den Zugriff von außen stellen Sie Karakeep hinter einen Reverse Proxy mit HTTPS. Setzen Sie NEXTAUTH_URL in der .env auf die öffentliche URL und erstellen Sie die Container neu, sonst schlagen Anmelde-Weiterleitungen fehl:
NEXTAUTH_URL=https://karakeep.example.comLäuft der Proxy auf demselben Host, binden Sie Port 3000 an 127.0.0.1:3000:3000, damit Karakeep nicht zusätzlich unverschlüsselt erreichbar ist; ein Proxy-Container im selben Docker-Netz braucht gar keinen veröffentlichten Port. Eine vollständige Traefik-Anbindung beschreibt Traefik als Docker-Reverse-Proxy mit automatischem HTTPS einrichten.
curl -I https://karakeep.example.com liefert HTTP/2 200 oder 302. Im Web-Container-Log erscheinen keine Fehler zu ungültigen Redirects oder CSRF-Tokens.
Schritt 8: Updates und Backups
Updates: Sichern Sie zuerst das Volume data und lesen Sie die Release Notes. Tragen Sie dann die neue Version als KARAKEEP_VERSION in die .env ein und führen Sie aus:
$ cd /opt/karakeep
$ docker compose up -dMit KARAKEEP_VERSION=release erzwingt docker compose up --pull always -d die neueste Version. Neue Versionen melden lässt sich mit Watchtower mit Docker: Container automatisch aktualisieren (Modus nur benachrichtigen).
Update von 0.33.2 auf 0.34.0: Im Test genügten die neuen Tags in .env und compose.yaml (Karakeep 0.34.0: Browser karakeep-chrome:154.0.8037.57-r1) und docker compose up -d. Die Datenbankmigration lief beim Start, der Dienst web war nach wenigen Sekunden healthy, ein vorher angelegtes Lesezeichen und der API-Schlüssel funktionierten weiter, die Anmeldung gelang, ein falsches Passwort ergab 401, und ein neuer Link wurde samt Screenshot gecrawlt. Laut Release Notes ist Folgendes zu beachten:
- Einmal neu anmelden: Die Anmeldung läuft jetzt über better-auth mit Sitzungen in der Datenbank. Alle Web-Nutzer werden einmal abgemeldet, Apps und API-Schlüssel sind nicht betroffen.
- E-Mail-Adressen in Kleinbuchstaben: Das Update schreibt gespeicherte Adressen klein. Im Test wurde aus
Admin@Example.comadmin@example.com, die Anmeldung mit der kleingeschriebenen Adresse gelang. Gibt es zwei Konten, die sich nur in der Groß- und Kleinschreibung unterscheiden, löschen Sie vor dem Update das unbenutzte, sonst sperren Sie sich aus. - Neue Variable
AUTH_TRUSTED_ORIGINS: Standard ist*, also die Adresse, unter der die Anfrage ankam. Hinter einem Reverse Proxy können Sie sie auf Ihre öffentliche URL begrenzen.NEXTAUTH_URLundNEXTAUTH_SECRETbleiben Pflicht. - Browser-Image:
karakeep-chromeenthält jetzt Google Chrome statt der Headless Shell, damit weniger Seiten den Crawler blockieren. Das Image ist dadurch größer.
Backups: Das Volume data enthält die SQLite-Datenbank und alle Assets und ist das einzige kritische Backup-Ziel. Stoppen Sie vor dem Kopieren den Dienst web (docker compose stop web), damit die Datenbank konsistent gesichert wird. Den Volume-Pfad liefert:
$ sudo docker volume inspect karakeep_data --format '{{ .Mountpoint }}'Alternativ ersetzen Sie in der compose.yaml data:/data durch den Bind-Mount /opt/karakeep/data:/data. Verwenden Sie nie docker compose down -v: -v löscht alle benannten Volumes inklusive Datenbank unwiderruflich.
docker compose ps zeigt nach dem Update alle Services wieder als Up. Die Oberfläche zeigt unter den Einstellungen die neue Versionsnummer.
Troubleshooting / Typische Fehler
- Login-Redirect schlägt fehl / Sitzung nicht akzeptiert
NEXTAUTH_URLstimmt nicht mit der genutzten URL überein. Bei HTTPS-Betrieb hinter einem Reverse Proxy mussNEXTAUTH_URL=https://karakeep.example.comgesetzt und danachdocker compose up -dausgeführt werden.- Kein Screenshot, kein Seiten-Archiv
Der Chrome-Container läuft nicht oder ist nicht erreichbar. Prüfen Sie
docker compose logs chrome. Wer noch das alte Imagealpine-chromenutzt, stellt laut Projekt aufkarakeep-chromeum und entfernt dabei die Argumente--remote-debugging-*.- Auto-Tagging funktioniert nicht (OpenAI)
API-Key ungültig oder Konto ohne nutzbares Kontingent. Prüfen Sie
docker compose logs web | grep -i inferenceund das OpenAI-Konto, oder wechseln Sie auf Ollama.- Ollama nicht erreichbar
OLLAMA_BASE_URL=http://localhost:11434funktioniert im Container nicht. Korrekt: die Host-IP oderhttp://host.docker.internal:11434(unter Linux nur mitextra_hosts, siehe Schritt 6).- Meilisearch-Fehler „incompatible db version“
Nach einem Meilisearch-Upgrade ist der Suchindex inkompatibel. Meilisearch stoppen, Verzeichnis
data.msim Volume umbenennen, neu starten, dann unter Admin Settings → Background Jobs „Reindex All Bookmarks“ ausführen.- .env-Änderung hat keine Wirkung
docker compose restartreicht nicht, verwenden Siedocker compose up -d.- Falsches Ollama-Modell
INFERENCE_TEXT_MODEL=gpt-4o-minifunktioniert nur mit OpenAI. Bei Ollama ein lokal verfügbares Modell eintragen, zum Beispielllama3.
Häufige Fragen
Brauche ich einen OpenAI-Key, damit Karakeep funktioniert?
Nein. Volltextsuche, manuelles Tagging, Seiten-Archiv und Screenshots funktionieren ohne KI-Key; nur automatisches Tagging und Zusammenfassen entfallen. Alternativ nutzen Sie Ollama mit einem lokalen Modell.
Kann ich Karakeep auf einem Raspberry Pi oder Apple-Silicon-Mac betreiben?
Ja. Das Karakeep-Image und das Karakeep-Chrome-Image gibt es für linux/arm64; Docker lädt automatisch die passende Variante. Auf einem Raspberry Pi 4 mit 4 GB RAM läuft der Stack problemlos, wenn keine anderen speicherintensiven Dienste aktiv sind.
Wie sichere ich meine Daten am einfachsten?
Sichern Sie das Volume data bei gestopptem Dienst web, siehe Schritt 8. Mit dem Bind-Mount /opt/karakeep/data:/data genügt ein Verzeichnis-Backup.
Wie richte ich Karakeep hinter einem Reverse Proxy ein?
Wie in Schritt 7: NEXTAUTH_URL auf die öffentliche HTTPS-URL setzen und im Proxy auf Port 3000 weiterleiten. Die üblichen Forwarding-Header reichen aus.
Wie aktualisiere ich Meilisearch auf eine neue Version?
Nur wenn das Projekt es verlangt; Karakeep legt die Meilisearch-Version fest und rät von eigenen Upgrades ab. Nach einem Wechsel ist der alte Suchindex oft inkompatibel: Verzeichnis data.ms umbenennen und „Reindex All Bookmarks“ ausführen (siehe Troubleshooting). Die Bookmarks und Assets im data-Volume bleiben dabei unangetastet.
Gibt es Browser-Extensions und mobile Apps?
Ja. Extensions für Chrome, Firefox und Safari sowie Apps für iOS und Android sind über die offizielle Karakeep-Website und die jeweiligen Stores verfügbar. Nach der Installation tragen Sie in den App-Einstellungen die URL Ihrer Instanz ein.
Fazit
Karakeep bündelt Lesezeichen, Notizen und Dokumente in einem durchsuchbaren, selbst gehosteten Speicher. Der Stack bleibt überschaubar: drei Dienste, SQLite statt PostgreSQL, benannte Volumes für Daten und Suchindex. Die KI-Funktionen sind optional und laufen mit Ollama auch vollständig lokal. Für den Einstieg in lokale KI eignet sich Ollama und Open WebUI mit Docker. Wer darüber hinaus ein hierarchisches Notizsystem sucht, findet mit TriliumNext Notes mit Docker eine Ergänzung für strukturierte Notizen.
Weiterführende Anleitungen und Quellen
- Docker-Container automatisch aktualisieren
- Docker und Docker Compose auf Linux installieren, die Self-Hosting-Grundlage
- Traefik als Docker-Reverse-Proxy mit automatischem HTTPS einrichten
- Ollama und Open WebUI mit Docker: eigenes lokales KI-Sprachmodell
- Watchtower mit Docker: Container automatisch aktualisieren
- TriliumNext Notes mit Docker: Hierarchisches Notizsystem
Offizielle Quellen: Karakeep Dokumentation, Docker-Installation | Karakeep GitHub-Repository | Karakeep Konfigurationsreferenz


