Direkt zum Hauptinhalt

BookStack-Autoupdate per Shellscript

Backup der MySQL DB tut dieses Script hier nicht! Müsst ihr noch reineditieren. No risk no fun.

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

#!/bin/bash

# Path to the last known version file
VERSION_FILE="/home/$USER/bookstack-latest-version.txt"
LOG_FILE="/home/$USER/bookstack-update.log"

# using atom feed
# LATEST_RELEASE=$(curl -s https://github.com/BookStackApp/BookStack/releases.atom | xmllint --format - | grep -oP '(?<=<title>BookStack ).*(?=</title>)' | head -n 1)

# 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"
    # 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

(Mit gewisser Hilfe von Claude Haiku)

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

chmod +x ~/bookstack-update.sh nicht vergessen

Scriptanalyse

So, jetzt müssen wir das Ganze verstehen können, immerhin hats eine LLM-KI geschrieben.
Was nutzen wir dafür? Klar, auch LLM-KI's:

Here's a concise breakdown of the update script's functionality:

1. Version Detection
- Retrieves the latest BookStack release from GitHub's Atom feed REST API
- Uses xmllint to parse the XML and extract the most recent version number

2. Version Tracking
- Maintains a version tracking file (`bookstack-latest-version.txt`)
- Stores the last known version of BookStack
- Compares the current stored version with the latest available version

3. Update Process (if a new version is detected)
- Changes to the BookStack directory
- Fetches the latest changes from the git repository
- Pulls the latest release branch
- Runs Composer to update dependencies
- Executes Laravel migrations
- Clears application cache
- Clears view cache
- Updates the version tracking file

4. Logging
- Logs all actions and decisions in `bookstack-update.log`
- Records when updates are available or not
- Timestamps each log entry

5. Automation
- Automatically checks for and applies updates without manual intervention

The script provides a lightweight, self-contained mechanism for keeping BookStack up-to-date with minimal manual oversight.

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

Script schreiben und Cronjob

Ist das getan, müssen wir das Script einmal ausführen und dann testen wir, ob /tmp/feed.txt existiert mit test -f /tmp/feed.txt && echo "exists". Hier brauchen wir echo, weil der Test-Befehl sonst nichts ausgeben würde.

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.