SSD Nodes Learn Hosting plans →
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-08-13

Pilihan Wiki Self-Hosted: BookStack vs Wiki.js vs Outline

Bandingkan BookStack, Wiki.js dan Outline untuk dokumentasi pasukan. Ketahui perbezaan dari segi model penyuntingan, keperluan pelayan dan sistem log masuk untuk pilihan terbaik.

Wiki yang manakah patut anda jalankan secara self-hosted

Wiki yang dijalankan secara self-hosted meletakkan dokumen pasukan anda di satu lokasi yang boleh dicari pada pelayan yang anda kawal. BookStack, Wiki.js dan Outline semuanya melaksanakan tugas tersebut. Perbezaan utama antara ketiganya ialah jumlah persediaan yang diperlukan sebelum halaman pertama dimuatkan, serta siapa yang dibenarkan untuk log masuk.

BookStack adalah yang paling ringan untuk disediakan dan mempunyai struktur yang paling tetap. Wiki.js memberikan anda pilihan editor yang paling luas dalam satu pepohon halaman. Outline mempunyai pengalaman penulisan yang terbaik antara ketiga-tiganya, dan ia tidak akan membenarkan sesiapa pun log masuk sehingga anda menyambungkannya dengan penyedia identiti luar.

Segala maklumat di bawah dibaca daripada dokumentasi projek itu sendiri dan fail konfigurasi yang diterbitkan. Ini adalah perbandingan keupayaan, bukan penanda aras. Nombor versi dan keperluan disertakan dengan tarikh kerana ketiga-tiga projek ini sentiasa berubah.

Struktur ialah pilihan sebenar

BookStack menetapkan bentuk kandungan anda. Halaman berada di dalam buku, buku boleh mengandungi bab, dan rak mengumpulkan buku. Anda tidak boleh mencipta tahap kelima. Had tersebut adalah produk itu sendiri: penulis baharu tahu di mana letaknya sesuatu halaman kerana hanya ada satu tempat yang mungkin. Kosnya ialah kandungan yang tidak menepati bentuk tersebut akan dipaksa masuk ke dalamnya.

Wiki.js menggunakan pepohon laluan, seperti folder pada cakera. Halaman pada ops/backup/restic terletak di mana sahaja anda meletakkannya, dan anda memilih kedalamannya. Tiada apa yang menghalang dua orang daripada memfailkan subjek yang sama di bawah dua cawangan yang berbeza, jadi instans Wiki.js memerlukan seorang individu yang menguruskan pepohon tersebut.

Outline menggunakan koleksi dengan dokumen yang bersarang di dalam dokumen lain. Memindahkan dokumen dilakukan dengan menyeret menggunakan tetikus. Ia adalah yang paling fleksibel antara ketiga-tiganya, jadi ia juga yang paling mudah untuk menjadi tidak teratur.

BookStack: pemasangan paling minimum

BookStack ialah aplikasi PHP yang disokong oleh MySQL. Setakat Julai 2026, keperluan yang didokumenkan ialah PHP 8.2 atau lebih baharu dan sama ada MySQL 8.0 atau MariaDB 10.6 atau lebih baharu, serta Composer 2.2 atau lebih baharu jika anda memasang daripada sumber. Barisan keluaran semasa ialah 26.05.

Projek ini menerbitkan satu skrip pemasangan bagi setiap keluaran Ubuntu. Skrip 24.04 memasang Apache, MySQL 8.0 dan PHP 8.3 untuk anda.

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

Baca amaran pada skrip tersebut sebelum anda menjalankannya. Dokumentasi menyatakan ia "HANYA UNTUK OS BAHARU, ia akan memasang Apache, MySQL 8.0 & PHP 8.3 dan boleh MENIMPA mana-mana tetapan web sedia ada pada mesin". Pada pelayan yang sudah menjawab pada port 80, skrip tersebut akan mengambil port itu dan menulis semula konfigurasi Apache. Gunakan kontena di sana, atau pasang BookStack secara manual di atas LAMP stack sedia ada pada Ubuntu 24.04.

Laluan kontena menggunakan imej LinuxServer.io, yang merupakan pilihan yang disyorkan oleh dokumentasi BookStack. BookStack memerlukan kunci penyulitan sesi dan tidak akan menghidangkan halaman tanpanya, jadi jana kunci tersebut terlebih dahulu.

