مقارنة BookStack وWiki.js وOutline: أيها تختار؟
قارن BookStack وWiki.js وOutline من حيث صعوبة الإعداد، وطريقة التحرير، وخيارات تسجيل الدخول، والبحث، مع اختيار واضح للمشرف الفردي والفرق.
أي Wiki مستضافة ذاتياً ينبغي أن تشغّل
تضع Wiki المستضافة ذاتياً مستندات فريقك في مكان واحد قابل للبحث على خادم تتحكم به. تؤدي BookStack وWiki.js وOutline هذه الوظيفة. ويظهر الاختلاف الأكبر بينها في مقدار ما يجب تجميعه قبل تحميل الصفحة الأولى، وفي الأشخاص المسموح لهم بتسجيل الدخول.
BookStack هي الأسهل في الإعداد والأكثر فرضاً لبنية محددة. تتيح Wiki.js أوسع اختيار للمحررات ضمن شجرة صفحات واحدة. وتوفر Outline أفضل تجربة للكتابة بين هذه المشاريع الثلاثة، لكنها لا تسمح لأي شخص بتسجيل الدخول قبل ربط موفر هوية خارجي بها.
تعتمد جميع المعلومات أدناه على وثائق المشاريع نفسها وملفات الإعداد المنشورة لها. هذه مقارنة للقدرات وليست اختبار أداء. أُرفقت أرقام الإصدارات والمتطلبات بتاريخ لأن المشاريع الثلاثة تتغير باستمرار.
البنية هي الخيار الحقيقي
يفرض BookStack شكلاً محدداً على محتواك. توجد الصفحة داخل كتاب، وقد يضم الكتاب فصولاً، بينما تجمع الأرفف الكتب. لا يمكنك ابتكار مستوى خامس. هذا القيد هو جوهر المنتج: يعرف الكاتب الجديد مكان الصفحة لأن هناك مكاناً واحداً فقط يمكن أن توجد فيه. أما التكلفة، فهي أن المحتوى الذي لا يناسب هذا الشكل يُجبر على التوافق معه.
يستخدم Wiki.js شجرة مسارات تشبه المجلدات على القرص. توجد الصفحة في ops/backup/restic حيث تضعها، ويمكنك اختيار عمقها. لا يمنع ذلك شخصين من تصنيف الموضوع نفسه ضمن فرعين مختلفين، لذلك تحتاج مثيلة Wiki.js إلى شخص واحد يتولى إدارة الشجرة.
يستخدم Outline مجموعات تحتوي على مستندات متداخلة داخل مستندات أخرى. لنقل مستند، اسحبه بالماوس. وهو الأكثر مرونة بين المنتجات الثلاثة، ولذلك يسهل أيضاً ترك بنيته تنحرف عن التنظيم المطلوب.
BookStack: أبسط عملية تثبيت
BookStack هو تطبيق PHP يعتمد على MySQL. اعتباراً من يوليو 2026، تتطلب الوثائق PHP 8.2 أو أحدث، وأحد الخيارين MySQL 8.0 أو MariaDB 10.6 أو أحدث، بالإضافة إلى Composer 2.2 أو أحدث إذا ثبّتَّه من المصدر. سلسلة الإصدارات الحالية هي 26.05.
ينشر المشروع سكربت تثبيت واحداً لكل إصدار من Ubuntu. يثبّت سكربت 24.04 Apache وMySQL 8.0 وPHP 8.3 نيابةً عنك.
wget https://codeberg.org/bookstack/devops/raw/branch/main/scripts/installation-ubuntu-24.04.sh
chmod a+x installation-ubuntu-24.04.sh
sudo ./installation-ubuntu-24.04.shاقرأ التحذير الموجود في ذلك السكربت قبل تشغيله. تنص الوثائق على أنّه «للنظام الجديد فقط، إذ سيثبّت Apache وMySQL 8.0 وPHP 8.3، وقد يستبدل أي إعداد ويب موجود على الجهاز». إذا كان الخادم يستقبل الاتصالات مسبقاً على المنفذ 80، فسيستولي السكربت على ذلك المنفذ ويعيد كتابة إعدادات Apache. استخدم الحاويات في هذه الحالة، أو ثبّت BookStack يدوياً فوق حزمة LAMP موجودة على Ubuntu 24.04.
يستخدم مسار الحاويات صورة LinuxServer.io، وهي الخيار الذي تشير إليه وثائق BookStack. يحتاج BookStack إلى مفتاح تشفير للجلسات، ولن يقدّم الصفحات بدونه، لذا أنشئه أولاً.
docker run -it --rm --entrypoint /bin/bash lscr.io/linuxserver/bookstack:latest appkeyانسخ القيمة المطبوعة إلى APP_KEY، ثم اكتب الخدمة:
services:
bookstack:
image: lscr.io/linuxserver/bookstack:latest
container_name: bookstack
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- APP_URL=https://wiki.example.com
- APP_KEY=paste_the_generated_key_here
- DB_HOST=bookstack_db
- DB_PORT=3306
- DB_USERNAME=bookstack
- DB_PASSWORD=change_me
- DB_DATABASE=bookstackapp
volumes:
- ./config:/config
ports:
- 6875:80
restart: unless-stoppedيجب أن يطابق APP_URL العنوان الذي يكتبه القراء فعلياً، بما في ذلك المخطط وأي منفذ. اضبطه على http://localhost، ثم قدّم الموقع عبر HTTPS؛ وإلا فستشير الروابط وإعادات التوجيه المنشأة إلى المضيف الخطأ، وقد يرى القراء صفحة تسجيل دخول تعيد التوجيه إلى نفسها باستمرار. إذا كانت ملفات compose جديدة عليك، فابدأ بـأساسيات Docker Compose على VPS قبل متابعة هذا الدليل.
شغّل التطبيق وتحقق من أنّه يستجيب، وليس من أنّ الحاوية تعمل فقط:
docker compose up -d
docker compose ps
curl -sI http://127.0.0.1:6875/loginيشير 200 OK إلى أنّ تطبيق PHP بدأ التشغيل وتمكّن من الوصول إلى قاعدة البيانات. ويعني 500 في الغالب أنّ APP_KEY فارغ أو أنّ بيانات اعتماد قاعدة البيانات غير متطابقة، بينما يطبع docker compose logs bookstack أيّ السببين هو الموجود.
Wiki.js: شجرة واحدة، ومحررات متعددة
Wiki.js هو تطبيق Node.js. يقرن إعداد Docker الموثق التطبيق بـPostgreSQL، مع أن البرنامج يدعم أيضاً MySQL وMariaDB وMSSQL وSQLite. هذا هو ملف compose من صفحة Docker الخاصة بالمشروع:
services:
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: wiki
POSTGRES_PASSWORD: wikijsrocks
POSTGRES_USER: wikijs
logging:
driver: none
restart: unless-stopped
volumes:
- db-data:/var/lib/postgresql/data
wiki:
image: ghcr.io/requarks/wiki:2
depends_on:
- db
init: true
environment:
DB_TYPE: postgres
DB_HOST: db
DB_PORT: 5432
DB_USER: wikijs
DB_PASS: wikijsrocks
DB_NAME: wiki
restart: unless-stopped
ports:
- "80:3000"
volumes:
db-data:غيّر POSTGRES_PASSWORD وDB_PASS معاً قبل تشغيل الملف، لأنهما يمثلان بيانات اعتماد واحدة، ولأن قيمة العينة عامة. ثُبّتت الوسمة على ghcr.io/requarks/wiki:2 عن قصد. توصي الوثائق بعدم استخدام latest، لأن الانتقال بين الإصدارات الرئيسية يغيّر مخطط قاعدة البيانات أثناء تشغيل المثيل.
الإصدار 2 هو السلسلة المناسبة للتشغيل. في يوليو 2026، كان أحدث إصدار من السلسلة 2 هو 2.5.314، وقد صدر في مايو 2026. يوجد الإصدار 3، لكن وثائقه الخاصة تقول: "هذا الموقع مخصص للإصدار التجريبي غير المستقر من Wiki.js 3.0. يجب ألا تثبّت هذا الإصدار في بيئة الإنتاج." تعامل مع الوسمة :3 على أنها معاينة.
عند التحميل الأول، يرشدك Wiki.js خلال إعداد داخل المتصفح ينشئ حساب المسؤول. إلى أن تنهي الإعداد، سيحصل أي شخص يصل إلى المنفذ على معالج الإعداد هذا. لذلك ضع الخدمة خلف الـreverse proxy وطبقة TLS (أمان طبقة النقل) قبل فتح المنفذ في الجدار الناري. إذا كان الخادم يستضيف خدمات أخرى، فمن الطبيعي وضع الويكي على اسم مضيف مستقل خلف Traefik أمام عدة تطبيقات Docker.
اختيار المحرر هو سبب اختيار كثير من المستخدمين لـWiki.js. يمكن لمثيل واحد استضافة صفحات Markdown وصفحات المحرر المرئي وصفحات HTML الخام وصفحات AsciiDoc جنباً إلى جنب. يفيد ذلك عند استيراد محتوى قديم بتنسيق لا تريد تحويله. لكنه قد يؤدي أيضاً إلى وجود أربعة أساليب تحرير داخل ويكي واحد. لذلك حدّد المحرر الافتراضي في اليوم الأول، ووثّق هذا القرار.
المخطط: أفضل محرر وأثقل المتطلبات المسبقة
المخطط هو ما يقصده الناس عادةً عندما يقولون إنهم يريدون أداة ملاحظات تشبه الأدوات التجارية. وهو تطبيق Node.js، والإصدار الحالي في يوليو 2026 هو 1.9.2. يسرد ملف البيئة النموذجي متطلباته: PostgreSQL عبر DATABASE_URL، وRedis عبر REDIS_URL، وسرّين عشوائيين، وURL يمكن الوصول إليه من شبكة عامة.
openssl rand -hex 32
openssl rand -hex 32شغّل ذلك مرتين واحتفظ بالقيمتين. تصبح القيمة الأولى SECRET_KEY، والثانية UTILS_SECRET. ويبدو الجزء الأساسي من ملف البيئة كما يلي:
NODE_ENV=production
URL=https://docs.example.com
PORT=3000
SECRET_KEY=<first openssl value>
UTILS_SECRET=<second openssl value>
DATABASE_URL=postgres://outline:change_me@postgres:5432/outline
PGSSLMODE=disable
REDIS_URL=redis://redis:6379
FILE_STORAGE=local
FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/dataتكون PGSSLMODE=disable صحيحة فقط عندما تكون قاعدة البيانات على الجهاز نفسه أو على شبكة Docker نفسها. احذفها إذا كانت قاعدة البيانات متاحة عبر الشبكة، وإلا انتقل الاتصال من دون تشفير. لم تعد المرفقات تفرض استخدام تخزين الكائنات: تكتب FILE_STORAGE=local الملفات المرفوعة إلى الدليل أعلاه، ويجب أن يكون هذا الدليل volume يستطيع container الكتابة إليه وأن تشمله النسخ الاحتياطية. اضبط FILE_STORAGE=s3 باستخدام قيم AWS_* بدلاً من ذلك إذا أردت تخزين هذه الملفات في bucket متوافق مع S3.
أما الجزء الذي يفاجئ الناس فهو التالي. لا يوفّر Outline تسجيل دخول مدمجاً باسم مستخدم وكلمة مرور. يوضح نموذج الإعداد الخاص به أن بيانات اعتماد تسجيل الدخول عبر جهات خارجية مطلوبة: "يلزم توفر خيار واحد على الأقل من هذه الخيارات لتثبيت يعمل، وإلا فلن تتوفر لديك أي خيارات لتسجيل الدخول". تشمل المزوّدات الموثقة Google وSlack وMicrosoft Entra وDiscord وأي خادم عام لـOpenID Connect (OIDC)، عبر OIDC_CLIENT_ID وOIDC_CLIENT_SECRET وOIDC_AUTH_URI وOIDC_TOKEN_URI وOIDC_USERINFO_URI.
لذلك، فإن التكلفة الفعلية لـOutline هي Outline بالإضافة إلى PostgreSQL وRedis ومزوّد هوية. إذا كان فريقك يسجّل الدخول مسبقاً باستخدام Google Workspace أو Microsoft Entra، فلن يستغرق هذا الجزء الأخير أكثر من عشر دقائق، وسيصبح Outline خياراً جذاباً جداً. أما إذا لم يكن الأمر كذلك، فسيتعين عليك أيضاً استضافة خدمة مثل Keycloak أو Authentik، ما يضيف خدمة ثانية تحتاج إلى التحديث والنسخ الاحتياطي. خصص الذاكرة وفقاً لذلك: توصي إرشادات Outline الخاصة به بنحو 512 MB لكل عملية ويب، ويُضبط ذلك عبر WEB_CONCURRENCY، إضافةً إلى متطلبات قاعدة البيانات وRedis.
كيف يتعامل كل منها مع الجهات التي يمكنها قراءة المحتوى
يوفّر BookStack حسابات محلية بالبريد الإلكتروني وكلمة المرور افتراضياً، ويدعم LDAP وSAML2 وOIDC كبدائل. تُحدَّد الأذونات لكل دور، ويمكن تجاوزها على مستوى رف أو كتاب أو فصل أو صفحة منفردة. وبما أن التسلسل الهرمي ثابت، تنتقل الأذونات عبره بطريقة يمكن التنبؤ بها.
يوفّر Wiki.js أيضاً حسابات محلية، ويضيف قائمة طويلة من الاستراتيجيات التي يمكنك تفعيلها من منطقة الإدارة. تمنح قواعد الصفحات الأذونات أو تمنعها وفق نمط المسار. وهذا يوفر مرونة كبيرة، لكنه يجعل ارتكاب الأخطاء سهلاً، لأن قاعدة مكتوبة من أجل ops/* ستنطبق بصمت على كل صفحة تضعها لاحقاً ضمن ذلك المسار.
يفوّض Outline هذه المسألة بالكامل إلى موفّر الهوية لديك. تتبع العضوية موفّر الهوية، وداخل Outline تتحكم في الوصول حسب المجموعة وحسب مجموعة المستخدمين. لا يبقى حساب محلي بعد مغادرة الشخص للشركة، وهذه ميزة مهمة عندما يكون موفّر الهوية هو النظام الذي تستخدمه لإلغاء إتاحة الحسابات.
كيفية عمل البحث في كل منصة
البحث هو ما يحدد ما إذا كانت الويكي ستثبت فائدتها أو تتحول إلى مجلد من الملفات المنسية.
يبحث BookStack في قاعدة البيانات، ويوفر للقرّاء لغة استعلام يمكن تعلمها خلال دقيقة. يفرض اقتباس عبارة، كما في "london meeting"، البحث عن هذه السلسلة النصية بالضبط. تبحث الأقواس المربعة في الوسوم: يطابق [location=london] اسم الوسم أو قيمته أو كليهما، مع مقارنات تشمل != و>= وlike. تُستخدم الأقواس المعقوفة لتصفية البيانات الوصفية، كما في {created_after:2016-12-30}. يمكن نفي أي مصطلح مطابق تماماً أو خاص بوسم أو بتصفية، وذلك بإضافة - إلى بدايته. يفرض BookStack حداً لعدد المصطلحات من كل نوع في الاستعلام الواحد، لذلك يُختصر الاستعلام الطويل جداً بدلاً من تنفيذه.
يتعامل Wiki.js مع البحث باعتباره وحدة قابلة للتبديل. محركات البحث الموثقة هي محرك قاعدة بيانات أساسي، ومحرك PostgreSQL، وElasticsearch، وAlgolia، وAWS CloudSearch، وAzure Search. يكفي المحرك الأساسي لبضع مئات من الصفحات. إذا كنت تستخدم PostgreSQL، فانتقل إلى محرك PostgreSQL من منطقة الإدارة، لأنه يستخدم فهرس البحث النصي الكامل الخاص بقاعدة البيانات بدلاً من المطابقة البسيطة. استخدم Elasticsearch فقط عندما تكون الويكي كبيرة بما يكفي لتقبل تشغيل خدمة بحث ثانية وتثبيتها بتحديثات الأمان.
يبحث Outline في فهارس البحث النصي الكامل في PostgreSQL. لا يوجد محرك تختاره ولا إعدادات تحتاج إلى ضبطها، كما أنه يبحث أيضاً في النص الموجود داخل المستندات المرفوعة. بالنسبة إلى ويكي فريق تضم بضعة آلاف من المستندات، فهذا يتطلب أقل قدر من العمل بين المنصات الثلاث. ولا يوجد إعداد يمكن تغييره إذا لم يعد سريعاً بما يكفي.
ما الخيار المناسب لك
اختر BookStack إذا أردت تشغيل الويكي هذا بعد الظهر، وكنت تفضّل مناقشة المحتوى بدلاً من مناقشة البنية. يحتوي على أقل عدد من المكوّنات المتحركة: تطبيق PHP واحد وقاعدة بيانات MySQL واحدة. يناسب أدلة التشغيل الداخلية ووثائق العملاء، كما يناسب الفرق التي لا يعمل معظم كتّابها في الهندسة. وهو أيضاً الأسهل في النسخ الاحتياطي بين الخيارات الثلاثة، لأن حالته الكاملة تتكوّن من تفريغ قاعدة بيانات واحد ومجلد uploads.
اختر Wiki.js إذا كنت تحتاج إلى محرر محدد أو استراتيجية مصادقة محددة لا يوفّرها الخياران الآخران، أو إذا كنت تستورد مجموعة كبيرة من ملفات Markdown أو AsciiDoc الحالية وتريد الحفاظ على بنية المسارات. تقبّل أنك ستشغّل حزمة أثقل، وثبّت وسم الإصدار الرئيسي.
اختر Outline إذا كانت جودة الكتابة هي العامل الأهم، وكان الويكي مخصصاً لفريق لا للجمهور، وكان لديك موفّر هوية بالفعل. يكافئك هذا الإعداد بمحرر يستمتع الأشخاص فعلاً باستخدامه. لا تختره كأول تطبيق تستضيفه بنفسك.
إذا لم يناسبك أي من الخيارات الثلاثة، فعادةً ما يكون السبب هو عدم ملاءمة نوع المحتوى. تنتمي الفواتير والعقود الممسوحة ضوئياً إلى نظام لإدارة المستندات مثل Paperless-ngx بدلاً من الويكي، وفرض استخدامها فيه هو سبب هجر كثير من مواقع الويكي في النهاية. أما عدم الملاءمة الشائع الآخر فهو رغبتك في مساحة عمل لا ويكي، تضم مستندات وجداول ولوحة بيضاء على لوحة واحدة، وهنا تكون مساحة عمل AFFiNE تستضيفها بنفسك أنسب من أي من الخيارات الثلاثة السابقة. وللاطلاع على نطاق أوسع لما يستحق مكاناً على خادمك الخاص، راجع قائمة التطبيقات المختصرة للاستضافة الذاتية لعام 2026.
تحديد الموارد والنسخ الاحتياطية
يمكن تشغيل التطبيقات الثلاثة على VPS صغير، لكن الحد الأدنى الواقعي يختلف بسبب المكونات التي يعتمد عليها كل تطبيق. يتكون BookStack من عملية تطبيق واحدة وMySQL. ويتكون Wiki.js من عملية Node وPostgreSQL. أما Outline فيتكون من عملية Node وPostgreSQL وRedis، ويُستخدم معه عادةً موفّر هوية أيضاً، ولذلك يحتاج إلى ذاكرة إضافية.
انسخ قاعدة البيانات والملفات المرفوعة احتياطياً معاً، واستعدهما في مثيل مؤقت مرة واحدة قبل الاعتماد على تلك النسخة الاحتياطية. فالنسخة الاحتياطية لويكي لم يختبر أحد استعادتها ليست سوى تخمين. بالنسبة إلى BookStack، يعني ذلك mysqldump بالإضافة إلى وحدة التخزين /config. وبالنسبة إلى Wiki.js وOutline، يعني ذلك pg_dump بالإضافة إلى وحدة البيانات، وبالنسبة إلى Outline أيضاً كل ما يوجد داخل FILE_STORAGE_LOCAL_ROOT_DIR.
FAQ
ما أسهل ويكي مستضاف ذاتياً لتثبيته؟
BookStack. هو تطبيق PHP واحد يستخدم قاعدة بيانات MySQL، ويوفّر المشروع نص تثبيت لـ Ubuntu 24.04 يجهّز Apache وMySQL 8.0 وPHP 8.3 في تشغيل واحد. لا تحتاج صورة الحاوية إلا إلى APP_KEY وبيانات اعتماد قاعدة البيانات. يضيف Wiki.js بيئة تشغيل Node وخادماً لـ PostgreSQL، بينما يضيف Outline Redis وموفّر هوية خارجياً فوق ذلك.
هل يمكنني استخدام Outline من دون Google أو موفّر SSO آخر؟
لا. لا يوفّر Outline تسجيل دخول محلياً باستخدام اسم مستخدم وكلمة مرور. يوضح الإعداد النموذجي له أنّه يجب توفير موفّر تسجيل دخول واحد على الأقل من جهة خارجية، وإلا فلن تتوفر أي خيارات لتسجيل الدخول. يمكنك استخدام Google أو Slack أو Microsoft Entra أو Discord أو أي خادم OpenID Connect عام، مثل Keycloak أو Authentik المستضافين ذاتياً. ويُعد تشغيل ذلك الموفّر جزءاً من تكلفة تشغيل Outline.
هل ينبغي أن أثبّت Wiki.js 3 أم Wiki.js 2؟
الإصدار 2. حتى يوليو 2026، كان أحدث إصدار من السلسلة 2 هو 2.5.314، وقد صدر في مايو 2026. وتذكر وثائق الإصدار 3 بوضوح أنّه إصدار تجريبي غير مستقر، ولا ينبغي تثبيته في بيئة الإنتاج. ثبّت صورتك على ghcr.io/requarks/wiki:2 بدلاً من latest، لأن تغيير الإصدار الرئيسي يغيّر مخطط قاعدة البيانات أثناء تشغيل المثيل.
أيّها يوفّر أفضل بحث؟
تتميز هذه المنتجات بطرق مختلفة. يوفّر BookStack للقرّاء لغة استعلام تتضمن العبارات المطابقة تماماً، ومرشحات للوسوم مثل [location=london]، ومرشحات للبيانات الوصفية مثل {created_after:2016-12-30}. ويمكن نفي أي من هذه الشروط باستخدام - في بدايته. لا يحتاج Outline إلى إعداد، ويبحث داخل النص الموجود في الملفات المرفوعة. أما Wiki.js فهو الأكثر قابلية للضبط، لأنك تختار محرك البحث، ويستحق محرك PostgreSQL التبديل إليه بمجرد أن يتجاوز الويكي بضع مئات من الصفحات.
هل يمكنني نقل المحتوى من أحدها إلى آخر لاحقاً؟
جزئياً، وينبغي أن تتوقع بعض العمل اليدوي. تدعم المنتجات الثلاثة تصدير Markdown واستيراده، لذلك يبقى نص الصفحة عادةً. لكن البنية لا تنتقل بصورة سليمة: لا مقابل لكتب وفصول BookStack في المستندات المتداخلة في Outline، كما أنّ مسارات Wiki.js لا تتوافق مع التسلسل الهرمي الثابت في BookStack. وتُعد المرفقات والأذونات وسجل الصفحات أكثر العناصر عرضة للفقدان، لذلك صدّر عينة وافحص هذه العناصر قبل بدء عملية النقل.