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.
- 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
- 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
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!
