From 6fbc778c1f48bf2a13ba98baa89a7358ea89532a Mon Sep 17 00:00:00 2001 From: Vadim Malanov Date: Wed, 8 Jul 2026 22:33:01 +0300 Subject: [PATCH] fix(ingest): flush Document before FK inserts; build fixes; shared-minio overlay --- .gitignore | 2 ++ app/ingestion/knowledge_ingest.py | 7 +++++ docker-compose.shared-minio.yml | 28 ++++++++++++++++++ docker/Dockerfile | 8 +++++ ..._recognition_engine-0.1.0-py3-none-any.whl | Bin 0 -> 6425 bytes 5 files changed, 45 insertions(+) create mode 100644 docker-compose.shared-minio.yml create mode 100644 docker/wheels/teamhub_document_recognition_engine-0.1.0-py3-none-any.whl diff --git a/.gitignore b/.gitignore index c6707d4..7c807d1 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,5 @@ var/ # local preview launch config frontend/.claude/ .claude/launch.json + +.env.*.bak diff --git a/app/ingestion/knowledge_ingest.py b/app/ingestion/knowledge_ingest.py index f945d35..c45d0d2 100644 --- a/app/ingestion/knowledge_ingest.py +++ b/app/ingestion/knowledge_ingest.py @@ -139,6 +139,13 @@ class SqlAlchemyKnowledgeIngestRepository: if existing_doc.status == DocumentStatus.DISCOVERED: existing_doc.status = DocumentStatus.STORED_ORIGINAL + # Flush the Document row before FK-dependent inserts: there is no + # ORM relationship between AssetIngestJob/DocumentArtifact and + # Document, so the unit of work does not order these INSERTs and + # PostgreSQL rejects the job row with a ForeignKeyViolation + # (SQLite-based tests do not enforce FKs, hence unseen there). + db.flush() + ensure_artifact( db, document_id=document_id, diff --git a/docker-compose.shared-minio.yml b/docker-compose.shared-minio.yml new file mode 100644 index 0000000..a3119b7 --- /dev/null +++ b/docker-compose.shared-minio.yml @@ -0,0 +1,28 @@ +# Shared-minio migration overlay (phase 1 of +# TeamHUB-Platform/docs/submodules/plans/2026-07-08-shared-minio-migration-prompt.md). +# Attaches ONLY api and worker to the shared teamhub_net so they can reach the +# platform MinIO (alias teamhub-minio) from container start. Unlike +# docker-compose.teamhub.yml this overlay does not strip host ports from data +# services and does not enable AUTH_REQUIRE_IDENTITY - local debug contour. +# +# Usage: +# docker compose -f docker-compose.yml -f docker-compose.shared-minio.yml up -d --no-deps api worker + +networks: + teamhub_net: + external: true + name: teamhub_net + +services: + api: + networks: + edge: {} + legacyhub_db: {} + teamhub_net: + aliases: [legacyhub-api] + + worker: + networks: + edge: {} + legacyhub_db: {} + teamhub_net: {} diff --git a/docker/Dockerfile b/docker/Dockerfile index bd0883a..c7fce41 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -22,6 +22,7 @@ RUN apt-get update \ build-essential \ curl \ ca-certificates \ + git \ ghostscript \ qpdf \ unpaper \ @@ -51,7 +52,14 @@ COPY pyproject.toml README.md alembic.ini /app/ COPY app /app/app COPY scripts /app/scripts +# Local build: install the recognition engine from a pre-built wheel (the +# pinned git source lives in a private GitHub repo unreachable from the build +# container without credentials), then relax the pyproject pin to a version +# spec inside this layer only - the repo file stays untouched. +COPY docker/wheels /tmp/wheels RUN pip install --upgrade pip wheel setuptools \ + && pip install /tmp/wheels/*.whl \ + && sed -i 's|"teamhub-document-recognition-engine @ git+[^"]*"|"teamhub-document-recognition-engine>=0.1.0"|' pyproject.toml \ && pip install -e . RUN mkdir -p /data/input /data/work diff --git a/docker/wheels/teamhub_document_recognition_engine-0.1.0-py3-none-any.whl b/docker/wheels/teamhub_document_recognition_engine-0.1.0-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..c6c2d712d5bbc8f3c3ac5eba965621639b5d2461 GIT binary patch literal 6425 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 GjQ$5U4QJ^9 literal 0 HcmV?d00001