نظرة عامة
يوفر Twenty وضعين للإعداد ليلائم احتياجات النشر المختلفة: الوصول إلى لوحة الإدارة: يمكن للمستخدمين الذين لديهم صلاحيات المسؤول (canAccessFullAdminPanel: true) فقط الوصول إلى واجهة التكوين.
1. إعداد لوحة الإدارة (افتراضي)
- الوصول إلى نسخة Twenty الخاصة بك (عادة
http://localhost:3000) - اذهب إلى الإعدادات / لوحة الإدارة / متغيرات التكوين
- اضبط التكاملات، والبريد الإلكتروني، والتخزين، والمزيد
- تسري التغييرات على الفور (خلال 15 ثانية لعمليات النشر متعددة الحاويات)
- المصادقة - Google/Microsoft OAuth، إعدادات كلمة المرور
- البريد الإلكتروني - إعدادات SMTP، القوالب، التحقق
- التخزين - تكوين S3، مسارات التخزين المحلية
- التكاملات - Gmail، تقويم Google، خدمات Microsoft
- حدود التشغيل ومعدل التكنولوجيا - حدود التنفيذ، API الحد من السرعة
- والمزيد من الأمور…

مفاتيح التشفير
تستخدم Twenty مفتاحَي تشفير يحددان حصراً عبر متغيرات البيئة:
لضمان التوافق مع الإصدارات السابقة، إذا لم يتم تعيين
ENCRYPTION_KEY، فإن Twenty تستخدم APP_SECRET كبديل لتشفير البيانات أثناء التخزين — بما يطابق سلوك الإصدارات القديمة في عمليات النشر الأقدم. يجب على عمليات التثبيت الجديدة دائماً تعيين قيمة مخصصة لـ ENCRYPTION_KEY.
قم بإنشاء القيم باستخدام الأمر openssl rand -base64 32 وخزنها في مكان آمن (مثل مدير الأسرار، إعدادات مُشفَّرة، إلخ). فقدان ENCRYPTION_KEY يعني فقدان الوصول إلى كل سر مخزن في قاعدة البيانات.
لتدوير ENCRYPTION_KEY بدون وقت توقف، راجع دليل تدوير المفاتيح.
2. إعداد بيئي فقط
.env:
- قم بتعيين
IS_CONFIG_VARIABLES_IN_DB_ENABLED=falseفي ملف.envالخاص بك - أضف جميع متغيرات الإعداد إلى ملف
.envالخاص بك - أعد تشغيل الحاويات لتصبح التغييرات نافذة
- ستظهر لوحة الإدارة القيم الحالية لكنها لن تتمكن من تعديلها
وضع تعدد مساحات العمل
افتراضيًا، تعمل Twenty في وضع مساحة عمل واحدة — وهو مثالي لمعظم عمليات النشر المستضافة ذاتيًا حيث تحتاج إلى مثيل واحد من نظام إدارة علاقات العملاء لمؤسستك.وضع مساحة العمل الواحدة (الافتراضي)
- مساحة عمل واحدة لكل مثيل من Twenty
- أول مستخدم يصبح تلقائيًا مشرفًا مع صلاحيات كاملة (
canImpersonateوcanAccessFullAdminPanel) - يتم تعطيل عمليات التسجيل الجديدة بعد إنشاء مساحة العمل الأولى
- بنية URL بسيطة:
https://your-domain.com
تمكين وضع تعدد مساحات العمل
- يمكن إنشاء مساحات عمل متعددة على نفس المثيل
- تحصل كل مساحة عمل على نطاق فرعي خاص بها (مثل:
sales.your-domain.com،marketing.your-domain.com) - يسجل المستخدمون ويقومون بتسجيل الدخول عبر
{DEFAULT_SUBDOMAIN}.your-domain.com(مثل:app.your-domain.com) - لا توجد صلاحيات مشرف تلقائية — أول مستخدم في كل مساحة عمل يكون مستخدمًا عاديًا
- إعدادات خاصة بمساحة العمل مثل النطاق الفرعي والنطاق المخصص تصبح متاحة ضمن إعدادات مساحة العمل
تكوين DNS لوضع تعدد مساحات العمل
عند استخدام وضع تعدد مساحات العمل، قم بتكوين DNS لديك بسجل wildcard للسماح بإنشاء النطاقات الفرعية ديناميكيًا:تقييد إنشاء مساحات العمل
في وضع تعدد مساحات العمل، قد ترغب في تقييد من يمكنه إنشاء مساحات عمل جديدة:canAccessFullAdminPanel إنشاء مساحات عمل إضافية. لا يزال بإمكان المستخدمين إنشاء مساحة العمل الأولى الخاصة بهم أثناء التسجيل الأولي.
تكامل Gmail و Google Calendar
إنشاء مشروع Google Cloud
- اذهب إلى وحدة تحكم السحابة من Google
- أنشئ مشروعًا جديدًا أو اختر أحد المشاريع الموجودة
- قم بتفعيل هذه الـ APIs:
تكوين OAuth
- اذهب إلى بيانات اعتماد
- قم بإنشاء معرف عميل OAuth 2.0
- أضف هذه الـ URIs لإعادة التوجيه:
https://{your-domain}/auth/google/redirect(لتسجيل الدخول الفردي)https://{your-domain}/auth/google-apis/get-access-token(للتكاملات)
الإعداد في Twenty
- اذهب إلى الإعدادات → لوحة الإدارة → متغيرات التكوين
- ابحث بسهولة عن قسم Google Auth
- حدد هذه المتغيرات:
MESSAGING_PROVIDER_GMAIL_ENABLED=trueCALENDAR_PROVIDER_GOOGLE_ENABLED=trueAUTH_GOOGLE_CLIENT_ID={client-id}AUTH_GOOGLE_CLIENT_SECRET={client-secret}AUTH_GOOGLE_CALLBACK_URL=https://{your-domain}/auth/google/redirectAUTH_GOOGLE_APIS_CALLBACK_URL=https://{your-domain}/auth/google-apis/get-access-token
https://www.googleapis.com/auth/calendar.eventshttps://www.googleapis.com/auth/gmail.readonlyhttps://www.googleapis.com/auth/profile.emails.read
إذا كان تطبيقك في وضع الاختبار
إذا كان تطبيقك في وضع الاختبار، ستحتاج إلى إضافة مستخدمين اختباريين إلى مشروعك. تحت شاشة موافقة OAuth، أضف مستخدمي الاختبار إلى قسم “مستخدمو الاختبار”.تكامل Microsoft 365
إنشاء مشروع في Microsoft Azure
ستحتاج إلى إنشاء مشروع في Microsoft Azure والحصول على بيانات الاعتماد.تمكين APIs
على وحدة تحكم Microsoft Azure، قم بتمكين الواجهات التالية في “أذونات”:- Microsoft Graph: Mail.ReadWrite
- Microsoft Graph: Mail.Send
- Microsoft Graph: قراءة التقويمات وكتابتها (Calendars.ReadWrite)
- Microsoft Graph: User.Read
- Microsoft Graph: openid
- Microsoft Graph: email
- Microsoft Graph: profile
- Microsoft Graph: offline_access
كل هذه الأذونات مطلوبة، حتى إذا كنت تريد مزامنة رسائل البريد الإلكتروني وأحداث التقويم فقط. يطلب Twenty دائمًا “Mail.ReadWrite” و”Mail.Send” و”Calendars.ReadWrite” عندما يربط المستخدم حسابه، لذا فإن أذونات القراءة فقط مثل “Mail.Read” أو “Calendars.Read” غير كافية.
إذا كان المستأجر الخاص بك لا يسمح للمستخدمين العاديين بالموافقة على هذه الأذونات، فسيظهر لهم الخطأ AADSTS90094 عند ربط حسابهم. يمكن للمسؤول إصلاح ذلك بالنقر فوق “Grant admin consent for ” في صفحة “API permissions” الخاصة بتسجيل التطبيق.
URIs لإعادة التوجيه المصرح بها
ستحتاج إلى إضافة URIs التالية لإعادة التوجيه إلى مشروعك:https://{your-domain}/auth/microsoft/redirectإذا كنت تريد استخدام تسجيل الدخول الفردي في Microsofthttps://{your-domain}/auth/microsoft-apis/get-access-token
الإعداد في Twenty
- اذهب إلى الإعدادات → لوحة الإدارة → متغيرات التكوين
- ابحث عن قسم Microsoft Auth
- حدد هذه المتغيرات:
MESSAGING_PROVIDER_MICROSOFT_ENABLED=trueCALENDAR_PROVIDER_MICROSOFT_ENABLED=trueAUTH_MICROSOFT_ENABLED=trueAUTH_MICROSOFT_CLIENT_ID={client-id}AUTH_MICROSOFT_CLIENT_SECRET={client-secret}AUTH_MICROSOFT_CALLBACK_URL=https://{your-domain}/auth/microsoft/redirectAUTH_MICROSOFT_APIS_CALLBACK_URL=https://{your-domain}/auth/microsoft-apis/get-access-token
تكوين النطاقات
انظر الشيفرة المصدرية ذات الصلة- ‘openid’
- ‘البريد الإلكتروني’
- ‘profile’
- ‘offline_access’
- ‘Mail.ReadWrite’
- ‘Mail.Send’
- ‘Calendars.ReadWrite’
- ‘User.Read’
إذا كان تطبيقك في وضع الاختبار
إذا كان تطبيقك في وضع الاختبار، ستحتاج إلى إضافة مستخدمين اختباريين إلى مشروعك. أضف مستخدمي الاختبار إلى قسم “المستخدمون والمجموعات”.مهام الخلفية للتقويم والمراسلة
بعد إعداد تكامل Gmail، أو Google Calendar، أو Microsoft 365، تحتاج إلى بدء وظائف الخلفية التي تقوم بمزامنة البيانات. سجل الوظائف المتكررة التالية في حاوية العمل الخاصة بك:حدود ذاكرة قائمة انتظار المهام
يعمل Redis الخاص بقائمة الانتظار باستخدامnoeviction: وبمجرد امتلائه، تفشل كل عملية إدراج في قائمة الانتظار لكل مساحة عمل. لمنع مساحة عمل أو تطبيق واحد من ملئها، يجوز لكل منهما استخدام حصة من الذاكرة التي يتركها الآخرون خالية، ويُحدد حجم كل مهمة بحد أقصى.
يتطلب حد الحصة ضبط
maxmemory على Redis الخاص بقائمة الانتظار. تُسجَّل حالات الرفض وتُحتسب في job_memory_limit_refused_total حسب قائمة الانتظار واسم المهمة والسبب، ويتتبع twenty_queue_memory_used_ratio استخدام الذاكرة. إذا كان موفر الخدمة لديك يحجز جزءًا من maxmemory (على سبيل المثال reserved-memory-percent في ElastiCache)، فأدرجه في JOB_QUEUE_MEMORY_RESERVE ما لم يكن maxmemory يستثنيه بالفعل.
تُحتسب تكلفة المهمة حتى تكتمل أو تفشل نهائيًا، ولا تنتهي صلاحية التكاليف. تحتفظ المهمة التي تُزال من قائمة انتظار خارج العامل (حذف من لوحة الإدارة، تنظيف قائمة الانتظار) بتكلفتها إلى أن تشغّل yarn command:prod job-memory:reconcile. يحرر الأمر رسوم كل مهمة تم إلغاؤها أو انتهت، مع التحقق مرتين بفاصل بضع ثوانٍ (--grace-seconds، القيمة الافتراضية 10) حتى لا يتم تحرير مهمة قيد الإدراج في قائمة الانتظار عن طريق الخطأ.
الاتصالات الصادرة إلى المضيفين الداخليين
بشكل افتراضي، يرفض Twenty الاتصالات الصادرة إلى عناوين IP الخاصة/الداخلية (حماية SSRF). يشمل ذلك إجراءات سير عمل HTTP، وخطافات الويب، وموفري الهوية لـ SSO، واتصالات IMAP/SMTP/CalDAV. إذا كان موفر الهوية أو خادم البريد أو التقويم لديك يعمل على شبكة خاصة، فأدرج اسم مضيفه أو عنوان IP حرفيًا:http://keycloak:8080/realms/twenty، أدرج keycloak. تظل جميع العناوين الخاصة الأخرى محظورة، وحتى المضيف المسموح له لا يمكنه أبدًا الوصول إلى نطاق عناوين البيانات الوصفية للسحابة. عيّن المتغير إلى * لتعطيل الحماية بالكامل، وهذا مناسب فقط على الشبكات الموثوقة والمعزولة.
OUTBOUND_HTTP_SAFE_MODE_ENABLED مهمل. أثناء تعيينه إلى false، تظل الحماية معطلة بالكامل ويتم تجاهل OUTBOUND_HTTP_ALLOWED_INTERNAL_HOSTS، لذا أزِله عند الترحيل إلى القائمة.
لا تغطي هذه القائمة مرفقات ملفات الذكاء الاصطناعي: تصل الصور وملفات PDF إلى النموذج كروابط مُنشأة من SERVER_URL، يجلبها إما موفر الذكاء الاصطناعي أو AI SDK في العامل، الذي يرفض العناوين الخاصة. لكي تعمل المرفقات، يجب أن يكون SERVER_URL عامًا؛ عند استخدام localhost أو SERVER_URL خاص، تعمل محادثات ووكلاء الذكاء الاصطناعي مع النص فقط.
تكوين البريد الإلكتروني
- اذهب إلى الإعدادات → لوحة الإدارة → متغيرات التكوين
- ابحث عن قسم Email
- قم بضبط إعدادات SMTP الخاصة بك:
- جيميل
- أوفيس 365
- smtp4dev
ستحتاج إلى توفير كلمة مرور التطبيق.
- 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’
تخزين S3
عيّنSTORAGE_TYPE=S_3 وقم بتهيئة متغيرات STORAGE_S3_* من خلال لوحة الإدارة أو .env.
ملف
.env بسيط لـ AWS S3 مع مستخدم IAM:
يُمرّر ملف Docker Compose المتغيرات
STORAGE_TYPE وSTORAGE_S3_REGION وSTORAGE_S3_NAME وSTORAGE_S3_ENDPOINT ومتغيرَي بيانات الاعتماد من .env. عيّن متغيرات عنوان URL الموقّع مسبقًا في لوحة الإدارة، أو أضفها إلى كتلة environment لخدمتَي server وworker.بيانات الاعتماد
عندما يكونSTORAGE_S3_ACCESS_KEY_ID غير محدد، يحل الخادم بيانات الاعتماد عبر السلسلة الافتراضية لـ AWS SDK: متغيرا البيئة AWS_ACCESS_KEY_ID وAWS_SECRET_ACCESS_KEY، أو ملف بيانات اعتماد مشترك، أو دور مهمة ECS، أو دور حساب خدمة EKS (IRSA)، أو ملف تعريف مثيل EC2.
CredentialsProviderError: Could not load credentials from any providers عند أول تحميل، بينما تعرض واجهة المستخدم خطأً عامًا فقط.
أذونات الحاوية
يُكتب الملف المُحمّل أولًا إلى مسار معلّق، ثم يُتحقق منه، وبعد ذلك يُنسخ إلى مساره النهائي، ويُحذف الكائن المعلّق. لذلك تحتاج السياسة إلى أكثر منs3:PutObject:
s3:ListBucket لحذف المجلدات، مثلًا عند حذف مساحة عمل. من دونه، يرد S3 على طلبات الكائنات المفقودة برفض الوصول بدلًا من عدم العثور عليها، لذلك لا يستطيع الخادم التمييز بين ملف مفقود ومشكلة أذونات.
الواجهة النهائية والعنونة
يستخدم Twenty دائمًا عنونة بنمط المسار، لذا تذهب الطلبات إلىhttps://endpoint/bucket/key. بالنسبة إلى AWS S3 الأصلية، اترك STORAGE_S3_ENDPOINT غير محدد: تنشئ SDK العنوان https://s3.{region}.amazonaws.com من STORAGE_S3_REGION، ولهذا يظهر إدخال منطقة غير صحيح كخطأ DNS بدلًا من خطأ S3. عيّن الواجهة النهائية فقط للخدمات المتوافقة مع S3، أو عندما يصل الخادم إلى S3 عبر واجهة VPC نهائية.
مشاركة الموارد عبر المصادر (CORS)
عندما تكون قيمةSTORAGE_S3_PRESIGNED_URL_ENABLED هي true، تتواصل المتصفحات مع الحاوية مباشرةً. التنزيلات هي طلبات GET، والتحميلات هي طلبات PUT تحمل ترويسة Content-Type، مما يجعل المتصفح يرسل طلب تحقق مسبق أولًا. لذلك يجب أن تسمح سياسة CORS الخاصة بالحاوية بمصدر Twenty الخاص بك، وكلتا الطريقتين وتلك الترويسة:
استكشاف الأخطاء وإصلاحها
تصل إخفاقات التحميل إلى واجهة المستخدم كخطأ عام. يوجد خطأ S3 الأساسي في سجلات الخادم (docker compose logs server) وفي استجابة GraphQL الظاهرة في علامة تبويب الشبكة بالمتصفح.
الوظائف المنطقية ومفسر الشيفرة
تدعم Twenty الوظائف المنطقية لعمليات سير العمل ومفسر الشيفرة لتحليل بيانات الذكاء الاصطناعي. كلاهما يقوم بتشغيل الشيفرة المقدمة من المستخدم ويتطلب تهيئة صريحة لأغراض الأمان.الإعدادات الافتراضية للأمان
في بيئة الإنتاج (NODE_ENV=production): يكون الإعداد الافتراضي لكل من الوظائف المنطقية ومفسر الشيفرة هو معطل. يجب تمكينهما صراحة باستخدامLOGIC_FUNCTION_TYPE وCODE_INTERPRETER_TYPE إذا كنت تحتاج إلى هذه الميزات.
في بيئة التطوير (NODE_ENV=development): يكون الإعداد الافتراضي لكليهما LOCAL لتسهيل التشغيل محلياً.
الوظائف المنطقية - برامج التشغيل المتاحة
الوظائف المنطقية - الإعداد الموصى به
للتطوير:LOGIC_FUNCTION_LAMBDA_LAYER_BUCKET، وهي حاوية تملكها في المنطقة نفسها التي توجد فيها وظائفك. عند عدم تعيينه، يستخدم برنامج التشغيل حاوية التخزين لديك (STORAGE_S3_NAME). إذا لم يتم تعيين أي منهما، تفشل الدوال المنطقية بسبب خطأ في التهيئة.
لتعطيل الوظائف المنطقية:
مفسر الشيفرة - برامج التشغيل المتاحة
عند استخدام
LOGIC_FUNCTION_TYPE=DISABLED أو CODE_INTERPRETER_TYPE=DISABLED، سترجع أي محاولة للتنفيذ خطأً. يكون هذا مفيدًا إذا كنت ترغب في تشغيل Twenty من دون هذه الإمكانات.واجهة برمجة التطبيقات (API) والواجهة الأمامية على مضيفين منفصلين
ينطبق فقط إذا كنت لا تدع الواجهة الخلفية تقوم بخدمة الواجهة الأمامية. عمليات النشر ذات الأصل نفسه لا تحتاج إلى أي شيء هنا. صرّح بجميع أصول المتصفحات التي تتواصل مع واجهة برمجة التطبيقات (API)، مفصولة بفواصل.SERVER_URL
وFRONTEND_URL موثوق بهما بالفعل. يقوم الخادم بتسجيل تحذير عندما يتصل به متصفح
من مصدر غير مصرح به.
AUTH_COOKIE_SAME_SITE=none، والذي يتطلب HTTPS.
مع تمكين ميزة تعدد مساحات العمل، لا تُدرِج كل نطاق فرعي لكل مساحة عمل هنا.
بدلًا من ذلك، قم بتوجيه مسارات واجهة برمجة التطبيقات (API) (/graphql، /metadata، /rest، /auth/،
/client-config، /file) إلى الواجهة الخلفية على كل اسم مضيف لمساحة عمل، بحيث تبقى كل مساحة عمل من نفس المصدر (same-origin) — هكذا تعمل Twenty Cloud.