882ac14309
gates / gates (push) Successful in 2s
Bookmarks/articles/notes with a crawler (karakeep-chrome) and search (meilisearch v1.41.0). AI off unless the household enters a key; setup gate + sign-up closed twice; Chrome healthcheck over bash /dev/tcp; smtp_mapping (plaintext), mail-off boot measured; web memory 768M -> 1536M on measurements (bench watch, box crawl burst). onboarding/karakeep.md complete. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
128 lines
5.2 KiB
YAML
128 lines
5.2 KiB
YAML
# Karakeep - Könyvjelzők, cikkek és jegyzetek mentése (a korábbi Hoarder)
|
|
# Domain: ${SUBDOMAIN}.${DOMAIN}
|
|
# Database: SQLite (in the data volume) + Meilisearch (search index) + a headless Chrome (the crawler)
|
|
# RAM: ~700M (mem_limit: 2816M total — web 1536M + chrome 768M + meilisearch 512M) | Pi-compatible: No (Chrome + Meilisearch)
|
|
#
|
|
# Environment variables:
|
|
# DOMAIN - Your domain (e.g., demo-felhom.eu)
|
|
# NEXTAUTH_SECRET - Munkamenet-aláíró kulcs (generált)
|
|
# MEILI_MASTER_KEY - A keresőindex kulcsa (generált; csak a belső hálón használt)
|
|
# OPENAI_API_KEY - NEM KÖTELEZŐ. Üresen az AI-címkézés KI van kapcsolva (Karakeep: `isConfigured = !!OPENAI_API_KEY ||
|
|
# !!OLLAMA_BASE_URL`). Ha a háztartás megadja, a könyvjelzők szövege az OpenAI-hoz kerül.
|
|
# SIGNUP_CLOSED - after_setup (decision 47): the box sets it when the household's first account exists. Karakeep's
|
|
# DISABLE_SIGNUPS also refuses the FIRST account, so the default here must stay OPEN.
|
|
#
|
|
# Mirrors upstream's docker/docker-compose.yml (web + karakeep-chrome + meilisearch v1.41.0, MEILI_NO_ANALYTICS),
|
|
# pinned, with the new-release check off (it would call api.github.com) and the crawler's own defaults kept: it fetches
|
|
# every bookmarked page — that IS the product — and an ad-block list at start (CRAWLER_ENABLE_ADBLOCKER).
|
|
|
|
services:
|
|
karakeep:
|
|
image: ghcr.io/karakeep-app/karakeep:0.33.2
|
|
container_name: karakeep
|
|
restart: unless-stopped
|
|
environment:
|
|
- TZ=Europe/Budapest
|
|
- DATA_DIR=/data
|
|
- NEXTAUTH_URL=https://${SUBDOMAIN}.${DOMAIN}
|
|
- NEXTAUTH_SECRET=${NEXTAUTH_SECRET}
|
|
- MEILI_ADDR=http://karakeep-meilisearch:7700
|
|
- MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
|
|
- BROWSER_WEB_URL=http://karakeep-chrome:9222
|
|
- DISABLE_NEW_RELEASE_CHECK=true
|
|
- DISABLE_SIGNUPS=${SIGNUP_CLOSED:-false}
|
|
- OPENAI_API_KEY=${OPENAI_API_KEY:-}
|
|
# App-email (smtp_mapping, tls_mode plaintext → the shim's :2526, which advertises no STARTTLS: Karakeep's mailer
|
|
# has no switch to accept the shim's self-signed certificate). Empty SMTP_HOST = mail OFF; measured 2026-10-01 that a
|
|
# fresh install with these EMPTY boots and signs up (checklist 7.1).
|
|
- SMTP_HOST=${SMTP_HOST:-}
|
|
- SMTP_PORT=${SMTP_PORT:-587}
|
|
- SMTP_FROM=${SMTP_FROM:-}
|
|
volumes:
|
|
- karakeep_data:/data
|
|
networks:
|
|
- traefik-public
|
|
- karakeep-internal
|
|
depends_on:
|
|
karakeep-meilisearch:
|
|
condition: service_healthy
|
|
# 1536M (measured 2026-10-01): the web container also runs the crawler workers. Bench 10-minute watch: 79 % of 768M,
|
|
# 51 % of 1024M; on the box, real pages crawled (a Wikipedia article among them) took it to 822 MiB = 80.3 % of 1024M.
|
|
# So the household's ordinary act — saving a heavy page — needs room; the burst is re-measured at 1536M (record 5.2).
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
memory: 1536M
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "wget -q -O - http://127.0.0.1:3000/api/health || curl -fsS http://127.0.0.1:3000/api/health"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
retries: 3
|
|
start_period: 60s
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.karakeep.rule=Host(`${SUBDOMAIN}.${DOMAIN}`)"
|
|
- "traefik.http.routers.karakeep.entrypoints=websecure"
|
|
- "traefik.http.routers.karakeep.tls=true"
|
|
- "traefik.http.routers.karakeep.tls.certresolver=letsencrypt"
|
|
- "traefik.http.services.karakeep.loadbalancer.server.port=3000"
|
|
|
|
karakeep-chrome:
|
|
image: ghcr.io/karakeep-app/karakeep-chrome:151.0.7922.47-r1
|
|
container_name: karakeep-chrome
|
|
restart: unless-stopped
|
|
init: true
|
|
command:
|
|
- --disable-gpu
|
|
- --disable-dev-shm-usage
|
|
- --hide-scrollbars
|
|
- --disable-blink-features=AutomationControlled
|
|
- --window-size=1440,900
|
|
networks:
|
|
- karakeep-internal
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
memory: 768M
|
|
# The image has no wget/curl/node (inspected one tool per run, 2026-10-01) but has bash: ask Chrome's own DevTools
|
|
# endpoint (socat on 9222 → headless-shell on 9223) for its version over a raw HTTP/1.1 request (HTTP/1.0 got no
|
|
# answer — measured 2026-10-01 on the bench).
|
|
healthcheck:
|
|
test: ["CMD", "bash", "-c", "exec 3<>/dev/tcp/127.0.0.1/9222 && printf 'GET /json/version HTTP/1.1\\r\\nHost: 127.0.0.1\\r\\nConnection: close\\r\\n\\r\\n' >&3 && grep -q Browser <&3"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
retries: 3
|
|
start_period: 20s
|
|
|
|
karakeep-meilisearch:
|
|
image: getmeili/meilisearch:v1.41.0
|
|
container_name: karakeep-meilisearch
|
|
restart: unless-stopped
|
|
environment:
|
|
- TZ=Europe/Budapest
|
|
- MEILI_NO_ANALYTICS=true
|
|
- MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
|
|
volumes:
|
|
- karakeep_meili:/meili_data
|
|
networks:
|
|
- karakeep-internal
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
memory: 512M
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:7700/health || wget -q -O - http://127.0.0.1:7700/health"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
retries: 3
|
|
start_period: 20s
|
|
|
|
volumes:
|
|
karakeep_data:
|
|
karakeep_meili:
|
|
|
|
networks:
|
|
traefik-public:
|
|
external: true
|
|
karakeep-internal:
|