دليل عملي

الاستضافة الذاتية

استضافة Excalidraw على VPS: لوح تعاوني مفتوح المصدر

Miro وFigJam وLucidspark: تفرض أدوات اللوح الأبيض SaaS رسوماً بالمقعد، وتخزّن نماذجك على خوادمها، وتحدّ من عدد الأعضاء وفق الخطة. Excalidraw هو البديل مفتوح المصدر (MIT): لوح تعاون في الوقت الفعلي يشبه الرسم اليدوي، مكوّن من عنصرين — واجهة React وخادم WebSocket — يمكن استضافتهما ذاتياً على VPS في حاويتَي Docker. يوضح هذا الدليل كيفية نشرهما وضبط nginx لـ WebSocket، ويقول بوضوح ما يبقى في تثبيت قياسي لدى خدمات طرف ثالث (Firebase وروابط المشاركة).

15 دقيقةً للقراءةعدد الخطوات: 5
المحتويات· لماذا تستضيف Excalidraw بنفسك بدلاً من النسخة العامة1/16
  1. 01لماذا تستضيف Excalidraw بنفسك بدلاً من النسخة العامة
  2. 02الفوائد الملموسة
  3. 03البنية: حاويتان بأدوار مختلفة
  4. 04المتطلبات الأساسية
  5. 05قائمة التحقق من المتطلبات
  6. 06نشر Excalidraw في 5 خطوات
  7. 07ما ينجح فعلاً في الاستضافة الذاتية
  8. 08ثلاثة تركيبات ممكنة، وما يتركه كل منها لدى طرف ثالث
  9. 09المتغير ← الوظيفة ← ما ينكسر بدونه
  10. 10التحقق ممّن يستقبل ماذا
  11. 11استكشاف الأخطاء: التعاون لا يبدأ، أو لا يتذكر شيئاً
  12. 12الأعراض والأسباب والحلول
  13. 13استمرارية اللوحات: ما يُحفظ فعلاً
  14. 14Excalidraw المستضاف ذاتياً مقابل بدائل SaaS
  15. 15للمزيد: SSO وقوائم IP المسموح بها
  16. 16التكامل مع مجموعة الأدوات المستضافة ذاتياً

لماذا تستضيف Excalidraw بنفسك بدلاً من النسخة العامة

تعمل النسخة العامة على ‎excalidraw.com بشكل جيد للرسم السريع الفردي. إلا أنها تُمرّر جلسات التعاون في الوقت الفعلي عبر خادم تديره شركة Excalidraw‏ s.r.o. قد يكون ذلك مقبولاً لجلسة عصف ذهني عابرة، لكنه أقل قبولاً حين تحتوي اللوحات على نماذج تدفق العملاء أو مخططات البنية الداخلية أو واجهات مشاريع مشمولة بالسرية.

استضافة Excalidraw ذاتياً تنقل حدود التحكم إلى بنيتك التحتية الخاصة. تمر حركة الوقت الفعلي عبر خادمك WebSocket على نطاقك الخاص؛ أما ما يبقى لدى طرف ثالث في تثبيت قياسي (المشهد المحفوظ وروابط المشاركة) فيُفصَّل أدناه. أنت من يقرر من يتصل — عبر قائمة IP المسموح بها أو SSO‏ OIDC أو HTTP Basic Auth أمام nginx. وبما أن المكوّنَين منشوران بموجب رخصة MIT، لا توجد قيود تجارية بصرف النظر عن عدد العملاء أو المتعاونين.

