SSD Nodes Learn 8GB RAM — $66/वर्ष
मार्गदर्शक Matt Connorद्वारे Matt Connor · अपडेटेड 2026-08-01

BookStack, Wiki.js की Outline: self-hosted wiki कोणते?

BookStack, Wiki.js आणि Outline यांची setup, संपादन, login आणि search यांवर तुलना. एकट्या admin साठी व टीमसाठी योग्य पर्याय स्पष्टपणे निवडा.

तुम्ही कोणता self-hosted wiki चालवावा

self-hosted wiki मुळे तुमच्या टीमची कागदपत्रे तुम्ही नियंत्रित करत असलेल्या server वर, शोधता येईल अशा एका ठिकाणी ठेवता येतात. BookStack, Wiki.js आणि Outline हे तिन्ही हे काम करतात. पहिल्या पानाचा लोड पूर्ण होण्यापूर्वी तुम्हाला किती घटक एकत्र जोडावे लागतात आणि कोणाला login करण्याची परवानगी आहे, यामध्ये त्यांच्यात सर्वाधिक फरक आहे.

BookStack उभारण्यासाठी सर्वात सोपा आहे आणि त्याची संरचना सर्वाधिक ठरावीक आहे. Wiki.js एका page tree अंतर्गत editors निवडण्याची सर्वाधिक मुभा देते. या तिघांपैकी Outline मध्ये लेखनाचा अनुभव सर्वोत्तम आहे; तसेच बाह्य identity provider जोडल्याशिवाय ते कोणालाही sign in करू देत नाही.

खालील सर्व माहिती या projects च्या स्वतःच्या documentation आणि त्यांनी प्रकाशित केलेल्या configuration files मधून घेतली आहे. ही capabilities ची तुलना आहे, benchmark नाही. तिन्ही projects मध्ये सतत बदल होत असल्यामुळे version numbers आणि requirements सोबत तारीख दिली आहे.

रचना हाच खरा पर्याय

BookStack तुमच्या सामग्रीची रचना निश्चित करते. एखादे पृष्ठ पुस्तकामध्ये असते, पुस्तकामध्ये प्रकरणे असू शकतात आणि शेल्फमध्ये पुस्तके गटबद्ध केली जातात. तुम्ही पाचवा स्तर तयार करू शकत नाही. हीच या उत्पादनाची उपयुक्तता आहे: नवीन लेखकाला पृष्ठ कुठे ठेवायचे हे माहीत असते, कारण ते ठेवण्यासाठी एकच जागा असते. मात्र, या रचनेत न बसणारी सामग्री त्यात जबरदस्तीने बसवावी लागते.

Wiki.js डिस्कवरील फोल्डरसारखे पथ-वृक्ष वापरते. ops/backup/restic वरील पृष्ठ तुम्ही जिथे ठेवता तिथे असते आणि त्याची खोली तुम्ही ठरवता. दोन व्यक्तींना एकाच विषयाची नोंद दोन वेगवेगळ्या शाखांमध्ये करण्यापासून काहीही रोखत नाही. त्यामुळे Wiki.js instance साठी हा वृक्ष व्यवस्थापित करणारी एक जबाबदार व्यक्ती आवश्यक असते.

Outline दस्तऐवजांच्या आत दस्तऐवज असलेल्या collections वापरते. दस्तऐवज हलवण्यासाठी mouse ने drag करावे लागते. या तीन पर्यायांपैकी हे सर्वात लवचिक आहे. त्यामुळे त्याची रचना विस्कळीत होणेही सर्वात सोपे आहे.

BookStack: सर्वात लहान स्थापना

BookStack हे MySQL द्वारे समर्थित PHP application आहे. July 2026 पर्यंतच्या दस्तऐवजीकृत आवश्यकतांनुसार PHP 8.2 किंवा त्यानंतरची आवृत्ती आणि MySQL 8.0 किंवा MariaDB 10.6 किंवा त्यानंतरची आवृत्ती आवश्यक आहे. Source मधून स्थापना करत असल्यास Composer 2.2 किंवा त्यानंतरची आवृत्तीही आवश्यक आहे. सध्याची release line 26.05 आहे.

प्रकल्प प्रत्येक Ubuntu release साठी एक installation script प्रकाशित करतो. 24.04 script तुमच्यासाठी 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

तो script चालवण्यापूर्वी त्यावरील warning वाचा. दस्तऐवजात नमूद केले आहे की तो "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". Port 80 वर आधीपासून प्रतिसाद देणाऱ्या server वर हा script तो port ताब्यात घेतो आणि Apache configuration पुन्हा लिहितो. अशा server वर containers वापरा. किंवा Ubuntu 24.04 वरील विद्यमान LAMP stack वर BookStack स्वहस्ते स्थापित करा.

