BookStack, Wiki.js чи Outline: яку wiki обрати
Порівнюємо BookStack, Wiki.js і Outline за складністю запуску, редакторами, входом та пошуком. Дізнайтеся, що краще для одного адміністратора і команди.
Яку self-hosted wiki варто запустити
Self-hosted wiki зберігає документи вашої команди в одному місці з пошуком на сервері, яким ви керуєте. BookStack, Wiki.js і Outline виконують це завдання. Найбільше вони відрізняються обсягом компонентів, які потрібно підготувати до завантаження першої сторінки, і способом визначення користувачів, яким дозволено входити.
BookStack найпростіше розгорнути, і він найжорсткіше визначає структуру. Wiki.js дає найбільший вибір редакторів для одного дерева сторінок. Outline забезпечує найкращий досвід написання з-поміж цих трьох рішень, але його задокументована production-конфігурація потребує зовнішнього identity provider для створення початкового workspace.
Усе нижче взято з документації самих проєктів і опублікованих ними конфігураційних файлів. Це порівняння можливостей, а не benchmark. Номери версій і вимоги мають дату, оскільки всі три проєкти активно розвиваються.
Структура визначає вибір
BookStack задає структуру вашого вмісту. Сторінка міститься в книзі, книга може містити розділи, а полиці групують книги. П’ятий рівень додати не можна. Саме це і є перевагою продукту: новий автор знає, де розмістити сторінку, оскільки для неї є лише одне можливе місце. Недолік полягає в тому, що вміст, який не відповідає цій структурі, доводиться в неї вміщувати.
Wiki.js використовує дерево шляхів, подібне до структури папок на диску. Сторінка в ops/backup/restic розміщується там, де ви її створите, а глибину дерева визначаєте самостійно. Ніщо не заважає двом людям розмістити матеріали на одну тему в різних гілках, тому для екземпляра Wiki.js потрібна людина, відповідальна за структуру дерева.
Outline використовує колекції, у яких документи можна вкладати в інші документи. Документ переміщується перетягуванням мишею. Це найгнучкіший із трьох варіантів, тому його найпростіше поступово дезорганізувати.
BookStack: найменше встановлення
BookStack — це PHP-застосунок, який використовує MySQL. Станом на October 2026 задокументовані вимоги: PHP 8.2 або новіша версія та MySQL 8.0 або MariaDB 10.6 чи новіша версія. Якщо встановлювати застосунок із вихідного коду, також потрібен Composer 2.2 або новіший. Поточна лінійка релізів — 26.09, випущена September 24, 2026. Останній стабільний реліз — 26.09.2, security release від October 20, 2026. Починаючи з 26.09, потрібно задати значення APP_KEY. Наведені нижче кроки для контейнера вже це враховують. BookStack також опублікував критичне security notice для PHP October 21, 2026. Оновіть базові PHP packages або завантажте й повторно створіть контейнер із виправленим образом, оскільки сама версія BookStack не підтверджує, що PHP має всі security patches.
Проєкт офіційно підтримує installation scripts і інструкції для перелічених Ubuntu LTS releases: наразі 22.04, 24.04 і 26.04. Іноді він також публікує непідтримувані інструкції та scripts для інших середовищ. Script для 24.04 самостійно встановлює Apache, MySQL 8.0 і PHP 8.3. У 26.04 використовуйте installation-ubuntu-26.04.sh у наведених нижче командах. Він встановлює MySQL 8.4 і PHP 8.5.
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Перед запуском прочитайте попередження в цьому script. У документації зазначено, що він призначений "ONLY FOR A FRESH OS, it will install Apache, MySQL 8.0 & PHP 8.3 and could OVERWRITE any existing web setup on the machine". Script для 24.04 перевіряє наявну конфігурацію Apache і дані MySQL. Якщо він знаходить будь-які з них, то припиняє роботу до початку встановлення. У такому разі використовуйте контейнери або встановіть BookStack вручну поверх наявного LAMP stack в Ubuntu 24.04.
Для контейнерного способу використовується image LinuxServer.io — один із двох community container setups, перелічених у документації BookStack. BookStack потребує session encryption key і не обслуговуватиме сторінки без нього, тому спочатку згенеруйте ключ.
docker run -it --rm --entrypoint /bin/bash lscr.io/linuxserver/bookstack:latest appkeyСкопіюйте виведене значення до APP_KEY, потім створіть service. Цей service також потребує наявної бази даних MySQL або MariaDB. Задайте значення DB_* відповідно до цієї бази даних, оскільки цей snippet не створює database service.
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-stoppedAPP_URL має відповідати адресі, яку фактично вводять читачі, включно зі scheme і port, якщо він використовується. Задайте його як http://localhost, а потім обслуговуйте сайт через HTTPS. Інакше згенеровані links і redirects вестимуть до неправильного host, а читачі бачитимуть login page, яка перенаправляє сама на себе. Якщо compose files для вас нові, перед цим прикладом ознайомтеся з основами Docker Compose на VPS.
Запустіть сервіс і перевірте, що застосунок відповідає на запити, а не лише те, що container працює:
docker compose up -d
docker compose ps
curl -sI http://127.0.0.1:6875/login200 OK означає, що PHP-застосунок запустився та підключився до бази даних. Для діагностики 500 потрібен application error log. За замовчуванням BookStack записує помилки до log file, а не до container output. Тому відкрийте ./config/log/bookstack/laravel.log на host, щоб побачити причину. docker compose logs bookstack показує власні startup messages контейнера. Вони можуть не містити application error.
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, оскільки перехід на наступну major-версію змінює схему бази даних у запущеному екземплярі.
Для запуску слід використовувати гілку версії 2. Станом на October 27, 2026 найновішим релізом версії 2 є 2.5.317 — bug-fix-збірка від October 23, 2026, у якій образ перебудовано з найновішими security updates для Node. Релізи версії 2 тепер публікуються в окремому репозиторії requarks/wiki-v2, а тег образу :2 і далі вказує на них. Версія 3 перебуває у public beta. У документації з її інсталяції зазначено, що її образи мають теги 3.0.0-beta, а звичайні теги 3 і 3.0 не працюватимуть до завершення beta-фази. Розглядайте її як попередню версію, а не як ціль для production. Попередній реліз 2.5.316 від October 2, 2026 додав утиліту експорту для подальшого перенесення вмісту до версії 3.
Під час першого відкриття Wiki.js проводить вас через налаштування в браузері та створює обліковий запис адміністратора. Поки налаштування не завершено, будь-хто, хто має доступ до порту, побачить цей майстер. Тому перед відкриттям порту у firewall розмістіть сервіс за reverse proxy і TLS (transport layer security). Wiki на власному hostname природно розміщується за Traefik перед кількома Docker-застосунками, якщо на сервері працює більше одного такого сервісу.
Саме вибір редактора є причиною, через яку користувачі обирають Wiki.js. Один екземпляр може містити поруч сторінки Markdown, сторінки у visual editor, сторінки з raw HTML і сторінки AsciiDoc. Це зручно під час імпорту старого вмісту у форматі, який ви не хотіли б конвертувати. Водночас так в одній wiki можуть з’явитися чотири різні внутрішні стилі. Тому визначте редактор за замовчуванням у перший день і зафіксуйте це рішення в документації.
Огляд: найкращий редактор із найважчими залежностями
Outline — це те, що зазвичай мають на увазі, коли хочуть інструмент для нотаток, схожий на комерційний продукт. Це застосунок Node.js. Станом на October 27, 2026 поточний реліз — 1.12.0 від October 23, 2026. У цьому релізі Docker image використовує версію Node, яка виправляє кілька нещодавно розкритих вразливостей Node. Тому старі інсталяції потрібно оновити. Його приклад файлу середовища показує необхідні компоненти: 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/dataPGSSLMODE=disable коректне лише тоді, коли база даних працює на тому самому комп’ютері або в тій самій Docker network. Не вказуйте його для бази даних, доступної через мережу, інакше з’єднання передаватиметься відкритим текстом. Вкладення більше не вимагають object storage: FILE_STORAGE=local зберігає завантажені файли у вказаному вище каталозі. Цей каталог має бути volume, до якого контейнер може записувати, і він має входити до резервних копій. Якщо потрібно зберігати ці файли у S3 compatible bucket, задайте FILE_STORAGE=s3, використовуючи значення AWS_*.
Тепер про особливість, яка часто дивує користувачів. Outline не має вбудованої автентифікації за іменем користувача та паролем. У його прикладі конфігурації зазначено, що облікові дані стороннього провайдера входу обов’язкові: "at least ONE OF these is required for a working installation or you'll have no sign-in options". Документовані провайдери включають Google, Slack, Microsoft Entra, Discord і будь-який сумісний із OpenID Connect (OIDC) сервер через OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_AUTH_URI, OIDC_TOKEN_URI і OIDC_USERINFO_URI. Для наявних робочих просторів також можна ввімкнути passkeys і email links або codes. Для входу через email потрібен SMTP. Цей спосіб не обходить SSO для облікових записів, пов’язаних із SSO-провайдером.
Отже, фактична вартість документованої production-конфігурації Outline — це Outline, PostgreSQL, Redis і identity provider. Якщо команда вже входить через Google Workspace або Microsoft Entra, Outline стає дуже привабливим варіантом. Якщо ні, доведеться також самостійно розгортати щось на зразок Keycloak або Authentik. Це ще один сервіс, який потрібно оновлювати та резервно копіювати. Плануйте обсяг пам’яті відповідно: за рекомендаціями Outline, потрібно приблизно 512 MB на один web process. Значення задається через WEB_CONCURRENCY, додатково до ресурсів для бази даних і Redis.
Як кожна система визначає, хто може читати певний вміст
BookStack за замовчуванням має локальні облікові записи з email і паролем, а також підтримує LDAP, SAML2 та OIDC як альтернативи. Дозволи налаштовуються для кожної ролі та можуть бути перевизначені для окремої полиці, книги, розділу або сторінки. Дозволи книги й розділу успадковуються дочірнім вмістом, якщо їх не перевизначено; дозволи полиці потрібно явно скопіювати до книг.
Wiki.js також постачається з локальними обліковими записами та підтримує довгий список стратегій автентифікації, які вмикаються в адміністративній області. Правила сторінок надають або забороняють доступ за шаблоном шляху. Це потужний механізм, у якому легко припуститися помилки, оскільки правило, написане для ops/*, непомітно охоплюватиме кожну сторінку, яку ви згодом розмістите за цим шляхом.
Outline використовує ваш identity provider для SSO і керування членством, а всередині Outline ви керуєте доступом на рівні колекції, документа та групи. Користувачі, яких видалили з identity provider, вийдуть із системи під час наступного завантаження Outline; призупиніть їх в Outline, щоб негайно завершити наявні сесії.
Як працює пошук у кожній системі
Пошук визначає, чи виправдовує wiki своє використання, чи перетворюється на каталог забутих файлів.
BookStack виконує пошук у базі даних і надає читачам мову запитів, яку можна опанувати за хвилину. Взяття фрази в лапки, як у "london meeting", вимагає точного збігу цього рядка. Квадратні дужки використовують для пошуку тегів: [location=london] знаходить збіги за назвою тегу, його значенням або обома параметрами. Підтримуються, зокрема, порівняння !=, >= і like. Фігурні дужки фільтрують метадані, як у {created_after:2016-12-30}. Будь-який точний термін, термін тегу або фільтр можна виключити, додавши перед ним -. BookStack обмежує кількість термінів кожного типу в одному запиті, тому дуже довгий запит буде скорочено, а не виконано.
Wiki.js розглядає пошук як підключний модуль. У документації описано такі пошукові рушії: базовий рушій бази даних, рушій PostgreSQL, Elasticsearch, Algolia, AWS CloudSearch і Azure Search. Базовий рушій шукає збіги в заголовках, описах і шляхах, а не в тексті сторінок. Якщо ви використовуєте PostgreSQL, перемкніть рушій на PostgreSQL в адміністративній панелі, оскільки він використовує власний повнотекстовий індекс бази даних замість простого зіставлення. Elasticsearch призначений для wiki, достатньо великої, щоб ви погоджувалися запускати й оновлювати окремий сервіс пошуку.
Outline виконує пошук у повнотекстових індексах PostgreSQL. Вбудований пошук за ключовими словами не потребує окремого сервісу пошуку. Для командної wiki з кількома тисячами документів це найменш трудомісткий варіант із трьох.
Що вам підходить
Виберіть BookStack, якщо хочете запустити wiki вже сьогодні та волієте обговорювати вміст, а не структуру. У ньому найменше компонентів: один PHP-застосунок і одна база даних MySQL. Він підходить для внутрішніх runbook і документації для клієнтів, а також для команд, де більшість авторів не є інженерами. Його також найпростіше резервно копіювати, оскільки стан складається з одного дампу бази даних, завантажених файлів і конфігурації .env, зокрема APP_KEY.
Виберіть Wiki.js, якщо вам потрібен певний редактор або конкретна стратегія автентифікації, яких немає в інших варіантів, або якщо ви імпортуєте великий масив наявних документів у Markdown чи AsciiDoc і хочете зберегти структуру шляхів. Врахуйте, що запускатимете складніший стек, і зафіксуйте тег major-версії.
Виберіть Outline, якщо якість написання має найбільше значення, wiki призначена для команди, а не для публічного доступу, і у вас уже є identity provider. Така конфігурація дає змогу користуватися редактором, який справді зручний для авторів. Не вибирайте його як перший self-hosted застосунок.
Якщо жоден із трьох варіантів не підходить, проблема зазвичай у типі вмісту. Скановані рахунки та договори слід зберігати в системі керування документами, наприклад Paperless-ngx, а не у wiki. Спроба використовувати wiki для цього часто призводить до того, що її залишають без підтримки. Інша поширена невідповідність — коли вам потрібен workspace, а не wiki: документи, таблиці та whiteboard на одному полотні. У такому разі self-hosted workspace AFFiNE підходить краще, ніж будь-який із трьох наведених варіантів. Ширший огляд інших сервісів, які варто розмістити на власному сервері, наведено в матеріалі короткий список self-hosted сервісів на 2026.
Розміри та резервні копії
Усі три системи можна розмістити на невеликому VPS. Мінімальні реалістичні вимоги відрізняються через компоненти, які працюють за кожною з них. BookStack — це один процес застосунку та MySQL. Wiki.js — це процес Node і PostgreSQL. Outline — це процес Node, PostgreSQL і Redis, зазвичай також identity provider. Тому для нього слід передбачити більше пам’яті.
Створюйте резервні копії бази даних і завантажених файлів разом. Перед використанням резервної копії відновіть їх у тимчасовому екземплярі. Резервна копія wiki, яку ніхто не перевіряв відновленням, є лише припущенням. Для BookStack це означає mysqldump і том /config. Для Wiki.js і Outline це означає pg_dump і том даних, а для Outline також усе, що зберігається в FILE_STORAGE_LOCAL_ROOT_DIR.
FAQ
Яку self-hosted wiki найпростіше встановити?
BookStack. Це один PHP-застосунок із базою даних MySQL, а проєкт постачає installation script для Ubuntu 24.04, який за один запуск налаштовує Apache, MySQL 8.0 і PHP 8.3. Для container image потрібні APP_KEY, APP_URL і облікові дані наявної бази даних. Wiki.js додає Node runtime і сервер PostgreSQL, а Outline для описаного початкового налаштування потребує Redis і зовнішнього identity provider.
Чи можна використовувати Outline без Google або іншого SSO provider?
В описаній production-конфігурації для створення початкового workspace потрібен provider. У Outline немає локального входу за іменем користувача та паролем. У прикладі конфігурації зазначено, що потрібен принаймні один third-party sign-in provider. Інакше варіантів входу не буде. Можна використовувати Google, Slack, Microsoft Entra, Discord або будь-який generic OpenID Connect server, наприклад self-hosted Keycloak чи Authentik. У наявних workspaces можна ввімкнути passkeys або email links і codes. Для входу через email потрібен SMTP. Облікові записи, пов’язані з SSO, і надалі використовують цей provider.
Встановлювати Wiki.js 3 чи Wiki.js 2?
Version 2. Станом на October 27, 2026 найновіший реліз version 2 — 2.5.317 від October 23, 2026, а version 3 усе ще перебуває на стадії beta, і його images мають тег 3.0.0-beta. Зафіксуйте image на ghcr.io/requarks/wiki:2, а не на latest, оскільки зміна major version змінює схему бази даних у запущеному instance.
У якого з них найкращий пошук?
Вони мають різні сильні сторони. BookStack надає читачам query language з пошуком точних фраз, фільтрами тегів на кшталт [location=london] і фільтрами metadata на кшталт {created_after:2016-12-30}. Будь-який із цих термінів можна виключити, додавши на початку -. Вбудований keyword search в Outline не потребує окремого search service. Wiki.js найкраще налаштовується, оскільки ви обираєте engine. PostgreSQL engine виконує пошук у тексті сторінок, чого не робить basic engine.
Чи можна пізніше перенести вміст з одного продукту в інший?
Частково, але слід очікувати ручної роботи. Усі три продукти експортують Markdown, однак вбудований import у BookStack приймає його Portable ZIP format. Тому сам Markdown не можна безпосередньо імпортувати в BookStack. Структура не переноситься коректно: books і chapters у BookStack не мають еквівалента у вкладених documents в Outline, а paths у Wiki.js не відповідають фіксованій ієрархії BookStack. Найімовірніше буде втрачено attachments, permissions і page history. Тому перед міграцією експортуйте зразок і перевірте ці дані.