Paperless-ngx ist eine großartige Lösung zur Dokumentenverwaltung – besonders, wenn man es als Bare-Metal-Installation (ohne Docker) in einem Proxmox LXC-Container betreibt. Doch genau das macht das Aktualisieren manchmal tricky – vor allem mit strukturellen Änderungen in neueren Versionen.
In diesem Beitrag zeigen wir dir ein zukunftssicheres Bash-Skript, mit dem du dein Paperless-ngx zuverlässig und bequem auf die neueste Version bringst – komplett automatisch.
🧰 Voraussetzungen
- Paperless-ngx ist unter
/opt/paperlessinstalliert - Keine Verwendung von Docker oder venv (System-Python)
- Die Dienste werden über
systemdgestartet (z. B.paperless-webserver)
✨ Was das Skript leistet
- Erkennt die aktuell installierte Version
- Ermittelt automatisch die neueste GitHub-Version
- Erstellt ein Backup der Konfiguration
- Lädt & entpackt die neue Version
- Installiert Python-Abhängigkeiten
- Führt Datenbankmigrationen durch
- Aktualisiert statische Dateien
- Startet alle Dienste neu
- Erkennt und ersetzt veraltete
gunicorn.conf.py
🛡️ Das Bash-Skript
1#!/bin/bash
2set -e
3
4APP_DIR="/opt/paperless"
5TMP_DIR="/tmp/paperless-update"
6RELEASES_URL="https://github.com/paperless-ngx/paperless-ngx/releases"
7LATEST=$(curl -s https://api.github.com/repos/paperless-ngx/paperless-ngx/releases/latest | grep tag_name | cut -d '"' -f4)
8TAR_NAME="paperless-ngx-${LATEST}.tar.xz"
9DOWNLOAD_URL="${RELEASES_URL}/download/${LATEST}/${TAR_NAME}"
10ARCHIVE_PATH="/tmp/${TAR_NAME}"
11
12INSTALLED_VERSION=$(grep -Po 'v[0-9]+\.[0-9]+\.[0-9]+' "$APP_DIR/static/VERSION" 2>/dev/null || echo "unbekannt")
13
14echo "🔍 Prüfe auf neue Paperless-ngx-Version..."
15echo "📦 Installiert: ${INSTALLED_VERSION} | Verfügbar: ${LATEST}"
16
17echo "🧾 Backup der Konfiguration..."
18cp "$APP_DIR/paperless.conf" "$APP_DIR/paperless.conf.$(date +%Y%m%d)"
19
20if [[ -f "$ARCHIVE_PATH" ]]; then
21 echo "📁 Archiv bereits vorhanden: $TAR_NAME"
22else
23 echo "⬇️ Lade Release: $TAR_NAME"
24 wget -q --show-progress -O "$ARCHIVE_PATH" "$DOWNLOAD_URL"
25fi
26
27echo "📂 Entpacke Archiv..."
28rm -rf "$TMP_DIR"
29mkdir "$TMP_DIR"
30tar --strip-components=1 -xf "$ARCHIVE_PATH" -C "$TMP_DIR"
31
32echo "🔎 Vergleiche Konfiguration..."
33cp "$TMP_DIR/paperless.conf" "$TMP_DIR/paperless.conf.release"
34diff "$APP_DIR/paperless.conf" "$TMP_DIR/paperless.conf.release" || echo "⚠️ Unterschiede gefunden – ggf. manuell prüfen."
35
36echo "🛑 Stoppe Dienste..."
37systemctl stop paperless-*.service
38
39if grep -q "paperless.workers" "$APP_DIR/gunicorn.conf.py" 2>/dev/null; then
40 echo "⚠️ Alte gunicorn.conf.py erkannt – wird ersetzt."
41 cp "$APP_DIR/gunicorn.conf.py" "$APP_DIR/gunicorn.conf.py.bak.$(date +%Y%m%d)"
42 curl -fsSL https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/main/deployment/gunicorn.conf.py -o "$APP_DIR/gunicorn.conf.py" || echo "❗ Neue gunicorn.conf.py konnte nicht geladen werden."
43fi
44
45echo "🧹 Lösche alte Dateien..."
46cd "$TMP_DIR"
47for f in * .*; do
48 [[ "$f" != "." && "$f" != ".." && "$f" != "paperless.conf" ]] && rm -rf "$APP_DIR/$f"
49done
50
51echo "📁 Kopiere neue Dateien..."
52chown -R paperless:paperless "$TMP_DIR"
53cp -r "$TMP_DIR/"* "$APP_DIR/"
54cp "$TMP_DIR"/.* "$APP_DIR/" 2>/dev/null || true
55
56echo "📦 Installiere Python-Abhängigkeiten..."
57pip3 install --upgrade -r "$APP_DIR/requirements.txt" --break-system-packages
58
59echo "🛠️ Migriere Datenbank..."
60cd "$APP_DIR/src"
61python3 manage.py migrate
62
63echo "🖼️ Sammle statische Dateien..."
64python3 manage.py collectstatic --noinput
65
66echo "${LATEST}" > "$APP_DIR/static/VERSION"
67
68echo "🚀 Starte Dienste..."
69systemctl start paperless-*.service
70
71echo "✅ Update auf ${LATEST} abgeschlossen!"