Container मार्ग LinuxServer.io image वापरतो. BookStack दस्तऐवजामध्ये हाच पर्याय सुचवला आहे. BookStack ला session encryption key आवश्यक असते. ती नसल्यास ते pages serve करणार नाही. त्यामुळे प्रथम ती generate करा.

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

छापलेली value APP_KEY मध्ये copy करा. त्यानंतर 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-stopped

APP_URL हे readers प्रत्यक्षात type करतात त्या address शी जुळले पाहिजे. त्यात scheme आणि कोणताही port समाविष्ट असावा. ते http://localhost वर सेट करून site HTTPS द्वारे serve करा. अन्यथा generated links आणि redirects चुकीच्या host कडे निर्देश करतील. Readers ना हे स्वतःकडे परत येणाऱ्या login page सारखे दिसेल. Compose files तुमच्यासाठी नवीन असल्यास, यापूर्वी VPS वरील Docker Compose मूलभूत माहिती वाचा.

Application ला सुरू करा आणि ती प्रतिसाद देत आहे का ते तपासा. फक्त container चालू आहे का ते तपासू नका:

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

200 OK याचा अर्थ PHP application सुरू झाली आणि database पर्यंत पोहोचली. 500 याचा अर्थ जवळजवळ नेहमी APP_KEY रिकामी आहे किंवा database credentials जुळत नाहीत. docker compose logs bookstack या दोनपैकी कोणती समस्या आहे ते दाखवते.

Wiki.js: एक वृक्ष, अनेक संपादक

Wiki.js हे Node.js अनुप्रयोग आहे. दस्तऐवजीकृत Docker सेटअपमध्ये ते PostgreSQL सोबत वापरले जाते. मात्र हे सॉफ्टवेअर MySQL, MariaDB, MSSQL आणि SQLite देखील स्वीकारते. प्रकल्पाच्या स्वतःच्या Docker पृष्ठावरील compose फाइल पुढीलप्रमाणे आहे:

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 वापरण्याची शिफारस केलेली नाही, कारण मुख्य आवृत्ती बदलल्यास चालू instance अंतर्गत डेटाबेस schema बदलतो.

चालवण्यासाठी आवृत्ती 2 हीच मालिका आहे. July 2026 पर्यंत आवृत्ती 2 मधील नवीनतम release 2.5.314 आहे. तो May 2026 मध्ये प्रसिद्ध झाला. आवृत्ती 3 उपलब्ध आहे. तिच्या स्वतःच्या दस्तऐवजीकरणात असे म्हटले आहे: "हे पृष्ठ Wiki.js 3.0 च्या अस्थिर beta release साठी आहे. हे production मध्ये install करू नये." :3 टॅगला preview म्हणून समजा.

पहिल्यांदा लोड केल्यावर Wiki.js browser मधील setup प्रक्रियेतून administrator account तयार करून घेते. ही प्रक्रिया पूर्ण होईपर्यंत port पर्यंत पोहोचणाऱ्या कोणालाही तो wizard दिसतो. त्यामुळे firewall उघडण्यापूर्वी service तुमच्या reverse proxy आणि TLS (transport layer security) मागे ठेवा. Server वर या एकापेक्षा अधिक service असल्यास, स्वतंत्र hostname असलेला wiki अनेक Docker apps च्या पुढे Traefik मागे ठेवणे स्वाभाविक ठरते.

लोक Wiki.js निवडतात त्यामागे editor ची निवड हे एक कारण आहे. एकाच instance मध्ये Markdown pages, visual editor pages, raw HTML pages आणि AsciiDoc pages एकत्र ठेवता येतात. रूपांतर करायचे नसलेल्या format मधील जुना content import करताना हे उपयुक्त ठरते. मात्र त्यामुळे एकाच wiki मध्ये चार वेगवेगळ्या house styles तयार होऊ शकतात. म्हणून पहिल्याच दिवशी default editor ठरवा आणि तो निर्णय नोंदवून ठेवा.

Outline: सर्वोत्तम संपादक, सर्वाधिक पूर्वअटी

व्यावसायिक notes tool सारखा अनुभव हवा असे म्हणताना लोकांचा सामान्यतः Outline कडे निर्देश असतो. हा Node.js application आहे आणि July 2026 पर्यंतचे सध्याचे release 1.9.2 आहे. त्याच्या sample environment file मध्ये आवश्यक घटक दिले आहेत: DATABASE_URL द्वारे PostgreSQL, REDIS_URL द्वारे Redis, दोन यादृच्छिक secrets आणि सार्वजनिकरीत्या पोहोचता येणारे URL.

