Skip to main content

Bookstack

Die moderne Lösung: Bookstack

Früher ein Geheimtipp, heute fest etabliert, hat Bookstack unter den Open-Source-Wikis in vielerlei Hinsicht einen Nerv getroffen. Schon seit 2015 entwickelt sich eine beachtliche Fanbase, die nicht selten aus dem DokuWiki-Lager überwechselt, obwohl Bookstack im Gegensatz zu DokuWiki eine (MySQL-)Datenbank verwendet. Erst 2021 verließ das Projekt die Beta-Phase und ist heute eine tadellos funktionierende Software, die nicht nur in puncto Usability und Look überzeugt, sondern auch noch stetig verbessert wird. Für unseren exemplarischen Anwendungsfall (Kundensupport) eignet sich Bookstack hervorragend aufgrund intuitiver Bedienbarkeit, granulierter Nutzerverwaltung und einer an Büchern angelehnten Organisation der Inhalte. Letztere ermöglicht es beispielsweise, bereits existierende Produkthandbücher ohne Strukturverlust in das System zu übertragen. Das geht sogar auch umgekehrt, denn eine exzellente Export-Funktion ermöglicht wie gesagt den Offlinegebrauch als Handbuch. Weitere Features runden den Gesamteindruck ab.

Anmerkung: Dieses Wiki beruht seit 2022 auf Bookstack. Vorher gab es diesen Wiki 10 Jahre lang auf Basis von DokuWiki.

Vorteile:
  • intuitiv und ohne Nutzeranleitung bedienbar
  • strukturiere Oberfläche
  • Nutzerverwaltung mit Berechtigungen
  • Diagramme können durch draw.io Integration erstellt werden
  • Export von Inhalten
  • WYSIWYG-Editor oder Markdown-Editor (siehe auch DokuWiki)
  • Video-Verweise z.B. von YouTube können eingebunden und abgespielt werden
  • unterstützt Docker und daher einfache Installation auf einem Server
Nachteile:
  • nicht so anpassungsfähig wie DokuWiki
  • benötigt Datenbank
  • kann nicht auf Webspace betrieben werden, da dort in der Regel keine Installation von Software erlaubt ist (nur HTML, PHP)
  • benötigt Server

Beispiel

bookstack.jpgbookstack.jpg
mobile Version mit Nachtmodus

Installation

  • Voraussetzung ist, dass Docker installiert ist
root@docker: nano /srv/bookstack/docker-compose.yml 
---
version: "2"
services:
  bookstack:
    image: lscr.io/linuxserver/bookstack
    container_name: bookstack
    environment:
      - PUID=1000
      - PGID=1000
      - APP_URL=http://lokaleIP:6875
      - DB_HOST=bookstack_db
      - DB_USER=bookstack
      - DB_PASS=dbpassword123
      - DB_DATABASE=bookstackapp
    volumes:
      - ./data:/config
    ports:
      - 6875:80
    restart: always
    depends_on:
      - bookstack_db
  bookstack_db:
    image: lscr.io/linuxserver/mariadb
    container_name: bookstack_db
    environment:
      - PUID=1000
      - PGID=1000
      - MYSQL_ROOT_PASSWORD=dbrootpasswd123
      - TZ=Europe/Berlin
      - MYSQL_DATABASE=bookstackapp
      - MYSQL_USER=bookstack
      - MYSQL_PASSWORD=dbpassword123
    volumes:
      - ./data:/config
    restart: always

ReverseProxy

folgtApache2-Konfig. Beispiel:

<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName wiki.foo.info

        TraceEnable off

        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/wiki.foo.info_access.log combined
        ErrorLog ${APACHE_LOG_DIR}/wiki.foo.info_error.log

        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
<VirtualHost *:443>
        ServerAdmin [email protected]
        ServerName wiki.foo.info

        TraceEnable off

        ProxyPreserveHost On
        ProxyPass /.well-known !
        ProxyPass / http://docker01.lan.foo.info:6875/
        ProxyPassReverse / http://docker01.lan.foo.info:6875/

        RequestHeader set X-Forwarded-Proto "https"
        RequestHeader set X-Forwarded-Port "443"

        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/wiki.foo.info_access.log combined
        ErrorLog ${APACHE_LOG_DIR}/wiki.foo.info_error.log

        SSLEngine on
        SSLProtocol All -SSLv2 -SSLv3
        SSLHonorCipherOrder On
        SSLInsecureRenegotiation Off
        SSLCompression off
        SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

        SSLCertificateFile /etc/letsencrypt/live/foo.info/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/foo.info/privkey.pem
        BrowserMatch "MSIE [2-6]" \
                nokeepalive ssl-unclean-shutdown \
                downgrade-1.0 force-response-1.0
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
        </Directory>
</VirtualHost>

Änderung Domain oder IP

Wenn sich der Domainname mal ändern sollte oder die lokale IP mit der Bookstack getestet wurde, dann muss der neue Name in Datenbank neu gesetzt werden.

docker exec -it bookstack php /app/www/artisan bookstack:update-url http://192.168.10.54:6875 https://neuer-name.com


 This will search for "http://192.168.10.54:6875" in your database and replace it with  "https://neuer-name".
Are you sure you want to proceed? (yes/no) [no]:
 > yes

 This operation could cause issues if used incorrectly. Have you made a backup of your existing database? (yes/no) [no]:
 > yes

Updated 0 rows in attachments->path
Updated 12 rows in pages->html
Updated 0 rows in pages->text
Updated 0 rows in pages->markdown
Updated 48 rows in images->url
Updated 1 rows in settings->value
Updated 0 rows in comments->html
Updated 0 rows in comments->text
Updated 0 JSON encoded rows in settings->value
URL update procedure complete.
============================================================================
Be sure to run "php artisan cache:clear" to clear any old URLs in the cache.
============================================================================

Danach den Cache leeren

docker exec -it bookstack php /app/www/artisan cache:clear

Application cache cleared!