الفوائد الملموسة

  • لا رسوم برمجية — المكوّنان (الواجهة وخادم التعاون) برخصة MIT. تدفع مقابل VPS فقط.
  • سرية النماذج — يبقى الرسم المباشر على بنيتك التحتية. أما المشهد المحفوظ وصور الغرفة فيحتاجان إلى معالجة (Firebase افتراضياً): راجع «ما ينجح فعلاً في الاستضافة الذاتية».
  • التحكم في الوصول — قائمة IP أو SSO‏ OIDC أو HTTP Basic Auth أمام nginx حسب مستوى العزل المطلوب.
  • جلسات وأعضاء غير محدودين — لا سقف يفرضه الخطة؛ الحد الوحيد هو ذاكرة RAM للخادم، وخادم excalidraw-room خفيف الوزن.
  • استمرارية اختيارية — ربط وحدة تخزين Docker أو حاوية S3 متوافقة لأرشفة اللوحات المصدَّرة بصيغة JSON.
  • التكامل مع مجموعة الأدوات المستضافة ذاتياً — Excalidraw إلى جانب Penpot وMattermost وDocmost يُغلق محيط SaaS لوكالة بأكملها.

البنية: حاويتان بأدوار مختلفة

يفصل Excalidraw ما يعتبره معظم الناس أداةً واحدةً إلى مكوّنَين مستقلَّين:

- excalidraw/excalidraw — الواجهة المُجمَّعة بـ React، تُقدَّم كموقع ثابت عبر nginx داخل الحاوية. لا تشغّل خادماً تطبيقياً. عناوين خدماتها (الغرفة وFirebase والمشاركة) متغيرات VITE_APP_* تُقرأ وقت البناء وتُدمج في حزمة JavaScript: تغييرها على حاوية قيد التشغيل لا يُحدث أي أثر.

- excalidraw/excalidraw-room — خادم ‎Node.js‏/Socket.IO يُعيد توجيه أحداث الرسم في الذاكرة بين المشاركين في الجلسة ذاتها. إنه عديم الحالة: لا يُخزّن شيئاً وينسى كل شيء عند إعادة التشغيل. المشهد المحفوظ للغرفة لا يمر عبره (انظر أدناه). لم تُنشر صورته على Docker Hub من جديد منذ ديسمبر 2023، ويبدأ Dockerfile الأصلي من Node 12: أبقه خلف nginx على شبكة Docker دون منفذ منشور.

النتيجة العملية: بُنيت صورة Docker الرسمية بعناوين ‎excalidraw.com. لتوجيهها إلى excalidraw-room الخاص بك، عليك بناء صورتك الخاصة بعد تعديل VITE_APP_WS_SERVER_URL في ‎‎.env.production.

المتطلبات الأساسية

يغطي VPS Solo من ServOrbit (2 نواة، 4 GB RAM) الحالة العادية: الواجهة الثابتة شبه خالية من الحمل، ويستهلك excalidraw-room أقل من 256 ميغابايت في الظروف العادية. مع عشرة متعاونين متزامنين ستبقى بعيداً عن نصف الذاكرة المتاحة.

ما تحتاجه قبل البدء:

قائمة التحقق من المتطلبات

  • خادم VPS بما لا يقل عن 1 نواة و512 ميغابايت RAM (يُوصى بـ 1 غيغابايت للفريق).
  • Docker Engine وإضافة Docker Compose مثبَّتان (للتحقق: docker compose version).
  • اسم نطاق مُوجَّه نحو IP الخادم — بدون TLS تُحجب WebSockets في المتصفحات الحديثة.
  • وصول SSH بصلاحيات root أو مستخدم بصلاحيات sudo.
  • شهادة TLS صالحة — يهيئ ServOrbit Let's Encrypt تلقائياً.

