Embedding-Service: kontrolliertes Deployment und Live-Verifikation #13

Closed
opened 2026-08-11 07:29:05 +02:00 by zwuge · 5 comments
Owner

Ziel

Den bereits lokal implementierten CPU-only fastembed/ONNX-Embedding-Service kontrolliert auf dem DGX Spark bereitstellen und live verifizieren.

Scope

  • vorab provisionierte, gepinnte Modellrevision e9b6763023c676ca8431644204f50c2b100d9aab ohne unkontrollierten Downloadpfad
  • reproduzierbares Packaging und exakte systemd-/Secret-/TLS-/Firewall-Ausführung
  • Unified-Memory-Readiness-Schwelle aus einer belegten Baseline ableiten
  • healthz, readyz, Auth-, Limit-, 429/503-, Dimensions- und synthetischer Embedding-Smoke-Test
  • echter HTTPS-E2E-Lauf vom autorisierten secondbrain-mcp-Client mit synthetischen Texten
  • kontrollierter Rollback-Nachweis auf die vorherige Service-/Modellrevision
  • Abschluss-Evidence in Forgejo und Second Brain

Nicht im Scope

  • keine Änderung am Qwen-/vLLM-Container oder dessen Parametern
  • keine Änderung an Qdrant, Hybrid-Suche oder Queue-/Retry-Verantwortung von secondbrain-mcp
  • keine Produktionsdaten, Notiztexte oder Secrets in Logs/Evidence
  • keine weiteren Architekturentscheidungen ohne separate Freigabe

Abnahmekriterien

  1. Lokale Contract-Tests, Lint und Typprüfung sind grün.
  2. Spark-Service läuft CPU-only über HTTPS mit restriktivem Bearer-Token.
  3. Readiness verweigert Inferenz bei fehlendem Modell, Ressourcenknappheit oder Belegung.
  4. Logs enthalten keine Tokens, Request-Bodies oder Textinhalte.
  5. Qwen-Baseline bleibt vor/nach dem Smoke-Test innerhalb der festgelegten Grenze.
  6. secondbrain-mcp-E2E, Rollback und alle Reifegrade sind mit Evidence dokumentiert.

Quellen

  • docs/adr/0001-separater-embedding-service.md
  • CONTEXT.md
  • [[3000-Projects/3090-dgx-spark/season-ae-embedding-interface-handoff]]
  • [[3000-Projects/3090-dgx-spark/sessions/2026-08-11-season-af-baseline]]
  • [[2029-DGX-Spark]]
## Ziel Den bereits lokal implementierten CPU-only `fastembed`/ONNX-Embedding-Service kontrolliert auf dem DGX Spark bereitstellen und live verifizieren. ## Scope - vorab provisionierte, gepinnte Modellrevision `e9b6763023c676ca8431644204f50c2b100d9aab` ohne unkontrollierten Downloadpfad - reproduzierbares Packaging und exakte systemd-/Secret-/TLS-/Firewall-Ausführung - Unified-Memory-Readiness-Schwelle aus einer belegten Baseline ableiten - `healthz`, `readyz`, Auth-, Limit-, `429`/`503`-, Dimensions- und synthetischer Embedding-Smoke-Test - echter HTTPS-E2E-Lauf vom autorisierten `secondbrain-mcp`-Client mit synthetischen Texten - kontrollierter Rollback-Nachweis auf die vorherige Service-/Modellrevision - Abschluss-Evidence in Forgejo und Second Brain ## Nicht im Scope - keine Änderung am Qwen-/vLLM-Container oder dessen Parametern - keine Änderung an Qdrant, Hybrid-Suche oder Queue-/Retry-Verantwortung von `secondbrain-mcp` - keine Produktionsdaten, Notiztexte oder Secrets in Logs/Evidence - keine weiteren Architekturentscheidungen ohne separate Freigabe ## Abnahmekriterien 1. Lokale Contract-Tests, Lint und Typprüfung sind grün. 2. Spark-Service läuft CPU-only über HTTPS mit restriktivem Bearer-Token. 3. Readiness verweigert Inferenz bei fehlendem Modell, Ressourcenknappheit oder Belegung. 4. Logs enthalten keine Tokens, Request-Bodies oder Textinhalte. 5. Qwen-Baseline bleibt vor/nach dem Smoke-Test innerhalb der festgelegten Grenze. 6. `secondbrain-mcp`-E2E, Rollback und alle Reifegrade sind mit Evidence dokumentiert. ## Quellen - `docs/adr/0001-separater-embedding-service.md` - `CONTEXT.md` - `[[3000-Projects/3090-dgx-spark/season-ae-embedding-interface-handoff]]` - `[[3000-Projects/3090-dgx-spark/sessions/2026-08-11-season-af-baseline]]` - `[[2029-DGX-Spark]]`
Author
Owner

