feat(storage): #106.4 — סקריפט הגירת בלובים ל-MinIO (DB-driven, dry-run default) #197

Merged
chaim merged 1 commits from worktree-minio-blob-migration into main 2026-06-11 17:19:28 +00:00
Owner

מה

סקריפט הגירת בלובים (PDF/DOCX/thumbnails) מדיסק ל-MinIO — מונחה-DB, לא mc mirror גורף, כי ה-bucket נקבע per-file-semantic (מסמך/טיוטה→legal-documents, thumbnail→legal-derived), ו-data/cases/X/ מערבב קבצים משתי דליות.

ממצאי-מציאות (אומתו 2026-06-11, מתקנים את הספ)

  • עמודות-נתיב אמיתיות (6): documents.file_path · cases.active_draft_path · digests.source_document_path · draft_final_pairs.final_path · document_image_embeddings.image_thumbnail_path · precedent_image_embeddings.image_thumbnail_path. הספ הניח case_law.source_document_path/*_image_pagesלא קיימים.
  • 3 פורמטי-נתיב legacy לא-עקביים: container-abs /data/…, host-abs /home/chaim/legal-ai/data/…, ו-relative digests/…. הסקריפט מנרמל את כולם ל-key יחסי-DATA_DIR (תואם storage.normalize_key + write-wiring #106.3 + read-wiring העתידי #106.5).

בטיחות / הפיכוּת

  • dry-run ברירת-מחדל: תוכנית + מניפסט CSV ל-data/audit/, אפס-שינוי.
  • --apply מעלה דרך mcli ומאמת size אחרי כל PUT; הדיסק לא נוגע → re-run אידמפוטנטי, ההגירה הפיכה (לרוקן דליות + flip חזרה ל-filesystem).
  • קבצים חסרים/מחוץ-DATA_DIR מדווחים, לא נבלעים.

אימות חי (dry-run)

derived 2593 קבצים (260MB) · documents 811 (638MB) · 0 outside-DATA_DIR (הנרמול עובד) · 28 חסרים (רפרנסי-DB תלויים מראש). סה"כ 3404 / 899MB.

Invariants

  • G2 — key=normalize_key, מסלול-אחסון יחיד.
  • INV-STG1/3 — storage layer; bucket לפי גבול-ממשל.
  • INV-G10 — dry-run/הפיך; לא נוגע בדיסק. cutover/WORM (בלתי-הפיכים) = שלבים נפרדים שעוצרים לאישור.

🤖 Generated with Claude Code

## מה סקריפט הגירת בלובים (PDF/DOCX/thumbnails) מדיסק ל-MinIO — **מונחה-DB, לא `mc mirror` גורף**, כי ה-bucket נקבע **per-file-semantic** (מסמך/טיוטה→`legal-documents`, thumbnail→`legal-derived`), ו-`data/cases/X/` מערבב קבצים משתי דליות. ## ממצאי-מציאות (אומתו 2026-06-11, מתקנים את הספ) - **עמודות-נתיב אמיתיות** (6): `documents.file_path` · `cases.active_draft_path` · `digests.source_document_path` · `draft_final_pairs.final_path` · `document_image_embeddings.image_thumbnail_path` · `precedent_image_embeddings.image_thumbnail_path`. הספ הניח `case_law.source_document_path`/`*_image_pages` — **לא קיימים**. - **3 פורמטי-נתיב legacy לא-עקביים**: container-abs `/data/…`, host-abs `/home/chaim/legal-ai/data/…`, ו-relative `digests/…`. הסקריפט מנרמל את כולם ל-key יחסי-DATA_DIR (תואם `storage.normalize_key` + write-wiring #106.3 + read-wiring העתידי #106.5). ## בטיחות / הפיכוּת - **dry-run ברירת-מחדל**: תוכנית + מניפסט CSV ל-`data/audit/`, אפס-שינוי. - `--apply` מעלה דרך mcli ומאמת size אחרי כל PUT; **הדיסק לא נוגע** → re-run אידמפוטנטי, ההגירה **הפיכה** (לרוקן דליות + flip חזרה ל-filesystem). - קבצים חסרים/מחוץ-DATA_DIR **מדווחים**, לא נבלעים. ## אימות חי (dry-run) `derived` 2593 קבצים (260MB) · `documents` 811 (638MB) · **0 outside-DATA_DIR** (הנרמול עובד) · **28 חסרים** (רפרנסי-DB תלויים מראש). סה"כ 3404 / 899MB. ## Invariants - **G2** — key=`normalize_key`, מסלול-אחסון יחיד. - **INV-STG1/3** — storage layer; bucket לפי גבול-ממשל. - **INV-G10** — dry-run/הפיך; לא נוגע בדיסק. cutover/WORM (בלתי-הפיכים) = שלבים נפרדים שעוצרים לאישור. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
chaim added 1 commit 2026-06-11 17:19:23 +00:00
feat(storage): #106.4 — DB-driven blob→MinIO migration script (dry-run default)
All checks were successful
G12 Leak-Guard / leak-guard (pull_request) Successful in 5s
970e8dc748
הגירת בלובים מדיסק ל-MinIO, מונחית-DB ולא `mc mirror` גורף — כי ה-bucket נקבע
per-file-SEMANTIC (מסמך/טיוטה→documents, thumbnail→derived). סורק 6 עמודות-נתיב
שקיימות בפועל (documents.file_path · cases.active_draft_path · digests.source_document_path
· draft_final_pairs.final_path · document_image_embeddings/precedent_image_embeddings.
image_thumbnail_path) — לא כפי שהספ הניח (case_law.source_document_path/*_image_pages לא קיימים).

מטפל ב-3 פורמטי-נתיב legacy לא-עקביים (אומת 2026-06-11): container-abs `/data/…`,
host-abs `/home/chaim/legal-ai/data/…`, ו-relative — מנרמל ל-key יחסי-DATA_DIR (תואם
storage.normalize_key + אתרי-הכתיבה #106.3 + read-wiring העתידי #106.5). קבצים שלא
נמצאים/מחוץ-ל-DATA_DIR מדווחים, לא נבלעים.

dry-run (ברירת-מחדל): תוכנית + מניפסט CSV ל-data/audit, אפס-שינוי. --apply מעלה דרך mcli
ומאמת size אחרי כל PUT; **הדיסק לא נוגע** → re-run אידמפוטנטי וההגירה הפיכה (לרוקן דליות
+ flip חזרה ל-filesystem). נרמול עמודות-ה-DB ל-keys נקיים = צעד נפרד מאוחר (#106.5).

אומת חי (dry-run): derived 2593 (260MB) · documents 811 (638MB) · 0 outside · 28 חסרים
(רפרנסי-DB תלויים מראש). סה"כ 3404 קבצים / 899MB.

invariants: G2 (key=normalize_key, מסלול-אחסון יחיד) · INV-STG1/3 (storage layer, bucket
per-governance) · INV-G10 (dry-run/הפיך, לא נוגע בדיסק). הצעדים הבלתי-הפיכים (cutover/WORM)
נפרדים ועוצרים לאישור.
tests: dry-run חי = אימות (count+size+normalization). py_compile OK.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
chaim merged commit 6c0590e1e3 into main 2026-06-11 17:19:28 +00:00
chaim deleted branch worktree-minio-blob-migration 2026-06-11 17:19:28 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ezer-mishpati/legal-ai#197