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

innr E27 Smart Filament LED Lampe, kompatibel mit Philips Hue*, Alexa & Google (bridge erforderlich), Vintage, 2200K, 2-Pack, RF 263-2
innr E27 Smart Filament LED Lampe, kompatibel mit Philips Hue*, Alexa & Google (bridge erforderlich), Vintage, 2200K, 2-Pack, RF 263-2
--

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! 📁✌️