Bookstack
Opensource Dokumentationsplattform.
Benutzung
Best Practice
Gruppierung von Inhalten
Inhalte bzw. Seiten sind grundsätzlich unabhängig vom Status ihrer Veröffentlichung im thematisch passenden Buch einzusortieren. Bücher dienen der Gruppierung von Inhalten, nicht, um Berechtigungen und Status der Veröffentlichung abzubilden. Seiten, die nur intern sichtbar sein sollen, sollen in einem Kapitel intern zusammengefasst werden.
Gliederung von Seiten
- Überschriften
- gezielt und hierarchisch einsetzen
- mit "Großer Überschrift" beginnen, absteigend nächst kleinere verwenden, keine Größe auslassen
- keine Nummerierung
- nicht als Fragen formulieren
- max. 5 Wörter
- Standard: linksbündig mit notfalls sinnvoller Worttrennung
- Unnötige Leerzeilen vermeiden
- Vermeidung von Doppelformatierungen (z. B. fett formatierte Überschrift oder farbige Überschriften)
- Vermeidung von Tabellen (sind für mobile Darstellung ungeeignet)
- Vermeidung von unnötigen Leerzeilen (machen Seiten unnötig lang, zerstören Layout)
- mit geschützten Umbrüchen (
Shift + Enter
) lassen sich Zeilenumbrüche ohne neun Absatz bzw. ohne neuen Nummerierungs-/Listenpunkt erzeugen
Hier ist
Beispiel.
https://www.computerkurs.com/word-kurs/zeilenumbruch-word/
Textformatierung
Inhalte aus anderen Dokumenten übernehmen
Bei der Übernahme von Inhalten, insbesondere aus Word-, PDF-Dokumenten und Web-Seiten ist darauf zu achten, dass Inhalte ohne Formatierung übernommen werden. Nach dem Kopieren (Strg + C) sollen diese mit Strg + Shift + V
eingefügt werden.
Werden Inhalte aus Mails oder PDFs übernommen, werden Zeilenumbrüche mit übernommen. Zeilenumbrüche müssen entfernt und durch ein Leerzeichen ersetzt werden, damit der Textfluss gegeben ist.
Aus der PDF:
Hallo. Ich bin ein kleiner Blindtext. Und zwar[Umbruch]
schon so lange ich denken kann. Es war nicht[Umbruch]
leicht zu verstehen, was es bedeutet, ein blinder[Umbruch]
Text zu sein: Man ergibt keinen Sinn.
In Bookstack:
Hallo. Ich bin ein kleiner Blindtext. Und zwar[Leerzeichen]schon so lange ich denken kann. Es war nicht[Leerzeichen]leicht zu verstehen, was es bedeutet, ein blinder[Leerzeichen]Text zu sein: Man ergibt keinen Sinn.
Zudem sind vor und nach Überschriften keine Leerzeilen einzufügen:
Überschrift
[Leerzeile]
Hallo. Ich bin ein kleiner Blindtext.
[Leerzeile]
[Bild]
[Leerzeile]
Überschrift
Hallo. Ich bin ein kleiner Blindtext.
[Bild]
Verlinkungen
- Verlinkungen innerhalb der KB sind im gleichen, Verlinkungen externer Seiten in neuem Fenster zu öffnen; interne Verlinkungen können jederzeit per Rechtsklick
Link in neuem Tab/Fenster öffnen
geöffnet werden. Nutzer sollen die Wahl haben. - zu Kontaktdaten verlinken:
- https://kb.el.uni-leipzig.de/books/start/page/kontakt aufrufen
- zur gewünschten Stelle scrollen
- Überschrift markieren
- Link aus Pop-up-Fenster kopieren und entsprechend einfügen
- https://kb.el.uni-leipzig.de/books/start/page/kontakt aufrufen
- Verlinkung zu einzelnem Abschnitt (auf einer Seite) oder einem Kapitel nutzen
- Buch/Seite aufrufen, wo links das Inhaltsverzeichnis ist, Rechtsklick auf Titel und Link kopieren
- Shortcuts oben für (interne) Verlinkung nutzen Strg + Shift + K
- Links auf Wörter statt URLs setzen:
Anmerkungsfelder und Inline Code
Achtung: Wird verwendet, um besonders wichtige Sachverhalte darzustellen
Tipp: Wird verwendet, um besonders hilfreiche Tipps darzustellen
Information: Wird verwendet, um zusätzliche Hinweise darzustellen
Wird im Text beschrieben, dass ein Button o. ä. angeklickt werden soll, dann diesen mit dem Inline Code kennzeichnen:
Im Tab Bewertung
sehen Sie die Bewertungen. Klicken Sie auf Speichern und beenden
. (Strg + 8)
Formulierungen
- Vermeidung von Abkürzungen, aber durchaus die gängigsten (z. B.; usw.) verwenden
- Vermeidung von redundanten Informationen
Besser Inhalte verlinken. Jede Seite sollte mit einzigartigem Text überzeugen. Suchmaschinen werten Seiten mit redundantem Inhalt ab. - Die Ansprache im Text lautet "Sie". Sollten Personengruppen genannt werden, dann bitte aufs Gendern achten:
- Lehrende
- Lernende
- Kollegen
- Nutzer
Anleitungen
- Was können Lehrende und Studenen damit machen? Für welche Lehr-Lern-Szenarien eignet sich die Aktivität? Beispiele: Reflexionsaufgaben, Kollaboratives Arbeiten, Vorwissenaktivierung, Einstieg ins Thema, etc.
- Zu Beginn stets auf die Grundanleitung zur Erstellung einer Aktivität verweisen: Anleitung zur Erstellung einer Aktivität
- Der graue Bereich mit den einweisenden Erklärungen bleibt erhalten, aber ohne grauen Hintergrund. Der Verweis auf die Screenshots (dass sie aus Moodle stammen) entfällt.
- Dabei wird das Format Absatz verwendet. Der Text ist linksbündig zu halten.
- Eine generelle Nummerierung entfällt. Bei Stichpunkten sind nur die Buttons oben im Editor zu verwenden:
- Screenshots, die nur auf das Klicken eines Buttons deuten, entfallen, um die Seite schlanker und kürzer zu halten. Dafür werden die Buttons mit dem Inline Code gekennzeichnet.
Bilder
Dateiformat
Bilder können im JPEG- und PNG-Format eingefügt werden. Um die bestmögliche Bildqualität bei gleichzeitig geringer Dateigröße zu erzielen, sollte das passende Format gewählte werden:
- PNG für Grafiken, Logos, Screenshots, Bilder mit wenig Farben, glatten Bildinhalten
- JPEGs für natürliche Fotos, wie sie mit einer Kamera aufgenommen werden
Als JPEG gespeicherte Screenshots können Artefakte (unscharfe Kanten) enthalten, während bei im PNG-Format gespeicherten natürlichen Fotos Flächenbildung und Verfärbungen entstehen.
Bild einfügen
Drag and Drop
Ziehe die Bilddatei mit der Maus an die gewünschte Stelle im Editor.
Zwischenablage
Füge ein Bild aus der Zwischenablage per die Tastenkombination Strg
+ v
ein. Das eingefügte Bild wird im PNG-Format gespeichert.
Zeichnungseditor
bietet die Möglichkeit, Elemente im Bild zu markieren und zu beschriften. Das Ergebnisbild wird als PNG gespeichert uns ist später wieder bearbeitbar. Er hat folgende Vorteile:
- Bildinhalte können markiert und beschriftet werden
- Bilder können beschnitten werden
- mehrere Bilder können zu einer Collage kombiniert werden
- Bilder können auch später noch geändert werden
Er hat aber auch folgende Nachteile gegenüber klassisch eingefügten Bildern:
- fertiges Bild wird stets als PNG gespeichert, was für natürliche Fotos nicht optimal ist
- Bilder können nicht mit Klick auf das Bild vergrößert werden
- mit dem Texteditor können keine Alternativtexte (für Blinde) eingefügt werden
- Screenshot oder Bilder sollen mit dem Button
Zeichnung einfügen/bearbeiten
bearbeitet werden:
- Umrandung einzelner Menüpunkte:
- Umrandung/Nummerierung mehrerer Menüpunkte in einem Bild:
- Kleine Pfeile zur Markierung mehrerer Menüpunkte in einem Bild:
- große Pfeile zur Markierung wichtiger Menüpunkte oder dem, was angeklickt werden soll:
Formatierung
- auf Auflösung achten (keine zu verpixelten Bilder)
- Bildbreite im 150er Pixelraster (Beispiel: 1x 150px, 2x 150px, ...)
- Alternativtext einfügen
- Formatierung:
- linksbündig
- keine Leerzeilen drüber/drunter
- bei Screenshots von Systemen:
- Nutzerdaten schwärzen
- Taskleisten entfernen
- Markierungen und Pfeile sinnvoll einfügen über den integrierten Zeicheneditor
- Bilder werden ergänzend unter Text angeordnet. Bei Liste sind diese nach einem geschützten Umbruch (
Shift
+Enter
) einzufügen. - Texte sollten nicht neben Screenshots angeordnet werden, da dies die barrierefreie Nutzung einschränkt.
- Vor und nach Bildern werden keine Leerzeilen eingefügt.
- Zusätzlich muss darauf geachtet werden, dass Bilder nicht nebeneinander erscheinen, da dann nicht beide Alternativtexte vorgelesen werden. Dies beeinträchtigt die Barrierefreiheit.
- Erstellung eines Alternativ-Textes:
Alternativtexte
- Sehbehinderte können keine Grafiken erkennen. Sie nutzen Screenreader, welche Alternativtext einer Grafik vorlesen
- Screenreader ignorieren Grafiken bei leerem Alternativtext, falls kein Alternativtext vorhanden ist, lesen sie im schlimmsten Fall den Dateinamen vor
- stellt euch die Frage: Ist die Grafik
- sinntragend? → aussagekräftigen Alternativtext erfassen
- dekorativ? → als dekorativ markieren = leerer Alternativtext
- so knapp wie möglich, gleichzeitig präzise
- Wenig präzise: "Frau mit Tasche"
- Besser: "Feine Dame mit roter Designer-Handtasche"
- Vermeide das Wort "Bild" im Alternativtext. "Bild eines Apfels" würde als "Bild, Bild eines Apfels" vorgelesen
- ist Text im Bild vorhanden, muss der Text auch im Alternativtext verwendet werden
Die. o. g. Punkte sind eine Zusammenfassung der Präsentation "Gute Alternativtexte schreiben" von Manu Heim der ETH Zürich.
Alternativtext einfügen
- Bei JPEGs: Klick auf das Bild. Dann das markierte Icon auswählen und Alternativtext eintragen.
- Über den Online-Editor hochgeladene Bilder:
- Oben rechts den Quellcode anzeigen lassen und das Bild finden (<img id="123" src="https...">).
- Dort innerhalb dieser <>-Klammern
alt="Hier Alternativtext schreiben"
einfügen.- Beispiel: <div drawio-diagram="1626" contenteditable="false" id="bkmrk--4"><img id="bkmrk--5" src="https://kb.el.uni-leipzig.de/uploads/images/drawio/2023-08/drawing-11-1693473708.png" alt="Das ist eine Bildbeschreibung."></div>
- Wichtig: Nicht die Anführungszeichen vergessen!
Bei Unklarheit hier im Quellcode das unterste Bild anschauen. Im Quellcode lässt sich auch der Alternativtext von JPEGs anpassen.
Icons
🔗 https://www.urz.uni-leipzig.de/servicedesk-und-hilfe/kontakt-zum-servicedesk
📧 servicedesk@uni-leipzig.de
☎ +49 341 97-33333
Icons sind nur in Ausnahmefällen zu verwenden.
Anhänge
Inhalte sollten nativ, d. h. direkt mit dem vorhandenen Editor, eingepflegt werden. Die Verwendung von Anhängen ist nicht zu empfehlen. Anhänge
- können nicht aktualisiert werden
- sind nicht durchsuchbar
- sind nicht barrierefrei
- können nicht im Browser betrachtet werden
- werden auf mobilen Geräten schlecht dargestellt
Formatierung
Text
Formatierung | Tastenkombination für Windows |
Tastenkombination für Mac |
Fett | Strg + B | ⌘ + b |
kursiv | Strg + I | ⌘ + i |
unterstrichen | Strg + U | ⌘ + u |
Best Practice mit Bookstack (intern) | Strg + Shift + K | ⌘ + ⇧ + k |
Universität Leipzig (extern) | Strg + K | |
Inline Code |
Strg + 8 |
⌘ + ⇧ + e |
ohne Formatierung einfügen |
Strg + Shift + v |
⌘ + ⇧ + ⌥ + v |
Große Überschrift (Strg + 1)
Mittlere Überschrift (Strg +2)
Kleine Überschrift (Strg + 3)
Sehr kleine Überschrift (Strg + 4)
Anmerkungen und Zitate
(1x Strg + 9) zusätzliche Information
(2x Strg + 9) hilfreiche Tipps
(3x Strg + 9) Warnung
(4x Strg + 9) besonders wichtige Sachverhalte
Zitate erstellt man mit Strg + 6
Damit kann man Skripte und Code mit automatischer Formatierung darstellen, damit der Code besser lesbar ist:
{
"_comment:" "Code Highlighting mit Strg + 7",
"Code:" "JSON",
"firstName": "John",
"lastName": "Doe",
"email": "john.doe@example.com",
"age": 45,
"weight": 67,
"admin": true
}
Listen und Nummerierungen
Unsortierte Liste (Strg + P)
- Milch
- Eier
- Mehl
Sortierte Liste (Strg + O)
- Chef
- Abteilungsleiter
- Teamleiter
- Mitarbeiter
Tabellen
Sie eignen sich zur strukturierten Darstellung, sind jedoch insbesondere für die Darstellung auf mobilen Geräten ungeeignet und sollten daher vermieden werden.
Singular | Plural | |
1. Person | ich | wir |
2. Person | du | ihr |
3. Person | er, sie, es | sie |
Bilder/Grafiken/Zeichnungen
Begriffe und Formulierungen
Die "Wie wird das nochmal geschrieben?"-Liste
- Dropdown-Menü
- drag and drop
- "um" am Satzanfang vermeiden
- im Idealfall mit Hauptsatz beginnen
- z. B., e. V., u. a., o. ä (Abkürzungen mit Leerzeichen zwischen den Buchstaben)
- ILIAS
- AlmaWeb
- Projektor/Projektion statt Beamer
- zwischen Zahlenwert und Einheit steht auch ein Leerzeichen
- Blu-ray
- Uni-PC statt Medien-PC, Hörsaal-PC, Rack-PC
- interaktiver Bildschirm statt Smartboard, Touch Monitor, Touch Display
- Tageslichtprojektor statt Overheadprojektor, Polylux
- Notebook für Laptop DE
Administration
Bookstack Dokumentation
https://www.bookstackapp.com/docs/admin/
Fehlersuche im System:
https://www.bookstackapp.com/docs/admin/debugging/
Backup
Dieses Skript sichert die Datenbank und alle Benutzerdateien. Siehe auch
https://www.bookstackapp.com/docs/admin/backup-restore
Skript
#!/bin/bash
#set -x
BACKUPDIR=/backup/bookstack
MYSQL_DB=bookstack
WWW_DIR=/var/www/bookstack
ITEMS=".env public/uploads/ storage/uploads/ themes/"
MINFILESIZE=200 # in kb
KEEP=28 # in days
EMAIL="[Absender]"
DATE=$(date "+%Y-%m-%dT%H%M%S%z")
FILENAME=${BACKUPDIR}/$MYSQL_DB-$DATE.sql
mysqldump --triggers --routines $MYSQL_DB -r $FILENAME
DB_DUMPSIZE=$(du -k $FILENAME|cut -f1)
if [[ -r $FILENAME && $DB_DUMPSIZE -ge $MINFILESIZE ]]
then
xz -9e --lzma2=dict=1024MiB,nice=273 $FILENAME
else
echo -e "Host:\t\t\t$(hostname -f)\nDB:\t\t\t$MYSQL_DB\nDatei:\t\t\t$FILENAME\nGröße (min):\t\t$MINFILESIZE kb\nGröße (tatsächlich):\t$DB_DUMPSIZE kb"|mailx -s "Backup gescheitert: $MYSQL_DB" $EMAIL
fi
FILENAME_ARCHIVE=${BACKUPDIR}/$(basename $WWW_DIR)-$DATE.tar.xz
tar --exclude=storage/framework -cf $FILENAME_ARCHIVE --use-compress-program='xz -9 --lzma2=dict=1024MiB,nice=273' -C /${WWW_DIR} $ITEMS
find $BACKUPDIR/* -type f -mtime +$KEEP -exec rm {} \; 2>&1
Cronjob
15 3 * * 2-6 /usr/local/bin/bs-backup-db.sh
Suchmaschinenoptimierung
Sitemap
Um Suchmaschinen die Indizierung Inhalte von Bookstack zu erleichtern, wird mittels eines Skriptes eine Sitemap generiert.
Installation
- Skript herunterladen
curl https://raw.githubusercontent.com/BookStackApp/api-scripts/main/php-generate-sitemap/generate-sitemap.php > /user/local/bin/bs-gen-sitemap.php
- Benutzer Sitemap anlegen
- Rolle für öffentliche Sichtbarkeit zuweisen (Guest), Rolle für API zuweisen; Durch die Rolle API erhält der Nutzer Zugriff auf die API. Durch die Rolle Guest werden nur öffentliche Seiten in die Sitemap aufgenommen.
- API-Token erzeugen und Variablen im PHP-Skript setzen
$baseUrl = 'https://kb.el.uni-leipzig.de'; // sitemap $clientId = '[geheim]'; $clientSecret = '[geheim]';
- Cronjob anlegen bzw. Sitemap manuell erstellen
15 19 * * 1-5 php /usr/local/bin/bs-gen-sitemap.php /var/www/bookstack/public/sitemap.xml
- URL-Liste für aus sitemap.xml erstellen
sed -n 's:.*<loc>\(.*\)</loc>.*:\1:p' /var/www/bookstack/public/sitemap.xml
- veröffentlichte Seite zählen
sed -n 's:.*<loc>\(.*\)</loc>.*:\1:p' /var/www/bookstack/public/sitemap.xml | wc -l
Cronjob
15 3 * * 2-6 /usr/local/bin/bs-backup.sh
Anmeldung zur Indizierung
Die Website inkl. Sitemap bei Suchmaschinen anmelden
Optimierung von Bilddateien
Im Wesentlichen werden zwei Bildformate verwendet, wobei jedes Format für bestimmte Inhalte optimiert ist:
- PNG: Geeignet für Screenshots, Grafiken und Motive mit wenigen, flächigen Farben
- JPEG: Geeignet für natürliche Inhalte wie Fotos und Bilder mit komplexen Strukturen, Farben und Farbverläufen
Meist werden diese Bilder nicht im für Webseiten optimalen Format gespeichert, d. h.
- in PNGs wird die komplette Farbpalette (RGB + Transparenz, mit 24 bzw. 32 bit) verwendet, obwohl für Darstellung deutlich weniger Farben ausreichen
- JPEGs werden qualitativ sehr hochwertig erstellt, erstellt Dateien sind recht groß
- JPEGs werden im Format Baseline erstellt, können also nicht progressiv geladen werden
- Bilder enthalten Metadaten
Hier einige Referenzen zur Optimierung von Bildern für die Darstellung auf Webseiten:
- Analyse der Bildqualität von JPEGs in Abhängigkeit von der Kompression
- Warum sollte man PNGs optimieren?
- Baseline oder Progressive?
- Performance mit progressiven JPEGs verbessern
Bilder in Bookstack automatisch optimieren
Um Nutzer nicht unnötig mit der Optimierung zu belasten, optimiert nachfolgendes Skript Bilddateien automatisch. Dabei kommen pngquant und jpegoptim zum Einsatz, welche für gängige Linux-Distributionen angeboten werden. Täglich 1x werden die Bilder aller Unterverzeichnisse (cover_book, cover_bookshelf, drawio, gallery, system, user) des aktuellen Monats im Image-Ordner bearbeitet.
Verzeichnis: /var/www/bookstack/public/uploads/images/[asset]/[YYYY-MM]/
Mit jedem Durchlauf werden Bilder weiter optimiert, wobei die Optimierung beim ersten Durchlauf am größten ist. Pngquant und jpegoptim optimieren die Bilder nur, wenn eine Mindestqualität nicht unterschritten wird. Die mehrfache Anwendung des Skriptes verschlechtert die Bildqualität daher nicht. Nach 2 bis 3 Durchläufen ist das angestrebte Optimum erreicht. In Tests mit mehreren hundert Bildern wurden zwischen 66 und 80 % der Dateigröße ohne sichtbaren Qualitätsverlust eingespart. Bei Dateien die mit in Bookstack integriertem draw.io erstellt/bearbeitet wurden und welche im Ordner drawio
liegen, werden die Metadaten beibehalten, da diese die Vektorgrafiken für spätere Bearbeitung enthalten. Würden sie entfernt, könnten sie nicht mehr mit draw.io bearbeitet werden.
Benötigte Komponenten installieren:
apt-get update
apt-get install pngquant
apt-get install jpegoptim
Skript installieren
/usr/local/bin/bs-opt-img.sh
# !/bin/bash
# set -x
#
# Recompresses uploaded images of the current month and strips meta tags.
# Images are only processed if there are potential savings. Script can be run
# multiple times without recompressing already compressed images - processed
# images are skipped.Needs pngqunat and jpegoptimum to be installed. Run script
# atleast once a week better daily.
# Logs at /var/log/[script-name].log
# Metadata of png files in drawio are not stripped because they are containing
# vector data which are neccessary to edit these drawings
#
# Version 2023-10-25
# daniel.obst@uni-leipzig.de
FOLDER_BASE=/var/www/bookstack/public/uploads/images
LOG=/var/log/`echo $(basename "$0") | rev | cut -d. -f2- | rev`.log
#FOLDERS="cover_book cover_bookshelf drawio gallery system user"
echo "$(date '+%Y-%m-%d %H:%M:%S') === START ===" >> $LOG
FOLDERS="`ls -q $FOLDER_BASE`"
for FOLDER in $FOLDERS; do
FOLDER_LONG=$FOLDER_BASE/$FOLDER/`date +"%Y-%m"`/
# FOLDER_LONG=$FOLDER_BASE/$i/2023-07/
if [ -d "$FOLDER_LONG" ]; then
DU_BEFORE=`du -s --block-size=1 $FOLDER_LONG | cut -f1`
DU_BEFORE_K=$(($DU_BEFORE/1024))
FILES=`ls -lq $FOLDER_LONG | grep -iE ".*\.(jpg|jpeg|png)$" | wc -l`
if [ $FILES -gt 0 ]; then
if [ "$FOLDER" = "drawio" ]; then
find $FOLDER_LONG -name "*.png" -exec pngquant --force --skip-if-larger --speed=1 --ext .png --quality=60-80 {} \;
find $FOLDER_LONG -name "*.PNG" -exec pngquant --force --skip-if-larger --speed=1 --ext .PNG --quality=60-80 {} \;
else
find $FOLDER_LONG -name "*.png" -exec pngquant --strip --force --skip-if-larger --speed=1 --ext .png --quality=60-80 {} \;
find $FOLDER_LONG -name "*.PNG" -exec pngquant --strip --force --skip-if-larger --speed=1 --ext .PNG --quality=60-80 {} \;
fi
find $FOLDER_LONG -iname "*.png" -exec chown -f --reference=$FOLDER_LONG {} \;
find $FOLDER_LONG -iregex ".*\.jpe?g" -exec jpegoptim -q -p --all-progressive -m75 --strip-com --strip-exif --strip-iptc --strip-icc --strip-xmp {} \;
DU_AFTER=`du -s --block-size=1 $FOLDER_LONG | cut -f1`
DU_AFTER_K=$((DU_AFTER/1024))
if [ $DU_AFTER -lt $DU_BEFORE ]; then
SAVED_K=$((DU_BEFORE_K-$DU_AFTER_K))
echo "$(date '+%Y-%m-%d %H:%M:%S') $FOLDER_LONG $FILES images, folder shrinked from ${DU_BEFORE_K}k to ${DU_AFTER_K}k, ${SAVED_K}k saved" >> $LOG
else
echo "$(date '+%Y-%m-%d %H:%M:%S') $FOLDER_LONG nothing to do, $FILES images, ${DU_AFTER_K}k" >> $LOG
fi
else
echo "$(date '+%Y-%m-%d %H:%M:%S') $FOLDER_LONG no images found" >> $LOG
fi
else
echo "$(date '+%Y-%m-%d %H:%M:%S') $FOLDER_LONG does not exists" >> $LOG
fi
done
echo "$(date '+%Y-%m-%d %H:%M:%S') $FOLDER_BASE/ `find $FOLDER_BASE/. -type f | wc -l` files, `du -sh $FOLDER_BASE | cut -f1`" >> $LOG
echo "$(date '+%Y-%m-%d %H:%M:%S') === STOP ===" >> $LOG
Cronjob
mit crontab -e
0 23 * * * /usr/local/bin/bs-opt-img.sh
Logs
Das Skript schreibt Logs nach /var/log/bs-opt-img.log
. Um zu verhindern, dass die Logs die Festplatte vollschreiben, sollten die Logs rotiert werden. Dazu eine Datei /etc/logrotate.d/bs-opt-img
mit folgendem Inhalt anlegen:
/var/log/bs-opt-img.log
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
}
Syslog Daemon neustarten:
systemctl restart rsyslog.service
überflüssige Bilder löschen
Nachfolgendes Skript löscht Bilder, die nicht mehr referenziert sind:
Skript
/usr/local/bin/bs-cleanup-img.sh:
# !/bin/bash
# set -x
#
# Cleanup images and drawings
# Also delete images that are only used in old revisions
# depending on amount of images cleanup will take several minutes
#
# Version 2024-02-29
APP_FOLDER=/var/www/bookstack
IMG_FOLDER=${APP_FOLDER}/public/uploads/images
LOG=/var/log/`echo $(basename "$0") | rev | cut -d. -f2- | rev`.log
echo "$(date '+%Y-%m-%d %H:%M:%S') === START ===" >> $LOG
echo "working on ${APP_FOLDER}" >> $LOG
DU_BEFORE=`du -s --block-size=1 $IMG_FOLDER | cut -f1`
DU_BEFORE_K=$(($DU_BEFORE/1024))
FILES_BEFORE=`ls -lqR ${IMG_FOLDER} | grep -iE ".*\.(jpg|jpeg|png)$" | wc -l`
php ${APP_FOLDER}/artisan bookstack:cleanup-images -f -n -v >> $LOG
DU_AFTER=`du -s --block-size=1 $IMG_FOLDER | cut -f1`
DU_AFTER_K=$(($DU_AFTER/1024))
FILES_AFTER=`ls -lqR ${IMG_FOLDER} | grep -iE ".*\.(jpg|jpeg|png)$" | wc -l`
if [ $DU_AFTER -lt $DU_BEFORE ]; then
DELETED_K=$((DU_BEFORE_K-$DU_AFTER_K))
FILES_DELETED=$((FILES_BEFORE-$FILES_AFTER))
echo "${FILES_BEFORE} - ${FILES_AFTER} = ${FILES_DELETED} deleted" >> $LOG
echo "${DU_BEFORE_K} - ${DU_AFTER_K} = ${DELETED_K}k deleted" >> $LOG
else
echo "nothing to do, ${FILES_AFTER} files, ${DU_AFTER_K}k" >> $LOG
fi
echo "$(date '+%Y-%m-%d %H:%M:%S') === STOP ===" >> $LOG
Auszug aus dem Log:
2024-02-29 16:31:19 === START ===
working on /var/www/bookstack
This operation is destructive and is not guaranteed to be fully accurate.
Ensure you have a backup of your images.
Image(s) to delete:
/uploads/images/gallery/2023-07/img-20220630-132119.jpg
/uploads/images/gallery/2023-08/PGBimage.png
[..]
/uploads/images/gallery/2024-01/vRZgrafik.png
/uploads/images/drawio/2024-02/drawing-7-1706817605.png
/uploads/images/drawio/2024-02/drawing-21-1708611127.png
325 image(s) deleted
8934 - 8000 = 934 files deleted
315784k - 256552k = 59232k deleted
2024-02-29 16:32:37 === STOP ===
2024-02-29 17:09:58 === START ===
working on /var/www/bookstack
This operation is destructive and is not guaranteed to be fully accurate.
Ensure you have a backup of your images.
0 image(s) deleted
nothing to do, 8000 files, 256552k
2024-02-29 17:24:18 === STOP ===
Cronjob
Skript sonntags 3:15 Uhr ausführen:
15 3 * * 7 /usr/local/bin/bs-cleanup-img.sh
Logrotate
/etc/logrotate.d/bs-cleanup-img
/var/log/bs-cleanup-img.log
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
}
Service neustarten, um Konfig zu aktivieren
systemctl restart rsyslog.service