# תצורה

> כל משתני הסביבה של Nodaro באירוח עצמי לפי נושא: ברירת המחדל, אם אפשר להגדיר אותם בקובץ ‎.env במערך השירותים של Compose, ומה הם משנים.

Source: https://nodaro.ai/he/docs/self-hosting/configuration

הדף הזה הוא **מדריך התצורה** של Nodaro באירוח עצמי: כל משתני הסביבה שמנהלי השרת מגדירים, מקובצים לפי ייעוד, עם ברירת המחדל של כל אחד. במערך השירותים המובנה של Compose לכל משתנה יש ברירת מחדל שעובדת, ולכן מגדירים רק את מה שרוצים לשנות. משתנים שחלים רק על Nodaro Cloud לא מופיעים כאן.

## איך מגדירים משתנה
במערך השירותים של Compose, מגדירים משתנה באחד משני מקומות:

- **ב-`.env`**, ליד `docker-compose.community.yml`. השיטה הזו עובדת למשתנים שקובץ ה-Compose מעביר לאפליקציה. בטבלאות שלמטה, בעמודה `.env` של המשתנים האלה כתוב **כן**.
- **בקובץ ה-Compose**, לכל משתנה אחר. הוסיפו אותו תחת `environment:` של השירות `nodaro`:

```yaml
nodaro:
environment:
# ...the variables already listed...
MCP_ENABLED: "true"
MCP_PUBLIC_URL: https://mcp.nodaro.example.com
```

ואז החילו את השינוי:

```bash
docker compose -f docker-compose.community.yml up -d
```

Nodaro קורא את הסביבה שלו באתחול. החריג היחיד הוא מפתחות הספק שמדביקים בדף `/setup`, שנכנסים לתוקף מיד. מחוץ למערך השירותים של Compose, הגדירו את המשתנים בהגדרות הסביבה של הפלטפורמה שלכם.

**חובה מחוץ למערך השירותים של Compose:** `SUPABASE_URL`, `SUPABASE_SERVICE_ROLE_KEY` ו-`INTERNAL_ORCHESTRATOR_SECRET`. בלעדיהם ה-API לא מוכן לעלות, ומציג את רשימת המשתנים החסרים או השגויים.

