snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s

This commit is contained in:
upstream-mirror
2026-09-17 23:28:13 +05:00
commit e7da97194a
32688 changed files with 4208681 additions and 0 deletions

View File

@@ -0,0 +1,262 @@
---
title: Docker Compose
icon: docker
---
<Warning>
حاويات Docker مخصصة للاستضافة في بيئة الإنتاج أو للاستضافة الذاتية. للمساهمة، يُرجى الاطلاع على [الإعداد المحلي](/l/ar/developers/contribute/capabilities/local-setup).
</Warning>
## نظرة عامة
يوفر هذا الدليل تعليمات خطوة بخطوة لتثبيت وتكوين تطبيق "Twenty" باستخدام Docker Compose. الهدف هو جعل العملية مباشرة ومنع المشاكل الشائعة التي يمكن أن تؤدي إلى تعطيل إعدادك.
**مهم:** عدّل الإعدادات المذكورة صراحة في هذا الدليل فقط. قد يؤدي تعديل التكوينات الأخرى إلى مشاكل.
راجع [إعداد متغيرات البيئة](/l/ar/developers/self-host/capabilities/setup) لإعداد متقدم. يجب إعلان جميع متغيرات البيئة في ملف `docker-compose.yml` على مستوى الخادم و/أو العامل، اعتمادًا على المتغير.
## متطلبات النظام
* رام: تأكد من أن بيئتك تحتوي على ما لا يقل عن 2GB من ذاكرة الرام. قد يؤدي عدم كفاية الذاكرة إلى تعطل العمليات.
* دوكر ودوكر كومبوز: تأكد من تثبيت كلاهما وتحديثهما.
## الخيار 1: نص سطر واحد
قم بتثبيت أحدث إصدار مستقر من Twenty باستخدام أمر واحد:
```bash
bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
```
لتثبيت إصدار محدد أو فرع:
```bash
VERSION=vx.y.z BRANCH=branch-name bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh)
```
* استبدل x.y.z برقم الإصدار المطلوب.
* استبدل branch-name بالاسم الفرعي المطلوب تثبيته.
## الخيار 2: خطوات يدوية
اتبع هذه الخطوات لإعداد يدوي.
### الخطوة 1: إعداد ملف البيئة
1. **إنشاء ملف .env**
انسخ ملف البيئة النموذجي إلى ملف .env جديد في دليل العمل لديك:
```bash
curl -o .env https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/.env.example
```
2. **إنشاء مفتاح تشفير**
قم بتشغيل الأمر التالي لإنشاء سلسلة عشوائية فريدة:
```bash
openssl rand -base64 32
```
**مهم:** احتفظ بهذه القيمة سرية ولا تشاركها. فقدان `ENCRYPTION_KEY` يعني فقدان الوصول إلى كل سر مخزَّن في قاعدة البيانات (رموز OAuth، متغيرات التطبيق، أسرار TOTP، إلخ).
3. **تحديث الـ `.env`**
استبدل قيمة النائب في ملف .env بالقيمة الرمزية المولدة:
```ini
ENCRYPTION_KEY=random_string
```
راجع [دليل تدوير المفاتيح](/l/ar/developers/self-host/capabilities/key-rotation) للحصول على إرشادات حول تدويره بدون توقّف عن العمل.
4. **تعيين كلمة مرور PostgreSQL**
قم بتحديث قيمة `PG_DATABASE_PASSWORD` في ملف .env باستخدام كلمة مرور قوية بدون أحرف خاصة.
```ini
PG_DATABASE_PASSWORD=my_strong_password
```
### الخطوة 2: الحصول على ملف Docker Compose
قم بتنزيل ملف `docker-compose.yml` إلى دليل العمل الخاص بك:
```bash
curl -o docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/docker-compose.yml
```
### الخطوة 3: إطلاق التطبيق
بدء حاويات Docker:
```bash
docker compose up -d
```
### الخطوة 4: الوصول إلى التطبيق
إذا كنت تستضيف twentyCRM على جهازك، فافتح المتصفح وانتقل إلى [http://localhost:3000](http://localhost:3000).
إذا كنت تستضيفه على خادم، فتحقق من أن الخادم يعمل وأن كل شيء على ما يرام باستخدام
```bash
curl http://localhost:3000
```
## التكوين
### جعل Twenty متاحاً للوصول الخارجي
افتراضياً، يعمل Twenty على `localhost` على المنفذ `3000`. تقوم واجهة المستخدم بحل واجهة برمجة التطبيقات (API) من مصدر المتصفح نفسه، لذلك يتم تحميلها من أي اسم مضيف يصل إلى الحاوية — لكن يجب مع ذلك تعيين `SERVER_URL` إلى عنوان URL العام الخاص بك: يستخدمه الخادم للروابط المُنشأة (رسائل البريد الإلكتروني، استدعاءات OAuth) ولاكتشاف HTTPS لملفات تعريف الارتباط الآمنة.
#### فهم `SERVER_URL`
* **البروتوكول:** استخدم `http` أو `https` حسب الإعداد الخاص بك.
* استخدم `http` إذا لم تقم بإعداد SSL.
* استخدم `https` إذا كان لديك SSL تم تكوينه.
* **النطاق/الآي بي:** هذا هو النطاق أو عنوان IP حيث يكون تطبيقك متاحاً.
* **المنفذ:** اشمل رقم المنفذ إذا لم تكن تستخدم المنافذ الافتراضية (`80` لـ `http`, `443` لـ `https`).
### متطلبات SSL
SSL (HTTPS) مطلوب لعمل ميزات معينة في المتصفح بشكل صحيح. بينما قد تعمل هذه الميزات أثناء التطوير المحلي (بما أن المتصفحات تعامل localhost بشكل مختلف)، هناك حاجة إلى إعداد SSL صحيح عند استضافة Twenty على نطاق عادي.
على سبيل المثال، قد يطلب API للحافظة السياق الآمن - بعض الميزات مثل أزرار النسخ في جميع أنحاء التطبيق قد لا تعمل بدون تمكين HTTPS.
نوصي بشدة بإعداد Twenty خلف وكيل عكسي مع إنهاء SSL للأمان والوظيفية المثلى.
#### تكوين `SERVER_URL`
1. **حدد عنوان وصولك**
* **بدون وكيل عكسي (الوصول المباشر):**
إذا كنت تصل إلى التطبيق مباشرة بدون وكيل عكسي:
```ini
SERVER_URL=http://your-domain-or-ip:3000
```
* **مع وكيل عكسي (المنافذ القياسية):**
إذا كنت تستخدم وكيل عكسي مثل Nginx أو Traefik وكان لديك SSL تم تكوينه:
```ini
SERVER_URL=https://your-domain-or-ip
```
* **مع وكيل عكسي (منافذ مخصصة):**
إذا كنت تستخدم منافذ غير قياسية:
```ini
SERVER_URL=https://your-domain-or-ip:custom-port
```
2. **تحديث ملف `.env`**
افتح ملف `.env` وقم بتحديث `SERVER_URL`:
```ini
SERVER_URL=http(s)://your-domain-or-ip:your-port
```
**أمثلة:**
* الوصول المباشر بدون SSL:
```ini
SERVER_URL=http://123.45.67.89:3000
```
* الوصول عبر النطاق باستخدام SSL:
```ini
SERVER_URL=https://mytwentyapp.com
```
3. **إعادة تشغيل التطبيق**
لتطبيق التغييرات، أعد تشغيل حاويات Docker:
```bash
docker compose down
docker compose up -d
```
#### اعتبارات
* **تكوين الوكيل العكسي:**
تأكد من أن الوكيل العكسي يوجه الطلبات إلى المنفذ الداخلي الصحيح (افتراضيًا `3000`). قم بتكوين انتهاء SSL وأي ترويسات مطلوبة.
* **إعدادات الجدار الناري:**
افتح المنافذ اللازمة في جدار الحماية للسماح بالوصول الخارجي.
* **التناسق:**
يجب أن يتطابق `SERVER_URL` مع طريقة وصول المستخدمين إلى تطبيقك في متصفحاتهم.
#### استمرارية البيانات
* **أحجام البيانات:**
يستخدم تكوين Docker Compose وحدات التخزين للاحتفاظ بالبيانات لقاعدة البيانات وتخزين الخادم.
* **البيئات غير المرتبطة بالحالة:**
إذا كنت تقوم بالنشر إلى بيئة غير مرتبطة بالحالة (مثل بعض خدمات السحابة)، فقم بتكوين التخزين الخارجي لحفظ البيانات.
## النسخ الاحتياطي والاستعادة
تحمي النسخ الاحتياطية المنتظمة بيانات نظام إدارة علاقات العملاء لديك من الفقدان.
### إنشاء نسخة احتياطية لقاعدة البيانات
```bash
docker exec twenty-postgres pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql
```
### أتمتة النسخ الاحتياطية اليومية
أضف إلى crontab لديك (`crontab -e`):
```bash
0 2 * * * docker exec twenty-postgres pg_dump -U postgres twenty > /backups/twenty_$(date +\%Y\%m\%d).sql
```
### الاستعادة من نسخة احتياطية
1. إيقاف التطبيق:
```bash
docker compose stop server worker
```
2. استعادة قاعدة البيانات:
```bash
docker exec -i twenty-postgres psql -U postgres twenty < backup_20240115.sql
```
3. إعادة تشغيل الخدمات:
```bash
docker compose up -d
```
### أفضل ممارسات النسخ الاحتياطي
* **اختبر عمليات الاستعادة بانتظام** — تحقق من أن النسخ الاحتياطية تعمل فعلاً
* **خزّن النسخ الاحتياطية خارج الموقع** — استخدم التخزين السحابي (S3، GCS، إلخ.)
* **شفّر البيانات الحساسة** — قم بحماية النسخ الاحتياطية بالتشفير
* **احتفِظ بنسخ متعددة** — احتفِظ بنسخ احتياطية يومية وأسبوعية وشهرية
## استكشاف الأخطاء وإصلاحها
إذا واجهت أي مشكلة، فارجع إلى [استكشاف الأخطاء وإصلاحها](/l/ar/developers/self-host/capabilities/troubleshooting) للحصول على الحلول.
## الاستضافة المُدارة
<Tip>
تُفضّل عدم تشغيل وصيانة Twenty بنفسك؟ [اعثر على شريك استضافة Twenty معتمد](https://twenty.com/partners/list?categories=HOSTING\&ref=docs-docker-compose) لنشر واستضافة وإدارة مثيلك من البداية إلى النهاية. *(أو تواصل مع فريقنا: [contact@twenty.com](mailto:contact@twenty.com).)*
</Tip>

View File

@@ -0,0 +1,60 @@
---
title: تدوير المفاتيح
icon: rotate
---
يمتلك Twenty عائلتين مستقلتين من المفاتيح:
* **مفاتيح توقيع JWT** — أزواج مفاتيح غير متماثلة ES256 (مع علامة `kid`) مُخزَّنة في `core."signingKey"`، تُستخدم لتوقيع والتحقق من رموز الوصول / التحديث.
* **مفتاح التشفير أثناء السكون (At-rest encryption key)** — `ENCRYPTION_KEY`، يُستخدم لتشفير رموز OAuth، ومتغيرات التطبيق، ومفاتيح التوقيع الخاصة، وقيم الإعدادات الحساسة، وأسرار TOTP داخل غلاف `enc:v2:`.
يُعد `APP_SECRET` سراً قديماً مُحتفَظاً به لأغراض التوافق مع الإصدارات السابقة: عندما لا يكون `ENCRYPTION_KEY` مضبوطاً، فإنه يعمل كحل احتياطي لمفتاح التشفير أثناء السكون / ملفات تعريف الارتباط للجلسة، ولا يزال يتحقق من رموز الوصول HS256 الموجودة مسبقاً. سيتم إهماله (إيقاف دعمه).
## مفاتيح توقيع JWT
يحمل كل مفتاح قيمة `publicKey` (يُحتفَظ بها إلى أجل غير مسمى حتى يمكنها التحقق من الرموز المصدرة مسبقاً)، و`privateKey` مُشفَّراً (يُستخدم فقط أثناء كون المفتاح حالياً)، وراية `isCurrent` (صف واحد فقط في كل وقت)، وحقل `revokedAt` اختياري.
### تدوير المفتاح الحالي
اضبط `SIGNING_KEY_ROTATION_DAYS` للتفعيل: عندها تصدر مهمة cron يومية مفتاحًا حاليًا جديدًا بمجرد أن يصبح المفتاح القائم أقدم من تلك العتبة. لا يتم إبطال المفاتيح السابقة، لذلك تستمر الرموز الموقعة تحتها في التحقق. اترك المتغير غير معيّن لتعطيل التدوير التلقائي.
<Note>ميزة التدوير التلقائي متوفّرة ابتداءً من الإصدار v2.6+.</Note>
### إبطال مفتاح (في حالات التسريب / الطوارئ فقط)
**Settings → Admin Panel → Signing keys → Revoke** على صف غير حالي. تعمل على مسح المادة الخاصة المشفرة، وتعيين `revokedAt`، ورفض كل رمز حالي موقَّع تحت هذا الـ `kid`.
## تدوير `ENCRYPTION_KEY`
<Note>أمر `secret-encryption:rotate` الموضَّح أدناه متوفر ابتداءً من الإصدار v2.6+.</Note>
يُغلَّف كل مقدار مُشفَّر بالشكل `enc:v2:\<keyId>:\<payload>`، حيث إن `\<keyId>` هو بادئة مكوَّنة من 8 أرقام ست عشرية مشتقة من المفتاح الخام. تتم عملية التدوير (الاستبدال) أثناء العمل، وقابلة للاستئناف.
1. **إنشاء مفتاح جديد**: `openssl rand -base64 32`.
2. **ضَبْط المفتاحين معاً جنباً إلى جنب** في ملف `.env`، ثم إعادة تشغيل الخدمة:
```ini
ENCRYPTION_KEY=NEW_VALUE
FALLBACK_ENCRYPTION_KEY=OLD_VALUE
```
تستخدم عمليات الكتابة الجديدة المفتاح الجديد، بينما لا تزال الصفوف الحالية تُفك تشفيرها عبر المفتاح الاحتياطي (fallback).
3. **إعادة تشفير الصفوف الحالية**:
```bash
docker exec -it {server_container} yarn command:prod secret-encryption:rotate
```
يتناول الأمر ستة مواقع (`connected-account-tokens`، `application-variable`، `application-registration-variable`، `signing-key-private-keys`، `sensitive-config-storage`، `totp-secrets`). يُهمِل عامل تصفية SQL الصفوف الموجودة بالفعل على `\<keyId>` الجديد، لذلك يكون الأمر عديم الأثر التكراري (idempotent): يمكنك مقاطعته وإعادة تشغيله حسب الحاجة. يخرج بقيمة مختلفة عن الصفر إذا فشل أي صف — أعد تشغيله لإعادة المحاولة.
| خيار | الوصف |
| ---------------------------------------- | ------------------------------------------------------------- |
| `-s, --site \<site>` | حصر التنفيذ على موقع واحد فقط. |
| `-b, --batch-size \<n>` | عدد الصفوف في كل دفعة (الافتراضي `200`، والحد الأقصى `5000`). |
| `-d, --dry-run` | فك التشفير + إعادة التشفير في الذاكرة، مع تخطي جملة `UPDATE`. |
4. **إزالة المفتاح الاحتياطي (fallback)** بمجرد أن يُظهِر الخيار `--dry-run` عدم وجود صفوف متبقية: أزِل `FALLBACK_ENCRYPTION_KEY` وأعد التشغيل.
## دعم `APP_SECRET` القديم
تستخدم النُسخ الأقدم التي لم تُعيِّن `ENCRYPTION_KEY` مطلقاً المتغيِّر `APP_SECRET` كمفتاح التشفير أثناء السكون (وكسرّ ملف تعريف الارتباط الخاص بالجلسة، المشتقّ منه). يُحفَظ هذا المسار لأغراض التوافق مع الإصدارات السابقة ولكنه **مهمل (موقوف الدعم)** — عيِّن متغير `ENCRYPTION_KEY` مخصَّصاً واتبع إجراء التدوير الموضَّح أعلاه للانتقال بعيداً عنه. يبقى `APP_SECRET` نفسه قيد الاستخدام للتحقق من رموز الوصول HS256 القديمة.

View File

@@ -0,0 +1,410 @@
---
title: إعداد
icon: gear
---
# إدارة الإعدادات
<Warning>
**هل هي المرة الأولى التي تقوم فيها بالتثبيت؟** اتبع [دليل تثبيت Docker Compose](/l/ar/developers/self-host/capabilities/docker-compose) لتشغيل Twenty، ثم عد هنا للإعداد.
</Warning>
يوفر Twenty **وضعين للإعداد** ليلائم احتياجات النشر المختلفة:
**الوصول إلى لوحة الإدارة:** يمكن للمستخدمين الذين لديهم صلاحيات المسؤول (`canAccessFullAdminPanel: true`) فقط الوصول إلى واجهة التكوين.
## 1. إعداد لوحة الإدارة (افتراضي)
```bash
IS_CONFIG_VARIABLES_IN_DB_ENABLED=true # default
```
**يحدث أغلب التكوين عبر واجهة المستخدم** بعد التثبيت:
1. الوصول إلى نسخة Twenty الخاصة بك (عادة `http://localhost:3000`)
2. اذهب إلى **الإعدادات / لوحة الإدارة / متغيرات التكوين**
3. اضبط التكاملات، والبريد الإلكتروني، والتخزين، والمزيد
4. تسري التغييرات على الفور (خلال 15 ثانية لعمليات النشر متعددة الحاويات)
<Warning>
**نشرات متعددة الحاويات:** عند استخدام إعدادات قاعدة البيانات (`IS_CONFIG_VARIABLES_IN_DB_ENABLED=true`)، يقوم كل من حاويات الخادم والعامل بالقراءة من نفس قاعدة البيانات. التغييرات في لوحة الإدارة تؤثر عليهما تلقائيًا، مما يلغي الحاجة إلى تكرار متغيرات البيئة بين الحاويات (باستثناء متغيرات البنية التحتية).
</Warning>
**ما يمكنك تكوينه عبر لوحة الإدارة:**
* **المصادقة** - Google/Microsoft OAuth، إعدادات كلمة المرور
* **البريد الإلكتروني** - إعدادات SMTP، القوالب، التحقق
* **التخزين** - تكوين S3، مسارات التخزين المحلية
* **التكاملات** - Gmail، تقويم Google، خدمات Microsoft
* **حدود التشغيل ومعدل التكنولوجيا** - حدود التنفيذ، API الحد من السرعة
* **والمزيد من الأمور...**
![متغيرات تكوين لوحة الإدارة](/images/user-guide/setup/admin-panel-config-variables.png)
<Warning>
كل متغير موثق بوصف في لوحة الإدارة الخاصة بك في **الإعدادات → لوحة الإدارة → متغيرات التكوين**.
بعض إعدادات البنية التحتية مثل اتصالات قاعدة البيانات (`PG_DATABASE_URL`)، عناوين الخوادم (`SERVER_URL`)، والأسرار (`ENCRYPTION_KEY`, `FALLBACK_ENCRYPTION_KEY`) يمكن ضبطها فقط عبر ملف `.env`.
[مرجع تقني كامل →](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts)
</Warning>
## مفاتيح التشفير
تستخدم Twenty مفتاحَي تشفير يحددان حصراً عبر متغيرات البيئة:
| المتغيّر | الغرض | مطلوب |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| `ENCRYPTION_KEY` | المفتاح الأساسي المستخدم لتشفير الأسرار أثناء التخزين (رموز OAuth، متغيرات التطبيق، المفاتيح الخاصة لمفاتيح التوقيع، أسرار TOTP، قيم الإعدادات الحساسة). | نعم في عمليات التثبيت الجديدة (قد تعتمد عمليات التثبيت القديمة بدلاً من ذلك على `APP_SECRET` — انظر أدناه) |
| `FALLBACK_ENCRYPTION_KEY` | مفتاح مخصص للتحقق فقط. يتم تعيينه أثناء التدوير ليكون `ENCRYPTION_KEY` السابق حتى تظل الصفوف الحالية قابلة لفك التشفير. | فقط أثناء التدوير |
لضمان التوافق مع الإصدارات السابقة، إذا لم يتم تعيين `ENCRYPTION_KEY`، فإن Twenty تستخدم `APP_SECRET` كبديل لتشفير البيانات أثناء التخزين — بما يطابق سلوك الإصدارات القديمة في عمليات النشر الأقدم. يجب على عمليات التثبيت الجديدة دائماً تعيين قيمة مخصصة لـ `ENCRYPTION_KEY`.
قم بإنشاء القيم باستخدام الأمر `openssl rand -base64 32` وخزنها في مكان آمن (مثل مدير الأسرار، إعدادات مُشفَّرة، إلخ). فقدان `ENCRYPTION_KEY` يعني فقدان الوصول إلى كل سر مخزن في قاعدة البيانات.
لتدوير `ENCRYPTION_KEY` بدون وقت توقف، راجع [دليل تدوير المفاتيح](/l/ar/developers/self-host/capabilities/key-rotation).
## 2. إعداد بيئي فقط
```bash
IS_CONFIG_VARIABLES_IN_DB_ENABLED=false
```
**جميع الإعدادات تتم إدارتها عبر ملفات `.env`:**
1. قم بتعيين `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` في ملف `.env` الخاص بك
2. أضف جميع متغيرات الإعداد إلى ملف `.env` الخاص بك
3. أعد تشغيل الحاويات لتصبح التغييرات نافذة
4. ستظهر لوحة الإدارة القيم الحالية لكنها لن تتمكن من تعديلها
## وضع تعدد مساحات العمل
افتراضيًا، تعمل Twenty في **وضع مساحة عمل واحدة** — وهو مثالي لمعظم عمليات النشر المستضافة ذاتيًا حيث تحتاج إلى مثيل واحد من نظام إدارة علاقات العملاء لمؤسستك.
### وضع مساحة العمل الواحدة (الافتراضي)
```bash
IS_MULTIWORKSPACE_ENABLED=false # default
```
* مساحة عمل واحدة لكل مثيل من Twenty
* أول مستخدم يصبح تلقائيًا مشرفًا مع صلاحيات كاملة (`canImpersonate` و`canAccessFullAdminPanel`)
* يتم تعطيل عمليات التسجيل الجديدة بعد إنشاء مساحة العمل الأولى
* بنية URL بسيطة: `https://your-domain.com`
### تمكين وضع تعدد مساحات العمل
```bash
IS_MULTIWORKSPACE_ENABLED=true
DEFAULT_SUBDOMAIN=app # default value
```
قم بتمكين وضع تعدد مساحات العمل لعمليات النشر المشابهة لـ SaaS حيث تحتاج عدة فرق مستقلة إلى مساحات عمل خاصة بها على نفس مثيل Twenty.
**الاختلافات الرئيسية مقارنة بوضع مساحة العمل الواحدة:**
* يمكن إنشاء مساحات عمل متعددة على نفس المثيل
* تحصل كل مساحة عمل على نطاق فرعي خاص بها (مثل: `sales.your-domain.com`، `marketing.your-domain.com`)
* يسجل المستخدمون ويقومون بتسجيل الدخول عبر `{DEFAULT_SUBDOMAIN}.your-domain.com` (مثل: `app.your-domain.com`)
* لا توجد صلاحيات مشرف تلقائية — أول مستخدم في كل مساحة عمل يكون مستخدمًا عاديًا
* إعدادات خاصة بمساحة العمل مثل النطاق الفرعي والنطاق المخصص تصبح متاحة ضمن إعدادات مساحة العمل
<Warning>
**إعداد خاص بالبيئة فقط:** لا يمكن تكوين `IS_MULTIWORKSPACE_ENABLED` إلا عبر ملف `.env` ويتطلب إعادة تشغيل. لا يمكن تغييره عبر لوحة الإدارة.
</Warning>
### تكوين DNS لوضع تعدد مساحات العمل
عند استخدام وضع تعدد مساحات العمل، قم بتكوين DNS لديك بسجل wildcard للسماح بإنشاء النطاقات الفرعية ديناميكيًا:
```
*.your-domain.com -> your-server-ip
```
يُمكّن هذا توجيه النطاقات الفرعية تلقائيًا لمساحات العمل الجديدة دون تكوين DNS يدوي.
### تقييد إنشاء مساحات العمل
في وضع تعدد مساحات العمل، قد ترغب في تقييد من يمكنه إنشاء مساحات عمل جديدة:
```bash
IS_WORKSPACE_CREATION_LIMITED_TO_SERVER_ADMINS=true
```
عند التمكين، يمكن فقط للمستخدمين الذين لديهم `canAccessFullAdminPanel` إنشاء مساحات عمل إضافية. لا يزال بإمكان المستخدمين إنشاء مساحة العمل الأولى الخاصة بهم أثناء التسجيل الأولي.
## تكامل Gmail و Google Calendar
### إنشاء مشروع Google Cloud
1. اذهب إلى [وحدة تحكم السحابة من Google](https://console.cloud.google.com/)
2. أنشئ مشروعًا جديدًا أو اختر أحد المشاريع الموجودة
3. قم بتفعيل هذه الـ APIs:
* [Gmail API](https://console.cloud.google.com/apis/library/gmail.googleapis.com)
* [Google Calendar API](https://console.cloud.google.com/apis/library/calendar-json.googleapis.com)
* [People API](https://console.cloud.google.com/apis/library/people.googleapis.com)
### تكوين OAuth
1. اذهب إلى [بيانات اعتماد](https://console.cloud.google.com/apis/credentials)
2. قم بإنشاء معرف عميل OAuth 2.0
3. أضف هذه الـ URIs لإعادة التوجيه:
* `https://{your-domain}/auth/google/redirect` (لتسجيل الدخول الفردي)
* `https://{your-domain}/auth/google-apis/get-access-token` (للتكاملات)
### الإعداد في Twenty
1. اذهب إلى **الإعدادات → لوحة الإدارة → متغيرات التكوين**
2. ابحث بسهولة **عن قسم Google Auth**
3. حدد هذه المتغيرات:
* `MESSAGING_PROVIDER_GMAIL_ENABLED=true`
* `CALENDAR_PROVIDER_GOOGLE_ENABLED=true`
* `AUTH_GOOGLE_CLIENT_ID={client-id}`
* `AUTH_GOOGLE_CLIENT_SECRET={client-secret}`
* `AUTH_GOOGLE_CALLBACK_URL=https://{your-domain}/auth/google/redirect`
* `AUTH_GOOGLE_APIS_CALLBACK_URL=https://{your-domain}/auth/google-apis/get-access-token`
<Warning>
**وضع بيئي فقط:** إذا كنت قد ضبطت `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`، فأضف هذه المتغيرات إلى ملف `.env` الخاص بك بدلاً من ذلك.
</Warning>
**النطاقات المطلوبة** (يتم تكوينها تلقائيًا):
[انظر الشيفرة المصدرية ذات الصلة](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes.ts#L4-L10)
* `https://www.googleapis.com/auth/calendar.events`
* `https://www.googleapis.com/auth/gmail.readonly`
* `https://www.googleapis.com/auth/profile.emails.read`
### إذا كان تطبيقك في وضع الاختبار
إذا كان تطبيقك في وضع الاختبار، ستحتاج إلى إضافة مستخدمين اختباريين إلى مشروعك.
تحت [شاشة موافقة OAuth](https://console.cloud.google.com/apis/credentials/consent)، أضف مستخدمي الاختبار إلى قسم "مستخدمو الاختبار".
## تكامل Microsoft 365
<Warning>
يجب على المستخدمين الحصول على [ترخيص Microsoft 365](https://admin.microsoft.com/Adminportal/Home) ليتمكنوا من استخدام تقويم API ورسائل. لن يتمكنوا من مزامنة حسابهم في Twenty دون واحد منها.
</Warning>
### إنشاء مشروع في Microsoft Azure
ستحتاج إلى إنشاء مشروع في [Microsoft Azure](https://portal.azure.com/#view/Microsoft_AAD_IAM/AppGalleryBladeV2) والحصول على بيانات الاعتماد.
### تمكين APIs
على وحدة تحكم Microsoft Azure، قم بتمكين الواجهات التالية في "أذونات":
* Microsoft Graph: Mail.ReadWrite
* Microsoft Graph: Mail.Send
* Microsoft Graph: Calendars.Read
* Microsoft Graph: User.Read
* Microsoft Graph: openid
* Microsoft Graph: email
* Microsoft Graph: profile
* Microsoft Graph: offline_access
<Note>
"Mail.ReadWrite" و "Mail.Send" إلزاميان فقط إذا كنت ترغب في إرسال رسائل بريد إلكتروني باستخدام إجراءات سير العمل الخاصة بنا. يمكنك استخدام "Mail.Read" بدلاً من ذلك إذا كنت ترغب فقط في تلقي الرسائل الإلكترونية.
</Note>
<Note>
"Calendars.ReadWrite" إلزامي إذا كنت تريد إنشاء أحداث تقويم باستخدام إجراءات سير العمل الخاصة بنا. إذا كنت تريد فقط مزامنة أحداث التقويم، فاستخدم "Calendars.Read".
</Note>
### URIs لإعادة التوجيه المصرح بها
ستحتاج إلى إضافة URIs التالية لإعادة التوجيه إلى مشروعك:
* `https://{your-domain}/auth/microsoft/redirect` إذا كنت تريد استخدام تسجيل الدخول الفردي في Microsoft
* `https://{your-domain}/auth/microsoft-apis/get-access-token`
### الإعداد في Twenty
1. اذهب إلى **الإعدادات → لوحة الإدارة → متغيرات التكوين**
2. ابحث عن قسم **Microsoft Auth**
3. حدد هذه المتغيرات:
* `MESSAGING_PROVIDER_MICROSOFT_ENABLED=true`
* `CALENDAR_PROVIDER_MICROSOFT_ENABLED=true`
* `AUTH_MICROSOFT_ENABLED=true`
* `AUTH_MICROSOFT_CLIENT_ID={client-id}`
* `AUTH_MICROSOFT_CLIENT_SECRET={client-secret}`
* `AUTH_MICROSOFT_CALLBACK_URL=https://{your-domain}/auth/microsoft/redirect`
* `AUTH_MICROSOFT_APIS_CALLBACK_URL=https://{your-domain}/auth/microsoft-apis/get-access-token`
<Warning>
**وضع بيئي فقط:** إذا كنت قد ضبطت `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`، فأضف هذه المتغيرات إلى ملف `.env` الخاص بك بدلاً من ذلك.
</Warning>
### تكوين النطاقات
[انظر الشيفرة المصدرية ذات الصلة](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes.ts#L2-L9)
* 'openid'
* 'البريد الإلكتروني'
* 'profile'
* 'offline_access'
* 'Mail.ReadWrite'
* 'Mail.Send'
* 'Calendars.Read'
### إذا كان تطبيقك في وضع الاختبار
إذا كان تطبيقك في وضع الاختبار، ستحتاج إلى إضافة مستخدمين اختباريين إلى مشروعك.
أضف مستخدمي الاختبار إلى قسم "المستخدمون والمجموعات".
## مهام الخلفية للتقويم والمراسلة
بعد إعداد تكامل Gmail، أو Google Calendar، أو Microsoft 365، تحتاج إلى بدء وظائف الخلفية التي تقوم بمزامنة البيانات.
سجل الوظائف المتكررة التالية في حاوية العمل الخاصة بك:
```bash
# from your worker container
yarn command:prod cron:messaging:messages-import
yarn command:prod cron:messaging:message-list-fetch
yarn command:prod cron:calendar:calendar-event-list-fetch
yarn command:prod cron:calendar:calendar-events-import
yarn command:prod cron:messaging:ongoing-stale
yarn command:prod cron:calendar:ongoing-stale
yarn command:prod cron:workflow:automated-cron-trigger
```
## تكوين البريد الإلكتروني
1. اذهب إلى **الإعدادات → لوحة الإدارة → متغيرات التكوين**
2. ابحث عن قسم **Email**
3. قم بضبط إعدادات SMTP الخاصة بك:
<Tabs>
<Tab title="جيميل">
ستحتاج إلى توفير [كلمة مرور التطبيق](https://support.google.com/accounts/answer/185833).
* EMAIL_DRIVER=smtp
* EMAIL_SMTP_HOST=smtp.gmail.com
* EMAIL_SMTP_PORT=465
* EMAIL_SMTP_USER=gmail_email_address
* EMAIL_SMTP_PASSWORD='gmail_app_password'
</Tab>
<Tab title="أوفيس 365">
تذكر أنه إذا كنت تشغل التحقق بعاملين، ستحتاج إلى توفير [كلمة مرور التطبيق](https://support.microsoft.com/en-us/account-billing/manage-app-passwords-for-two-step-verification-d6dc8c6d-4bf7-4851-ad95-6d07799387e9).
* EMAIL_DRIVER=smtp
* EMAIL_SMTP_HOST=smtp.office365.com
* EMAIL_SMTP_PORT=587
* EMAIL_SMTP_USER=office365_email_address
* EMAIL_SMTP_PASSWORD='office365_password'
</Tab>
<Tab title="smtp4dev">
**smtp4dev** هو خادم بريد إلكتروني مزيف للتطوير والاختبار.
* قم بتشغيل صورة smtp4dev: `docker run --rm -it -p 8090:80 -p 2525:25 rnwood/smtp4dev`
* الوصول إلى واجهة المستخدم smtp4dev هنا: [http://localhost:8090](http://localhost:8090)
* حدد المتغيرات التالية:
* EMAIL_DRIVER=smtp
* EMAIL_SMTP_HOST=localhost
* EMAIL_SMTP_PORT=2525
</Tab>
</Tabs>
<Warning>
**وضع بيئي فقط:** إذا كنت قد ضبطت `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`، فأضف هذه المتغيرات إلى ملف `.env` الخاص بك بدلاً من ذلك.
</Warning>
## تخزين S3
<Warning>
افتراضياً، تقوم Twenty بتخزين الملفات المرفوعة على نظام الملفات المحلي. بالنسبة لعمليات النشر في بيئة الإنتاج، استخدم S3 أو خدمة متوافقة مع S3 (MinIO، DigitalOcean Spaces، إلخ) لضمان بقاء الملفات عبر إعادة تشغيل الحاويات وإتاحة التوسّع عبر مثيلات خوادم متعددة.
</Warning>
عيّن `STORAGE_TYPE=S_3` وقم بتهيئة متغيرات `STORAGE_S3_*` من خلال لوحة الإدارة أو `.env`. راجع [مرجع config-variables.ts](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts) للاطلاع على القائمة الكاملة لمتغيرات S3.
عند استخدام S3 مع الميزات المعتمدة على CORS (مثل تنزيل الملفات داخل المتصفح)، تأكد من أن حاويتك تسمح بأصل واجهة Twenty الأمامية ضمن تهيئة CORS الخاصة بها.
## الوظائف المنطقية ومفسر الشيفرة
تدعم Twenty الوظائف المنطقية لعمليات سير العمل ومفسر الشيفرة لتحليل بيانات الذكاء الاصطناعي. كلاهما يقوم بتشغيل الشيفرة المقدمة من المستخدم ويتطلب تهيئة صريحة لأغراض الأمان.
### الإعدادات الافتراضية للأمان
**في بيئة الإنتاج (NODE_ENV=production):** يكون الإعداد الافتراضي لكل من الوظائف المنطقية ومفسر الشيفرة هو **معطل**. يجب تمكينهما صراحة باستخدام `LOGIC_FUNCTION_TYPE` و`CODE_INTERPRETER_TYPE` إذا كنت تحتاج إلى هذه الميزات.
**في بيئة التطوير (NODE_ENV=development):** يكون الإعداد الافتراضي لكليهما **LOCAL** لتسهيل التشغيل محلياً.
<Warning>
**ملاحظة أمنية:** يقوم برنامج التشغيل المحلي (`LOGIC_FUNCTION_TYPE=LOCAL` أو `CODE_INTERPRETER_TYPE=LOCAL`) بتشغيل الشيفرة مباشرة على المضيف ضمن عملية Node.js من دون عزل. يجب استخدامه فقط للشيفرة الموثوقة أثناء التطوير. لعمليات النشر الإنتاجية التي تتعامل مع شيفرة غير موثوقة، استخدم `LOGIC_FUNCTION_TYPE=LAMBDA` أو `CODE_INTERPRETER_TYPE=E2B` (مع وضع الحماية)، أو اتركهما مُعطَّلَيْن.
</Warning>
### الوظائف المنطقية - برامج التشغيل المتاحة
| برنامج التشغيل | متغير البيئة | حالة الاستخدام | مستوى الأمان |
| -------------- | ------------------------------ | ------------------------------- | ----------------------------- |
| معطل | `LOGIC_FUNCTION_TYPE=DISABLED` | تعطيل الوظائف المنطقية بالكامل | غير متاح |
| محلي | `LOGIC_FUNCTION_TYPE=LOCAL` | بيئات التطوير والبيئات الموثوقة | منخفض (من دون عزل) |
| Lambda | `LOGIC_FUNCTION_TYPE=LAMBDA` | الإنتاج مع شيفرة غير موثوق بها | مرتفع (عزل على مستوى الأجهزة) |
### الوظائف المنطقية - الإعداد الموصى به
**للتطوير:**
```bash
LOGIC_FUNCTION_TYPE=LOCAL # default when NODE_ENV=development
```
**للإنتاج (AWS):**
```bash
LOGIC_FUNCTION_TYPE=LAMBDA
LOGIC_FUNCTION_LAMBDA_REGION=us-east-1
LOGIC_FUNCTION_LAMBDA_ROLE=arn:aws:iam::123456789:role/your-lambda-role
LOGIC_FUNCTION_LAMBDA_ACCESS_KEY_ID=your-access-key
LOGIC_FUNCTION_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
```
**لتعطيل الوظائف المنطقية:**
```bash
LOGIC_FUNCTION_TYPE=DISABLED # default when NODE_ENV=production
```
### مفسر الشيفرة - برامج التشغيل المتاحة
| برنامج التشغيل | متغير البيئة | حالة الاستخدام | مستوى الأمان |
| -------------- | -------------------------------- | ------------------------------------- | ------------------------ |
| معطل | `CODE_INTERPRETER_TYPE=DISABLED` | تعطيل تنفيذ الشيفرة بالذكاء الاصطناعي | غير متاح |
| محلي | `CODE_INTERPRETER_TYPE=LOCAL` | للتطوير فقط | منخفض (من دون عزل) |
| E2B | `CODE_INTERPRETER_TYPE=E_2_B` | الإنتاج مع تنفيذ ضمن صندوق رمل معزول | مرتفعة (صندوق رمل معزول) |
<Note>
عند استخدام `LOGIC_FUNCTION_TYPE=DISABLED` أو `CODE_INTERPRETER_TYPE=DISABLED`، سترجع أي محاولة للتنفيذ خطأً. يكون هذا مفيدًا إذا كنت ترغب في تشغيل Twenty من دون هذه الإمكانات.
</Note>
## واجهة برمجة التطبيقات (API) والواجهة الأمامية على مضيفين منفصلين
ينطبق فقط إذا كنت لا تدع الواجهة الخلفية تقوم بخدمة الواجهة الأمامية. عمليات النشر ذات الأصل نفسه لا تحتاج إلى أي شيء هنا.
صرّح بجميع أصول المتصفحات التي تتواصل مع واجهة برمجة التطبيقات (API)، مفصولة بفواصل. `SERVER_URL`
و`FRONTEND_URL` موثوق بهما بالفعل. يقوم الخادم بتسجيل تحذير عندما يتصل به متصفح
من مصدر غير مصرح به.
```bash
AUTH_COOKIE_ALLOWED_ORIGINS=https://app.example.com
```
<Warning>
ترسل الواجهة الأمامية بيانات الاعتماد مع كل طلب، وتقوم المتصفحات برفض الاستجابة التي تحتوي على بيانات اعتماد إذا جاءت من مصدر غير مصرح به، لذلك يفشل التطبيق في التحميل حتى تقوم بتعيين هذا الإعداد.
</Warning>
إذا كان المضيفان على نطاقات قابلة للتسجيل مختلفة (وليس مجرد نطاقات فرعية مختلفة)، قم أيضًا بتعيين `AUTH_COOKIE_SAME_SITE=none`، والذي يتطلب HTTPS.
مع تمكين ميزة تعدد مساحات العمل، لا تُدرِج كل نطاق فرعي لكل مساحة عمل هنا.
بدلًا من ذلك، قم بتوجيه مسارات واجهة برمجة التطبيقات (API) (`/graphql`، `/metadata`، `/rest`، `/auth/`،
`/client-config`، `/file`) إلى الواجهة الخلفية على كل اسم مضيف لمساحة عمل، بحيث تبقى كل مساحة عمل من نفس المصدر (same-origin) — هكذا تعمل Twenty Cloud.

View File

@@ -0,0 +1,254 @@
---
title: استكشاف الأخطاء وإصلاحها
icon: wrench
---
## استكشاف الأخطاء وإصلاحها
إذا واجهت أي مشكلة أثناء إعداد البيئة للتطوير، أو ترقية النسخة الخاصة بك، أو استضافتها ذاتيًا، إليك بعض الحلول للمشاكل الشائعة.
### استضافة ذاتية
#### التثبيت الأولي ينتج عنه فشل المصادقة على كلمة المرور للمستخدم "بوستجريس"
🚨 **هام: هذا الحل فقط للتثبيتات الجديدة** 🚨
إذا كان لديك تطبيق Twenty موجود يحتوي على بيانات إنتاج، **لا تتبع هذه الخطوات لأنها ستحذف قاعدة البيانات الخاصة بك بشكل دائم!**
أثناء تثبيت Twenty لأول مرة، قد ترغب في تغيير كلمة المرور الافتراضية لقاعدة البيانات.
كلمة المرور التي تعيّنها أثناء التثبيت الأول يتم تخزينها بشكل دائم في حجم قاعدة البيانات. إذا حاولت لاحقًا تغيير هذه الكلمة في التكوين بدون إزالة الحجم القديم، ستحصل على أخطاء المصادقة لأن قاعدة البيانات لا تزال تستخدم كلمة المرور الأصلية.
⚠️ تحذير: اتباع الخطوات التالية سيقوم بحذف جميع بيانات قاعدة البيانات بشكل دائم! ⚠️
قم بالإجراء فقط إذا كان هذا تثبيتًا جديدًا بدون بيانات مهمة.
لتحديث \`PG_DATABASE_PASSWORD'، تحتاج إلى:
```sh
# Update the PG_DATABASE_PASSWORD in .env
docker compose down --volumes
docker compose up -d
```
#### تم العثور على فواصل الخط CR [نظام Windows]
يحدث هذا بسبب أحرف Windows التي تنتهي خط مع تكوين Git الخاص بك. حاول تشغيل:
```
git config --global core.autocrlf false
```
ثم قم بحذف المستودع واستنساخه مرة أخرى.
#### مخطط البيانات الوصفية مفقود
أثناء تثبيت Twenty، تحتاج إلى توفير قاعدة بيانات بوستجريس الخاصة بك بالمخططات والإضافات والمستخدمين الصحيحة.
إذا نجح تشغيل هذا التخصيص، يجب أن تحتوي قاعدة البيانات لديك على المخططات `default` و`metadata`.
إذا لم تقم بذلك، تأكد من أنه ليس لديك أكثر من مثيل بوستغريس QL يعمل على جهاز الكمبيوتر الخاص بك.
#### لا يمكن العثور على الوحدة النمطية 'twenty-emails' أو إعلانات نوعها المقابلة.
يجب عليك بناء حزمة '20 البريد الإلكتروني' (npx nx run 20 emails:build') قبل تشغيل تهيئة قاعدة البيانات.
#### حزمة twenty-x مفقودة
تأكد من تشغيل yarn في الدليل الجذر ثم تشغيل `npx nx server:dev twenty-server`. إذا لم يعمل ذلك، حاول بناء الحزمة المفقودة يدوياً.
#### التحقق من العمليات عند الحفظ لا يعمل
هذا يجب أن يعمل تلقائيًا مع تثبيت إضافة Oxc (`oxc.oxc-vscode`). إذا كان هذا لا يعمل، حاول إضافة هذا إلى إعدادات رمز VS الخاص بك (نطاق حاوية dev):
```
"editor.codeActionsOnSave": {
"source.fixAll.oxc": "explicit"
}
```
#### أثناء تشغيل `npx nx start` أو `npx nx start 20 front`، يتم إلقاء خطأ خارج الذاكرة
تشغيل الخدمات التي تحتاجها فقط، بدلاً من 'npx nx start`. على سبيل المثال، إذا كنت تعمل على الخادم، قم بتشغيل `npx nx worker twenty-server\` فقط
**إذا لم يعمل ذلك:**
إذا حاولت تشغيل `npx nx run twenty-server:start` فقط على WSL وفشل مع خطأ الذاكرة أدناه:
`FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory`
يتم تشغيل الأمر التالي في المحطة الطرفية الخاصة بك، أو إضافته إلى الملف الشخصي `.bashrc` الخاص بك بحيث يتم تطبيقه تلقائياً:
`export NODE_OPTIONS="--max-old-space-size=8192"`
علامة --max-old-space-size=8192 تحدد حداً أقصى للذاكرة الخاصة بـ Node.js بحد أقصى 8GB؛ الاستخدام يتزايد بطلبات التطبيق.
المرجع: https://stackoverflow.com/questions/56982005/where-do-i-set-node-options-max-old-space-size-2048
**إذا لم يعمل ذلك:**
تحقق من العمليات التي تستهلك معظم ذاكرة الوصول العشوائي (RAM) في جهازك. في العشرين، لاحظنا بعض ملحقات رمز VS كانت تأخذ الكثير من ذاكرة الوصول العشوائي، لذلك قمنا بتعطيلها مؤقتاً.
**إذا كان لا يعمل:**
إعادة تشغيل جهازك يساعد على تنظيف عمليات الشبح.
#### أثناء تشغيل `npx nx start` تظهر سجلات غريبة [0] و [1]
هذا متوقع حيث أن الأمر `npx nx start` يقوم بتشغيل المزيد من الأوامر خلف الكواليس
#### لا يتم إرسال الرسائل الإلكترونية
غالبًا، يكون السبب هو أن "العامل" لا يعمل في الخلفية. حاول التشغيل
```
npx nx worker twenty-server
```
#### لا يمكن ربط حساب مايكروسوفت 365 بـ 20
غالبًا، يكون السبب في ذلك هو أن المسؤول الخاص بك لم يقم بتمكين رخصة Microsoft 365 لحسابك. تحقق من [https://admin.microsoft.com/](https://admin.microsoft.com/Adminportal/Home).
إذا تلقيت رمز الخطأ `AADSTS50020`، فهذا يعني أنه ربما تستخدم حساب Microsoft شخصي. هذا غير مدعوم حتى الآن. المزيد من المعلومات [هنا](https://learn.microsoft.com/fr-fr/troubleshoot/entra/entra-id/app-integration/error-code-aadsts50020-user-account-identity-provider-does-not-exist)
#### أثناء تشغيل "yarn"، تظهر التحذيرات في وحدة التحكم
التحذيرات تخبر عن سحب تبعيات إضافية ليست مذكورة صراحة في `package.json`، طالما لم تظهر أي أخطاء تكسر العمل، ينبغي أن يعمل كل شيء كما هو متوقع.
#### عندما يصل مستخدم إلى صفحة تسجيل الدخول، يظهر خطأ حول مستخدم غير مصرح له يحاول الوصول إلى مساحة عمل في السجلات
هذا متوقع لأن المستخدم غير مصرح به عند تسجيل الخروج، لأنه لم يتم التحقق من هويته.
#### كيف يمكنك التأكد من عمل العامل الخاص بك؟
* اذهب إلى [webhook-test.com](https://webhook-test.com/) ونسخ **عنوان URL الخاص بك**.
<div style={{textAlign: 'center'}}>
<img src="/images/docs/developers/self-hosting/webhook-test.jpg" alt="اختبار الويب هوك" />
</div>
* افتح تطبيق Twenty الخاص بك، انتقل إلى `/settings`، وفعل التبديل المتقدم في الجزء السفلي الأيسر من الشاشة.
* إنشاء ويب هوك جديد.
* الصق **عنوان URL الفريد لخطّاف الويب الخاص بك** في الحقل **عنوان URL لنقطة النهاية** في Twenty. اضبط **عوامل التصفية** على `Companies` و`Created`.
<div style={{textAlign: 'center'}}>
<img src="/images/docs/developers/self-hosting/webhook-settings.jpg" alt="إعدادات الويب هوك" />
</div>
* انتقل إلى `/objects/companies` وأنشئ سجلاً جديدًا للشركة.
* ارجع إلى [webhook-test.com](https://webhook-test.com/) وتحقق مما إذا كانت هناك **طلب POST جديد** تم استلامه.
<div style={{textAlign: 'center'}}>
<img src="/images/docs/developers/self-hosting/webhook-test-result.jpg" alt="نتيجة اختبار الويب هوك" />
</div>
* إذا تم استلام **طلب POST**، فهذا يعني أن العامل يعمل بنجاح. وإلا، ستحتاج إلى استكشاف الأخطاء وإصلاحها لعامل التشغيل الخاص بك.
#### فشل في بدء و إرجاع الخطأ TS5042: الخيار 'مشروع' لا يمكن خلطه مع ملفات المصدر على سطر الأوامر
قم بالتعليق على المكون الإضافي الخاص بالمدقق في `packages/٢ui/vite-config.ts`، كما هو مبين في المثال أدناه:
```
plugins: [
react({ jsxImportSource: 'react' }),
tsconfigPaths(),
svgr(),
dts(dtsConfig),
// checker(checkersConfig),
wyw({
include: [
'**/OverflowingTextWithTooltip.tsx',
'**/Chip.tsx',
'**/Tag.tsx',
'**/Avatar.tsx',
'**/AvatarChip.tsx',
],
babelOptions: {
presets: ['@babel/preset-typescript', '@babel/preset-react'],
},
}),
],
```
#### لوحة الإدارة غير قابلة للوصول
تشغيل 'UPDATE core."user" مجموعة "canAccessFullAdminPanel" = TRUE WHERE البريد الإلكتروني = 'you@yourdomain.com'؛ في حاوية قاعدة البيانات للحصول على الوصول إلى لوحة المسؤول.
#### عند تشغيل سير العمل، يفشل تشغيل سير العمل مع الرسالة "تم تعطيل تنفيذ دوال المنطق. عيّن LOGIC_FUNCTION_TYPE إلى LOCAL أو LAMBDA لتمكين ذلك."
في بيئة الإنتاج، يتم تعطيل دوال المنطق افتراضيًا. قم بتعيين متغير البيئة `LOGIC_FUNCTION_TYPE` إلى `LOCAL` أو `LAMBDA` لتمكينها. يمكن تكوين ذلك عبر متغيرات البيئة أو من خلال متغيرات قاعدة البيانات في لوحة الإدارة. راجع [دليل إعداد دوال المنطق](/l/ar/developers/self-host/capabilities/setup#logic-functions-available-drivers) للحصول على التفاصيل.
#### عندما أكتب رسالة في دردشة الذكاء الاصطناعي ، فإنها لا تجيب على الفور ويجب علي تحديث الصفحة لمشاهدة الإجابة
هذا يعني أن البروكسي العكسي الخاص بك يفتقر إلى التهيئة لاستجابات API القائمة على البث. فيما يلي مثال على تكوين Nginx:
```
location ~* ^/api/.*stream|\/graphql\/stream {
proxy_pass http://twenty_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
proxy_request_buffering off;
proxy_cache off;
gzip off;
#chunked_transfer_encoding off;
add_header X-Accel-Buffering no always;
}
```
### إنشاء Docker بنقرة واحدة
#### غير قادر على تسجيل الدخول
إذا كنت لا تستطيع تسجيل الدخول بعد الإعداد:
1. قم بتشغيل الأوامر التالية:
```bash
docker exec -it twenty-server-1 yarn
docker exec -it twenty-server-1 npx nx database:reset --configuration=no-seed
```
2. إعادة تشغيل حاويات Docker:
```bash
docker compose down
docker compose up -d
```
لاحظ أن أمر "قاعدة البيانات: إعادة الضبط" سيمسح قاعدة البيانات الخاصة بك بالكامل وسيعيد إنشاءها من الصفر.
#### مشاكل الاتصال خلف بروكسي عكسي
إذا كنت تستخدم Twenty خلف بروكسي عكسي وواجهت مشاكل في الاتصال:
1. **تأكد من SERVER_URL:**
تأكد من أن `SERVER_URL` في ملف `.env` يتطابق مع عنوان الوصول الخارجي الخاص بك، بما في ذلك `https` إذا كان SSL مفعلاً.
2. **التحقق من إعدادات البروكسي العكسي:**
* تأكد من أن البروكسي العكسي يقوم بتمرير الطلبات بشكل صحيح إلى خادم Twenty.
* تأكد من أن رؤوس مثل `X-Forwarded-For` و`X-Forwarded-Proto` تم ضبطها بشكل صحيح.
3. **إعادة تشغيل الخدمات:**
بعد إجراء التغييرات، أعد تشغيل كل من البروكسي العكسي وحاويات Twenty.
#### خطأ عند تحميل صورة - تم رفض الإذن
تغيير ملكية مجلد البيانات على المضيف من الجذر إلى مستخدم ومجموعة آخرين يحل هذه المشكلة.
#### خطأ "لم يتم العثور على الملف" أثناء اختبار دالة Logic في سير العمل.
شغّل الأمر `yarn command:prod application:rebuild-default-deps` في حاوية twenty-server لديك لإصلاح مشكلة التبعيات المفقودة.
## الحصول على المساعدة
إذا واجهت مشكلات لم يتم تغطيتها في هذا الدليل:
* تفقد السجلات:
اعرض سجلات الحاوية للرسائل الخطأ:
```bash
docker compose logs
```
* الدعم المجتمعي:
تواصل مع [مجتمع Twenty](https://github.com/twentyhq/twenty/issues) أو [قنوات الدعم](https://discord.gg/cx5n4Jzs57) للحصول على المساعدة.

View File

@@ -0,0 +1,106 @@
---
title: دليل الترقية
icon: arrow-up-right-dots
---
## إرشادات عامة
**احرص دائمًا على إنشاء نسخة احتياطية لقاعدة البيانات قبل بدء عملية الترقية** عن طريق تشغيل:
```bash
docker exec -it {db_container_name_or_id} pg_dumpall -U {postgres_user} > databases_backup.sql
```
لاستعادة النسخة الاحتياطية:
```bash
cat databases_backup.sql | docker exec -i {db_container_name_or_id} psql -U {postgres_user}
```
إذا كنت تستخدم Docker Compose، اتبع الخطوات التالية:
1. أوقف Twenty: `docker compose down`
2. غيّر قيمة `TAG` في ملف `.env` الموجود بجانب ملف `docker-compose.yml`
3. ابدأ تشغيل Twenty: `docker compose up -d`
يقوم الخادم بتشغيل جميع عمليات ترحيل الترقية المطلوبة تلقائيًا عند بدء التشغيل. لا حاجة إلى أي أمر يدوي.
## الترقية إلى v2.34+ — الحد الأدنى PostgreSQL 15
يتطلب Twenty v2.34 الإصدار PostgreSQL 15 أو أحدث. يستخدم إعداد Docker Compose الرسمي الإصدار PostgreSQL 16. إذا كان مثيلك يتصل بقاعدة بيانات مُدارة خارجيًا، فقم بترقيتها قبل بدء خادم v2.34.
## الترقيات عبر الإصدارات (v1.23+)
بدءًا من **v1.23**، يدعم Twenty الترقيات عبر الإصدارات. يمكنك الانتقال مباشرةً من أي إصدار مدعوم إلى أحدث إصدار دون المرور بكل إصدار وسيط.
على سبيل المثال، الترقية من v1.23 مباشرةً إلى v2.0 مدعومة بالكامل.
## الترقية إلى v2.5+ — غلاف التشفير للبيانات الساكنة (at-rest)
بدءًا من **v2.5**، يقوم Twenty بتخزين الأسرار أثناء السكون (at-rest) — مثل رموز OAuth، ومتغيرات التطبيق، ومفاتيح التوقيع الخاصة، وقيم الإعدادات الحساسة، وأسرار TOTP — داخل غلاف ذي إصدار `enc:v2:` ومشفّر باستخدام `ENCRYPTION_KEY` (أو `APP_SECRET` إذا لم يتم تعيين `ENCRYPTION_KEY`).
أول إقلاع على v2.5 يشغّل أوامر ترقية بطيئة تقوم بإجراء **ملء رجعي** للصفوف الموجودة داخل الغلاف الجديد. هذه الأوامر عديمة الأثر عند التكرار (idempotent) — إيقاف الخادم وإعادة تشغيله يستأنف من حيث توقّف — لكنها قد تستغرق بعض الوقت على قواعد البيانات الكبيرة. يمكنك متابعة التقدّم باستخدام `upgrade:status`.
يجب تعيين `ENCRYPTION_KEY` مخصص **قبل** الترقية إلى v2.5 لكي يكتب الملء الرجعي الصفوف باستخدامه منذ البداية. يتطلّب تبديل المفاتيح بعد الملء الرجعي إجراء [تدوير](/l/ar/developers/self-host/capabilities/key-rotation).
## تدوير الأسرار ومفاتيح التوقيع
لمهام التشغيل اليومية مثل تدوير `ENCRYPTION_KEY`، أو تدوير مفتاح توقيع JWT، أو إبطال مفتاح توقيع تم تسريبه، راجع [دليل تدوير المفاتيح (Key rotation guide)](/l/ar/developers/self-host/capabilities/key-rotation).
## التحقق من حالة الترقية
يتيح لك الأمر `upgrade:status` فحص الحالة الحالية لمثيلك وعمليات ترحيل مساحات العمل. يكون مفيدًا لاستكشاف مشكلات الترقية وإصلاحها أو عند تقديم طلب دعم.
قم بتشغيله من حاوية الخادم:
```bash
docker exec -it {server_container_name_or_id} yarn command:prod upgrade:status
```
مثال على المخرجات:
```sh
APP_VERSION: v1.23.0
Instance
Inferred version: 1.23.0
Latest command: 1.23.0_DropWorkspaceVersionColumnFastInstanceCommand_1785000000000
Status: Up to date
Executed by: v1.23.0
At: 2026-04-16T11:43:58.823Z
Workspace
Apple (20202020-1c25-4d02-bf25-6aeccf7ea419)
Inferred version: 1.23.0
Latest command: 1.23.0_UpdateGlobalObjectContextCommandMenuItemsCommand_1780000005000
Status: Up to date
Executed by: v1.23.0
At: 2026-04-16T11:44:09.361Z
Summary
Instance: Up to date
Workspaces: 1 up to date, 0 behind, 0 failed (1 total)
```
### خيارات
| خيار | الوصف |
| ------------------------- | ----------------------------------------------------------- |
| `-w, --workspace-id <id>` | لتصفية حسب مساحة عمل معيّنة. يمكن تمريره عدة مرات. |
| `-f, --failed-only` | إخفاء مساحات العمل المحدَّثة، وعرض المتأخرة أو الفاشلة فقط. |
## استكشاف الأخطاء وإصلاحها
إذا فشلت الترقية في بعض مساحات العمل، فلن يتجاوز الخادم الخطوة الفاشلة. إعادة تشغيل الخادم (`docker compose up -d`) ستعيد محاولة الترقية من حيث توقفت.
لتحديد المشكلات بسرعة، قم بتشغيل:
```bash
docker exec -it {server_container_name_or_id} yarn command:prod upgrade:status --failed-only
```
يعرض هذا فقط مساحات العمل المتأخرة أو التي فشلت، مع رسالة الخطأ لكل حالة فشل.
## قبل v1.23
إذا كان مثيلك أقدم من v1.23، فيجب عليك الترقية تدريجيًا عبر كل إصدار رئيسي موسوم (من v1.6 إلى v1.7، ثم من v1.7 إلى v1.8، وهكذا) حتى تصل إلى v1.23. ومن هناك، يمكنك الانتقال مباشرةً إلى أحدث إصدار.

View File

@@ -0,0 +1,26 @@
---
title: الاستضافة الذاتية
description: قم بنشر Twenty وإدارته على البنية التحتية الخاصة بك.
---
<Frame>
<img src="/images/user-guide/what-is-twenty/20.png" alt="الذكاء الاصطناعي" />
</Frame>
## نظرة عامة
يمكن استضافة Twenty ذاتيًا على البنية التحتية الخاصة بك، مما يمنحك تحكمًا كاملاً في بياناتك وعمليات النشر.
## لماذا الاستضافة الذاتية؟
* **ملكية البيانات**: احتفظ بجميع بيانات إدارة علاقات العملاء (CRM) على خوادمك الخاصة
* **الامتثال**: تلبية المتطلبات التنظيمية الخاصة بإقامة البيانات
* **التخصيص**: وصول كامل إلى تعديل المنصة وتوسيعها
## البدء
<CardGroup cols={2}>
<Card title="Docker Compose" icon="docker" href="/l/ar/developers/self-host/capabilities/docker-compose">
إعداد سريع باستخدام Docker
</Card>
</CardGroup>