SSD Nodes Learn 8GB RAM — $66/سنة
الأدلة Matt Connorبقلم Matt Connor · آخر تحديث في 2026-08-01

مقارنة BookStack وWiki.js وOutline: أي ويكي تختار؟

مقارنة BookStack وWiki.js وOutline من حيث سهولة الإعداد، أسلوب التحرير، خيارات تسجيل الدخول والبحث، مع ترشيح واضح للمسؤول الفردي والفرق.

أي ويكي مستضاف ذاتيًا ينبغي أن تشغّل

يضع الويكي المستضاف ذاتيًا مستندات فريقك في مكان واحد قابل للبحث على خادم تتحكم فيه. تؤدي 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 هو السلسلة التي ينبغي تشغيلها. اعتبارًا من July 2026، أحدث إصدار من السلسلة 2 هو 2.5.314، وقد صدر في May 2026. يوجد الإصدار 3، وتقول وثائقه الخاصة: "هذا الموقع مخصص لإصدار Wiki.js 3.0 التجريبي غير المستقر. يجب ألا تثبّت هذا الإصدار في بيئة الإنتاج." تعامل مع العلامة :3 على أنها إصدار معاينة.

عند التحميل الأول، يوجّهك Wiki.js خلال إعداد داخل المتصفح ينشئ حساب administrator. إلى أن تنهي الإعداد، سيحصل أي شخص يصل إلى المنفذ على معالج الإعداد هذا. لذلك ضع الخدمة خلف reverse proxy وTLS (أمن طبقة النقل) قبل فتح جدار الحماية. عندما يستضيف الخادم أكثر من هذه الخدمة، يكون من الطبيعي وضع wiki على اسم مضيف مستقل خلف Traefik أمام عدة تطبيقات Docker.

اختيار المحرر هو سبب اختيار المستخدمين لـ Wiki.js. يمكن لمثيل واحد استضافة صفحات Markdown وصفحات المحرر المرئي وصفحات HTML الخام وصفحات AsciiDoc جنبًا إلى جنب. يفيد ذلك عند استيراد محتوى قديم بتنسيق لا تريد تحويله. لكنه قد يؤدي أيضًا إلى وجود أربع أساليب تحرير خاصة بالمؤسسة في wiki واحد. لذلك حدّد المحرر الافتراضي منذ اليوم الأول، وسجّل هذا القرار.

Outline: أفضل محرر، وأثقل المتطلبات الأساسية

Outline هو ما يقصده الناس عادةً عندما يريدون أداة ملاحظات تشبه أداة تجارية. وهو تطبيق 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 الملفات المرفوعة إلى الدليل المذكور أعلاه، ويجب أن يكون هذا الدليل وحدة تخزين يستطيع الحاوي الكتابة إليها، وأن يتضمنه نظام النسخ الاحتياطي لديك. اضبط FILE_STORAGE=s3 باستخدام قيم AWS_* بدلًا من ذلك إذا أردت تخزين هذه الملفات في حاوية متوافقة مع 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 لا إلى ويكي، وإجبارها على الدخول فيه هو سبب انتهاء كثير من مواقع الويكي مهجورة. للحصول على نظرة أوسع إلى التطبيقات الأخرى التي تستحق مكانًا على خادمك، راجع القائمة المختصرة للاستضافة الذاتية لعام 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. اعتبارًا من July 2026، أحدث إصدار من السلسلة 2 هو 2.5.314، وقد صدر في May 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. وتُعد المرفقات والأذونات وسجل الصفحات أكثر العناصر عرضةً للفقدان، لذا صدّر عينةً وافحصها قبل الالتزام بعملية الترحيل.

#bookstack#wikijs#outline#wiki#استضافة ذاتية#knowledge-base