Karakeep
v1.0.0Save and search bookmarks, notes, and images with optional AI tagging.
x-arcane:
icon: "https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/karakeep.svg"
urls:
- "https://docs.karakeep.app/installation/docker"
services:
karakeep:
image: "ghcr.io/karakeep-app/karakeep:release"
restart: "unless-stopped"
ports:
- "${PORT:-3000}:3000"
environment:
DATA_DIR: "/data"
MEILI_ADDR: "http://meilisearch:7700"
MEILI_MASTER_KEY: "${MEILI_MASTER_KEY:?Set MEILI_MASTER_KEY in .env}"
BROWSER_WEB_URL: "http://chrome:9222"
NEXTAUTH_URL: "${NEXTAUTH_URL:-http://localhost:3000}"
NEXTAUTH_SECRET: "${NEXTAUTH_SECRET:?Set NEXTAUTH_SECRET in .env}"
DISABLE_SIGNUPS: "${DISABLE_SIGNUPS:-false}"
volumes:
- "data:/data"
depends_on:
chrome:
condition: "service_healthy"
meilisearch:
condition: "service_healthy"
labels:
com.getarcaneapp.arcane.icon: "https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/karakeep.svg"
chrome:
image: "ghcr.io/karakeep-app/karakeep-chrome:release"
restart: "unless-stopped"
init: true
command:
- "--disable-gpu"
- "--disable-dev-shm-usage"
- "--hide-scrollbars"
- "--disable-blink-features=AutomationControlled"
- "--window-size=1440,900"
healthcheck:
test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://localhost:9222/json/version"]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
labels:
com.getarcaneapp.arcane.icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/karakeep.svg
meilisearch:
image: "getmeili/meilisearch:v1.41.0"
restart: "unless-stopped"
environment:
MEILI_MASTER_KEY: "${MEILI_MASTER_KEY:?Set MEILI_MASTER_KEY in .env}"
MEILI_NO_ANALYTICS: "true"
volumes:
- "search-data:/meili_data"
healthcheck:
test:
- "CMD"
- "curl"
- "-f"
- "http://localhost:7700/health"
interval: "10s"
timeout: "5s"
retries: 10
start_period: "30s"
labels:
com.getarcaneapp.arcane.icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/meilisearch.svg
volumes:
data: {}
search-data: {}
# Replace every change-me with an independent secret before deployment.
# Generate secrets with: openssl rand -hex 32
PORT=3000
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=change-me
MEILI_MASTER_KEY=change-me
DISABLE_SIGNUPS=false
README
Save and search bookmarks, notes, and images with optional AI tagging.
Copy .env.example to .env, review the settings, then run docker compose up -d. In Arcane, import the template and supply the same environment variables. Replace every change-me value before starting. Generate independent secrets with openssl rand -hex 32; use hexadecimal database passwords so connection URLs need no escaping. Use docker compose ps and docker compose logs to check startup.
Open NEXTAUTH_URL and create the first account. Set DISABLE_SIGNUPS=true after provisioning users. The data volume stores SQLite and archived files; Meilisearch stores indexes. Chrome runs internally for crawling. AI features require additional provider configuration and are not enabled here.
Named volumes preserve server data across container recreation. Back up these volumes before upgrades; docker compose down -v deletes them. Set PORT to an unused host port. For remote browser access, put HTTPS in front of the application and update its public URL setting where provided.
Upstream documentation: Karakeep deployment.