docker run -it --rm --entrypoint /bin/bash lscr.io/linuxserver/bookstack:latest appkey

Salin nilai yang dicetak ke dalam APP_KEY, kemudian tulis servis tersebut:

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 mestilah sepadan dengan alamat yang ditaip oleh pembaca, termasuk skema dan sebarang port. Tetapkannya kepada http://localhost dan kemudian hidangkan tapak melalui HTTPS, jika tidak, pautan dan ubah hala yang dijana akan menghala ke hos yang salah, yang dilihat oleh pembaca sebagai halaman log masuk yang berpatah balik kepada dirinya sendiri. Jika fail compose adalah perkara baharu bagi anda, mulakan dengan asas Docker Compose pada VPS sebelum yang ini.

Naikkan servis tersebut dan pastikan aplikasi menjawab, bukan sekadar kontena yang sedang berjalan:

docker compose up -d
docker compose ps
curl -sI http://127.0.0.1:6875/login

200 OK bermaksud aplikasi PHP telah but dan mencapai pangkalan data. 500 hampir selalu bermaksud APP_KEY kosong atau kelayakan pangkalan data tidak sepadan, dan docker compose logs bookstack mencetak yang mana satu antara kedua-duanya.

Wiki.js: satu pokok, beberapa penyunting

Wiki.js ialah aplikasi Node.js. Persediaan Docker yang didokumentasikan menggandingkannya dengan PostgreSQL, walaupun perisian ini juga menerima MySQL, MariaDB, MSSQL dan SQLite. Ini ialah fail compose daripada halaman Docker projek itu sendiri:

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:

Tukar POSTGRES_PASSWORD dan DB_PASS serentak sebelum anda menjalankannya, kerana ia merupakan satu kelayakan dan nilai contoh tersebut adalah awam. Tag tersebut dipinkan pada ghcr.io/requarks/wiki:2 dengan sengaja. Dokumentasi mengesyorkan agar tidak menggunakan latest, memandangkan lonjakan versi utama akan mengubah skema pangkalan data di bawah tika yang sedang berjalan.

Versi 2 ialah baris untuk dijalankan. Setakat Julai 2026, keluaran versi 2 terbaharu ialah 2.5.314, daripada Mei 2026. Versi 3 wujud, dan dokumentasinya sendiri menyatakan: "Laman ini adalah untuk keluaran beta tidak stabil Wiki.js 3.0. Anda TIDAK sepatutnya memasang ini dalam persekitaran pengeluaran." Anggap tag :3 sebagai pratonton.

Pada muatan pertama, Wiki.js akan memandu anda melalui persediaan dalam pelayar yang mencipta akaun pentadbir. Sehingga anda menyelesaikannya, sesiapa sahaja yang mencapai port tersebut akan mendapat wizard itu, jadi letakkan servis di belakang reverse proxy dan TLS (transport layer security) anda sebelum anda membuka firewall. Wiki pada hostname sendiri terletak secara semula jadi di belakang Traefik di hadapan beberapa aplikasi Docker apabila pelayan mengehos lebih daripada satu servis ini.

Pilihan penyunting adalah sebab orang memilih Wiki.js. Satu tika boleh memuatkan halaman Markdown, halaman penyunting visual, halaman HTML mentah dan halaman AsciiDoc secara bersebelahan. Ini membantu apabila anda mengimport kandungan lama dalam format yang anda tidak mahu tukarkan. Ia juga merupakan cara untuk berakhir dengan empat gaya rumah dalam satu wiki, jadi tentukan penyunting lalai pada hari pertama dan catatkan keputusan tersebut.

Garis panduan: editor terbaik, prasyarat paling berat

Garis panduan (Outline) adalah apa yang biasanya dimaksudkan oleh pengguna apabila mereka mahukan sesuatu yang terasa seperti alat nota komersial. Ia merupakan aplikasi Node.js, dan keluaran semasa setakat Julai 2026 ialah 1.9.2. Fail persekitaran contohnya menyenaraikan keperluan yang diperlukan: PostgreSQL melalui DATABASE_URL, Redis melalui REDIS_URL, dua rahsia rawak, dan URL yang boleh dicapai secara awam.

openssl rand -hex 32
openssl rand -hex 32