openssl rand -hex 32
openssl rand -hex 32

ही command दोनदा चालवा आणि दोन्ही values जतन करा. पहिली value SECRET_KEY बनेल आणि दुसरी UTILS_SECRET. Environment file चा मुख्य भाग असा दिसतो:

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

Database त्याच machine वर किंवा त्याच Docker network वर असेल तेव्हाच PGSSLMODE=disable योग्य आहे. Network द्वारे पोहोचल्या जाणाऱ्या database साठी ते वगळा; अन्यथा connection unencrypted स्वरूपात जाईल. Attachments मुळे आता object storage वापरणे अनिवार्य नाही: FILE_STORAGE=local uploads वरील directory मध्ये लिहिते. ही directory container ला लिहिता येईल अशा volume वर असली पाहिजे आणि तुमच्या backups मध्ये समाविष्ट असली पाहिजे. या files S3 compatible bucket मध्ये ठेवायच्या असतील, तर त्याऐवजी AWS_* values वापरून FILE_STORAGE=s3 सेट करा.

आता अनेकांना आश्चर्य वाटणारा भाग. Outline मध्ये username आणि password login ची built-in सुविधा नाही. त्याच्या sample configuration नुसार third-party sign-in credentials आवश्यक आहेत: "कार्यरत installation साठी यांपैकी किमान ONE आवश्यक आहे; अन्यथा sign-in चे कोणतेही पर्याय उपलब्ध राहणार नाहीत". Document केलेल्या providers मध्ये Google, Slack, Microsoft Entra, Discord आणि generic OpenID Connect (OIDC) server यांचा समावेश आहे. हे अनुक्रमे OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_AUTH_URI, OIDC_TOKEN_URI आणि OIDC_USERINFO_URI द्वारे जोडता येतात.

म्हणून Outline ची वास्तविक किंमत म्हणजे Outline, PostgreSQL, Redis आणि एक identity provider. तुमची team आधीच Google Workspace किंवा Microsoft Entra वापरून sign in करत असेल, तर शेवटच्या घटकासाठी दहा मिनिटे पुरतात आणि Outline अत्यंत उपयुक्त ठरते. तसे नसल्यास, Keycloak किंवा Authentik सारखी सेवा तुम्हालाच self-host करावी लागेल. त्यामुळे patch आणि backup करावयाची ही दुसरी service ठरते. Memory साठी योग्य तरतूद करा: Outline च्या मार्गदर्शनानुसार प्रत्येक web process साठी अंदाजे 512 MB आवश्यक असतात. हे WEB_CONCURRENCY द्वारे सेट केले जाते. याव्यतिरिक्त database आणि Redis साठीही memory आवश्यक असते.

प्रत्येक प्रणाली कोणाला काय वाचता येईल हे कसे हाताळते

BookStack मध्ये सुरुवातीपासून स्थानिक email आणि password खाती उपलब्ध असतात. पर्याय म्हणून LDAP, SAML2 आणि OIDC ला समर्थन दिले जाते. परवानग्या प्रत्येक role साठी सेट करता येतात. त्या एखाद्या shelf, book, chapter किंवा page वर स्वतंत्रपणे बदलता येतात. hierarchy निश्चित असल्यामुळे परवानग्या तिच्यामध्ये अंदाज करता येईल अशा पद्धतीने पुढे वारशाने लागू होतात.