Read-only Deployment-Inventur am 2026-08-11:

  • Spark erreichbar: Ubuntu 24.04.4, Python 3.11.15 in /home/pirate/.hermes/hermes-agent/venv.
  • FastEmbed und FastAPI sind in dieser Venv vorhanden.
  • Gepinnter Nomic-Modellcache wurde nicht gefunden; vor Start muss das Artefakt kontrolliert provisioniert werden.
  • Keine Embedding-systemd-Unit, keine /etc/embedding-service-Dateien und keine TLS-/Secret-Dateien vorhanden.
  • RAM: 121 GiB gesamt, 47 GiB verfügbar; Disk: 916 GiB gesamt, 697 GiB frei.
  • Bestehende Listener/Dienste unverändert: vLLM :8000, Qdrant :6333, Hermes 8642/8643; kein Embedding-Port.

Noch keine Live-Änderung. Nächster lokaler Schritt: reproduzierbare Unit-/Installationsvorlagen ohne Secrets und ohne unpinned Downloadpfad ergänzen.

Read-only Deployment-Inventur am 2026-08-11: - Spark erreichbar: Ubuntu 24.04.4, Python 3.11.15 in `/home/pirate/.hermes/hermes-agent/venv`. - FastEmbed und FastAPI sind in dieser Venv vorhanden. - Gepinnter Nomic-Modellcache wurde nicht gefunden; vor Start muss das Artefakt kontrolliert provisioniert werden. - Keine Embedding-systemd-Unit, keine `/etc/embedding-service`-Dateien und keine TLS-/Secret-Dateien vorhanden. - RAM: 121 GiB gesamt, 47 GiB verfügbar; Disk: 916 GiB gesamt, 697 GiB frei. - Bestehende Listener/Dienste unverändert: vLLM :8000, Qdrant :6333, Hermes 8642/8643; kein Embedding-Port. Noch keine Live-Änderung. Nächster lokaler Schritt: reproduzierbare Unit-/Installationsvorlagen ohne Secrets und ohne unpinned Downloadpfad ergänzen.
Author
Owner

Lokale Readiness-Artefakte ergänzt und verifiziert:

  • deploy/embedding-service/embedding-service.service
  • deploy/embedding-service/environment.example
  • deploy/embedding-service/README.md mit kontrollierter Reihenfolge und Rollback-Grenze
  • git diff --check: bestanden
  • tests/test_embedding_service.py: 11 passed; eine bekannte FastAPI/Starlette-Deprecation-Warnung

Noch kein Commit, Push, Modell-Download, Secret-/TLS-Schritt, Firewall-Schritt oder Service-Start. Diese Aktionen bleiben die nächste getrennte Ausführungsphase des Issues.

Lokale Readiness-Artefakte ergänzt und verifiziert: - `deploy/embedding-service/embedding-service.service` - `deploy/embedding-service/environment.example` - `deploy/embedding-service/README.md` mit kontrollierter Reihenfolge und Rollback-Grenze - `git diff --check`: bestanden - `tests/test_embedding_service.py`: 11 passed; eine bekannte FastAPI/Starlette-Deprecation-Warnung Noch kein Commit, Push, Modell-Download, Secret-/TLS-Schritt, Firewall-Schritt oder Service-Start. Diese Aktionen bleiben die nächste getrennte Ausführungsphase des Issues.
Author
Owner