نشر Excalidraw في 5 خطوات

  1. إنشاء VPS وتثبيت Docker

    شغّل VPS Ubuntu 24.04 من لوحة تحكم ServOrbit. بعد الاتصال عبر SSH، إن لم يكن Docker مثبتاً بعد، شغّل:

    curl -fsSL https://get.docker.com | sh

    تحقق من استجابة Docker Compose Plugin قبل المتابعة:

    docker compose version
  2. بناء الصورة مع رابط التعاون الخاص بك

    انسخ المستودع الرسمي ثم اضبط عنوان الغرفة في ملف ‎‎.env.production من المستودع قبل البناء. استبدل ‎collab.yourdomain.com بالنطاق الفرعي الذي تخصصه لـ excalidraw-room:

    ‎git clone https://github.com/excalidraw/excalidraw.git
    cd excalidraw
    ‎sed -i 's|^VITE_APP_WS_SERVER_URL=.*|VITE_APP_WS_SERVER_URL=https://collab.yourdomain.com|' .env.production
    ‎docker build -t my-excalidraw:latest .

    لماذا لا نستعمل --build-arg؟ لأن Dockerfile الأصلي لا يعلن أي ARG لمتغيرات VITE_APP_*: فالأمر --build-arg VITE_APP_WS_SERVER_URL=… لا يصل أبداً إلى أمر البناء، وتُبنى الصورة بشكل طبيعي وتظل موجّهة إلى خادم Excalidraw. كما أن ‎‎.dockerignore الأصلي لا يقبل إلا ‎‎.env.development و‎‎.env.production، فيُتجاهل ‎‎.env.production.local. العنوان مدمج في الحزمة، لذا يستلزم تغيير النطاق إعادة البناء.

    تحقق من النتيجة: يجب أن يطبع الأمر ‎‎docker run --rm --entrypoint sh my-excalidraw:latest -c "grep -rl oss-collab.excalidraw.com /usr/share/nginx/html || echo clean" الكلمة clean. صورة excalidraw/excalidraw الرسمية مناسبة للتجارب المحلية، لكنها تستهدف خدمات Excalidraw العامة.

  3. كتابة ملف docker-compose.yml

    أنشئ مجلد عمل وضع الملف التالي. تستمع الخدمتان داخلياً؛ nginx (الخطوة التالية) هو نقطة الدخول العامة الوحيدة:

    mkdir ~/excalidraw-stack && cd ~/excalidraw-stack

    محتوى docker-compose.yml:

    services:
      excalidraw:
        image: my-excalidraw:latest
        restart: unless-stopped
        networks:
          - excalidraw
    
      excalidraw-room:
        image: excalidraw/excalidraw-room:latest
        environment:
          - CORS_ORIGIN=https://draw.yourdomain.com
        restart: unless-stopped
        networks:
          - excalidraw
    
    networks:
      excalidraw:

    شغّل المجموعة:

    docker compose up -d
  4. إعداد nginx مع ترويسات WebSocket

    هذه الخطوة هي المكان الذي تفشل فيه معظم عمليات النشر بصمت: بدون ترويستَي Upgrade وConnection، يفتح المتصفح اتصالاً HTTP عادياً بدلاً من WebSocket، وتبدو ميزة التعاون كأنها لا تعمل دون أي رسالة خطأ.

    كتلة nginx للواجهة الأمامية لـ ‎Excalidraw (draw.yourdomain.com):

    server {
        listen 443 ssl;
        server_name draw.yourdomain.com;
    
        location / {
            proxy_pass http://excalidraw:80;
            proxy_set_header Host $host;
        }
    }

    كتلة nginx لخادم الغرفة (collab.yourdomain.com):

    server {
        listen 443 ssl;
        server_name collab.yourdomain.com;
    
        location / {
            proxy_pass http://excalidraw-room:80;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_read_timeout 86400s;
        }
    }

    أعِد تحميل nginx (nginx -s reload) بعد وضع الكتل.

  5. اختبار التعاون في الوقت الفعلي

    افتح https://draw.yourdomain.com في علامتَي تبويب أو متصفحَين مختلفَين. انقر على Live collaboration في شريط الأدوات وأنشئ جلسة. انسخ رابط الجلسة في علامة التبويب الثانية.

    ارسم شيئاً في علامة التبويب الأولى: يجب أن تظهر اللمسة في الثانية فوراً. إن لم تظهر، تحقق أولاً من ترويسات WebSocket في nginx (تُظهر أدوات الشبكة في المتصفح إن كان الاتصال قد ارتقى إلى 101 Switching Protocols).

    افتح بعد ذلك تبويب الشبكة في المتصفح: يجب أن يستهدف اتصال الوقت الفعلي ‎collab.yourdomain.com لا ‎oss-collab.excalidraw.com أبداً. أما ما يستقبله Firebase فتعالجه الفقرة التالية.

