BookStack, Wiki.js czy Outline: którą wiki wybrać?
Porównanie systemów wiki do samodzielnego hostingu. Analiza wymagań instalacyjnych, edytorów oraz metod logowania. Sprawdź, które rozwiązanie najlepiej sprawdzi się w zespole.
Którą wiki z własnym hostingiem wybrać
Własna instancja wiki pozwala na przechowywanie dokumentacji zespołu w jednym, przeszukiwalnym miejscu na serwerze pod pełną kontrolą. BookStack, Wiki.js oraz Outline realizują to zadanie. Różnią się one głównie zakresem konfiguracji wymaganej przed uruchomieniem pierwszej strony oraz mechanizmami kontroli dostępu dla użytkowników.
BookStack jest najlżejszy w instalacji i narzuca sztywną strukturę danych. Wiki.js oferuje największy wybór edytorów w ramach jednego drzewa stron. Outline zapewnia najlepsze wrażenia podczas pisania, jednak blokuje możliwość logowania do momentu skonfigurowania zewnętrznego dostawcy tożsamości.
Poniższe zestawienie opracowano na podstawie dokumentacji projektów oraz opublikowanych plików konfiguracyjnych. Jest to porównanie możliwości, a nie test wydajności. Numery wersji oraz wymagania są opatrzone datą, ze względu na dynamiczny rozwój wszystkich trzech rozwiązań.
Struktura to rzeczywisty wybór
BookStack narzuca formę treści. Strona znajduje się wewnątrz książki, książka może zawierać rozdziały, a półki grupują książki. Nie można utworzyć piątego poziomu. To ograniczenie stanowi istotę produktu: nowy autor wie, gdzie umieścić stronę, ponieważ istnieje tylko jedno poprawne miejsce. Kosztem tego rozwiązania jest konieczność dopasowania treści, które nie pasują do narzuconego schematu.
Wiki.js wykorzystuje drzewo ścieżek, podobnie jak foldery na dysku. Strona pod adresem ops/backup/restic znajduje się tam, gdzie zostanie umieszczona, a użytkownik samodzielnie wybiera głębokość struktury. Nic nie stoi na przeszkodzie, aby dwie osoby przypisały ten sam temat do dwóch różnych gałęzi, dlatego instancja Wiki.js wymaga osoby odpowiedzialnej za utrzymanie porządku w drzewie.
Outline korzysta z kolekcji z dokumentami zagnieżdżonymi w innych dokumentach. Przenoszenie dokumentu odbywa się poprzez przeciągnięcie myszą. Jest to najbardziej elastyczne z trzech rozwiązań, przez co najłatwiej doprowadzić do utraty spójności struktury.
BookStack: minimalna instalacja
BookStack to aplikacja PHP korzystająca z bazy danych MySQL. Według stanu na lipiec 2026 r. udokumentowane wymagania to PHP 8.2 lub nowszy oraz MySQL 8.0 lub MariaDB 10.6 lub nowszy, a także Composer 2.2 lub nowszy w przypadku instalacji ze źródeł. Obecna linia wydawnicza to 26.05.
Projekt publikuje jeden skrypt instalacyjny na każde wydanie Ubuntu. Skrypt dla wersji 24.04 instaluje Apache, MySQL 8.0 oraz 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.shPrzed uruchomieniem skryptu należy zapoznać się z ostrzeżeniem. Dokumentacja wskazuje, że jest on przeznaczony „WYŁĄCZNIE DLA CZYSTEGO SYSTEMU OPERACYJNEGO; zainstaluje Apache, MySQL 8.0 oraz PHP 8.3 i może NADPISAĆ każdą istniejącą konfigurację serwera WWW na maszynie”. Na serwerze, który już obsługuje ruch na porcie 80, skrypt przejmie ten port i nadpisze konfigurację Apache. W takim przypadku należy użyć kontenerów lub zainstalować BookStack ręcznie na istniejącym stosie LAMP na Ubuntu 24.04.
Metoda kontenerowa wykorzystuje obraz LinuxServer.io, co jest opcją zalecaną w dokumentacji BookStack. Aplikacja wymaga klucza szyfrowania sesji i nie będzie wyświetlać stron bez jego podania, dlatego należy go najpierw wygenerować.
docker run -it --rm --entrypoint /bin/bash lscr.io/linuxserver/bookstack:latest appkeySkopiuj wyświetloną wartość do APP_KEY, a następnie utwórz definicję usługi:
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-stoppedWartość APP_URL musi odpowiadać adresowi, który wpisują użytkownicy, włącznie ze schematem i ewentualnym portem. Ustaw ją na http://localhost; w przeciwnym razie serwis będzie dostępny przez HTTPS, ale wygenerowane linki i przekierowania będą wskazywać na błędny host, co użytkownicy zobaczą jako stronę logowania zapętlającą się w nieskończoność. Jeśli pliki compose są nowością, przed przystąpieniem do dalszych kroków zapoznaj się z podstawami Docker Compose na VPS.
Uruchom usługę i sprawdź, czy aplikacja odpowiada, a nie tylko czy kontener działa:
docker compose up -d
docker compose ps
curl -sI http://127.0.0.1:6875/loginKod 200 OK oznacza, że aplikacja PHP uruchomiła się i uzyskała dostęp do bazy danych. Kod 500 prawie zawsze oznacza, że APP_KEY jest puste lub dane logowania do bazy danych są nieprawidłowe, a docker compose logs bookstack wyświetla informację, która z tych dwóch przyczyn wystąpiła.
Wiki.js: jedno drzewo, wielu redaktorów
Wiki.js jest aplikacją Node.js. Udokumentowana konfiguracja Docker łączy ją z PostgreSQL, choć oprogramowanie obsługuje również MySQL, MariaDB, MSSQL oraz SQLite. Poniżej znajduje się plik compose pochodzący z oficjalnej strony projektu 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:Należy zmienić POSTGRES_PASSWORD oraz DB_PASS przed uruchomieniem, ponieważ stanowią one jedną parę poświadczeń, a przykładowa wartość jest publicznie znana. Znacznik jest celowo przypięty do ghcr.io/requarks/wiki:2. Dokumentacja odradza stosowanie latest, ponieważ przejście na wyższą wersję główną zmienia schemat bazy danych w działającej instancji.
Wersja 2 jest linią przeznaczoną do uruchomienia. Według stanu na lipiec 2026 najnowsze wydanie wersji 2 to 2.5.314, z maja 2026. Wersja 3 istnieje, a jej dokumentacja podaje: "Ta witryna dotyczy niestabilnego wydania beta Wiki.js 3.0. NIE należy instalować jej w środowisku produkcyjnym". Znacznik :3 należy traktować jako wersję poglądową.
Przy pierwszym uruchomieniu Wiki.js przeprowadza użytkownika przez konfigurację w przeglądarce, która tworzy konto administratora. Do momentu zakończenia tego procesu każdy, kto uzyska dostęp do portu, otrzyma dostęp do kreatora. Z tego powodu należy umieścić usługę za odwrotnym serwerem proxy i TLS (transport layer security) przed otwarciem zapory sieciowej. Wiki działające pod własną nazwą hosta naturalnie znajduje się za Traefik przed kilkoma aplikacjami Docker, gdy serwer obsługuje więcej niż tę jedną usługę.
Wybór edytora jest powodem, dla którego użytkownicy wybierają Wiki.js. Jedna instancja może przechowywać strony Markdown, strony edytora wizualnego, surowe strony HTML oraz strony AsciiDoc obok siebie. Jest to pomocne podczas importowania starych treści w formacie, którego użytkownik nie chce konwertować. Jest to również sposób na uzyskanie czterech różnych stylów w jednym wiki, dlatego należy ustalić domyślny edytor pierwszego dnia i zapisać tę decyzję.
Zarys: najlepszy edytor, najcięższe wymagania wstępne
Zarys (Outline) jest tym, co użytkownicy zazwyczaj mają na myśli, poszukując narzędzia do notatek o funkcjonalności rozwiązań komercyjnych. Jest to aplikacja Node.js, a bieżące wydanie z lipca 2026 roku to 1.9.2. Przykładowy plik środowiskowy zawiera listę wymagań: PostgreSQL przez DATABASE_URL, Redis przez REDIS_URL, dwa losowe klucze tajne oraz publicznie dostępny URL.
openssl rand -hex 32
openssl rand -hex 32Należy wykonać to polecenie dwukrotnie i zachować obie wartości. Pierwsza z nich stanie się SECRET_KEY, a druga UTILS_SECRET. Rdzeń pliku środowiskowego wygląda wówczas następująco:
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/dataWartość PGSSLMODE=disable jest poprawna tylko wtedy, gdy baza danych znajduje się na tej samej maszynie lub w tej samej sieci Docker. Należy ją pominąć w przypadku bazy danych dostępnej przez sieć, w przeciwnym razie połączenie będzie przesyłane otwartym tekstem. Załączniki nie wymagają już korzystania z pamięci obiektowej: FILE_STORAGE=local zapisuje przesłane pliki w katalogu nadrzędnym, który musi być wolumenem z uprawnieniami do zapisu dla kontenera oraz elementem uwzględnionym w kopiach zapasowych. Należy skonfigurować FILE_STORAGE=s3 za pomocą wartości AWS_*, jeśli pliki mają być przechowywane w zasobniku zgodnym z S3.
Teraz część, która zaskakuje użytkowników. Outline nie posiada wbudowanego mechanizmu logowania za pomocą nazwy użytkownika i hasła. Przykładowa konfiguracja wskazuje na konieczność użycia danych logowania zewnętrznego dostawcy: „wymagany jest przynajmniej JEDEN z poniższych elementów, aby instalacja działała, w przeciwnym razie nie będzie dostępnych opcji logowania”. Dokumentacja wymienia dostawców takich jak Google, Slack, Microsoft Entra, Discord oraz dowolny ogólny serwer OpenID Connect (OIDC) poprzez OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_AUTH_URI, OIDC_TOKEN_URI i OIDC_USERINFO_URI.
Rzeczywisty koszt utrzymania Outline to Outline plus PostgreSQL plus Redis plus dostawca tożsamości. Jeśli zespół korzysta już z Google Workspace lub Microsoft Entra, ostatni element zajmie dziesięć minut konfiguracji, a Outline stanie się bardzo atrakcyjnym rozwiązaniem. W przeciwnym razie konieczne jest samodzielne utrzymywanie usługi typu Keycloak lub Authentik, co stanowi drugą usługę wymagającą aktualizacji i tworzenia kopii zapasowych. Należy odpowiednio zaplanować zasoby pamięci: wytyczne Outline wskazują na około 512 MB na proces sieciowy, określane przez WEB_CONCURRENCY, poza pamięcią wymaganą przez bazę danych i Redis.
Sposób zarządzania uprawnieniami do odczytu
BookStack oferuje wbudowaną obsługę kont lokalnych z uwierzytelnianiem za pomocą adresu e-mail i hasła, a także wspiera protokoły LDAP, SAML2 oraz OIDC jako alternatywne metody logowania. Uprawnienia definiuje się dla poszczególnych ról, z możliwością ich nadpisania na poziomie pojedynczej półki, książki, rozdziału lub strony. Ze względu na sztywną strukturę hierarchiczną, uprawnienia są dziedziczone w sposób przewidywalny.
Wiki.js również obsługuje konta lokalne i udostępnia szeroką listę strategii uwierzytelniania, które można aktywować w panelu administracyjnym. Reguły dostępu do stron pozwalają na przyznawanie lub blokowanie uprawnień na podstawie wzorca ścieżki. Jest to rozwiązanie zaawansowane, lecz podatne na błędy, ponieważ reguła zdefiniowana dla ops/* automatycznie obejmuje każdą stronę, która zostanie przypisana do tej ścieżki w przyszłości.
Outline całkowicie deleguje kwestię zarządzania tożsamością. Członkostwo jest synchronizowane z dostawcą tożsamości, a wewnątrz Outline kontrola dostępu odbywa się na poziomie kolekcji oraz grup. Dzięki temu w systemie nie pozostają żadne konta lokalne po odejściu pracownika z firmy, co stanowi istotną zaletę w przypadku, gdy dostawca tożsamości jest głównym systemem służącym do zarządzania cyklem życia kont użytkowników.
Jak działa wyszukiwanie w poszczególnych rozwiązaniach
Wyszukiwanie decyduje o tym, czy wiki jest użytecznym narzędziem, czy jedynie zbiorem zapomnianych plików.
BookStack przeszukuje bazę danych i udostępnia użytkownikom język zapytań, którego można nauczyć się w minutę. Ujęcie frazy w cudzysłów, jak w "london meeting", wymusza wyszukanie dokładnego ciągu znaków. Nawiasy kwadratowe służą do wyszukiwania tagów: [location=london] dopasowuje wyniki według nazwy tagu, wartości lub obu tych elementów, przy czym dostępne operatory porównania to !=, >= oraz like. Nawiasy klamrowe pozwalają filtrować metadane, jak w {created_after:2016-12-30}. Każdy dokładny termin, tag lub filtr można zanegować, poprzedzając go znakiem -. BookStack ogranicza liczbę terminów każdego typu w jednym zapytaniu, dlatego zbyt długie zapytania są przycinane zamiast wykonywane.
Wiki.js traktuje wyszukiwanie jako moduł typu pluggable. Udokumentowane silniki obejmują podstawowy silnik bazodanowy, silnik PostgreSQL, Elasticsearch, Algolia, AWS CloudSearch oraz Azure Search. Silnik podstawowy jest wystarczający dla kilkuset stron. W przypadku korzystania z PostgreSQL należy przełączyć się na silnik PostgreSQL w panelu administracyjnym, ponieważ wykorzystuje on natywny indeks pełnotekstowy bazy danych zamiast prostego dopasowywania ciągów. Elasticsearch należy zachować dla wiki na tyle dużych, aby uzasadnione było utrzymywanie i aktualizowanie dodatkowej usługi wyszukiwania.
Outline przeszukuje indeksy pełnotekstowe PostgreSQL. Nie ma możliwości wyboru silnika ani konfiguracji parametrów, a system przeszukuje również treść wewnątrz przesłanych dokumentów. Dla wiki zespołowej liczącej kilka tysięcy dokumentów jest to rozwiązanie wymagające najmniej pracy z całej trójki. Nie ma jednak żadnych opcji optymalizacji, jeśli wydajność przestanie być wystarczająca.
Które rozwiązanie wybrać
Należy wybrać BookStack, jeśli wiki ma działać jeszcze dzisiaj, a priorytetem jest treść, a nie struktura. Rozwiązanie to posiada najmniej elementów: jedną aplikację PHP oraz jedną bazę danych MySQL. Sprawdza się w przypadku wewnętrznych procedur (runbooks) i dokumentacji dla klientów, a także w zespołach, w których większość autorów nie jest inżynierami. Jest to również najłatwiejsze do wykonania kopii zapasowej z omawianej trójki, ponieważ cały stan systemu to jeden zrzut bazy danych oraz katalog z przesłanymi plikami.
Należy wybrać Wiki.js, jeśli wymagany jest konkretny edytor lub specyficzna strategia uwierzytelniania, której nie oferują pozostałe rozwiązania, lub jeśli importowana jest duża liczba istniejących plików Markdown bądź AsciiDoc z zachowaniem struktury ścieżek. Należy zaakceptować fakt, że jest to cięższy stos technologiczny i przypiąć tag głównej wersji oprogramowania.
Należy wybrać Outline, jeśli najważniejsza jest jakość pisania, wiki jest przeznaczone dla zespołu, a nie dla odbiorców zewnętrznych, oraz jeśli w infrastrukturze istnieje już dostawca tożsamości. System ten oferuje edytor, z którego użytkownicy faktycznie chętnie korzystają. Nie należy wybierać go jako pierwszej samodzielnie hostowanej aplikacji.
Jeśli żadne z powyższych rozwiązań nie pasuje, przyczyną jest zazwyczaj rodzaj treści. Zeskanowane faktury i umowy powinny trafiać do systemu zarządzania dokumentami, takiego jak Paperless-ngx, a nie do wiki. Próba wymuszenia ich przechowywania w wiki jest powodem, dla którego wiele takich projektów zostaje porzuconych. Aby uzyskać szerszy przegląd innych rozwiązań wartych uruchomienia na własnym serwerze, należy zapoznać się z listą rekomendowanych rozwiązań self-hosting na rok 2026.
Dobór zasobów i kopie zapasowe
Wszystkie trzy aplikacje mieszczą się na niewielkim serwerze VPS. Realne zapotrzebowanie na zasoby zależy od komponentów wymaganych przez każdą z nich. BookStack to jeden proces aplikacji oraz MySQL. Wiki.js to proces Node oraz PostgreSQL. Outline to proces Node, PostgreSQL oraz Redis, zazwyczaj działające wraz z dostawcą tożsamości, dlatego wymaga większej ilości pamięci RAM.
Kopie zapasowe bazy danych oraz przesłanych plików należy wykonywać łącznie. Przed poleganiem na kopii zapasowej należy przynajmniej raz przeprowadzić proces przywracania danych na instancji testowej. Kopia zapasowa wiki, która nie została przetestowana pod kątem przywracania, jest jedynie przypuszczeniem. W przypadku BookStack oznacza to mysqldump oraz wolumen /config. Dla Wiki.js i Outline oznacza to pg_dump oraz wolumen z danymi, a w przypadku Outline dodatkowo zawartość FILE_STORAGE_LOCAL_ROOT_DIR.
FAQ
Które wiki z własnym hostingiem jest najłatwiejsze w instalacji?
BookStack. Jest to pojedyncza aplikacja PHP z bazą danych MySQL, a projekt udostępnia skrypt instalacyjny dla Ubuntu 24.04, który konfiguruje Apache, MySQL 8.0 oraz PHP 8.3 w jednym przebiegu. Obraz kontenera wymaga jedynie APP_KEY oraz danych uwierzytelniających do bazy danych. Wiki.js wymaga środowiska uruchomieniowego Node oraz serwera PostgreSQL, a Outline dodatkowo wymaga Redis oraz zewnętrznego dostawcy tożsamości.
Czy mogę używać Outline bez Google lub innego dostawcy SSO?
Nie. Outline nie obsługuje logowania za pomocą lokalnej nazwy użytkownika i hasła. Przykładowa konfiguracja wskazuje, że wymagany jest co najmniej jeden zewnętrzny dostawca logowania, w przeciwnym razie użytkownik nie będzie miał żadnych opcji uwierzytelniania. Można użyć Google, Slack, Microsoft Entra, Discord lub dowolnego ogólnego serwera OpenID Connect, takiego jak samodzielnie hostowany Keycloak lub Authentik. Utrzymanie tego dostawcy jest częścią kosztów eksploatacji Outline.
Czy powinienem zainstalować Wiki.js 3 czy Wiki.js 2?
Wersję 2. Według stanu na lipiec 2026 najnowsze wydanie wersji 2 to 2.5.314 z maja 2026, a dokumentacja wersji 3 wyraźnie stwierdza, że jest to niestabilna wersja beta, której nie należy instalować w środowisku produkcyjnym. Należy przypiąć obraz do ghcr.io/requarks/wiki:2 zamiast latest, ponieważ zmiana głównej wersji zmienia schemat bazy danych w działającej instancji.
Które rozwiązanie ma najlepszą wyszukiwarkę?
Każde z nich posiada inne mocne strony. BookStack oferuje czytelnikom język zapytań z dokładnymi frazami, filtrami tagów, takimi jak [location=london], oraz filtrami metadanych, takimi jak {created_after:2016-12-30}; każdy z tych terminów można zanegować za pomocą prefiksu -. Outline nie wymaga konfiguracji i przeszukuje tekst wewnątrz przesłanych plików. Wiki.js jest najbardziej konfigurowalne, ponieważ użytkownik wybiera silnik wyszukiwania, a na silnik PostgreSQL warto przejść, gdy wiki przekroczy kilkaset stron.
Czy mogę później przenieść zawartość z jednego systemu do drugiego?
Częściowo, jednak należy spodziewać się pracy ręcznej. Wszystkie trzy systemy eksportują i importują Markdown, więc tekst stron zazwyczaj zostaje zachowany. Struktura nie przenosi się w sposób czysty: książki i rozdziały w BookStack nie mają odpowiednika w zagnieżdżonych dokumentach Outline, a ścieżki w Wiki.js nie mapują się na sztywną hierarchię BookStack. Załączniki, uprawnienia oraz historia stron to elementy najbardziej narażone na utratę, dlatego przed podjęciem decyzji o migracji należy wyeksportować próbkę danych i sprawdzić ich poprawność.