Sicherheitsbefund und Fix abgeschlossen:

FastEmbed 0.8.0 verwirft beim konkreten Modell-Loader den Revisionsparameter; der vorherige Code hätte daher keinen sicheren Pin garantiert und übergab beim Runtime-embed() unpassende Kwargs. Behoben in Commit f238711:

  • exakte HF-Revision wird über provision-model.py separat provisioniert
  • Revisionsmarker wird vor Modellladung geprüft
  • specific_model_path + local_files_only=True erzwingen Offline-Laden
  • Runtime-embed() erhält nur die unterstützte API
  • direkte huggingface_hub==1.24.0-Abhängigkeit ergänzt

Verifikation: 12 passed, Ruff clean, git diff --check clean. Commit ist nach origin/master gepusht. Noch kein Modell-Download und kein Service-Start.

Sicherheitsbefund und Fix abgeschlossen: FastEmbed 0.8.0 verwirft beim konkreten Modell-Loader den Revisionsparameter; der vorherige Code hätte daher keinen sicheren Pin garantiert und übergab beim Runtime-`embed()` unpassende Kwargs. Behoben in Commit `f238711`: - exakte HF-Revision wird über `provision-model.py` separat provisioniert - Revisionsmarker wird vor Modellladung geprüft - `specific_model_path` + `local_files_only=True` erzwingen Offline-Laden - Runtime-`embed()` erhält nur die unterstützte API - direkte `huggingface_hub==1.24.0`-Abhängigkeit ergänzt Verifikation: `12 passed`, Ruff clean, `git diff --check` clean. Commit ist nach `origin/master` gepusht. Noch kein Modell-Download und kein Service-Start.
Author
Owner

Live-Vorbereitung weitergeführt:

  • Gepinnte Modellrevision provisioniert: /var/lib/embedding-service/model, Marker geprüft, 523 MiB, pirate:pirate.
  • CPU-only Offline-Smoke-Test bestanden: Dimension 768, Load ca. 726 ms, Embed ca. 68 ms.
  • Separate /opt/embedding-service/.venv installiert; Paketimport und Entry-Point erfolgreich.
  • Packaging-Ebene korrigiert und verifiziert; Repo-Wheel enthält embedding_service/app.py.
  • systemd-Unit installiert, daemon-reload und systemd-analyze verify bestanden; Unit bleibt disabled/inactive.

Noch nicht ausgeführt: TLS-/Secret-Bereitstellung, Firewall-Allowlist, Aktivierung, Service-Start, HTTPS-E2E und Rollback. Diese bleiben wegen fehlender autoritativer Zertifikats-/Secret-/Firewall-Fakten offen.

Live-Vorbereitung weitergeführt: - Gepinnte Modellrevision provisioniert: `/var/lib/embedding-service/model`, Marker geprüft, 523 MiB, `pirate:pirate`. - CPU-only Offline-Smoke-Test bestanden: Dimension 768, Load ca. 726 ms, Embed ca. 68 ms. - Separate `/opt/embedding-service/.venv` installiert; Paketimport und Entry-Point erfolgreich. - Packaging-Ebene korrigiert und verifiziert; Repo-Wheel enthält `embedding_service/app.py`. - systemd-Unit installiert, `daemon-reload` und `systemd-analyze verify` bestanden; Unit bleibt disabled/inactive. Noch nicht ausgeführt: TLS-/Secret-Bereitstellung, Firewall-Allowlist, Aktivierung, Service-Start, HTTPS-E2E und Rollback. Diese bleiben wegen fehlender autoritativer Zertifikats-/Secret-/Firewall-Fakten offen.
Author
Owner

Issue #13 Deployment-/Live-Nachweis abgeschlossen.