ما ينجح فعلاً في الاستضافة الذاتية

لنكن دقيقين: «حاويتان وانتهى الأمر» هو الاختصار الذي تكرره هذه الأدلة أكثر من غيره. يلخص الخيط الجامع في المستودع الأصلي (excalidraw/excalidraw، المسألة رقم 1772، مفتوحة منذ يونيو 2020 وما زالت نشطة في أكتوبر 2026) ثلاثة جدران، قابلناها بالشيفرة وبملفات ‎‎.env في المستودع.

الجدار الأول — العناوين مثبتة وقت البناء. عناوين خادم التعاون وخدمة المشاركة ومشروع Firebase هي متغيرات VITE_APP_* يقرؤها Vite أثناء البناء. بُنيت صورة excalidraw/excalidraw الرسمية بقيم ‎‎.env.production: لذا ما زالت تتحدث إلى خدمات ‎excalidraw.com. متغير يُمرَّر إلى docker run لا يغيّر شيئاً، ولا يعلن Dockerfile الأصلي أي ARG لنقل متغير إلى البناء.

الجدار الثاني — التعاون محلي بالنصف. الوقت الفعلي (من يرسم ماذا مباشرةً) يمر عبر excalidraw-room الذي تستضيفه. لكن المشهد المحفوظ والصور الملصقة في غرفة تذهب إلى Firebase: تستدعي الشيفرة saveToFirebase وsaveFilesToFirebase بإعدادات VITE_APP_FIREBASE_CONFIG. ما دام هذا المتغير يحتفظ بالقيمة الأصلية، تُخزَّن هذه البيانات (المشفّرة في المتصفح بمفتاح الغرفة) في مشروع Firebase التابع لـ Excalidraw لا عندك. وهذا يوفّق بين الشهادات المتناقضة في الخيط: أحدهم يلاحظ أن التعاون يفشل مع VITE_APP_FIREBASE_CONFIG='{}'، وآخر أن Jitsi Meet أزال جزء Firebase وأن الوقت الفعلي يعمل بالغرفة وحدها. الرسم المباشر يستغني عن Firebase؛ أما الحفظ والاستئناف فلا.

الجدار الثالث — روابط المشاركة تتطلب خادم تخزين لا ينشره المشروع. يُنشأ رابط #json= بطلب إلى VITE_APP_BACKEND_V2_POST_URL ويُقرأ عبر VITE_APP_BACKEND_V2_GET_URL، والافتراضي ‎json.excalidraw.com. يذكر الخيط إعادات كتابة من المجتمع (إحداها بـ ‎Next.js على S3 وأخرى على تخزين متوافق مع S3) لكنه لا يعتبر أياً منها رسمية.

ثلاثة تركيبات ممكنة، وما يتركه كل منها لدى طرف ثالث

  • التركيب أ — الغرفة وحدها (تركيب هذا الدليل). تغيّر VITE_APP_WS_SERVER_URL ولا شيء غيره. يمر الرسم المباشر عبر خادمك؛ أما المشهد المحفوظ وصور الغرف فتبقى مكتوبة في Firebase التابع لـ Excalidraw. مقبول للوحات قليلة الحساسية، ولا يجوز تقديمه على أنه «لا شيء لدى طرف ثالث».
  • التركيب ب — الغرفة مع مشروع Firebase خاص بك. تنشئ مشروع Firebase خاصاً بك وتضع إعداداته بصيغة JSON في VITE_APP_FIREBASE_CONFIG. تقرأ الشيفرة هذا المتغير وحده؛ لم ننشره من البداية إلى النهاية، ويبقى Firebase خدمة من Google لا استضافة ذاتية بالمعنى الصارم.
  • التركيب ج — نسخة فردية. تقدّم الواجهة وحدها دون غرفة ودون رابط: يرسم كل شخص ويصدّر إلى ‎‎.excalidraw أو إلى صورة ويؤرشف الملفات عندك. لا شيء يذهب إلى طرف ثالث بسبب التعاون، لأنه غير موجود.
  • ما لا يوجد في الجانب الرسمي. لا خادم تخزين مفتوح لروابط #json=، ولا خيار ينقل المحيط كله إلى نطاقك بمتغير واحد وقت التشغيل. إن كان شرطك «لا بيانات لدى طرف ثالث» مع التعاون والمشاركة، فالجواب الصادق هو عمل تكييف أو تفريع (fork) لا مجرد تثبيت.

