Paperless-ngx in Proxmox LXC aktualisieren (Bare-Metal ohne Docker)

paperless-ngx-in-proxmox-lxc-aktualisieren-bare-metal-ohne-docker
Wlan Steckdose mit Tasmota vorgeflasht. Kleinste ESP8266 smart plug. 16A mini wifi steckdosen mit stromverbrauch stromzähler, zeitschaltuhr. MQTT, Domoticz, Home Assistant, Alexa. 2,4GHz. NOUS A1T
Wlan Steckdose mit Tasmota vorgeflasht. Kleinste ESP8266 smart plug. 16A mini wifi steckdosen mit stromverbrauch stromzähler, zeitschaltuhr. MQTT, Domoticz, Home Assistant, Alexa. 2,4GHz. NOUS A1T
Unverb. Preisempf.: 16,99 €
16,29 €
Sie sparen 0,70 €

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/paperless installiert
  • Keine Verwendung von Docker oder venv (System-Python)
  • Die Dienste werden über systemd gestartet (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

#!/bin/bash
set -e

APP_DIR="/opt/paperless"
TMP_DIR="/tmp/paperless-update"
RELEASES_URL="https://github.com/paperless-ngx/paperless-ngx/releases"
LATEST=$(curl -s https://api.github.com/repos/paperless-ngx/paperless-ngx/releases/latest | grep tag_name | cut -d '"' -f4)
TAR_NAME="paperless-ngx-${LATEST}.tar.xz"
DOWNLOAD_URL="${RELEASES_URL}/download/${LATEST}/${TAR_NAME}"
ARCHIVE_PATH="/tmp/${TAR_NAME}"

INSTALLED_VERSION=$(grep -Po 'v[0-9]+\.[0-9]+\.[0-9]+' "$APP_DIR/static/VERSION" 2>/dev/null || echo "unbekannt")

echo "🔍 Prüfe auf neue Paperless-ngx-Version..."
echo "📦 Installiert: ${INSTALLED_VERSION} | Verfügbar: ${LATEST}"

echo "🧾 Backup der Konfiguration..."
cp "$APP_DIR/paperless.conf" "$APP_DIR/paperless.conf.$(date +%Y%m%d)"

if [[ -f "$ARCHIVE_PATH" ]]; then
  echo "📁 Archiv bereits vorhanden: $TAR_NAME"
else
  echo "⬇️ Lade Release: $TAR_NAME"
  wget -q --show-progress -O "$ARCHIVE_PATH" "$DOWNLOAD_URL"
fi

echo "📂 Entpacke Archiv..."
rm -rf "$TMP_DIR"
mkdir "$TMP_DIR"
tar --strip-components=1 -xf "$ARCHIVE_PATH" -C "$TMP_DIR"

echo "🔎 Vergleiche Konfiguration..."
cp "$TMP_DIR/paperless.conf" "$TMP_DIR/paperless.conf.release"
diff "$APP_DIR/paperless.conf" "$TMP_DIR/paperless.conf.release" || echo "⚠️ Unterschiede gefunden – ggf. manuell prüfen."

echo "🛑 Stoppe Dienste..."
systemctl stop paperless-*.service

if grep -q "paperless.workers" "$APP_DIR/gunicorn.conf.py" 2>/dev/null; then
  echo "⚠️ Alte gunicorn.conf.py erkannt – wird ersetzt."
  cp "$APP_DIR/gunicorn.conf.py" "$APP_DIR/gunicorn.conf.py.bak.$(date +%Y%m%d)"
  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."
fi

echo "🧹 Lösche alte Dateien..."
cd "$TMP_DIR"
for f in * .*; do
  [[ "$f" != "." && "$f" != ".." && "$f" != "paperless.conf" ]] && rm -rf "$APP_DIR/$f"
done

echo "📁 Kopiere neue Dateien..."
chown -R paperless:paperless "$TMP_DIR"
cp -r "$TMP_DIR/"* "$APP_DIR/"
cp "$TMP_DIR"/.* "$APP_DIR/" 2>/dev/null || true

echo "📦 Installiere Python-Abhängigkeiten..."
pip3 install --upgrade -r "$APP_DIR/requirements.txt" --break-system-packages

echo "🛠️ Migriere Datenbank..."
cd "$APP_DIR/src"
python3 manage.py migrate

echo "🖼️ Sammle statische Dateien..."
python3 manage.py collectstatic --noinput

echo "${LATEST}" > "$APP_DIR/static/VERSION"

echo "🚀 Starte Dienste..."
systemctl start paperless-*.service

echo "✅ Update auf ${LATEST} abgeschlossen!"

💡 WICHTIG

  • Erstelle vor dem Update einen Snapshot des LXC-Containers in Proxmox
  • Optional: Backup der Datenbank separat speichern
  • Konfiguration manuell vergleichen, falls nötig (diff)

🧩 Fazit

Mit diesem Script wird das Paperless-Update deutlich entspannter. Du brauchst keine Sorge mehr vor fehlenden Modulen oder alten Konfigs zu haben. Das Ganze lässt sich sogar per cron oder systemd-Timer regelmäßig automatisieren.

Happy Archiving! 📁✌️