الانتقال إلى المحتوى الرئيسي

نظرة عامة

يحتوي نظام إدارة علاقات العملاء لديك على عملائك وصفقاتك ورسائلك الإلكترونية وتقويمك. عندما يصدر إصلاح أمني في إصدار من Twenty، يشير الإصلاح نفسه إلى المهاجمين حيث ينبغي أن يبحثوا، ويكون كل مثيل لم يُرقَّ بعد هدفًا. الترقية سريعًا هي الحل الحقيقي، لكن معظم المثيلات المستضافة ذاتيًا تعمل بإصدارات متأخرة ببضعة إصدارات. أفضل حماية إلى أن تلحق بالركب بسيطة: تأكد من أنه لا يمكن لأي شخص على الإنترنت الوصول إلى مثيلك من الأساس. توضح هذه الصفحة كيفية القيام بذلك باستخدام Tailscale أو Cloudflare أو الوكيل العكسي الخاص بك.

خاص افتراضيًا

قسّم مثيلك إلى ثلاث مناطق: يغطي كل مسار كل ما يندرج تحته. افتح المنطقتين العامة والخاصة بالذكاء الاصطناعي السحابي فقط إذا كنت تستخدم الميزات الموجودة خلفهما، راجع المسارات العامة. وإلا، فأبقِ المثيل بأكمله خاصًا. لا تحتاج مساعدات الذكاء الاصطناعي التي تعمل على أجهزة كمبيوتر فريقك، مثل Claude Code، إلى فتح أي شيء، راجع عملاء الذكاء الاصطناعي.
ما ستتخلى عنه: لا يمكن لأدوات الأتمتة المستضافة التي تستدعي واجهة Twenty API من سحابتهم الخاصة (Zapier وMake وn8n Cloud) الوصول إلى مثيل خاص. شغّلها داخل شبكتك بدلًا من ذلك (يعمل n8n المستضاف ذاتيًا جيدًا)، أو استخدم سير عمل Twenty. لا تجعل /graphql أو /rest عامين للتحايل على ذلك: فالتطبيق نفسه يعمل على نقاط النهاية هذه، لذا فإن كشفها يكشف كل شيء.

اختر إعدادًا

community-tailscale
Tailscale
خاص تماماً. أبسط إعداد، والأفضل للفرق الصغيرة.
community-cloudflare
Cloudflare
لا توجد منافذ مفتوحة، قم بتسجيل الدخول مع موفر هويتك والمسار العام عند الحاجة.
community-reverse-proxy
عكس الوكيل
Caddy أو Nginx مع قوائم أذونات IP لا توجد خدمة تابعة لجهة خارجية.

الخيار 1: Tailscale

تضع Tailscale خادمك وأجهزة فريقك على شبكة خاصة. يحصل Twenty على عنوان HTTPS لا يعمل إلا للأشخاص الموجودين على تلك الشبكة.
1

اربط Twenty بـ localhost

في docker-compose.yml، غيّر تعيين منفذ server بحيث لا يمكن الوصول إلى الحاوية إلا من الخادم نفسه:
2

أضف الخادم إلى tailnet الخاص بك

ثبّت Tailscale على الخادم، ثم:
3

قدّم Twenty عبر HTTPS

أصبح Twenty الآن متاحًا على https://twenty.\<your-tailnet>.ts.net، مع شهادة تديرها Tailscale. إذا طلب منك الأمر ذلك، فعّل شهادات HTTPS لشبكة tailnet الخاصة بك في وحدة تحكم المشرف.
4

حدّث SERVER_URL

ثم أعد التشغيل باستخدام docker compose up -d.
استخدم عناصر التحكم بالوصول في Tailscale لقصر الوصول إلى الخادم على الأشخاص الذين يحتاجون إليه، وليس على شبكة tailnet بأكملها. لا يزال ربط حسابات Google أو Microsoft يعمل: تحدث إعادة توجيه OAuth في متصفح زميلك، الموجود على شبكة tailnet. ترتبط رسائل الدعوة الإلكترونية بعنوان tailnet، لذا يحتاج الزملاء الجدد إلى الانضمام إلى tailnet قبل قبولها.
ينشر Tailscale Funnel منفذًا كاملًا على الإنترنت، وليس مسارات فردية. لا يمكنك استخدامه لجعل /webhooks عامًا مع إبقاء التطبيق خاصًا. إذا كنت تحتاج إلى مسارات عامة أو موصلات ذكاء اصطناعي، فاستخدم الخيار 2 أو 3.

الخيار 2: Cloudflare Tunnel وAccess

يربط Cloudflare Tunnel خادمك بـ Cloudflare عبر اتصال صادر، لذا لا تكون أي منافذ مفتوحة على الخادم. يطلب Cloudflare Access من فريقك بعد ذلك تسجيل الدخول باستخدام موفر الهوية لديك قبل وصول أي طلب إلى Twenty.
1

احمِ اسم المضيف باستخدام Access