Erreicht:

  • Spark-Embedding-Service als HTTPS-Endpunkt auf 192.168.178.5:8443 deployt.
  • Interne Root-CA auf LXC 106; Spark-Serverzertifikat mit SAN IP:192.168.178.5.
  • Bearer-Token auf Spark und LXC 106 als Secret-Datei abgelegt; Tokenwert nicht ausgegeben.
  • Port-8443-Allowlist per eigener nftables/systemd-Unit: Loopback + 192.168.178.38, sonst Drop.
  • embedding-service.service ist enabled und active; embedding-service-firewall.service ist active.
  • EMBEDDING_MIN_AVAILABLE_GIB=32 in Code, Tests und Deployment-Env ergänzt.

Evidence:

  • LXC-106 HTTPS-E2E mit synthetischem Text: HTTP 200, vectors=1, dimension=768, Modell nomic-ai/nomic-embed-text-v1.5.
  • Falscher Bearer-Token von LXC 106: HTTP 401 unauthorized.
  • Post-Deployment-Qwen-Smoke: exakt POST-EMBEDDING-QWEN-OK.
  • RAM nach E2E: 46 GiB verfügbar, Swap 0 B; GPU 41 °C.
  • Lokale Tests: tests/test_embedding_service.py -> 14 passed.
  • Ruff und git diff --check sauber.

Commit:

  • 94675e74e109dd84cd9650cc7d905a2f4a8014a5 (Sichere Embedding-Readiness mit RAM-Schwelle), nach origin/master gepusht und remote verifiziert.

Abgrenzung:

  • Der deployte secondbrain-mcp-Code auf LXC 106 enthält aktuell noch keinen embedding_client.py; die produktive Hybrid-Suche/Client-Verdrahtung ist nicht Teil dieses Issues und braucht ein separates secondbrain-mcp-Ticket.
  • Vault-Doku: 3000-Projects/3090-dgx-spark/sessions/2026-08-11-season-af-baseline.md und Projektindex aktualisiert.
Issue #13 Deployment-/Live-Nachweis abgeschlossen. Erreicht: - Spark-Embedding-Service als HTTPS-Endpunkt auf `192.168.178.5:8443` deployt. - Interne Root-CA auf LXC 106; Spark-Serverzertifikat mit SAN `IP:192.168.178.5`. - Bearer-Token auf Spark und LXC 106 als Secret-Datei abgelegt; Tokenwert nicht ausgegeben. - Port-8443-Allowlist per eigener nftables/systemd-Unit: Loopback + `192.168.178.38`, sonst Drop. - `embedding-service.service` ist `enabled` und `active`; `embedding-service-firewall.service` ist `active`. - `EMBEDDING_MIN_AVAILABLE_GIB=32` in Code, Tests und Deployment-Env ergänzt. Evidence: - LXC-106 HTTPS-E2E mit synthetischem Text: HTTP 200, `vectors=1`, `dimension=768`, Modell `nomic-ai/nomic-embed-text-v1.5`. - Falscher Bearer-Token von LXC 106: HTTP 401 `unauthorized`. - Post-Deployment-Qwen-Smoke: exakt `POST-EMBEDDING-QWEN-OK`. - RAM nach E2E: 46 GiB verfügbar, Swap 0 B; GPU 41 °C. - Lokale Tests: `tests/test_embedding_service.py` -> 14 passed. - Ruff und `git diff --check` sauber. Commit: - `94675e74e109dd84cd9650cc7d905a2f4a8014a5` (`Sichere Embedding-Readiness mit RAM-Schwelle`), nach `origin/master` gepusht und remote verifiziert. Abgrenzung: - Der deployte `secondbrain-mcp`-Code auf LXC 106 enthält aktuell noch keinen `embedding_client.py`; die produktive Hybrid-Suche/Client-Verdrahtung ist nicht Teil dieses Issues und braucht ein separates `secondbrain-mcp`-Ticket. - Vault-Doku: `3000-Projects/3090-dgx-spark/sessions/2026-08-11-season-af-baseline.md` und Projektindex aktualisiert.
zwuge closed this issue 2026-08-11 08:52:38 +02:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
zwuge/dgx-spark#13
No description provided.