المتغير ← الوظيفة ← ما ينكسر بدونه

مرّر الجدول أفقيًا

المتغيرالوظيفةما ينكسر بدونه
`VITE_APP_WS_SERVER_URL` (وقت البناء)عنوان خادم الوقت الفعلي ‎Socket.IO (`excalidraw-room`).القيمة الأصلية باقية: تمر جلساتك عبر ‎oss-collab.excalidraw.com. عنوان لا يمكن الوصول إليه: لا يبدأ التعاون.
`VITE_APP_FIREBASE_CONFIG` (وقت البناء)إعداد JSON لمشروع Firebase: المشهد المحفوظ للغرفة والصور الملصقة.القيمة الأصلية: تبقى تلك البيانات لدى Excalidraw. فارغ أو غير صالح (ومنه `{}`): يفشل حفظ الغرفة واستئنافها، ووفق شهادة في الخيط يفشل التعاون أيضاً. وJSON غير مقروء يسجّل `Error JSON parsing firebase config`.
`VITE_APP_BACKEND_V2_POST_URL` (وقت البناء)إنشاء رابط مشاركة `#json=` (رفع المشهد المشفّر).القيمة الأصلية: يُنشأ الرابط لدى ‎json.excalidraw.com. عنوان بلا خادم متوافق: يفشل إنشاء الرابط.
`VITE_APP_BACKEND_V2_GET_URL` (وقت البناء)إعادة قراءة رابط `#json=` عند فتحه.القيمة الأصلية: يُقرأ الرابط من Excalidraw. عنوان بلا خادم متوافق: يفشل فتح الرابط.
`VITE_APP_DISABLE_SENTRY` (وقت البناء)يعطّل إرسال تقارير الأخطاء إلى Sentry.لا ينكسر شيء؛ وبدونه قد يرسل التطبيق تقارير أخطاء إلى طرف ثالث. السكربت الأصلي `build:app:docker` يضبطه أصلاً على `true`.
`VITE_APP_DISABLE_PREVENT_UNLOAD` (وقت البناء)يلغي التنبيه قبل مغادرة غرفة لم ينتهِ حفظها.لا ينكسر شيء، لكن إغلاق التبويب لم يعد يحذّر. يُحتفظ به للتنقيح فقط.
`CORS_ORIGIN` (وقت التشغيل، `excalidraw-room`)المصدر المسموح له بفتح اتصال بخادم الغرفة.غائب: القيمة الافتراضية `*` وأي صفحة ويب تستطيع الاتصال. اضبط ‎`https://draw.yourdomain.com`.
`PORT` (وقت التشغيل، `excalidraw-room`)منفذ استماع خادم الغرفة.غائب: يستمع على المنفذ 80 خارج وضع التطوير، وهو ما تفترضه كتل nginx في هذا الدليل. إن غيّرته فيجب أن يتبعه `proxy_pass`.

التحقق ممّن يستقبل ماذا

الطريقة الوحيدة لمعرفة ما يخرج من نسختك هي النظر. افتح تبويب الشبكة في المتصفح، وابدأ جلسة تعاون، وارسم، والصق صورة، ثم أنشئ رابط مشاركة. تُقرأ ثلاث فئات من الوجهات: نطاقك الفرعي للغرفة (الوقت الفعلي، متوقع)؛ ونطاقات ‎‎googleapis.com التابعة لـ Firebase (المشهد والصور المحفوظة، متوقعة مع الإعداد الأصلي، وتُزال إن كنت تظن العكس)؛ و‎json.excalidraw.com (المشاركة بالرابط). هذا الفحص هو اختبار قبول التركيب الذي اخترته: بدونه تبقى عبارة «على خادمي» مجرد فرضية.