افعل ذلك قبل إنشاء النفق، حتى لا يمكن الوصول إلى اسم المضيف مطلقًا بدون تسجيل دخول. أنشئ تطبيقات Access مستضافة ذاتيًا. يطبّق Access المسار الأكثر تحديدًا، لذا تكون قواعد المسار أدناه لها الأولوية على قاعدة اسم المضيف.أنشئ تطبيقًا واحدًا لكل مسار. أضف قواعد التجاوز للميزات التي تستخدمها فقط.لا يمكن لعملاء الذكاء الاصطناعي المحليين مثل Claude Code إكمال تسجيل الدخول عبر المتصفح، لذا يعتمدون على عناوين IP الخاصة بالمكتب أو VPN في القاعدة الأخيرة. إذا كان فريقك يعمل من أي مكان، فأضف بدلًا من ذلك سياسة سماح لفريقك إلى ذلك التطبيق، وفعّل مصادقة WARP في Access، واجعلهم يشغّلون عميل Cloudflare WARP.
2

أنشئ نفقًا

في لوحة معلومات Cloudflare Zero Trust، أنشئ نفقًا، واختر Docker كالبيئة وانسخ الرمز المميز. أضف اسم مضيف عامًا، crm.example.com، يشير إلى http://server:3000.
3

شغّل cloudflared بجانب Twenty

أضف هذه الخدمة إلى docker-compose.yml وأزل قسم ports من server. يصل cloudflared إلى Twenty عبر شبكة Docker، لذا لا يحتاج الخادم إلى نشر أي منفذ.
أضف CLOUDFLARE_TUNNEL_TOKEN إلى .env الخاص بك.
4

حدّث SERVER_URL

ثم أعد التشغيل باستخدام docker compose up -d.
إذا كنت تستخدم WAF من Cloudflare أو حماية من الروبوتات، فتجاوز التحديات في مسارات MCP وOAuth. لا يستطيع Claude وChatGPT حل صفحة التحدي.

الخيار 3: الوكيل العكسي الخاص بك

إذا كنت تشغّل بالفعل وكيلاً عكسيًا، فأضف عناوين IP لمكتبك أو VPN إلى قائمة السماح للتطبيق وافتح المسارات العامة فقط. اربط Twenty بـ localhost أولًا، كما في الخيار 1، حتى لا يتجاوز أي شيء الوكيل.
استبدل 203.0.113.0/24 بعناوين مكتبك أو VPN. يحتوي CHATGPT_CONNECTOR_IPS على نطاقات OpenAI، راجع عملاء الذكاء الاصطناعي؛ اتركه فارغًا إذا كنت لا تستخدم ChatGPT. إذا كان وكيلك يقع خلف موازن تحميل، فطابق عنوان IP للعميل الذي يمرره (client_ip مع trusted_proxies في Caddy، وset_real_ip_from في Nginx)، وليس عنوان موازن التحميل.

المسارات العامة

هذه هي المسارات التي تستدعيها الخدمات خارج شبكتك. افتح فقط ما تحتاج إليه منها. افتراضيًا، يستطلع Twenty صناديق البريد والتقويمات، لذا لا يتصل Google وMicrosoft بمثيلك مطلقًا. لا يفعلان ذلك إلا إذا ضبطت IS_CONNECTED_ACCOUNT_WEBHOOK_SUBSCRIPTION_ENABLED=true. كيفية حماية كل مسار عام:
  • لا تتحقق خطافات ويب مهام سير العمل إلا من وجود مساحة العمل ومهمة سير العمل. يمكن لأي شخص يعرف عنوان URL تشغيل مهمة سير العمل، لذا تعامل مع عنوان URL كسِر وتحقق من الحمولة في مهمة سير العمل قبل اتخاذ إجراء بشأنها.
  • تكون مسارات التطبيق والدوال المنطقية عامة ما لم يكن المسار يتطلب مصادقة (isAuthRequired). بالنسبة إلى المسارات العامة، تحقق من هوية المستدعي في التعليمات البرمجية الخاصة بك، مثلًا باستخدام توقيع خدمة الإرسال.
  • يتحقق Twenty من خطافات ويب Google وMicrosoft وSES وResend باستخدام توقيع الموفر أو رمزه المميز.
  • لا يمكن أن تسجل روابط البريد الإلكتروني إلا فتحًا أو نقرة أو إلغاء اشتراك للمستلم الذي أُرسلت إليه.

عملاء الذكاء الاصطناعي (MCP)

يُعد مساعدو الذكاء الاصطناعي إحدى الطرق الرئيسية التي سيستخدم بها فريقك Twenty، عبر خادم MCP الخاص به. يعتمد ما تحتاج إلى فتحه على مكان تشغيل المساعد، وليس على المساعد الذي هو عليه.

العملاء المحليون: لا شيء لفتحه

