fix(ops): שרת ה-MCP עובר ל-S3 — סוגר את דריפט האחסון מול הקונטיינר
הקונטיינר רץ `STORAGE_BACKEND=s3` ושרת ה-MCP נפל ל-`filesystem`. כלומר מסמך שסוכן כתב דרך MCP נחת על הדיסק בעוד ה-web חיפש אותו ב-S3 — שני מסלולים לאותו נכס, שמתפצלים בשקט (G2 / INV-STG1). מה נדרש כדי לסגור, ומה נמצא בדרך - **הסודות לא היו קיימים במקור-האמת.** `MINIO_ENDPOINT`/`ACCESS_KEY`/ `SECRET_KEY` חיו רק ב-env של Coolify. נוצרו ב-Infisical תחת `/apps/legal-ai` (tag `credentials`, באישור חיים) ונטענים ל-`~/.legal-mcp-http.env` — אותו דפוס כמו MCP_HTTP_SHARED_SECRET. הערכים עברו ב-stdin דרך infisical-set.sh; לא ב-argv ולא בהיסטוריה. - **`aioboto3` לא היה מותקן ב-venv המקומי.** מוצהר ב-pyproject אך חסר. מסלול ה-S3 מייבא אותו **עצלנית**, ולכן השירות היה עולה בהצלחה ונשבר רק בפעולת-הקובץ הראשונה — כשל שקט עד לשימוש. זו בדיוק הסיבה שהבדיקה רצה לפני ההפעלה ולא אחריה. אימות מהמארח לפני ההפעלה: put/get/delete מלא מול https://s3.nautilus.marcusgroup.org, וקריאת בלוב-ייצור קיים (573KB) מתוך 2,283 אובייקטים בדלי. ה-runbook עודכן: בלוק-האזהרה הוחלף בתיעוד המצב הסגור, כולל מלכודת הייבוא-העצל ופקודת-אימות שאפשר להעתיק. invariants: G2 (מסלול-אחסון אחד לשתי הדלתות) · INV-STG1 · §6
This commit is contained in:
@@ -58,21 +58,34 @@
|
||||
- שער Bearer (`MCP_HTTP_SHARED_SECRET`); השרת **מסרב לעלות** בלי טוקן. בדיקה: ללא טוקן → `401`, עם טוקן → `200`.
|
||||
- **⚠️ שינוי קוד ב-`mcp-server/` לא נכנס לתוקף עד `pm2 restart legal-mcp-http`.** זה תהליך ארוך-חיים, בניגוד ל-stdio שנטען מחדש בכל סשן. אחרי מיזוג שנוגע ב-`mcp-server/` — להפעיל מחדש, אחרת הסוכנים ירוצו על קוד ישן בשקט.
|
||||
|
||||
> #### 🚨 דריפט תצורה פתוח — `STORAGE_BACKEND`
|
||||
> הקונטיינר רץ `STORAGE_BACKEND=s3`; שרת ה-MCP נופל לברירת-המחדל `filesystem`, כי
|
||||
> `~/.env` אינו מגדיר אותו. כלומר **סוכן שכותב קובץ דרך MCP כותב לדיסק, בעוד ה-web
|
||||
> קורא מ-S3** — שני מסלולים שמתפצלים (G2 / INV-STG1).
|
||||
> #### ✅ תצורת האחסון והאחזור מיושרת לקונטיינר (2026-08-05)
|
||||
> `STORAGE_BACKEND=s3` ו-`MULTIMODAL_ENABLED=true` — זהים לקונטיינר, כך שמסמך
|
||||
> שסוכן כותב דרך MCP הוא זה שה-web קורא, ושתי הדלתות מדרגות את אותו קורפוס
|
||||
> באותה צורה (G2).
|
||||
>
|
||||
> **למה זה עדיין לא תוקן:** ההעברה ל-s3 דורשת `MINIO_ENDPOINT` + `MINIO_ACCESS_KEY` +
|
||||
> `MINIO_SECRET_KEY`, ואלה **אינם קיימים ב-Infisical** — רק ב-env של Coolify. הפיכת
|
||||
> הדגל בלעדיהם תפתור את `MINIO_ENDPOINT` לברירת-המחדל `http://minio:9000` (שם-רשת
|
||||
> פנימי של דוקר, לא נגיש מהמארח) ותשבור כל פעולת-בלוב.
|
||||
> **הסודות:** `MINIO_ENDPOINT` · `MINIO_ACCESS_KEY` · `MINIO_SECRET_KEY` נוצרו
|
||||
> ב-Infisical תחת `/apps/legal-ai` (tag `credentials`), ונטענים ל-`~/.legal-mcp-http.env`
|
||||
> (chmod 600) — אותו דפוס כמו `MCP_HTTP_SHARED_SECRET`. **רוטציה:** לעדכן
|
||||
> ב-Infisical → למשוך מחדש לקובץ → `pm2 restart legal-mcp-http`.
|
||||
>
|
||||
> **מה שצריך כדי לסגור:** ליצור את שלושת המפתחות ב-Infisical תחת `/apps/legal-ai`
|
||||
> (תגית `credentials`, באישור חיים — ראה כלל "Saving a NEW secret" ב-`~/CLAUDE.md`),
|
||||
> לטעון אותם בקונפיג ה-pm2 כמו `MCP_HTTP_SHARED_SECRET`, ואז להוסיף
|
||||
> `STORAGE_BACKEND: "s3"`. MinIO **כן** נגיש מהמארח: `https://s3.nautilus.marcusgroup.org`
|
||||
> (אומת — `/minio/health/live` מחזיר 200).
|
||||
> **⚠️ מלכודת — `aioboto3` מיובא עצלנית.** מסלול ה-S3 מייבא אותו רק בקריאה
|
||||
> הראשונה, ולכן venv בלי החבילה **עולה בהצלחה** ונשבר רק בפעולת-הקובץ הראשונה
|
||||
> — כשל שקט עד לשימוש. הוא מוצהר ב-`mcp-server/pyproject.toml`, אבל לא היה
|
||||
> מותקן ב-venv המקומי. אחרי כל בנייה מחדש של ה-venv:
|
||||
> `~/legal-ai/mcp-server/.venv/bin/pip install -e ~/legal-ai/mcp-server`.
|
||||
>
|
||||
> **אימות לפני הפעלה** (הרץ מהמארח, לא מהקונטיינר):
|
||||
> ```bash
|
||||
> cd ~/legal-ai/mcp-server && set -a && . ~/.legal-mcp-http.env && set +a
|
||||
> STORAGE_BACKEND=s3 HOME=/home/chaim DOTENV_PATH=/home/chaim/.env \
|
||||
> .venv/bin/python -c "import asyncio;from legal_mcp.services import storage
|
||||
> async def m():
|
||||
> st=storage.get_storage()
|
||||
> print(len(await st.list_keys('', bucket=storage.Bucket.DOCUMENTS)))
|
||||
> asyncio.run(m())"
|
||||
> ```
|
||||
> מצופה: מספר האובייקטים בדלי (היו 2,283 ב-2026-08-05). שגיאת
|
||||
> `ModuleNotFoundError: aioboto3` = ה-venv חסר את התלות.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user