مقایسه BookStack، Wiki.js و Outline برای wiki خودمیزبان
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 نصب کنید.
روش کانتینری از image متعلق به 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 باید با نشانیای مطابقت داشته باشد که کاربران واقعاً وارد میکنند؛ این نشانی باید scheme و هر port را نیز شامل شود. آن را روی http://localhost تنظیم کنید و سپس سایت را از طریق HTTPS ارائه دهید. در غیر این صورت، پیوندهای تولیدشده و redirectها به میزبان نادرست اشاره میکنند و کاربران صفحه ورود را میبینند که دوباره به خودش بازمیگردد. اگر فایلهای compose برای شما جدید هستند، پیش از این راهنما با مبانی Docker Compose روی یک VPS شروع کنید.
سرویس را راهاندازی کنید و بررسی کنید که برنامه پاسخ میدهد؛ فقط running بودن کانتینر کافی نیست:
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 است. نباید آن را در محیط production نصب کنید.» برچسب :3 را یک پیشنمایش در نظر بگیرید.
در اولین بارگذاری، Wiki.js شما را در یک راهاندازی درونمرورگری هدایت میکند که حساب administrator را ایجاد میکند. تا زمانی که این فرایند را تمام نکنید، هر کسی که به port دسترسی داشته باشد، این wizard را میبیند. بنابراین پیش از باز کردن firewall، سرویس را پشت reverse proxy و TLS (امنیت لایه انتقال) قرار دهید. وقتی سرور بیش از این یک سرویس را میزبانی میکند، یک wiki با hostname مستقل، بهطور طبیعی پشت Traefik در جلوی چند برنامه Docker قرار میگیرد.
انتخاب ویرایشگر دلیل انتخاب Wiki.js است. یک نمونه میتواند صفحات Markdown، صفحات ویرایشگر بصری، صفحات HTML خام و صفحات AsciiDoc را در کنار هم نگه دارد. این قابلیت هنگام وارد کردن محتوای قدیمی در قالبی که ترجیح میدهید تبدیل نکنید، مفید است. همچنین ممکن است در یک wiki به چهار سبک داخلی متفاوت برسید. بنابراین از روز اول ویرایشگر پیشفرض را تعیین کنید و این تصمیم را ثبت کنید.
Outline: بهترین ویرایشگر با سنگینترین پیشنیازها
Outline همان چیزی است که معمولاً منظور افراد از ابزاری با حسوحال یک ابزار تجاری یادداشتبرداری است. این ابزار یک برنامه Node.js است و نسخه فعلی آن تا ژوئیه 2026، برابر با 1.9.2 است. فایل محیط نمونه آن نیازمندیهایش را فهرست میکند: PostgreSQL از طریق DATABASE_URL، Redis از طریق REDIS_URL، دو secret تصادفی و یک URL که از عموم قابل دسترسی باشد.
openssl rand -hex 32
openssl rand -hex 32این دستور را 2 بار اجرا کنید و هر دو مقدار را نگه دارید. مقدار اول به 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/dataPGSSLMODE=disable فقط زمانی درست است که پایگاه داده روی همان ماشین یا همان شبکه Docker قرار داشته باشد. برای پایگاه دادهای که از طریق شبکه قابل دسترسی است، آن را حذف کنید؛ در غیر این صورت اتصال بدون رمزنگاری انجام میشود. پیوستها دیگر شما را مجبور به استفاده از object storage نمیکنند: FILE_STORAGE=local فایلهای بارگذاریشده را در دایرکتوری بالا مینویسد. این دایرکتوری باید یک volume قابل نوشتن برای container باشد و در پشتیبانگیریهای شما قرار گیرد. اگر میخواهید این فایلها را در یک bucket سازگار با S3 ذخیره کنید، FILE_STORAGE=s3 را با استفاده از مقادیر AWS_* تنظیم کنید.
اکنون به بخشی میرسیم که بسیاری را شگفتزده میکند. Outline ورود داخلی با username و password ندارد. پیکربندی نمونه خود آن اعلام میکند که اعتبارنامههای ورود شخص ثالث الزامی هستند: «برای نصب عملیاتی، دستکم یکی از این موارد لازم است؛ در غیر این صورت هیچ گزینهای برای ورود نخواهید داشت». ارائهدهندگان مستندشده شامل 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 و یک identity provider است. اگر تیم شما از قبل با Google Workspace یا Microsoft Entra وارد میشود، راهاندازی بخش آخر 10 دقیقه زمان میبرد و Outline گزینه بسیار جذابی میشود. اگر چنین نیست، باید سرویسی مانند Keycloak یا Authentik را نیز self-host کنید؛ این یعنی یک سرویس دیگر برای patch و پشتیبانگیری خواهید داشت. حافظه را متناسب با این موضوع در نظر بگیرید: راهنمای خود Outline حدود 512 MB برای هر web process پیشنهاد میکند که با WEB_CONCURRENCY تنظیم میشود؛ این مقدار جدا از حافظه مورد نیاز پایگاه داده و Redis است.
هرکدام تعیین میکنند چه کسی چه چیزی را بخواند
BookStack بهصورت پیشفرض حسابهای محلی با ایمیل و گذرواژه دارد و از LDAP، SAML2 و OIDC نیز بهعنوان گزینههای جایگزین پشتیبانی میکند. مجوزها برای هر نقش تنظیم میشوند و میتوان آنها را در یک قفسه، کتاب، فصل یا صفحه منفرد بازنویسی کرد. از آنجا که سلسلهمراتب ثابت است، مجوزها بهشکلی قابل پیشبینی در آن به سطوح پایینتر به ارث میرسند.
Wiki.js نیز حسابهای محلی را ارائه میکند و فهرست بلندبالایی از راهبردها را اضافه میکند که آنها را در بخش مدیریت فعال میکنید. قوانین صفحه، دسترسی را بر اساس الگوی مسیر مجاز یا رد میکنند. این قابلیت قدرتمند است، اما بهسادگی میتوان در استفاده از آن اشتباه کرد؛ زیرا قانونی که برای ops/* نوشته شده باشد، بعداً بهطور خاموش همه صفحههایی را پوشش میدهد که در آن مسیر قرار میدهید.
Outline این موضوع را بهطور کامل به ارائهدهنده هویت شما واگذار میکند. عضویت از ارائهدهنده هویت پیروی میکند و در Outline دسترسی را بر اساس مجموعه و گروه کنترل میکنید. وقتی فردی شرکت را ترک میکند، هیچ حساب محلی بدون استفادهای باقی نمیماند. اگر ارائهدهنده هویت همان سامانهای باشد که از طریق آن دسترسی افراد را لغو میکنید، این یک مزیت واقعی است.
جستوجو در هرکدام چگونه کار میکند
جستوجو جایی است که یک ویکی ارزش خود را نشان میدهد یا به پوشهای از فایلهای فراموششده تبدیل میشود.
BookStack پایگاهداده را جستوجو میکند و به خوانندگان یک زبان کوئری میدهد که یادگیری آن فقط 1 دقیقه زمان میبرد. قرار دادن یک عبارت در علامت نقلقول، مانند "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 برای جستوجو استفاده میکند. موتوری برای انتخاب و گزینهای برای تنظیم وجود ندارد و این سامانه متن داخل اسناد بارگذاریشده را نیز جستوجو میکند. برای یک ویکی تیمی با چند هزار سند، این گزینه کمترین میزان کار را از میان این 3 مورد دارد. اگر جستوجو دیگر بهاندازه کافی سریع نباشد، اهرمی برای تنظیم آن وجود ندارد.
کدام گزینه برای شما مناسب است
اگر میخواهید ویکی را همین بعدازظهر راهاندازی کنید و ترجیح میدهید درباره محتوا بحث کنید، نه ساختار، BookStack را انتخاب کنید. این گزینه کمترین اجزای متحرک را دارد: یک برنامه PHP و یک پایگاه داده MySQL. برای runbookهای داخلی و مستندات مشتری مناسب است و برای تیمهایی کاربرد دارد که بیشتر نویسندگان آنها مهندس نیستند. تهیه نسخه پشتیبان از آن نیز در میان این 3 گزینه آسانتر است، زیرا کل وضعیت آن شامل یک database dump و فهرست uploads است.
اگر به ویرایشگر یا راهبرد احراز هویت خاصی نیاز دارید که گزینههای دیگر ارائه نمیکنند، یا اگر میخواهید حجم زیادی از Markdown یا AsciiDoc موجود را وارد کنید و ساختار مسیرها حفظ شود، Wiki.js را انتخاب کنید. بپذیرید که در حال اجرای یک stack سنگینتر هستید و major version tag را ثابت نگه دارید.
اگر کیفیت نگارش برای شما بیشترین اهمیت را دارد، ویکی برای یک تیم است نه عموم، و از قبل یک identity provider دارید، Outline را انتخاب کنید. این راهاندازی با ویرایشگری پاسخ میدهد که کاربران واقعاً از کار کردن با آن لذت میبرند. آن را بهعنوان نخستین برنامه self-hosted خود انتخاب نکنید.
اگر هیچیک از این 3 گزینه مناسب نیست، مشکل معمولاً به نوع محتوا مربوط میشود. فاکتورها و قراردادهای اسکنشده به یک سیستم مدیریت اسناد مانند Paperless-ngx تعلق دارند، نه به ویکی؛ وادار کردن آنها به ورود به ویکی دلیل رها شدن بسیاری از ویکیهاست. برای دیدی گستردهتر درباره برنامههایی که ارزش قرار گرفتن روی سرور شخصی شما را دارند، فهرست کوتاه self-hosting برای 2026 را ببینید.
اندازهگذاری و پشتیبانگیری
هر سه گزینه روی یک VPS کوچک قابل اجرا هستند، اما حداقل منابع عملی آنها به اجزای پشت هرکدام بستگی دارد. BookStack شامل یک فرایند برنامه و MySQL است. Wiki.js شامل یک فرایند Node و PostgreSQL است. Outline شامل یک فرایند Node، PostgreSQL و Redis است و معمولاً یک ارائهدهنده هویت نیز در کنار آن اجرا میشود. به همین دلیل، Outline به حافظه بیشتری نیاز دارد.
از پایگاه داده و فایلهای بارگذاریشده بهصورت همزمان پشتیبان بگیرید و پیش از اتکا به آن پشتیبان، هر دو را یکبار در یک نمونه موقتی بازیابی کنید. پشتیبان ویکی که هرگز بازیابی نشده باشد، فقط یک حدس است. در BookStack، این کار به معنی پشتیبانگیری از mysqldump بههمراه volume مربوط به /config است. در Wiki.js و Outline، این کار به معنی پشتیبانگیری از pg_dump بههمراه data volume است؛ برای Outline، هر چیزی را که در FILE_STORAGE_LOCAL_ROOT_DIR قرار دارد نیز اضافه کنید.
FAQ
نصب کدام ویکی خودمیزبان آسانتر است؟
BookStack. این نرمافزار یک برنامه واحد PHP با پایگاهداده MySQL است و پروژه، یک اسکریپت نصب برای Ubuntu 24.04 ارائه میکند که Apache، MySQL 8.0 و PHP 8.3 را در یک اجرا راهاندازی میکند. ایمیج کانتینر فقط به یک APP_KEY و اطلاعات اعتباری پایگاهداده نیاز دارد. Wiki.js یک runtime مربوط به 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 صراحتاً میگویند که این نسخه یک بتای ناپایدار است و نباید در محیط production نصب شود. ایمیج خود را روی ghcr.io/requarks/wiki:2 ثابت کنید، نه latest، زیرا تغییر نسخه اصلی، طرحواره پایگاهداده را در یک نمونه در حال اجرا تغییر میدهد.
کدامیک بهترین جستوجو را دارد؟
هرکدام در زمینهای متفاوت عملکرد خوبی دارند. BookStack زبانی برای جستوجو در اختیار خوانندگان میگذارد که از عبارتهای دقیق، فیلترهای برچسب مانند [location=london] و فیلترهای فراداده مانند {created_after:2016-12-30} پشتیبانی میکند؛ همچنین میتوان هرکدام از این عبارتها را با افزودن - در ابتدای آنها نفی کرد. Outline به پیکربندی نیاز ندارد و متن داخل فایلهای بارگذاریشده را جستوجو میکند. Wiki.js بیشترین قابلیت تنظیم را دارد، زیرا موتور را شما انتخاب میکنید؛ همچنین بهمحض آنکه ویکی شما از چند صد صفحه فراتر رفت، تغییر به موتور PostgreSQL ارزشمند است.
آیا میتوانم بعداً محتوای خود را از یکی به دیگری منتقل کنم؟
تا حدی، اما باید انتظار کار دستی داشته باشید. هر سه نرمافزار از Markdown خروجی و به آن وارد میکنند؛ بنابراین متن صفحه معمولاً حفظ میشود. ساختار بهطور کامل حفظ نمیشود: کتابها و فصلهای BookStack معادل مستقیمی در اسناد تودرتوی Outline ندارند و مسیرهای Wiki.js با سلسلهمراتب ثابت BookStack منطبق نمیشوند. پیوستها، مجوزها و تاریخچه صفحات، بخشهایی هستند که احتمال از دست رفتن آنها بیشتر است؛ بنابراین پیش از متعهد شدن به مهاجرت، از نمونهای خروجی بگیرید و این موارد را بررسی کنید.