يتصل Claude Code وCodex CLI وCursor والأدوات الأخرى التي تعمل على جهاز الكمبيوتر الخاص بك بـ Twenty من ذلك الكمبيوتر. إذا كان موجودًا على tailnet أو VPN الخاص بك، فإنها تصل إلى /mcp بالطريقة نفسها التي يصل بها متصفحك إلى التطبيق. هذا هو الإعداد الأكثر أمانًا، لذا فضّله عندما تستطيع. يُعد Claude Desktop الاستثناء: تعمل الموصلات المضافة في الإعدادات → الموصلات في سحابة Anthropic، حتى في تطبيق سطح المكتب. للحفاظ على الاتصال محليًا، أضف Twenty كخادم MCP محلي في claude_desktop_config.json بدلًا من ذلك:

الموصلات السحابية: افتح بحذر

يستدعي Claude (الويب والجوال والموصلات في تطبيق سطح المكتب) وChatGPT خادمك من بنية Anthropic وOpenAI الأساسية، وليس من جهازك. لا يمكنهما الوصول إلى مثيل خاص، لذا عليك فتح /mcp و/oauth و/.well-known لنطاقات IP الخاصة بهما.
تتحقق قائمة سماح عناوين IP من الشبكة التي يأتي منها الطلب، وليس ممن أرسله. يمكن لأي شخص لديه حساب Claude أو ChatGPT إضافة عنوان URL الخاص بك كموصل وإرسال طلبات إلى هذه المسارات.
ما يمنعهم هو تسجيل الدخول. للحصول على رمز مميز، يجب على المستخدم تسجيل الدخول في صفحة /authorize الخاصة بـ Twenty، التي تظل في المنطقة الخاصة. يمكن لشخص خارج شبكتك بدء تدفق الاتصال لكنه لا يستطيع إكماله، ويرفض /mcp كل طلب دون رمز مميز صالح. ما يبقى مكشوفًا هو التعليمة البرمجية التي تعمل قبل تسجيل الدخول: اكتشاف OAuth وتسجيل العميل (/oauth/register) ونقطة نهاية الرمز المميز. تضيّق قائمة السماح ذلك: لا تستطيع أدوات الفحص على مستوى الإنترنت الوصول إلى هذه المسارات مباشرةً، ويجب أن تأتي الطلبات عبر بنية Claude أو ChatGPT الأساسية. لا يجعل ذلك تلك التعليمة البرمجية آمنة بمفرده، لذا تظل الترقيات مهمة. إذا كنت تستخدم موصلات سحابية:
  • افتح فقط /mcp و/oauth و/.well-known. لا تفتح مطلقًا /authorize أو بقية التطبيق.
  • اسمح فقط للموردين الذين تستخدمهم:
    • Anthropic: 160.79.104.0/21، من صفحة عناوين IP الخاصة بـ Anthropic.
    • OpenAI: القائمة الموجودة في chatgpt-connectors.json. تصفها OpenAI بأنها بأفضل جهد وتتغير بمرور الوقت، لذا حدّثها وفق جدول زمني:
  • رقِّ بسرعة عندما تذكر ملاحظات الإصدار إصلاحات MCP أو OAuth.

تحقق من إعدادك

اختبر من جانبي شبكتك بعد أي تغيير:
يجب أن تشير الترويسة إلى https://crm.example.com/.well-known/.... إذا كانت تعرض http:// أو 127.0.0.1، فإن وكيلك لا يمرر ترويسات Host وX-Forwarded-Proto.

قائمة التحقق الأساسية

لم يتم نشر Postgres وRedis. لا ينشرهما docker-compose.yml الافتراضي؛ حافظ على ذلك إذا عدّلته.
لا شيء يتجاوز الوكيل أو النفق الخاص بك. مع وكيل على المضيف، يُربط منفذ Twenty بـ 127.0.0.1. مع cloudflared في Docker، لا تنشر خدمة server أي منفذ. يكتب Docker قواعد جدار الحماية الخاصة به، لذا تتجاوز المنافذ التي ينشرها ufw وجدران حماية المضيف المشابهة.
الأسرار طويلة وعشوائية، وأنت تعرف كيفية تدويرها.
يستخدم أعضاء مساحة العمل SSO أو المصادقة الثنائية.
تُنسخ قاعدة البيانات احتياطيًا وفق جدول زمني، وقد اختبرت عملية استعادة.
يُثبّت TAG على إصدار، وتُجري الترقية عن قصد.

ابقَ على اطلاع دائم

لا شيء مما سبق يغني عن الترقية. إنه يمنحك وقتًا.
  • راقب الإصدارات على GitHub: مراقبة → مخصص → الإصدارات.
  • عندما يتضمن إصدار إصلاحًا أمنيًا، رقِّ في أقرب وقت تشير إليه استشارته: في اليوم نفسه للمشكلات الحرجة. اتبع دليل الترقية.
  • أبلغ عن الثغرات الأمنية إلى security@twenty.com، وليس في المشكلات العامة.