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

LIFX Tile Kit (International), Einstellbar, Mehrfarbig, Dimmbar, Kein hub notwendig, Kompatibel mit Alexa, Apple HomeKit und Google Assistant
LIFX Tile Kit (International), Einstellbar, Mehrfarbig, Dimmbar, Kein hub notwendig, Kompatibel mit Alexa, Apple HomeKit und Google Assistant
--

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