BookStack-Autoupdate per Shellscript
BookStack hat ein Problem. Es gibt kein Autoupdate. Autoupdate ist essenziell um einigermaßen Sicherheit gewährleisten zu können.
Also müssen wir das Autoupdate selbst machen.
Die Grundlage hierzu ist natürlich ein Uberspace. Dort können wir kein sudo nutzen, also muss alles im Userspace laufen:
Script
Das Script geht davon aus dass die Anleitung aus dem Lab zur Installation verwendet wurde und dass eine globale $USER Variable existiert. Also die Datenbank euren Username mit dem Präfix _bookstack trägt.
#!/bin/bash
# Path to the last known version file
VERSION_FILE="/home/$USER/bookstack-latest-version.txt"
LOG_FILE="/home/$USER/bookstack-update.log"
# Backup directory
BACKUP_DIR="/home/$USER/bookstack-backups"
# Create backup directory if it doesn't exist
mkdir -p "$BACKUP_DIR"
# using github API
LATEST_RELEASE=$(curl -s https://api.github.com/repos/BookStackApp/BookStack/releases/latest | grep -oP '"tag_name": "\K[^"]*')
echo "Debug: Latest release detected: $LATEST_RELEASE" >> "$LOG_FILE"
# Check if version file exists and has content
if [ ! -s "$VERSION_FILE" ]; then
echo "Debug: Version file is empty or doesn't exist" >> "$LOG_FILE"
echo "$LATEST_RELEASE" > "$VERSION_FILE"
echo "Debug: Created version file with: $LATEST_RELEASE" >> "$LOG_FILE"
exit 0
fi
# Compare current stored version with latest release
STORED_VERSION=$(cat "$VERSION_FILE")
echo "Debug: Stored version: $STORED_VERSION" >> "$LOG_FILE"
echo "Debug: Latest release: $LATEST_RELEASE" >> "$LOG_FILE"
if [ "$LATEST_RELEASE" != "$STORED_VERSION" ]; then
echo "New version detected: $LATEST_RELEASE" >> "$LOG_FILE"
# Database backup before update
BACKUP_FILENAME="bookstack_backup_$(date +"%Y%m%d_%H%M%S").sql.gz"
BACKUP_PATH="${BACKUP_DIR}/${BACKUP_FILENAME}"
# Perform MySQL dump
mysqldump --defaults-group-suffix=client -u "$USER" "$USER"_bookstack | gzip > "$BACKUP_PATH"
# Check backup success
if [ $? -eq 0 ]; then
echo "Database backup successful: $BACKUP_PATH" >> "$LOG_FILE"
# Cleanup old backups (keep last 5)
ls -t "$BACKUP_DIR"/bookstack_backup_*.sql.gz | tail -n +6 | xargs -d '\n' rm -f
else
echo "Database backup failed!" >> "$LOG_FILE"
exit 1
fi
# Perform update steps
cd /var/www/virtual/$USER/BookStack
git fetch origin
git pull origin release
composer install --no-dev
php artisan migrate --force
php artisan cache:clear
php artisan view:clear
# Update the version file
echo "$LATEST_RELEASE" > "$VERSION_FILE"
echo "$(date): Updated to $LATEST_RELEASE" >> "$LOG_FILE"
else
echo "$(date): No new version available" >> "$LOG_FILE"
fi
php artisan migrate --force ist hier der kritischste Punkt. Die Abfrage für eine Migration ist nicht ohne Grund manuell. Wenn etwas irgendwann Nacharbeit erfordert, dann das...
Wer gut aufgepasst hat: mysqldump benötigt hier einen write-permission user. Warum? Mysqldump muss die Tabelle für den Prozess des Backups vor Änderungen schützen und nutzt dafür LOCK TABLES. Das ist in MySQL als write klassifiziert.
chmod +x ~/bookstack-update.sh nicht vergessen
Scriptanalyse
So, jetzt müssen wir das Ganze verstehen können, immerhin ist's durch eine LLM-KI deutlich schneller entstanden als ohne diese.
Was nutzen wir dafür? Klar, auch LLM-KI's...
Macht das bitte selbst, würde ich meinen KI Output hier pasten ist der so dass ich es verstehe, aber vielleicht nicht ihr...
Test-run
/bin/bash ~/bookstack-update.sh
tail ~/bookstack-update.log
Dies wird beim ersten Ausführen eure bestehende Installation einmal mit der gleichen Version überschreiben, erst dann existiert das version-tracking file /home/$USER/bookstack-latest-version.txt
Cronjob-Automatismus
Nun ab in den Cronjob damit.
crontab -e
MAILTO=""
0 */2 * * * /bin/bash /home/$USER/bookstack-update.sh
Das Script erzeugt Output von den curl
Befehlen, den würden wir im Falle von Uberspaces per Mail gespammt bekommen, wenn das MAILTO dort nicht wäre.
Denkt dran: :wq
falls ihr in VI oder VIM gelandet seid. Crontab-Guru für andere Zeitintervalle.