وتذكّر أخيراً أن خادم الغرفة لا يوثّق أحداً: CORS_ORIGIN يحدّ من صفحات الويب المسموح لها بالاتصال لا من الأشخاص. وتُضبط هوية المشاركين أمام الواجهة (Basic Auth أو SSO) كما يرد أدناه.

استكشاف الأخطاء: التعاون لا يبدأ، أو لا يتذكر شيئاً

تنتج الأعراض التالية عن الشيفرة وعن الخيط الأصلي؛ ولا تُنقل أي رسالة سوى ما قُرئ في المستودع.

الأعراض والأسباب والحلول

  • تذهب الجلسة إلى ‎oss-collab.excalidraw.com (تبويب الشبكة) رغم أنك بنيت صورتك. السبب: لم يُؤخذ العنوان في الحسبان وقت البناء (--build-arg بلا أثر، و‎‎.env.production.local يتجاهله ‎‎.dockerignore). الحل: عدّل ‎‎.env.production وأعد البناء وأعد فحص grep من الخطوة 2. وتغيير النطاق يخضع للقاعدة نفسها.
  • يُرفض اتصال المتصفح بالغرفة. سبب متكرر بعد ضبط CORS_ORIGIN: المصدر لا يطابق تماماً مصدر الصفحة (مخطط http بدل https، أو المنفذ، أو شرطة مائلة أخيرة). الحل: يجب أن تكون القيمة هي المصدر الدقيق للواجهة، مثل ‎https://draw.yourdomain.com.
  • تظهر الخطوط مباشرةً، لكن مشاركاً ينضم لاحقاً أو بعد إعادة تشغيل الغرفة لا يجد المحتوى أو الصور. السبب: يُحفظ المشهد والصور عبر Firebase لا عبر excalidraw-room الذي لا يحتفظ بشيء. إن كان VITE_APP_FIREBASE_CONFIG فارغاً أو لا يمكن الوصول إليه فلا يُقرأ شيء. الحل: اختر التركيب أ أو ب أعلاه.
  • تحذير ‎Error JSON parsing firebase config. Supplied value: في وحدة تحكم المتصفح. السبب: VITE_APP_FIREBASE_CONFIG ليس JSON صالحاً، وغالباً بسبب علامات اقتباس غير محمية جيداً أو سطر جديد في الملف. الحل: JSON في سطر واحد بين علامتي اقتباس مفردتين في ‎‎.env.production كما في الملف الأصلي.
  • تفشل المشاركة بالرابط، أو يشير الرابط الناتج إلى ‎json.excalidraw.com. السبب: لم يُغيَّر VITE_APP_BACKEND_V2_POST_URL وVITE_APP_BACKEND_V2_GET_URL، أو يشيران إلى خادم لا ينفّذ الواجهة المتوقعة. الحل: الإبقاء على الافتراضي عن علم، أو تبادل ملفات ‎‎.excalidraw.
  • خطأ تشفير أو توليد مفتاح على شبكة محلية عبر http://. السبب: واجهة التشفير في المتصفح (‎window.crypto) لا تُتاح إلا في سياق آمن؛ وينبّه الخيط الأصلي إلى هذا الفخ في الاستضافة الذاتية على شبكة محلية. الحل: تقديم الواجهة عبر HTTPS (أو على localhost) كما يشترط متطلب TLS أعلاه.

استمرارية اللوحات: ما يُحفظ فعلاً

بشكل افتراضي، يكون excalidraw-room عديم الحالة تماماً: إن أُعيد تشغيل الخادم يبدأ الترحيل من الصفر. المشهد المحفوظ للغرفة يعيش في مكان آخر (Firebase، انظر أعلاه)، ويحتفظ كل مشارك أيضاً برسمه في localStorage المتصفح.

