Skip to main content

Bookstack

Ein exemplarischer Anwendungsfall ist neben dem privaten Gebrauch z.b. eine Wissensdatenbank für den Kundensupport. Letzteres 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 den Offlinegebrauch als Handbuch.

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
  • Sehr gute Dokumentation https://www.bookstackapp.com/docs/
Nachteile:
  • nicht so anpassungsfähig wie DokuWiki
  • starre Strukturen
  • keine Plugins im klassischen Sinne, sondern Hacks
  • benötigt Datenbank oder sqlite

Beispiel

bookstack.jpg
mobile Version mit Nachtmodus

Installation

  • Voraussetzung ist, dass Docker installiert ist
root@docker: nano /srv/bookstack/docker-compose.yml 
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

Apache2-Konfig. Beispiel:

wiki.foo.info.conf
<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 der 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!

Export der Inhalte in verschiedenen Formaten

https://github.com/homeylab/bookstack-file-exporter?tab=readme-ov-file#run-via-pip