From 91f5b863168f33025ec9f61062ccd8881c3db7d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hartmut=20N=C3=B6renberg?= Date: Fri, 6 Mar 2026 21:11:15 +0100 Subject: [PATCH] docs: learning erfasst - @shared_task vs @celery_app.task, SQLAlchemy model registry, RENDER_SCRIPTS_DIR Co-Authored-By: Claude Sonnet 4.6 --- LEARNINGS.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/LEARNINGS.md b/LEARNINGS.md index bc1c8ab..fad2721 100644 --- a/LEARNINGS.md +++ b/LEARNINGS.md @@ -7,6 +7,18 @@ ## Learnings +### 2026-03-06 | Celery | `@shared_task` verbindet sich mit localhost statt Redis-Container +**Problem**: Neuer Celery-Task in `app/domains/materials/tasks.py` mit `@shared_task` (aus `celery`) statt `@celery_app.task` — beim Aufruf via FastAPI-Endpoint kam `kombu.exceptions.OperationalError: [Errno 111] Connection refused` weil `@shared_task` keinen expliziten App-Kontext hat und daher den Default-Broker `localhost:6379` nutzt, nicht `redis://redis:6379/0`. +**Lösung**: Immer `from app.tasks.celery_app import celery_app` importieren und `@celery_app.task(...)` nutzen. `@shared_task` nur verwenden wenn der Modul garantiert nach `celery_app.py` geladen wird (was in Domain-Modulen nicht der Fall ist). + +### 2026-03-06 | SQLAlchemy | Relationship-Auflösung schlägt fehl wenn Models nicht alle importiert sind +**Problem**: Celery-Task importierte nur `AssetLibrary`, aber `Material.creator` hat eine String-Relationship zu `"User"`. SQLAlchemy kann den String-Verweis nur auflösen wenn `User` bereits im Mapper registriert ist → `InvalidRequestError: 'User' failed to locate a name`. +**Lösung**: `import app.models # noqa: F401` vor dem ersten DB-Zugriff in Celery-Tasks einfügen. Das `__init__.py` importiert alle 14 Modelle und registriert sie alle im SQLAlchemy-Mapper. + +### 2026-03-06 | Blender / Scripts | `catalog_assets.py` Pfad in Docker falsch +**Problem**: Script-Pfad via `Path(__file__).parent...` aufgelöst — in Docker zeigt `__file__` auf den Python-Pfad im `backend`-Container, nicht im `render-worker`. Der render-worker kopiert Scripts nach `/render-scripts/` (via `COPY render-worker/scripts/ /render-scripts/`). +**Lösung**: `RENDER_SCRIPTS_DIR` Env-Var nutzen: `Path(os.environ.get("RENDER_SCRIPTS_DIR", "/render-scripts")) / "catalog_assets.py"` — identisch zur Konvention in `domains/rendering/tasks.py`. + ### 2026-01-15 | Architektur | Backend-Port-Konflikt **Problem:** FastAPI standardmäßig auf Port 8000 — war auf dem Entwicklungsrechner belegt **Lösung:** Port 8888 in `docker-compose.yml` und Vite-Proxy konfiguriert