## המופע
| משתנה | ברירת מחדל | `.env` | מה הוא עושה |
| --- | --- | --- | --- |
| `EDITION` | `community` | לא | `community`, `business` או `cloud`. קובץ ה-Compose קובע אותו ל-`community`. ראו את הדף [מהדורות ופרופילי ממשק](https://nodaro.ai/docs/self-hosting/editions-and-profiles). |
| `PUBLIC_URL` | `http://localhost:3000` | כן | ה-origin הציבורי של ההתקנה: לכתובות ההפניה של ההתחברות ושל OAuth, לכתובות המדיה ולבדיקת ה-CORS. |
| `PUBLIC_URL_SAME_ORIGIN` | לא מוגדר | לא | הערך `true` נותן לדפדפן את `/` ככתובת ה-API במקום `PUBLIC_URL`, כך שההזרמות נשארות על שם המארח שהמבקר פתח. מיועד להתקנות שעונות בכמה שמות מארח. רק הערך המדויק `true` מפעיל את האפשרות. |
| `CORS_ORIGIN` | ריק | כן | origins נוספים של דפדפן, מופרדים בפסיקים. ה-origin שב-`PUBLIC_URL` תמיד מורשה. במארחים האלה, ההפניה לדף הנחיתה אחרי SSO היא כתובת יחסית. |
| `DEFAULT_LOCALE` | ריק (שפת הדפדפן) | כן | השפה שמבקר חדש מתחיל בה. ראו את הסעיף [שפת ברירת המחדל](#default-language). |
| `NODARO_SURFACE_PROFILE` | ריק (הממשק המלא) | כן | מצמצם את הממשק של התקנת Business. ראו את הסעיף [פרופילי ממשק](https://nodaro.ai/docs/self-hosting/editions-and-profiles#surface-profiles) בדף מהדורות ופרופילי ממשק. |
| `NODARO_TUTORIAL_PACKS` | ריק (רק המדריכים המובנים) | כן | תיקיות של חבילות מדריכים נוספות, מופרדות בפסיקים. ראו את הסעיף [חבילות מדריכים](#tutorial-packs). |
| `RUNTIME_ENV` | `local` | לא | נותן שם להתקנה כששתי התקנות חולקות מסד נתונים אחד אבל לא Redis אחד. ראו את הדף [הרחבת קיבולת](https://nodaro.ai/docs/self-hosting/scaling#two-installs-one-database). ב-Railway, המשתנה `RAILWAY_ENVIRONMENT_NAME` קובע אותו. [נקודת קצה של Webhook](https://nodaro.ai/docs/developers/api/webhooks) שייכת להתקנה שיצרה אותה, ולכן שינוי השם ב-`RUNTIME_ENV` מסתיר את נקודות הקצה שנוצרו תחת השם הישן. |
| `PORT`, `HOST` | `8000`, `0.0.0.0` | לא | הפורט והכתובת שה-API מאזין בהם. באימג׳, ה-API מאזין בפורט `9000`, מאחורי שרת הווב בפורט `3000`. |
| `NODE_ENV` | `development` | לא | בכל אימג׳ הערך הוא `production`. |

## סודות
| משתנה | ברירת מחדל | `.env` | מה הוא עושה |
| --- | --- | --- | --- |
| `INTERNAL_ORCHESTRATOR_SECRET` | נוצר באתחול במערך השירותים של Compose | כן | מאמת את ה-orchestrator מול ה-API. לפחות 32 תווים. חובה מחוץ למערך השירותים של Compose. |
| `NODARO_ENCRYPTION_KEY` | נוצר באתחול הראשון במערך השירותים של Compose, ונשמר ב-volume `app-data` | כן | מפתח הקסדצימלי באורך 64 תווים שמצפין פרטי גישה שמורים: מפתחות ספק שהודבקו, אסימוני התחברות לרשתות חברתיות, פרטי הגישה ל-HTTP שנשמרו לרכיב פלט Webhook וסודות החתימה של [נקודות קצה של Webhook](https://nodaro.ai/docs/developers/api/webhooks). בלעדיו, רישום של נקודת קצה של Webhook נדחה עם `503 encryption_key_missing`. |
| `SOCIAL_ENCRYPTION_KEY` | ריק | כן | השם הישן של `NODARO_ENCRYPTION_KEY`. שני השמות עובדים. |

צרו סוד עם `openssl rand -hex 32`. גבו את מפתח ההצפנה יחד עם מסד הנתונים: ראו את הדף [גיבוי ושחזור](https://nodaro.ai/docs/self-hosting/backups).

## מסד נתונים והתחברות
| משתנה | ברירת מחדל | `.env` | מה הוא עושה |
| --- | --- | --- | --- |
| `SUPABASE_URL` | `http://localhost:3000/supabase` במערך השירותים של Compose | כן | כתובת ה-Supabase שה-API משתמש בה. חובה מחוץ למערך השירותים של Compose. |
| `SUPABASE_SERVICE_ROLE_KEY` | מפתח ברירת מחדל ציבורי במערך השירותים של Compose | כן | מפתח ה-service role שה-API משתמש בו. חובה מחוץ למערך השירותים של Compose. |
| `SUPABASE_ANON_KEY` | מפתח ברירת מחדל ציבורי במערך השירותים של Compose | כן | מפתח ה-anon שנמסר לדפדפן ולשירות ההתחברות. |
| `FRONTEND_SUPABASE_URL` | `PUBLIC_URL/supabase` במערך השירותים המובנה | כן | כתובת ה-Supabase שהדפדפן משתמש בה, שנכתבת ל-`/config.js` באתחול. הגדירו אותו כשמשתמשים בפרויקט Supabase מנוהל. |
| `SUPABASE_JWT_SECRET` | סוד ברירת מחדל ציבורי | כן | הסוד שחותם על מפתחות ה-anon וה-service role במערך השירותים המובנה. צרו את שלושתם עם `node tools/generate-selfhost-keys.mjs`. |
| `POSTGRES_PASSWORD` | `nodaro-postgres-pw` | כן | הסיסמה של מסד הנתונים המובנה. הסיסמאות של התפקידים הפנימיים נגזרות ממנה רק בהפעלה הראשונה של מסד הנתונים. |
| `DATABASE_URL` | `postgres://postgres:nodaro-postgres-pw@db:5432/postgres` | כן | כתובת ישירה ל-Postgres, שמשמשת רק להחלת מיגרציות באתחול. שמרו על הסיסמה שבה תואמת ל-`POSTGRES_PASSWORD`. |
| `RUN_MIGRATIONS_ON_BOOT` | `false`, ובמערך השירותים של Compose `true` | כן | מחיל את `supabase/migrations/` לפני שה-API עולה. הגדירו `false` כשמשתמשים בפרויקט Supabase מנוהל. |
| `SUPABASE_MANAGED_PROXY` | לא מוגדר | לא | הערך `true` מגיש פרויקט Supabase מנוהל דרך ה-origin של האפליקציה עצמה. ראו את הדף [מסד נתונים](https://nodaro.ai/docs/self-hosting/database#serve-a-managed-project-through-your-own-origin). |
| `SUPABASE_PROXY_UPSTREAM` | לא מוגדר | לא | ה-origin של הפרויקט המנוהל, בלי נתיב, לפרוקסי שלמעלה. |

## תורים
| משתנה | ברירת מחדל | `.env` | מה הוא עושה |
| --- | --- | --- | --- |
| `REDIS_URL` | `redis://localhost:6379`, ובמערך השירותים של Compose `redis://redis:6379` | לא | ה-Redis של התורים והמטמונים המשותפים. גם כתובת של Redis Cluster או של Sentinel עובדת. |

## אחסון
| משתנה | ברירת מחדל | `.env` | מה הוא עושה |
| --- | --- | --- | --- |
| `R2_ENDPOINT` | `http://minio:9000` במערך השירותים של Compose | כן | כתובת ה-S3 API של שירות האחסון. במערך השירותים של Compose, בערך ריק נעשה שימוש ב-MinIO. |
| `R2_FORCE_PATH_STYLE` | `true` במערך השירותים של Compose | כן | כתובות מסוג path-style, שרוב שירותי האחסון באירוח עצמי צריכים. |
| `R2_ACCOUNT_ID` | ריק | כן | מזהה החשבון ב-Cloudflare. מחוץ למערך השירותים של Compose, כשהמשתנה `R2_ENDPOINT` לא מוגדר, נקודת הקצה של R2 נגזרת ממנו. |
| `R2_ACCESS_KEY_ID`, `R2_SECRET_ACCESS_KEY` | פרטי הגישה של ה-MinIO המובנה | כן | פרטי הגישה לאחסון. במערך השירותים של Compose, הם גם פרטי הגישה של משתמש ה-root ב-MinIO. |
| `R2_BUCKET_NAME` | `nodaro-assets` במערך השירותים של Compose | כן | ה-bucket. מחוץ למערך השירותים של Compose ברירת המחדל היא `scenenode-assets`, ולכן תמיד הגדירו אותו. |
| `R2_PUBLIC_URL` | `http://localhost:3000/storage/nodaro-assets` במערך השירותים של Compose | כן | הכתובת הציבורית של ה-bucket. |
| `R2_REGION` | `auto` | כן | האזור של S3. הגדירו אזור אמיתי ל-AWS, ל-DigitalOcean Spaces (`nyc3` ועוד) ול-Supabase מקומי (`local`). |
| `STORAGE_OBJECT_ACL` | ריק (בלי כותרת ACL) | כן | ערך ACL מוכן מראש לכל אובייקט שמועלה, לשירותי אחסון שלא מקבלים מדיניות bucket. ראו את הדף [התקנה](https://nodaro.ai/docs/self-hosting/install#make-the-media-publicly-readable). |
| `R2_PUBLIC_FALLBACK_DOMAIN` | ריק | לא | מארח ציבורי נוסף למדיה, למשל הכתובת הגולמית של `r2.dev` לצד דומיין של CDN. |
| `R2_SHARED_WITH_RELAY_TARGET` | `false` | לא | הגדירו `true` רק כשהמשתנה `R2_PUBLIC_URL` מצביע על אותו bucket שהשרת של Nodaro Cloud שלכם כותב אליו. ראו את הדף [חיבור ל-Nodaro Cloud](https://nodaro.ai/docs/self-hosting/cloud-connect#configuration-reference). |

## ספקי מודלים
את כל אחד מהמפתחות האלה אפשר גם להדביק בדף `/setup`. מפתח שמוגדר בסביבה גובר. ראו את הדף [מפתחות ספק](https://nodaro.ai/docs/self-hosting/provider-keys).

| משתנה | ברירת מחדל | `.env` | למה הוא משמש |
| --- | --- | --- | --- |
| `NODARO_API_KEY` | ריק | כן | Nodaro Cloud כספק, עם אסימון API אישי. |
| `KIE_API_KEY` | ריק | כן | הכיסוי הרחב ביותר של מודלי מדיה וטקסט. |
| `KIE_API_BASE_URL` | שרת ה-API של הספק עצמו | כן | מעביר את התעבורה לספק הזה דרך פרוקסי משלכם. הוא מעביר גם את תעבורת הטקסט של Claude ושל Gemini שרצה על `KIE_API_KEY`. |
| `REPLICATE_API_TOKEN` | ריק | כן | קטלוג חלופי, כולל מודלי Flux 2. |
| `ANTHROPIC_API_KEY` | ריק | כן | Claude ישירות, לרכיבי הטקסט. |
| `GEMINI_API_KEY` | ריק | כן | Gemini ישירות. ראו את הסעיף [מודלי Gemini](https://nodaro.ai/docs/self-hosting/provider-keys#gemini-models) בדף מפתחות ספק. |
| `ELEVENLABS_API_KEY` | ריק | כן | דיבור, קולות ודיבוב. |
| `ELEVENLABS_BASE_URL` | `https://api.elevenlabs.io` | כן | מעביר את התעבורה ל-ElevenLabs דרך פרוקסי משלכם. |
| `FAL_KEY` | ריק | כן | מודלים כמו Sync Lipsync v3. |
| `HEYGEN_API_KEY` | ריק | כן | אווטאר AI ואווטאר קולנועי. |
| `BEEBLE_API_KEY` | ריק | כן | תאורה מחדש והחלפה. |
| `APIFY_API_TOKEN` | ריק | כן | גריפת אתר וצילום אתר. |
| `SITE_CAPTURE_ENABLED` | מופעל | לא | הערך `false` מכבה בהתקנה הזו את רכיב צילום אתר, את `POST /v1/site-capture` ואת כלי ה-MCP `capture_site`. |
| `HEYGEN_CATALOG_REFRESH_HOURS` | `24` | לא | כל כמה שעות מתרעננת הרשימה המשותפת של האווטארים והקולות של HeyGen. |

## החיבור ל-Nodaro Cloud
| משתנה | ברירת מחדל | `.env` | מה הוא עושה |
| --- | --- | --- | --- |
| `NODARO_CLOUD_URL` | `https://app.nodaro.ai` | כן | השרת של Nodaro Cloud שההתקנה נרשמת אליו כשלוחצים על **חיבור nodaro.ai**, ואליו נשלחות קריאות עם `NODARO_API_KEY`. שנו אותו רק כשההתקנה שלכם שייכת לפריסה ייעודית של Nodaro. נקרא באתחול. |

גם המשתנים `NODARO_API_KEY` ו-`R2_SHARED_WITH_RELAY_TARGET` שייכים לחיבור. ראו את הדף [חיבור ל-Nodaro Cloud](https://nodaro.ai/docs/self-hosting/cloud-connect).

## Workers וביצועים
| משתנה | ברירת מחדל | `.env` | מה הוא עושה |
| --- | --- | --- | --- |
| `MAX_CONCURRENT_NODES_PER_EXECUTION` | `6`, לכל היותר `20` | לא | כמה רכיבים הרצה אחת של תהליך יכולה להריץ בו־זמנית. |
| `VIDEO_WORKER_CONCURRENCY` | `50` | לא | משימות מקבילות ב-worker של המדיה, שרוב הזמן ממתין לספקים. |
| `ORCHESTRATOR_CONCURRENCY` | `20` | לא | משימות מקבילות ב-orchestrator. |
| `RENDER_WORKER_CONCURRENCY` | `2`, לכל היותר `10` | לא | רינדורים מקבילים. כל רינדור מריץ Chrome ללא ממשק. |
| `REMOTION_CONCURRENCY` | `2` לסצנות תלת־ממד; מחצית מליבות ה-CPU לרינדורים אחרים | לא | כרטיסיות דפדפן לכל רינדור. ערך שאתם מגדירים חל על שני המקרים. השאירו אותו נמוך כשרצות כמה משימות תלת־ממד: כל כרטיסיית WebGL מוסיפה threads ונספרת במגבלת הפרוססים של הקונטיינר. |
| `FFMPEG_CONCURRENCY` | `4`, לכל היותר `32` | לא | מספר פרוססי ffmpeg בו־זמנית, בכל רכיבי עריכת הווידאו והאודיו יחד. |
| `RAILWAY_DEPLOYMENT_DRAINING_SECONDS` | לא מוגדר | לא | ב-Railway בלבד: הזמן בין אות העצירה לעצירה הכפויה של קונטיינר שמוחלף. ה-worker של המדיה ממשיך לסיים את המשימות שבטיפולו במשך הזמן הזה פחות 5 שניות. כשהמשתנה לא מוגדר, הוא מסיים אותן במשך 25 שניות. |

ראו את הדף [הרחבת קיבולת](https://nodaro.ai/docs/self-hosting/scaling) לפני שאתם מעלים את הערכים האלה.

## עורכים
| משתנה | ברירת מחדל | `.env` | מה הוא עושה |
| --- | --- | --- | --- |
| `FREECUT_URL` | ריק (העורך ש-Nodaro מארח) | כן | עורך הווידאו שמאחורי הכפתור **עריכה ב-NodarCut** על הקנבס ומאחורי הכפתור **עריכה** בתוצאת וידאו באפליקציה. הערך `off` מכבה את העורך: הכפתורים נשארים, אבל שום עורך לא נפתח. |
| `AUDIOMASS_URL` | ריק (אין עורך אודיו) | כן | עורך האודיו שמאחורי הכפתור **עריכה** בתוצאת אודיו באפליקציה. הערך `off` מתנהג כמו ערך ריק. |

ראו את הסעיף [עורכי וידאו ואודיו](#video-and-audio-editors).

## עדכונים
| משתנה | ברירת מחדל | `.env` | מה הוא עושה |
| --- | --- | --- | --- |
| `NODARO_IMAGE` | `ghcr.io/nodaroai/nodaro-community:latest` | כן | האימג׳ של האפליקציה שקובץ ה-Compose מריץ. כאן מקבעים את ההתקנה על תג של גרסה. |
| `NODARO_UPDATE_CHECK` | מופעל | לא | הערך `off` עוצר את הבדיקה היומית של עדכונים: שום בקשה לא יוצאת מההתקנה. מיועד להתקנות שמנותקות מהאינטרנט. |
| `NODARO_UPDATE_CHECK_TOKEN` | ריק (אנונימי) | לא | אסימון GitHub לבדיקת העדכונים, בלי הרשאות. |

ראו את הדף [עדכון גרסה](https://nodaro.ai/docs/self-hosting/updating#which-version-you-run).

## MCP
| משתנה | ברירת מחדל | `.env` | מה הוא עושה |
| --- | --- | --- | --- |
| `MCP_ENABLED` | כבוי | לא | הערך `true` או `1` מפעיל את נקודת הקצה של MCP. |
| `MCP_PUBLIC_URL` | ריק (שרת ה-MCP של Nodaro Cloud) | לא | הכתובת הציבורית של שרת ה-MCP שלכם. |
| `MCP_DYNAMIC_REGISTRATION` | `allowlist` | לא | רישום דינמי של לקוחות MCP: `allowlist`, `open` או `off`. |
| `MCP_DCR_ALLOWLIST` | 14 לקוחות מוכרים | לא | שמות הלקוחות שמורשים להירשם במצב `allowlist`. |

ראו את הדף [MCP בהתקנה באירוח עצמי](https://nodaro.ai/docs/self-hosting/mcp).

## התחברות ותפקידים
| משתנה | ברירת מחדל | `.env` | מה הוא עושה |
| --- | --- | --- | --- |
| `EXTERNAL_SSO_PROVIDERS` | ריק (SSO כבוי) | לא | ספקי זהות מהימנים, כ-JSON ישירות בערך או כ-`@/path/to/file.json`. ערך פגום עוצר את האתחול. |
| `EXTERNAL_SSO_LINK_EXISTING` | `false` | לא | האם כניסה מאוחדת יכולה לקשר לחשבון מקומי קיים. |
| `PLATFORM_OWNER_EMAIL` | ריק | לא | במהדורת Business: חשבון הבעלים, שאף מנהל אחר לא יכול לשנות את התפקיד שלו. |

ראו את הדפים [כניסה מאוחדת (SSO)](https://nodaro.ai/docs/self-hosting/sso) ו[המשתמש הראשון והמנהל](https://nodaro.ai/docs/self-hosting/first-admin).

## אינטגרציות
| משתנה | ברירת מחדל | `.env` | מה הוא עושה |
| --- | --- | --- | --- |
| `FIGMA_PLUGIN_OAUTH_CLIENT_ID` | ריק (החיבור של התוסף כבוי) | לא | מזהה הלקוח של יישום המפתחים שהתוסף ל-Figma מתחבר דרכו. |
| משתנים של רשתות חברתיות | ריק | לא | ראו את הסעיף [אפליקציות לרשתות חברתיות](#social-network-apps). |

לתוסף ל-Figma, רשמו בהתקנה שלכם יישום מפתחים עם `<PUBLIC_URL>/v1/oauth/plugin/callback` ככתובת הפניה ועם ההרשאות `jobs:read`, `assets:read`, `assets:write` ו-`credits:read`. אחר כך הגדירו כאן את מזהה הלקוח שלו. כשהמשתנה ריק, נתיבי החיבור של התוסף מחזירים `503`, ושום דבר אחר לא משתנה. ראו את הדף [אפליקציות OAuth](https://nodaro.ai/docs/developers/oauth).

## הגדרות בזמן הבנייה
ההגדרות האלה נקבעות כשבונים את האימג׳. שנו אותן תחת `build: args:` בקובץ ה-Compose ובנו מחדש.

| ארגומנט בנייה | ברירת מחדל | מה הוא עושה |
| --- | --- | --- |
| `VITE_EDITION` | `community` בקובץ ה-Compose | המהדורה שהעורך מציג. הבנייה לא מקבלת ערך ריק או לא מוכר. |
| `VITE_STUDIO_URL` | `https://studio.nodaro.ai` | הכתובת של הקישורים **פתיחה ב-Studio**. |
| `VITE_PERSON_URL` | `https://person.nodaro.ai` | הכתובת של הכרטיס **פתיחת Person** בדף הבית. |

## עורכי וידאו ואודיו
הכפתור **עריכה ב-NodarCut** בתוצאת וידאו על הקנבס, והכפתור **עריכה** בתוצאת וידאו ב[אפליקציה](https://nodaro.ai/docs/concepts/apps), פותחים את עורך הווידאו NodarCut. הכפתור **עריכה** בתוצאת אודיו באפליקציה פותח את עורך האודיו AudioMass. המדיה שלכם לא נשלחת לשרת של העורך: האפליקציה קוראת את הקובץ מהאחסון שלכם ומעבירה אותו לעורך בתוך הדפדפן. העריכה והייצוא מתבצעים שם.

- **וידאו.** כשהמשתנה `FREECUT_URL` ריק, העורך נטען מ-`freecut.nodaro.ai`, שמאפשר הטמעה רק מ-`http://localhost:3000`. ב-origin אחר, כמו כתובת ברשת המקומית או דומיין, הדפדפן חוסם אותו והחלונית מסבירה למה. כדי שהכתובת שלכם תאושר, פתחו Issue ב-GitHub עם הכתובת שבה ההתקנה שלכם זמינה, או הריצו [FreeCut](https://github.com/nodaroai/freecut) משלכם. FreeCut ציבורי, ברישיון MIT, ומגיע עם Dockerfile. אחר כך הגדירו `FREECUT_URL=https://freecut.example.internal`.
- **אודיו.** Nodaro לא מארח גרסה ציבורית של AudioMass, ולכן עד שתגדירו אותו, הכפתור **עריכה** בתוצאת אודיו לא פותח שום עורך. בלשונית **מצגת** הוא לא עושה כלום, ומחוץ לעורך הוא מציג חלונית שמסבירה מה להגדיר. הריצו את ה-fork של Nodaro, [AudioMass](https://github.com/nodaroai/audiomass), שתומך בהעברה בתוך הדפדפן שחסרה ב-AudioMass המקורי. אחר כך הגדירו `AUDIOMASS_URL=https://audiomass.example.internal`.

אחרי שינוי, הפעילו מחדש את מערך השירותים. אין צורך לבנות מחדש.

## לוגואים של יצרני מודלים
הנתיב `GET /v1/models` מציין את היצרן של כל מודל, ויכול לכלול את הלוגו של היצרן ב-`logoUrl`, עבור אפליקציות שמציגות תפריט בחירת מודל. הלוגו של חברה הוא סימן מסחר שלה, ולכן Nodaro לא מגיע עם אף לוגו. התקנה מפרסמת רק את הלוגואים שיש לה זכות להציג. לכל יצרן אחר, השדה `logoUrl` הוא `null`, והאפליקציות מציגות אז את שם היצרן. התקנה שלא מפרסמת אף לוגו לא צריכה שום הגדרה.

כדי לפרסם לוגו של יצרן:

1. **העלו את הקובץ** ל-bucket שמאחורי `R2_PUBLIC_URL`, לנתיב `brand/makers/<maker id>.svg`, עם סוג התוכן `image/svg+xml`. השתמשו בלוגו הרשמי של החברה כקובץ SVG בלי סקריפטים. מזהי היצרנים הם ערכי `maker.id` שהנתיב `GET /v1/models` מחזיר.
2. **הצהירו על מזהי היצרנים** בהגדרת המופע `model_maker_logos`, רשימה כמו `["google", "openai"]`. בהתקנת Business, מנהל השרת מגדיר אותה עם `PUT /v1/admin/settings/model_maker_logos` ועם גוף הבקשה `{"value": ["google", "openai"]}`. במהדורת Community, שאין בה ממשק ניהול, כתבו את אותה הגדרת מופע ישירות במסד הנתונים.

- **השרת בודק קודם את הקובץ.** יצרן שהוצהר מקבל `logoUrl` רק כשהקובץ שלו נמצא ב-bucket כ-SVG, ולכן אפשר לבצע את שני השלבים בכל סדר. כשהקובץ חסר או מסוג שגוי, הערך הוא `null`, אף פעם לא כתובת שבורה.
- **אל תפתחו את הכתובת בדפדפן כדי לבדוק העלאה.** ה-CDN, ו-Caddy במערך השירותים המובנה, שומרים במטמון תשובת "not found" (לא נמצא) למשך שנה. בדקו את הקובץ בקונסולת האחסון או בבקשת `HEAD`, כמו `curl -I`.
- **תזמון.** לוגו חדש מופיע בתוך כעשר דקות. כדי להחליף לוגו, העלו את הקובץ החדש במקום הישן: הכתובת משתנה יחד עם הקובץ. כדי להסיר לוגו, הסירו את המזהה שלו מההגדרה או מחקו את הקובץ.
- **Nodaro אף פעם לא מוחק את הקבצים האלה.** כשאתם רוצים להסיר לוגו, הסירו אותו מקונסולת האחסון.

## שפת ברירת המחדל
המשתנה `DEFAULT_LOCALE` קובע את השפה שמבקר חדש מתחיל בה. הערכים האפשריים: `he`, `ar`, `de`, `fr`, `es`, `hi`, `ja`, `ko`, `pt-BR`, `ru`, `zh-CN` ו-`en`. הבחירה השמורה של המשתמש עצמו תמיד גוברת. בערך ריק, בערך של רווחים בלבד או בערך לא מוכר, נעשה שימוש בשפת הדפדפן של המבקר. כדי שהשינוי ייכנס לתוקף, הפעילו מחדש. ראו את הדף [שפות](https://nodaro.ai/docs/concepts/languages).

## חבילות מדריכים
התקנה באירוח עצמי יכולה להוסיף מדריכים משלה למדריכים המובנים, בלי לבנות מחדש. כל חבילה היא תיקייה:

- **`manifest.json`** — ה-`name` של החבילה וה-`categories` שהמדריכים שלה משתמשים בהם. לכל קטגוריה יש `slug` ו-`name`, ואפשר להוסיף לה גם `sortOrder` ו-`description`. המפתחות האופציונליים הם `locale`, `version`, `forbiddenPromptTerms` ו-`creatorDisplayName`, שם היוצר שמוצג בכל כרטיס של החבילה.
- **קובץ `*.json` אחד לכל מדריך** — תמונת מצב של תהליך, עם הרכיבים, החיבורים והתוצאות שכבר נוצרו, כך שעותק משוכפל נפתח ומציג את ההרצה המוגמרת. נתוני הכרטיס האופציונליים הם `estimatedCredits`, הקרדיטים שהרצה עולה, ו-`estimatedPerMinuteCredits` למדריך שהמחיר שלו נקבע לפי אורך ההקלטה שהוא מקבל. מדריך כזה מגדיר ב-`estimatedCredits` את החלק הקבוע וב-`estimatedPerMinuteCredits` את הקרדיטים לכל דקת הקלטה. עוד שדות אופציונליים הם `nodeTypesUsed` ו-`providersUsed` לתגיות בכרטיס, `creatorDisplayName` לכל מדריך בנפרד ו-`listedIn`. הערך של `listedIn` הוא `["tutorial"]` ללשונית **מדריכים**, ברירת המחדל, או `["marketplace"]` לשוק התבניות. הוא חל רק בטעינה הראשונה של הנתונים.

כל קובץ מדיה שמדריך משתמש בו חייב להיות כתובת `https://` ציבורית. הקטגוריה של כל מדריך חייבת להיות מוצהרת ב-`manifest.json`, והיא נוצרת באתחול הראשון.

מפו את תיקיות החבילות לתוך הקונטיינר לקריאה בלבד, ורשמו את הנתיבים שלהן בתוך הקונטיינר:

```yaml
nodaro:
volumes:
      - ./tutorials/acme:/data/tutorials/acme:ro
```

```bash
NODARO_TUTORIAL_PACKS=/data/tutorials/acme
```

חבילות רק מוסיפות מדריכים; הן אף פעם לא משנות את המדריכים המובנים. חבילה שלא עוברת את בדיקת התקינות לא נטענת בכלל, והכישלון נרשם ביומן. בדיקת התקינות נכשלת כשיש JSON לא תקין, קטגוריה שלא הוצהרה, כתובת מדיה שהיא לא ציבורית או slug שמתנגש במדריך קיים. כדי לטעון חבילה ששונתה, הפעילו מחדש את הקונטיינר.

## אפליקציות לרשתות חברתיות
הפרסום ברשתות חברתיות עובד לכל רשת בנפרד. רשת הופכת לזמינה ברגע שפרטי הגישה של אפליקציית ה-OAuth שלה מוגדרים. בלעדיהם, הרשת עדיין מופיעה בדף **הגדרות › אינטגרציות** כלא זמינה, עם שמות המשתנים החסרים.

| רשת | משתנים |
| --- | --- |
| אינסטגרם | `META_APP_ID`, `META_APP_SECRET`. אופציונלי: המשתנה `META_INSTAGRAM_CONFIG_ID` ל-Facebook Login for Business. |
| אינסטגרם, בלי דף פייסבוק | `INSTAGRAM_APP_ID`, `INSTAGRAM_APP_SECRET`. Meta מנפיקה אותם בנפרד מאפליקציית פייסבוק. האסימונים מתרעננים מעצמם, בערך כל 60 ימים. |
| פייסבוק | `META_APP_ID`, `META_APP_SECRET`. אופציונלי: המשתנה `META_FACEBOOK_CONFIG_ID`. |
| טיקטוק | `TIKTOK_CLIENT_KEY`, `TIKTOK_CLIENT_SECRET` |
| יוטיוב | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` |
| לינקדאין | `LINKEDIN_CLIENT_ID`, `LINKEDIN_CLIENT_SECRET` |
| X | `X_CLIENT_ID`, `X_CLIENT_SECRET` |
| Reddit | `REDDIT_CLIENT_ID`, `REDDIT_CLIENT_SECRET` |
| Pinterest | `PINTEREST_CLIENT_ID`, `PINTEREST_CLIENT_SECRET` |
| Discord | `DISCORD_CLIENT_ID`, `DISCORD_CLIENT_SECRET`, `DISCORD_BOT_TOKEN` |
| Twitch | `TWITCH_CLIENT_ID`, `TWITCH_CLIENT_SECRET` |
| Threads | `THREADS_APP_ID`, `THREADS_APP_SECRET` |
| Mastodon | `MASTODON_CLIENT_ID`, `MASTODON_CLIENT_SECRET`. אופציונלי: המשתנה `MASTODON_URL`, ברירת מחדל `mastodon.social`. |
| טלגרם | אין: המשתמשים מדביקים אסימון בוט משלהם. |
| Bluesky | אין: המשתמשים מתחברים עם שם משתמש וסיסמת אפליקציה. |
| Dev.to, Hashnode, Medium | אין: המשתמשים מתחברים עם מפתח API או אסימון משלהם. |
| WordPress | אין: המשתמשים מתחברים עם כתובת האתר וסיסמת אפליקציה. |
| Lemmy | אין: המשתמשים מתחברים עם מופע, פרטי התחברות וקהילה. |

כל אפליקציית OAuth חייבת לאשר את כתובת ההפניה `https://<your-domain>/v1/social/callback/<network>`. כשהתחברות לפייסבוק או לאינסטגרם מנהלת יותר מדף אחד או מחשבון אחד, חלון החיבור שואל את המשתמש איזה מהם לחבר. ראו את המדריך [פרסום ברשתות החברתיות](https://nodaro.ai/docs/guides/publishing-to-social).

## שאלות נפוצות

### למה משתנה בקובץ ‎.env שלי לא משפיע?

משתנה בקובץ ‎.env משפיע רק אם קובץ ה-Compose מעביר אותו לאפליקציה, והקובץ מעביר רק את המשתנים שרשומים בבלוק environment של השירות nodaro. הוסיפו כל משתנה אחר לבלוק הזה ב-docker-compose.community.yml, ואז הריצו docker compose up -d.

### אילו משתני סביבה הם חובה?

במערך השירותים המובנה של Compose אין משתני חובה, כי המערך מגדיר או מייצר אותם. מחוץ לו, ה-API לא מוכן לעלות בלי SUPABASE_URL, בלי SUPABASE_SERVICE_ROLE_KEY ובלי INTERNAL_ORCHESTRATOR_SECRET באורך 32 תווים לפחות.

### האם צריך להפעיל מחדש אחרי שמשנים משתנה?

כן. Nodaro קורא את הסביבה שלו באתחול, ולכן הריצו docker compose up -d כדי ליצור מחדש את הקונטיינר עם הערכים החדשים. מפתחות ספק שמודבקים בדף ‎/setup הם החריג: הם נכנסים לתוקף בלי הפעלה מחדש.

### איך משנים את שפת ברירת המחדל של ההתקנה?

את שפת ברירת המחדל קובעים במשתנה DEFAULT_LOCALE, למשל DEFAULT_LOCALE=de, ואז מפעילים מחדש. מבקר חדש מתחיל בשפה הזו. הבחירה השמורה של המשתמש עצמו תמיד גוברת, ובערך לא מוכר נעשה שימוש בשפת הדפדפן.

### איך מוסיפים מדריכים משלכם להתקנה באירוח עצמי?

כדי להוסיף מדריכים משלכם, שימו כל חבילת מדריכים בתיקייה עם manifest.json וקובץ JSON אחד לכל מדריך, מפו את התיקייה לתוך הקונטיינר ורשמו את התיקיות ב-NODARO_TUTORIAL_PACKS. הפעילו מחדש כדי לטעון אותן.