Jalankan arahan tersebut dua kali dan simpan kedua-dua nilai. Nilai pertama menjadi SECRET_KEY, manakala yang kedua menjadi UTILS_SECRET. Teras fail persekitaran kemudiannya kelihatan seperti ini:

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 hanya tepat apabila pangkalan data berada pada mesin yang sama atau rangkaian Docker yang sama. Jangan sertakan parameter ini untuk pangkalan data yang dicapai merentasi rangkaian, atau sambungan tersebut akan dihantar dalam bentuk teks jelas (clear text). Lampiran tidak lagi memaksa anda menggunakan storan objek: FILE_STORAGE=local menulis muat naik ke direktori di atas, yang mestilah merupakan volum yang boleh ditulis oleh kontena dan disertakan dalam sandaran anda. Tetapkan FILE_STORAGE=s3 dengan nilai AWS_* sebaliknya jika anda mahukan fail tersebut berada dalam bucket yang serasi dengan S3.

Sekarang bahagian yang mengejutkan ramai orang. Outline tidak mempunyai log masuk nama pengguna dan kata laluan terbina dalam. Konfigurasi contohnya menyatakan bahawa kelayakan log masuk pihak ketiga diperlukan: "sekurang-kurangnya SATU DARIPADA ini diperlukan untuk pemasangan yang berfungsi atau anda tidak akan mempunyai pilihan log masuk". Pembekal yang didokumenkan termasuk Google, Slack, Microsoft Entra, Discord, dan mana-mana pelayan OpenID Connect (OIDC) generik melalui OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_AUTH_URI, OIDC_TOKEN_URI dan OIDC_USERINFO_URI.

Jadi, kos sebenar Outline ialah Outline ditambah PostgreSQL ditambah Redis ditambah pembekal identiti. Jika pasukan anda sudah log masuk menggunakan Google Workspace atau Microsoft Entra, bahagian terakhir itu hanya mengambil masa sepuluh minit dan Outline menjadi sangat menarik. Jika tidak, anda juga perlu menguruskan sendiri perisian seperti Keycloak atau Authentik, yang merupakan servis kedua untuk ditampal (patch) dan disandarkan. Peruntukkan memori dengan sewajarnya: panduan Outline sendiri mengesyorkan kira-kira 512 MB bagi setiap proses web, yang ditetapkan oleh WEB_CONCURRENCY, di samping keperluan untuk pangkalan data dan Redis.

Cara setiap satu mengurus siapa yang boleh membaca apa

BookStack mempunyai akaun e-mel dan kata laluan tempatan secara lalai, serta menyokong LDAP, SAML2 dan OIDC sebagai alternatif. Kebenaran ditetapkan mengikut peranan dan boleh diatasi (override) pada peringkat rak, buku, bab atau halaman tunggal. Oleh kerana hierarkinya tetap, kebenaran diwarisi ke bawah mengikut cara yang boleh diramal.

