---
okf: "0.1"
type: incident
visibility: private
status: active
updated: 2026-08-03
links:
  - ../phases/backlog.md
---

## Fix: paperless-worker@SOLARIA — dwa bugi configu, naprawione i zweryfikowane na żywo (2026-07-12)

**Kontekst.** Moduł 3 (`services/paperless-worker/`, split-host OCR worker) był
zdeployowany i brał zadania z kolejki, ale miał dwa bugi w compose:

1. **`command: celery ...` nie odpalał celery.** Obraz paperless-ngx
   (`/sbin/docker-entrypoint.sh`) routuje każdy argument NIE zaczynający się
   od `/` do `manage.py` — więc `celery` lądował jako nieznana subkomenda
   Django, nie jako program. Fix: `command: /usr/sbin/gosu paperless
   /usr/local/bin/celery ...` (ścieżka absolutna wchodzi w gałąź `exec "$@"`
   entrypointu; `gosu paperless` z przodu bo ta gałąź nie dostaje automatycznego
   gosu, inaczej proces poszedłby jako root i zepsuł właściciela plików na NFS).
2. **Brak współdzielonego `SCRATCH_DIR`.** Paperless@PIHA staguje wgrywany
   plik w `/tmp/paperless` (domyślny `SCRATCH_DIR`) i niesie tę ścieżkę w
   payloadzie zadania celery jako ścieżkę absolutną. Worker@SOLARIA miał
   własny, lokalny `/tmp/paperless` — gdy odbierał zadanie zamiast workera
   PIHA, padał `Cannot consume ...: File not found`. Fix: NFS volume
   `paperless_scratch` (ten sam wzorzec co `data/media/consume`) na
   `/opt/homelab/data/paperless/scratch` (już istniał na PIHA, `chown 1000:1000`),
   mount na `/tmp/paperless` po obu stronach.

Oba fixy + uzasadnienie: `services/paperless/docker-compose.yml`,
`services/paperless-worker/docker-compose.yml`, `kb/services/paperless-worker.md`.
Zweryfikowane end-to-end na żywo (branch `task/paperless-worker-fix`, jeszcze
niezmergowany do master w momencie pisania tego wpisu): 3 dokumenty testowe
wrzucone do `consume/` na PIHA, jeden odebrany i dokończony przez worker@SOLARIA
(log: `ocrmypdf`/`tesseract` → `ConsumeTaskPlugin completed with: Success`),
zero `File not found`. Dokumenty testowe usunięte po teście (`document.delete()`
+ ręczny cleanup plików) — produkcyjne 6 dokumentów nietknięte.

**Otwarte (świadomie odłożone, nie blokuje działania):**
- `hosts/solaria/services.yaml` i `inventory/topology.yaml` nie mają wpisu
  `paperless-worker` (SOLARIA ma tam tylko `node-agent`) — było zaplanowane w
  cutover checkliście README jako krok "przy deployu", ale nigdy nie zrobione.
  Bez tego wpisu supervisor/observer nie widzą tego serwisu w desired-state —
  drift (np. worker padnie i nie wstanie) nie zostanie automatycznie wykryty
  przez agent system, tylko przez brak przetwarzania kolejki.
- Test formalnego fallbacku (stop worker@SOLARIA → kolejka mieli na PIHA →
  start → drenaż) nie był wykonany w tej sesji — mechanizm nie zmienił się
  tym fixem (był już OK), ale warto zweryfikować przy okazji.

