
Reolink WLAN IP Kamera, Überwachungskamera 1440p HD mit Audio für Aussen, 2,4/5GHz WiFi Outdoor Kamera mit 30m IR Nachtsicht, SD Kartenslot und Bewegungserkennung, Fernzugriff, RLC-410W
--
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! 📁✌️