الخيار الأول — تصدير يدوي لملفات ‎‎.excalidraw. تُنتج قائمة التصدير في الواجهة ملف ‎‎.excalidraw (أو صورة) يمكن إعادة استيراده في أي وقت. لا يوفر Excalidraw واجهة تصدير تُستدعى من cron: إنها خطوة تتم في المتصفح، ثم تضع الملف في وحدة تخزين أو مستودع git.

الخيار الثاني — حاوية S3 متوافقة للأرشفة. يوفر ServOrbit تخزين كائنات متوافق مع S3. انسخ إليه الملفات المصدَّرة بالأداة التي تفضلها (rclone أو aws s3 cp)؛ والاستعادة تتم بإعادة استيراد آخر ملف. Excalidraw نفسه لا يكتب في S3.

Excalidraw المستضاف ذاتياً مقابل بدائل SaaS

مرّر الجدول أفقيًا

المعيارExcalidraw (ذاتي)MiroFigJam
التكلفة لكل مستخدملا شيء (VPS فقط)مدفوع بالمقعدمدفوع بالمقعد
استضافة البياناتبنيتك التحتية (الوقت الفعلي)؛ وFirebase الخاص بـ Excalidraw افتراضياً للمشهد المحفوظ‎Miro Inc.‎‎Adobe / Figma‎
الأعضاء المتزامنونغير محدود (RAM فقط)محدود بالخطةمحدود بالخطة
رخصة البرنامجMIT (مفتوح المصدر)خاصةخاصة
قابل للاستضافة الذاتيةجزئياً: حاويتان، مع Firebase وروابط المشاركة التي تحتاج معالجةلالا
التحكم في الوصولIP / SSO / Basic AuthSSO (خطط Pro)SSO (خطط Edu+)

للمزيد: SSO وقوائم IP المسموح بها

بالنسبة للوكالات ذات متطلبات سرية صارمة، قد لا يكون نشر Excalidraw على نطاق فرعي عام مقبولاً دائماً. ثمة إعدادان شائعان يُحكمان الوصول دون تعديل Excalidraw نفسه.

HTTP Basic Auth عبر nginx. أضف توجيه auth_basic أمام كتلة location / للواجهة الأمامية. يجب على أي شخص يحاول فتح الواجهة المصادقة قبل تحميل تطبيق React. سهل التطبيق وكافٍ للمشاريع الداخلية.

قائمة IP المسموح بها. إن اتصل المتعاونون من عناوين IP ثابتة أو شبكة VPN مؤسسية، تكفي كتلة allow/deny في nginx لإغلاق الوصول:

allow 203.0.113.0/24;
allow 198.51.100.42;
deny all;

SSO‏ OIDC عبر وكيل عكسي للمصادقة. للفرق التي تمتلك بالفعل مزود هوية (Keycloak أو Authelia أو Authentik)، يُفوَّض التحقق من الهوية إلى SSO الحالي عبر وكيل كـ Oauth2-Proxy أو Authelia أمام nginx. لا يحتاج Excalidraw إلى معرفة وجود طبقة المصادقة الإضافية.

التكامل مع مجموعة الأدوات المستضافة ذاتياً

يتكامل Excalidraw بشكل طبيعي مع مجموعة الأدوات المستضافة ذاتياً. إن نشرت Mattermost للتواصل الجماعي، يمكنك لصق رابط جلسة Excalidraw في قناة ودعوة المتعاونين للانضمام إلى اللوحة مباشرةً. وإن كان Penpot يغطي التصميم عالي الدقة، يتولى Excalidraw العمل الأولي — الواجهات السريعة ومخططات التدفق وجلسات العصف الذهني — قبل انتقال التصاميم إلى Penpot.

هذا التكامل هو الحجة الحقيقية في مواجهة SaaS: تبقى كل أداة في نطاق كفاءتها دون اشتراك منصة يفوتر عن ميزات لا تحتاجها.

منصة واحدة لـ VPS والنطاق والنسخ الاحتياطية

يجمع ServOrbit.com VPS والنطاق والنسخ الاحتياطية على حسابك: انشر Excalidraw لفريقك من فضاء العميل.