Wiki.js juga menyediakan akaun tempatan dan menambah senarai panjang strategi yang boleh anda aktifkan di kawasan pentadbir. Peraturan halamannya memberi atau menafikan akses mengikut corak laluan (path pattern). Ini sangat berkuasa namun mudah tersilap, kerana peraturan yang ditulis untuk ops/* akan meliputi setiap halaman yang anda failkan di bawah laluan tersebut secara automatik pada masa hadapan.

Outline menyerahkan persoalan ini sepenuhnya kepada pihak luar. Keahlian mengikut pembekal identiti anda, dan di dalam Outline anda mengawal akses mengikut koleksi dan kumpulan. Tiada akaun tempatan yang tertinggal apabila seseorang meninggalkan syarikat, yang merupakan kelebihan sebenar apabila pembekal identiti sudah menjadi sistem yang anda gunakan untuk menyahperuntukkan (deprovision) akses.

Cara carian berfungsi dalam setiap sistem

Fungsi carian ialah penentu sama ada sesebuah wiki menjadi rujukan berguna atau sekadar himpunan fail yang dilupakan.

BookStack melakukan carian pada pangkalan data dan menyediakan bahasa pertanyaan yang boleh dipelajari oleh pembaca dalam masa seminit. Meletakkan frasa dalam tanda petikan, seperti "london meeting", memerlukan rentetan yang tepat. Kurungan segi empat mencari tag: [location=london] memadankan mengikut nama tag, nilai, atau kedua-duanya, dengan perbandingan termasuk !=, >= dan like. Kurungan kerinting menapis metadata, seperti dalam {created_after:2016-12-30}. Sebarang istilah tepat, tag, atau penapis boleh dinafikan dengan meletakkan awalan -. BookStack mengehadkan bilangan istilah bagi setiap jenis dalam satu pertanyaan, jadi pertanyaan yang terlalu panjang akan dipotong dan bukannya dijalankan.

Wiki.js mengendalikan carian sebagai modul yang boleh dipasang (pluggable). Enjin yang didokumentasikan ialah enjin pangkalan data asas, enjin PostgreSQL, Elasticsearch, Algolia, AWS CloudSearch dan Azure Search. Enjin asas sudah memadai untuk beberapa ratus halaman. Jika anda menjalankan PostgreSQL, tukar kepada enjin PostgreSQL di kawasan pentadbir, kerana ia menggunakan indeks teks penuh pangkalan data itu sendiri dan bukannya padanan ringkas. Simpan Elasticsearch untuk wiki yang cukup besar sehingga anda sanggup menjalankan dan menampal (patch) perkhidmatan carian kedua.

Outline mencari indeks teks penuh PostgreSQL. Tiada enjin untuk dipilih dan tiada tetapan untuk dilaraskan, malah ia juga mencari teks di dalam dokumen yang dimuat naik. Bagi wiki pasukan yang mempunyai beberapa ribu dokumen, ini adalah pilihan yang paling kurang memerlukan penyelenggaraan antara ketiga-tiganya. Walau bagaimanapun, tiada kawalan yang boleh diubah jika kelajuannya tidak lagi mencukupi.

Pilihan yang sesuai untuk anda

Pilih BookStack jika anda mahu wiki beroperasi pada petang ini dan anda lebih gemar berdebat tentang kandungan berbanding struktur. Ia mempunyai komponen paling sedikit: satu aplikasi PHP dan satu pangkalan data MySQL. Ia sesuai untuk runbook dalaman dan dokumentasi pelanggan, serta sesuai untuk pasukan yang kebanyakan penulisnya bukan jurutera. Ia juga paling mudah untuk disandarkan antara ketiga-tiganya, kerana keseluruhan keadaan sistem terdiri daripada satu dump pangkalan data dan direktori muat naik.

Pilih Wiki.js jika anda memerlukan editor khusus atau strategi pengesahan tertentu yang tidak ditawarkan oleh yang lain, atau jika anda mengimport sejumlah besar fail Markdown atau AsciiDoc sedia ada dan mahu struktur laluan dikekalkan. Terima hakikat bahawa anda menjalankan stack yang lebih berat, dan tetapkan tag versi utama.

Pilih Outline jika kualiti penulisan adalah keutamaan, wiki tersebut adalah untuk pasukan dan bukan untuk orang awam, serta anda sudah mempunyai penyedia identiti. Ia memberikan ganjaran kepada persediaan tersebut dengan editor yang sememangnya digemari pengguna. Jangan pilih ia sebagai aplikasi self-hosted pertama anda.

Jika tiada satu pun daripada ketiga-tiga pilihan ini sesuai, ketidakpadanan biasanya berpunca daripada jenis kandungan. Invois dan kontrak yang diimbas lebih sesuai diletakkan dalam sistem pengurusan dokumen seperti Paperless-ngx berbanding di dalam wiki, dan memaksa kandungan tersebut ke dalam wiki adalah punca mengapa banyak wiki akhirnya terbiar. Satu lagi ketidakpadanan biasa ialah keinginan untuk mendapatkan ruang kerja (workspace) dan bukannya wiki, yang merangkumi dokumen, jadual dan papan putih pada satu kanvas; di sinilah ruang kerja AFFiNE yang dihoskan sendiri lebih sesuai berbanding ketiga-tiga pilihan di atas. Untuk pandangan lebih luas mengenai apa lagi yang layak diletakkan pada pelayan anda sendiri, lihat senarai pendek self-hosting untuk tahun 2026.

Saiz dan sandaran

Ketiga-tiga aplikasi ini boleh dimuatkan pada VPS bersaiz kecil, namun keperluan sebenar berbeza bergantung pada komponen di sebalik setiap aplikasi. BookStack terdiri daripada satu proses aplikasi dan MySQL. Wiki.js terdiri daripada proses Node dan PostgreSQL. Outline pula terdiri daripada proses Node, PostgreSQL dan Redis, biasanya dengan penyedia identiti (identity provider) yang disertakan bersama, itulah sebabnya ia memerlukan memori tambahan.

Sandarkan pangkalan data dan fail muat naik secara serentak, kemudian lakukan pemulihan ke dalam instans sementara sekurang-kurangnya sekali sebelum anda bergantung pada sandaran tersebut. Sandaran wiki yang tidak pernah dipulihkan hanyalah satu andaian. Bagi BookStack, ini bermaksud mysqldump serta volum /config. Bagi Wiki.js dan Outline, ini bermaksud pg_dump serta volum data, dan bagi Outline, ia juga merangkumi apa sahaja yang terkandung dalam FILE_STORAGE_LOCAL_ROOT_DIR.

FAQ

Wiki yang manakah paling mudah dipasang untuk self-hosting?

BookStack. Ia merupakan aplikasi PHP tunggal dengan pangkalan data MySQL, dan projek tersebut menyediakan skrip pemasangan untuk Ubuntu 24.04 yang menetapkan Apache, MySQL 8.0 dan PHP 8.3 dalam satu proses. Imej kontena hanya memerlukan APP_KEY dan kelayakan pangkalan data. Wiki.js memerlukan runtime Node dan pelayan PostgreSQL, manakala Outline memerlukan Redis serta penyedia identiti luaran tambahan.

Bolehkah saya menggunakan Outline tanpa Google atau penyedia SSO lain?

Tidak. Outline tidak mempunyai fungsi log masuk nama pengguna dan kata laluan tempatan. Konfigurasi contohnya menyatakan bahawa sekurang-kurangnya satu penyedia log masuk pihak ketiga diperlukan, jika tidak, anda tidak akan mempunyai sebarang pilihan untuk log masuk. Anda boleh menggunakan Google, Slack, Microsoft Entra, Discord, atau mana-mana pelayan OpenID Connect generik seperti Keycloak atau Authentik yang dihoskan sendiri. Menjalankan penyedia tersebut adalah sebahagian daripada kos operasi Outline.

Patutkah saya memasang Wiki.js 3 atau Wiki.js 2?

Versi 2. Setakat Julai 2026, keluaran versi 2 yang terkini ialah 2.5.314, daripada Mei 2026, dan dokumentasi versi 3 menyatakan dengan jelas bahawa ia adalah beta tidak stabil yang tidak sepatutnya dipasang dalam persekitaran pengeluaran. Tetapkan imej anda kepada ghcr.io/requarks/wiki:2 dan bukannya latest, kerana perubahan versi utama akan mengubah skema pangkalan data pada instans yang sedang berjalan.

Yang manakah mempunyai carian terbaik?

Setiap satunya mempunyai kelebihan tersendiri. BookStack memberikan pembaca bahasa pertanyaan dengan frasa tepat, penapis tag seperti [location=london] dan penapis metadata seperti {created_after:2016-12-30}, dan mana-mana istilah tersebut boleh dinafikan dengan meletakkan - di hadapan. Outline tidak memerlukan konfigurasi dan mencari teks di dalam fail yang dimuat naik. Wiki.js adalah yang paling boleh dilaras, kerana anda boleh memilih enjin carian, dan enjin PostgreSQL sangat berbaloi untuk digunakan sebaik sahaja wiki anda melebihi beberapa ratus halaman.

Bolehkah saya memindahkan kandungan saya daripada satu platform ke platform lain kemudian hari?

Sebahagiannya boleh, namun anda perlu menjangkakan kerja manual. Ketiga-tiganya menyokong eksport dan import Markdown, jadi teks halaman biasanya akan kekal. Struktur tidak akan dipindahkan dengan sempurna: buku dan bab dalam BookStack tidak mempunyai padanan dalam dokumen bersarang Outline, dan laluan Wiki.js tidak dipetakan kepada hierarki tetap BookStack. Lampiran, kebenaran dan sejarah halaman adalah bahagian yang paling berkemungkinan hilang, jadi eksport sampel dan periksa bahagian tersebut sebelum anda membuat keputusan untuk melakukan migrasi.

#bookstack#wikijs#outline#wiki#self-hosting#knowledge-base