Wiki.js मध्येही स्थानिक खाती उपलब्ध असतात. तसेच admin क्षेत्रात सक्षम करता येतील अशा अनेक strategies दिल्या आहेत. त्याचे page rules path pattern नुसार प्रवेश मंजूर किंवा नाकारतात. ही सुविधा शक्तिशाली आहे, पण तिचा चुकीचा वापर करणे सोपे आहे. कारण ops/* साठी लिहिलेला rule नंतर त्या path अंतर्गत ठेवलेल्या प्रत्येक page वर शांतपणे लागू होतो.

Outline हा प्रश्न पूर्णपणे तुमच्या identity provider कडे सोपवतो. Membership तुमच्या identity provider नुसार ठरते. Outline मध्ये तुम्ही collection आणि group नुसार प्रवेश नियंत्रित करता. एखादी व्यक्ती कंपनी सोडल्यानंतर कोणतेही स्थानिक account शिल्लक राहत नाही. identity provider मधूनच deprovisioning करत असल्यास हा महत्त्वाचा फायदा आहे.

प्रत्येकामध्ये शोध कसा कार्य करतो

शोध ही अशी सुविधा आहे की ज्यामुळे wiki उपयुक्त ठरते किंवा विसरलेल्या फाइल्सचा संग्रह बनते.

BookStack डेटाबेसमध्ये शोध घेते आणि वाचकांना एका मिनिटात शिकता येईल अशी query language देते. "london meeting" प्रमाणे अवतरणचिन्हांमध्ये वाक्य दिल्यास तो अचूक string आवश्यक असतो. Square brackets मध्ये tags शोधता येतात: [location=london] हे tag name, value किंवा दोन्हीवर जुळते. यामध्ये !=, >= आणि like यांसारख्या comparisons चा समावेश आहे. Curly braces {created_after:2016-12-30} प्रमाणे metadata वर filter लावतात. कोणत्याही exact, tag किंवा filter term च्या आधी - लावून तो term वगळता येतो. एका query मध्ये प्रत्येक प्रकारचे किती terms असू शकतात यावर BookStack मर्यादा घालते. त्यामुळे अतिशय मोठी query चालवण्याऐवजी तिच्यातील अतिरिक्त terms काढून टाकले जातात.

Wiki.js मध्ये search हे pluggable module म्हणून कार्य करते. दस्तऐवजीकरणात basic database engine, PostgreSQL engine, Elasticsearch, Algolia, AWS CloudSearch आणि Azure Search यांचा उल्लेख आहे. काहीशे pages साठी basic engine पुरेसा आहे. तुम्ही PostgreSQL वापरत असल्यास admin area मध्ये PostgreSQL engine निवडा. हा engine simple matching ऐवजी डेटाबेसचा स्वतःचा full text index वापरतो. दुसरी search service चालवणे आणि patch करणे स्वीकार्य असेल, एवढी मोठी wiki असल्यासच Elasticsearch वापरा.

Outline PostgreSQL full text indexes वापरून शोध घेते. कोणतेही engine निवडता येत नाही आणि tuning करण्यासाठी काहीही नाही. अपलोड केलेल्या documents मधील text मध्येही ते शोध घेते. काही हजार documents असलेल्या team wiki साठी या तीन पर्यायांपैकी यामध्ये सर्वात कमी काम करावे लागते. कार्यक्षमता अपुरी ठरल्यास ती सुधारण्यासाठी कोणतेही नियंत्रण उपलब्ध नाही.

तुमच्यासाठी कोणता योग्य आहे

तुम्हाला आज दुपारपर्यंत wiki सुरू करायचा असेल आणि संरचनेपेक्षा आशयावर चर्चा करणे पसंत असेल, तर BookStack निवडा. यामध्ये सर्वात कमी घटक आहेत: एक PHP application आणि एक MySQL database. हे अंतर्गत runbook आणि ग्राहकांसाठीचे documentation यांच्यासाठी योग्य आहे. बहुतेक लेखक engineer नसलेल्या teams साठीही ते योग्य आहे. या तिन्हीपैकी त्याचा backup घेणे सर्वात सोपे आहे, कारण संपूर्ण state एक database dump आणि uploads directory मध्ये असते.

इतर पर्याय देत नसलेला विशिष्ट editor किंवा विशिष्ट authentication strategy आवश्यक असेल, किंवा मोठ्या प्रमाणातील विद्यमान Markdown किंवा AsciiDoc import करून path structure जतन करायची असेल, तर Wiki.js निवडा. तुम्ही अधिक जड stack चालवत आहात हे स्वीकारा आणि major version tag निश्चित करा.

लेखनाची गुणवत्ता सर्वात महत्त्वाची असेल, wiki सार्वजनिक वापरासाठी नसून team साठी असेल आणि तुमच्याकडे आधीपासून identity provider असेल, तर Outline निवडा. या setup च्या बदल्यात लोकांना प्रत्यक्ष वापरायला आवडणारा editor मिळतो. ते तुमचे पहिले self-hosted application म्हणून निवडू नका.

यापैकी एकही पर्याय योग्य नसेल, तर समस्या सहसा content type मध्ये असते. Scanned invoices आणि contracts wiki ऐवजी Paperless-ngx सारख्या document management system मध्ये ठेवावेत. त्यांना wiki मध्ये जबरदस्तीने ठेवणे हेच अनेक wiki सोडून देण्याचे कारण ठरते. तुमच्या स्वतःच्या server वर आणखी कोणत्या गोष्टींना स्थान मिळू शकते याचे व्यापक चित्र पाहण्यासाठी 2026 साठीची self-hosting shortlist पहा.

आकारमान आणि बॅकअप

हे तिन्ही लहान VPS वर चालतात. प्रत्येकासाठी व्यवहार्य किमान आवश्यकता त्यामागे चालणाऱ्या घटकांनुसार वेगळी असते. BookStack मध्ये एक application process आणि MySQL असते. Wiki.js मध्ये Node process आणि PostgreSQL असते. Outline मध्ये Node process, PostgreSQL आणि Redis असतात. त्यासोबत सहसा identity provider देखील असतो. त्यामुळे Outline साठी अतिरिक्त memory द्यावी.

Database आणि uploads यांचा एकत्रित बॅकअप घ्या. त्या बॅकअपवर अवलंबून राहण्यापूर्वी तो एकदा तात्पुरत्या instance मध्ये restore करून तपासा. ज्याचा restore करून पाहिलेला नाही असा wiki बॅकअप म्हणजे केवळ अंदाज असतो. BookStack साठी याचा अर्थ mysqldump आणि /config volume असा होतो. Wiki.js आणि Outline साठी याचा अर्थ pg_dump आणि data volume असा होतो. Outline साठी FILE_STORAGE_LOCAL_ROOT_DIR मध्ये असलेला डेटा देखील समाविष्ट करा.

FAQ

स्वतः होस्ट केलेल्या wiki पैकी कोणते स्थापित करणे सर्वात सोपे आहे?

BookStack. हा MySQL database वापरणारा एकमेव PHP application आहे. Ubuntu 24.04 साठी प्रकल्पाने installation script दिली आहे. ती एका run मध्ये Apache, MySQL 8.0 आणि PHP 8.3 सेट करते. Container image ला फक्त एक APP_KEY आणि database credentials आवश्यक असतात. Wiki.js मध्ये Node runtime आणि PostgreSQL server अतिरिक्त आवश्यक असतात. Outline साठी त्याशिवाय Redis आणि बाह्य identity provider आवश्यक असतो.

Google किंवा अन्य SSO provider शिवाय Outline वापरता येईल का?

नाही. Outline मध्ये स्थानिक username आणि password login नाही. त्याच्या sample configuration नुसार किमान एक third-party sign-in provider आवश्यक आहे. अन्यथा sign-in करण्याचा कोणताही पर्याय उपलब्ध राहत नाही. तुम्ही Google, Slack, Microsoft Entra, Discord किंवा self-hosted Keycloak अथवा Authentik सारखा generic OpenID Connect server वापरू शकता. हा provider चालवण्याचा खर्च Outline चालवण्याच्या एकूण खर्चाचा भाग आहे.

Wiki.js 3 स्थापित करावे की Wiki.js 2?

Version 2. July 2026 पर्यंत version 2 चे नवीनतम release 2.5.314 आहे. ते May 2026 मध्ये release झाले. Version 3 च्या documentation मध्ये स्पष्टपणे सांगितले आहे की ते unstable beta आहे आणि production मध्ये स्थापित करू नये. तुमची image ghcr.io/requarks/wiki:2 वर pin करा, latest वर नाही. Major version बदलल्यास चालू instance अंतर्गत database schema बदलतो.

प्रत्येकाची ताकद वेगवेगळी आहे. BookStack वाचकांना exact phrases, [location=london] सारखे tag filters आणि {created_after:2016-12-30} सारखे metadata filters असलेली query language देते. यापैकी कोणतीही term सुरुवातीला - लावून वगळता येते. Outline साठी configuration आवश्यक नाही. ते uploaded files मधील text शोधते. Wiki.js मध्ये सर्वाधिक tuning करता येते, कारण तुम्ही engine निवडता. तुमची wiki काही hundred pages पेक्षा मोठी होताच PostgreSQL engine वर switch करणे उपयुक्त ठरते.

नंतर माझा content एका system मधून दुसऱ्यामध्ये हलवता येईल का?

अंशतः. Manual work आवश्यक असेल असे गृहीत धरा. तिन्ही systems Markdown export आणि import करतात. त्यामुळे page text सहसा सुरक्षित राहतो. मात्र structure व्यवस्थित जतन होत नाही. BookStack मधील books आणि chapters यांना Outline मधील nested documents मध्ये समतुल्य रचना नाही. Wiki.js paths BookStack च्या fixed hierarchy शी जुळत नाहीत. Attachments, permissions आणि page history गमावले जाण्याची शक्यता सर्वाधिक असते. त्यामुळे migration निश्चित करण्यापूर्वी sample export करा आणि या बाबी तपासा.

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