BookStack, Wiki.js o Outline: quale wiki self-hosted?
Confronto tra BookStack, Wiki.js e Outline su installazione, editor, accesso e ricerca, con una scelta chiara per amministratori singoli e team.
Quale wiki self-hosted eseguire
Un wiki self-hosted raccoglie i documenti del team in un unico punto ricercabile, su un server sotto il tuo controllo. BookStack, Wiki.js e Outline svolgono tutti questo compito. Le differenze principali riguardano la quantità di componenti da predisporre prima che venga caricata la prima pagina e le modalità di accesso degli utenti.
BookStack è il più semplice da installare e impone maggiormente una struttura organizzativa. Wiki.js offre la scelta più ampia di editor all'interno di un unico albero di pagine. Outline offre la migliore esperienza di scrittura tra i tre e non consente a nessuno di accedere finché non viene collegato un identity provider esterno.
Tutto ciò che segue è ricavato dalla documentazione dei progetti e dai relativi file di configurazione pubblicati. Si tratta di un confronto delle funzionalità, non di un benchmark. I numeri di versione e i requisiti riportano una data, perché tutti e tre i progetti sono soggetti a evoluzione.
La struttura è una scelta vincolante
BookStack definisce la struttura dei contenuti. Una pagina si trova all'interno di un libro, un libro può contenere capitoli e gli scaffali raggruppano i libri. Non è possibile creare un quinto livello. Questo limite è parte del prodotto: un nuovo autore sa dove collocare una pagina perché esiste un solo punto in cui inserirla. Il compromesso è che i contenuti che non rientrano nella struttura devono essere adattati.
Wiki.js usa un albero di percorsi, simile alle cartelle su un disco. Una pagina in ops/backup/restic si trova nel punto in cui la si colloca e si sceglie la profondità. Nulla impedisce a due persone di archiviare lo stesso argomento in due rami diversi. Per questo un'istanza Wiki.js deve avere una persona responsabile dell'albero.
Outline usa raccolte con documenti annidati all'interno di altri documenti. Per spostare un documento è sufficiente trascinarlo con il mouse. È la soluzione più flessibile delle tre, quindi è anche quella che tende più facilmente a perdere coerenza.
BookStack: installazione minima
BookStack è un'applicazione PHP che usa MySQL. A luglio 2026 i requisiti documentati sono PHP 8.2 o versione successiva e MySQL 8.0 oppure MariaDB 10.6 o versione successiva. Se l'installazione viene eseguita dal codice sorgente, serve anche Composer 2.2 o versione successiva. La linea di release corrente è 26.05.
Il progetto pubblica uno script di installazione per ogni release di Ubuntu. Lo script per 24.04 installa Apache, MySQL 8.0 e 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.shLeggere l'avviso dello script prima di eseguirlo. La documentazione specifica che è "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". Su un server che risponde già sulla porta 80, lo script occupa quella porta e riscrive la configurazione di Apache. In questo caso usare invece i container oppure installare BookStack manualmente sopra uno stack LAMP esistente su Ubuntu 24.04.
La soluzione basata sui container usa l'immagine LinuxServer.io, indicata dalla documentazione di BookStack. BookStack richiede una chiave di cifratura della sessione e non pubblica le pagine senza questa chiave. Generarla prima.
docker run -it --rm --entrypoint /bin/bash lscr.io/linuxserver/bookstack:latest appkeyCopiare il valore visualizzato in APP_KEY, quindi scrivere il servizio:
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 deve corrispondere all'indirizzo che gli utenti digitano effettivamente, incluso lo schema e qualsiasi porta. Impostarlo su http://localhost e pubblicare quindi il sito su HTTPS. In caso contrario, i link generati e i redirect punteranno all'host errato e agli utenti verrà mostrata una pagina di accesso che ritorna continuamente a se stessa. Se i file Compose sono una novità, iniziare da le basi di Docker Compose su un VPS prima di procedere con questa guida.
Avviare il servizio e verificare che l'applicazione risponda, non soltanto che il container sia in esecuzione:
docker compose up -d
docker compose ps
curl -sI http://127.0.0.1:6875/loginUn 200 OK indica che l'applicazione PHP è stata avviata e ha raggiunto il database. Un 500 indica quasi sempre che APP_KEY è vuota oppure che le credenziali del database non corrispondono. docker compose logs bookstack indica quale delle due condizioni si verifica.
Wiki.js: un solo albero, più editor
Wiki.js è un'applicazione Node.js. La configurazione Docker documentata lo abbina a PostgreSQL, ma il software supporta anche MySQL, MariaDB, MSSQL e SQLite. Questo è il file compose della pagina Docker ufficiale del progetto:
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:Modificare insieme POSTGRES_PASSWORD e DB_PASS prima di eseguire il file, perché costituiscono un'unica credenziale e il valore di esempio è pubblico. Il tag è fissato a ghcr.io/requarks/wiki:2 intenzionalmente. La documentazione sconsiglia latest, perché il salto a una versione principale diversa modifica lo schema del database mentre l'istanza è in esecuzione.
La linea da usare è la versione 2. A luglio 2026, l'ultima release della versione 2 è la 2.5.314, pubblicata a maggio 2026. Esiste anche la versione 3 e la relativa documentazione specifica: "Questo sito è dedicato alla release beta instabile di Wiki.js 3.0. NON installarla in produzione." Considerare il tag :3 una versione di anteprima.
Al primo accesso, Wiki.js guida l'utente attraverso una procedura di configurazione nel browser che crea l'account amministratore. Fino al completamento della procedura, chiunque raggiunga la porta visualizza la procedura guidata. Perciò configurare il servizio dietro un reverse proxy e TLS (transport layer security) prima di aprire la porta nel firewall. Un wiki con un proprio hostname si integra naturalmente con Traefik davanti a più applicazioni Docker quando il server ospita più di questo servizio.
La scelta dell'editor è il motivo per cui molti scelgono Wiki.js. Una singola istanza può contenere affiancate pagine Markdown, pagine dell'editor visuale, pagine HTML grezzo e pagine AsciiDoc. Questo è utile quando si importa contenuto precedente in un formato che si preferisce non convertire. Tuttavia, si rischia di ritrovarsi con quattro stili editoriali diversi nello stesso wiki. Perciò decidere l'editor predefinito il primo giorno e annotare questa decisione.
Struttura: l'editor migliore richiede più prerequisiti
Outline è ciò che di solito si intende quando si cerca uno strumento per le note con un'esperienza simile a quella di un prodotto commerciale. È un'applicazione Node.js e, a luglio 2026, la release corrente è la 1.9.2. Il file di ambiente di esempio elenca i requisiti: PostgreSQL tramite DATABASE_URL, Redis tramite REDIS_URL, due secret casuali e un URL raggiungibile pubblicamente.
openssl rand -hex 32
openssl rand -hex 32Eseguire il comando due volte e conservare entrambi i valori. Il primo diventa SECRET_KEY, il secondo UTILS_SECRET. La parte principale del file di ambiente è quindi simile a questa:
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 è corretto solo quando il database si trova sulla stessa macchina o sulla stessa rete Docker. Ometterlo per un database raggiunto attraverso la rete; in caso contrario, la connessione non è cifrata. Gli allegati non obbligano più a usare l'object storage: FILE_STORAGE=local salva i caricamenti nella directory precedente, che deve corrispondere a un volume su cui il container possa scrivere e che sia incluso nei backup. Impostare FILE_STORAGE=s3 usando i valori AWS_* se si desidera archiviare questi file in un bucket compatibile con S3.
Ora viene la parte che sorprende molti utenti. Outline non dispone di un'autenticazione integrata con nome utente e password. La configurazione di esempio fornita dal progetto specifica che sono necessarie le credenziali per l'accesso tramite provider esterni: "at least ONE OF these is required for a working installation or you'll have no sign-in options". I provider documentati includono Google, Slack, Microsoft Entra, Discord e qualsiasi server OpenID Connect (OIDC) generico tramite OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_AUTH_URI, OIDC_TOKEN_URI e OIDC_USERINFO_URI.
Il costo reale di Outline consiste quindi in Outline, PostgreSQL, Redis e un identity provider. Se il team usa già Google Workspace o Microsoft Entra per l'accesso, quest'ultimo componente richiede circa dieci minuti di configurazione e Outline diventa una scelta molto interessante. In caso contrario, è necessario gestire anche un servizio come Keycloak o Authentik, che dovrà essere aggiornato e incluso nei backup. Pianificare la memoria di conseguenza: le indicazioni del progetto Outline prevedono circa 512 MB per ogni processo web, impostati tramite WEB_CONCURRENCY, oltre alla memoria richiesta da database e Redis.
Come gestiscono l'accesso ai contenuti
BookStack offre già account locali con indirizzo email e password e supporta LDAP, SAML2 e OIDC come alternative. Le autorizzazioni vengono impostate per ruolo e possono essere sovrascritte per una singola shelf, un singolo book, chapter o page. Poiché la gerarchia è fissa, le autorizzazioni vengono ereditate lungo la struttura in modo prevedibile.
Wiki.js offre anch'esso account locali e aggiunge un lungo elenco di strategie che si possono abilitare nell'area di amministrazione. Le regole delle pagine concedono o negano l'accesso in base a pattern del percorso. Questa funzione è potente, ma è facile configurarla in modo errato, perché una regola scritta per ops/* si applica silenziosamente a tutte le pagine che in seguito vengono archiviate in quel percorso.
Outline delega completamente questa gestione. L'appartenenza segue il provider di identità e, all'interno di Outline, l'accesso viene controllato per collection e per group. Quando una persona lascia l'azienda, non rimane alcun account locale, un vantaggio concreto se il provider di identità è già il sistema usato per disabilitare gli account.
Come funziona la ricerca in ciascun prodotto
La ricerca determina se un wiki diventa davvero utile o si riduce a una raccolta di file dimenticati.
BookStack cerca nel database e offre agli utenti un linguaggio di query che possono imparare in un minuto. Racchiudere una frase tra virgolette, come in "london meeting", richiede la presenza esatta di quella stringa. Le parentesi quadre eseguono la ricerca nei tag: [location=london] individua il nome del tag, il valore o entrambi, con confronti come !=, >= e like. Le parentesi graffe filtrano i metadati, come in {created_after:2016-12-30}. Qualsiasi termine esatto, relativo a un tag o a un filtro può essere escluso anteponendo -. BookStack limita il numero di termini di ogni tipo che una query può contenere, quindi una query molto lunga viene troncata invece di essere eseguita.
Wiki.js tratta la ricerca come un modulo collegabile. I motori documentati sono un motore di base per database, un motore PostgreSQL, Elasticsearch, Algolia, AWS CloudSearch e Azure Search. Il motore di base è sufficiente per alcune centinaia di pagine. Se usi PostgreSQL, passa al motore PostgreSQL nell'area di amministrazione, perché usa l'indice full text del database invece del semplice confronto testuale. Riserva Elasticsearch a un wiki abbastanza grande da giustificare la gestione e l'aggiornamento di un secondo servizio di ricerca.
Outline usa gli indici full text di PostgreSQL. Non è possibile scegliere un motore né modificare impostazioni, e la ricerca include anche il testo dei documenti caricati. Per un wiki di team con poche migliaia di documenti, è la soluzione che richiede meno lavoro tra le tre. Se la ricerca dovesse diventare troppo lenta, però, non sono disponibili impostazioni per intervenire.
Quale soluzione fa per te
Scegli BookStack se vuoi avere il wiki operativo già questo pomeriggio e preferisci discutere dei contenuti anziché della struttura. Ha il minor numero di componenti: un'applicazione PHP e un database MySQL. È adatto ai runbook interni e alla documentazione per i clienti, oltre che ai team in cui la maggior parte degli autori non è composta da tecnici. È anche il più semplice dei tre da sottoporre a backup, perché l'intero stato consiste in un dump del database e nella directory degli upload.
Scegli Wiki.js se ti serve un editor specifico o una strategia di autenticazione specifica che le altre soluzioni non offrono, oppure se stai importando una grande quantità di Markdown o AsciiDoc esistente e vuoi conservare la struttura dei percorsi. Devi accettare di eseguire uno stack più pesante e fissare il tag della versione principale.
Scegli Outline se la qualità della scrittura è l'aspetto più importante, il wiki è destinato a un team e non al pubblico, e disponi già di un identity provider. Questa configurazione offre in cambio un editor che le persone apprezzano davvero. Non sceglierlo come prima applicazione self-hosted.
Se nessuna delle tre soluzioni è adatta, di solito il problema riguarda il tipo di contenuti. Fatture e contratti acquisiti tramite scansione appartengono a un sistema di gestione documentale come Paperless-ngx, non a un wiki, e inserirli a forza in un wiki è il motivo per cui molti wiki vengono infine abbandonati. L'altro caso frequente è avere bisogno di un workspace anziché di un wiki, con documenti, tabelle e una lavagna su un'unica area di lavoro. In questo caso un workspace AFFiNE self-hosted è più adatto di una qualsiasi delle tre soluzioni precedenti. Per una panoramica più ampia di ciò che può trovare posto sul tuo server, consulta la selezione di soluzioni self-hosted per il 2026.
Dimensionamento e backup
Tutte e tre le soluzioni possono essere eseguite su un VPS di piccole dimensioni. Il limite minimo realistico varia in base ai componenti usati da ciascuna. BookStack richiede un processo applicativo e MySQL. Wiki.js richiede un processo Node e PostgreSQL. Outline richiede un processo Node, PostgreSQL e Redis, in genere anche con un provider di identità. Per questo è la soluzione a cui assegnare più memoria.
Eseguire il backup del database e dei file caricati insieme. Prima di affidarsi a questo backup, ripristinare entrambi almeno una volta in un'istanza temporanea. Un backup di una wiki che non è mai stato ripristinato è solo un'ipotesi. Per BookStack questo significa mysqldump e il volume /config. Per Wiki.js e Outline significa pg_dump e il volume dei dati. Per Outline significa inoltre tutto ciò che si trova in FILE_STORAGE_LOCAL_ROOT_DIR.
FAQ
Quale wiki self-hosted è più semplice da installare?
BookStack. È una singola applicazione PHP con un database MySQL. Il progetto fornisce uno script di installazione per Ubuntu 24.04 che configura Apache, MySQL 8.0 e PHP 8.3 in un'unica esecuzione. L'immagine del container richiede soltanto un APP_KEY e le credenziali del database. Wiki.js aggiunge un runtime Node e un server PostgreSQL. Outline aggiunge anche Redis e un provider di identità esterno.
Posso usare Outline senza Google o un altro provider SSO?
No. Outline non supporta l'accesso locale con nome utente e password. La configurazione di esempio specifica che è richiesto almeno un provider di accesso di terze parti. In caso contrario, non sarà disponibile alcuna modalità di accesso. Puoi usare Google, Slack, Microsoft Entra, Discord oppure un server OpenID Connect generico, come Keycloak o Authentik self-hosted. La gestione di questo provider fa parte dei costi operativi di Outline.
Devo installare Wiki.js 3 o Wiki.js 2?
La versione 2. A luglio 2026, la versione 2 più recente è la 2.5.314, pubblicata a maggio 2026. La documentazione della versione 3 specifica chiaramente che si tratta di una beta instabile e che non deve essere installata in produzione. Blocca l'immagine su ghcr.io/requarks/wiki:2 invece di usare latest, perché il cambio di versione principale modifica lo schema del database mentre l'istanza è in esecuzione.
Quale offre la ricerca migliore?
Sono efficaci in modi diversi. BookStack offre ai lettori un linguaggio di query con frasi esatte, filtri per tag come [location=london] e filtri per metadati come {created_after:2016-12-30}. È possibile negare ciascuno di questi termini anteponendo -. Outline non richiede configurazione e cerca il testo contenuto nei file caricati. Wiki.js è il più configurabile, perché puoi scegliere il motore. Il motore PostgreSQL è una scelta consigliata non appena il wiki supera alcune centinaia di pagine.
Posso trasferire in seguito i contenuti da uno all'altro?
In parte, ma devi prevedere attività manuali. Tutti e tre supportano l'esportazione e l'importazione in Markdown. Il testo delle pagine viene quindi conservato nella maggior parte dei casi. La struttura, invece, non viene trasferita correttamente. I libri e i capitoli di BookStack non hanno un equivalente nei documenti nidificati di Outline. I percorsi di Wiki.js non corrispondono alla gerarchia fissa di BookStack. Gli allegati, i permessi e la cronologia delle pagine sono gli elementi che con maggiore probabilità andranno persi. Esporta quindi un campione e verifica questi aspetti prima di procedere con la migrazione.