In diesem Video zeige ich euch, wie ihr unter Proxmox ( LXC oder VM), oder einem separaten PC Paperless NGX einrichtet. Da es recht viele Dinge dabei zu berücksichtigen gibt, habe ich euch dafür 3 Skripte erstellt.
- Installation
- Backup
- Restore
Mit diesen Skripten wird euch fast die gesamte Arbeit abgenommen.
Möchtest du Paperless ngx als Home Assistant Addon installieren, findest du hier eine Anleitung dazu:
https://youtu.be/wCiSkHQtYEE
Wichtiger Hinweis ! Bitte unbedingt beachten!
Ich habe die Freigabenamen umbenannt. Im Video bin ich darauf nochmal kurz eingegangen. Die Freigaben heißen nun:
consume
backup
restore
D.h. , wenn unter Windows die Freigaben gemountet werden, müssen diese Freigabenamen verwendet werden !
Skript install_paperless.sh
#!/bin/bash set -euo pipefail # Funktion zur sicheren Passworteingabe mit Bestätigung function prompt_for_password() { local password password_confirm # Falls PAPERLESS_PASSWORD eingegeben wird, zusätzliche Erklärung ausgeben if [[ "$1" == "PAPERLESS_PASSWORD" ]]; then echo -e "\n💡 Hinweis: Dieses Passwort wird für den Linux-Benutzer 'paperless' und den Samba-Server verwendet." echo -e "Es wird für den Zugriff auf freigegebene Samba-Ordner benötigt.\n" fi while true; do echo -e "\n🔒 Bitte geben Sie das Passwort für **$1** ein:" read -s password echo -e "\n🔒 Bitte bestätigen Sie das Passwort:" read -s password_confirm if [[ "$password" == "$password_confirm" ]]; then echo -e "\n✅ Passwort erfolgreich gesetzt für **$1**.\n" eval "$2='$password'" break else echo -e "\n❌ Die Passwörter stimmen nicht überein. Bitte erneut eingeben.\n" fi done } # Funktion zur Eingabe des Admin-Benutzernamens mit Standardwert function prompt_for_admin_user() { echo -e "\n👤 Bitte geben Sie den **Admin-Benutzernamen** ein (Standard: paperless):" read admin_user_input ADMIN_USER="${admin_user_input:-paperless}" echo -e "\n✅ Admin-Benutzer wurde auf **'$ADMIN_USER'** gesetzt.\n" } # Passwörter abfragen prompt_for_password "PAPERLESS_PASSWORD" PAPERLESS_PASSWORD prompt_for_admin_user prompt_for_password "ADMIN_PASSWORD" ADMIN_PASSWORD # Weitere Konfigurationen SAMBA_PASSWORD="$PAPERLESS_PASSWORD" DB_PASSWORD="paperless" # System aktualisieren und benötigte Pakete installieren update_and_install_dependencies() { echo "Aktualisiere Paketliste und installiere benötigte Pakete..." sudo apt update sudo apt install -y apt-transport-https curl jq gnupg openssh-server samba samba-common-bin } # Docker-Repository hinzufügen add_docker_repo() { echo "Füge Docker GPG-Schlüssel und Repository hinzu..." sudo mkdir -p /etc/apt/keyrings if [[ ! -f /etc/apt/keyrings/docker.gpg ]]; then curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg fi . /etc/os-release DOCKER_REPO="deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $VERSION_CODENAME stable" echo "$DOCKER_REPO" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update } # Paperless-Benutzer und Gruppe anlegen ensure_paperless_user_and_group() { if ! getent group paperless &>/dev/null; then echo "Erstelle Gruppe 'paperless' mit GID 1002..." sudo groupadd -g 1002 paperless fi if ! id -u paperless &>/dev/null; then echo "Erstelle Benutzer 'paperless' mit UID 1002 und GID 1002..." sudo useradd -m -s /bin/bash -u 1002 -g paperless paperless echo "paperless:$PAPERLESS_PASSWORD" | sudo chpasswd fi } # Docker installieren install_docker() { if ! command -v docker &>/dev/null; then echo "Docker wird installiert..." sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo systemctl enable --now docker fi if ! groups paperless | grep -q "\bdocker\b"; then echo "Füge Benutzer 'paperless' zur Docker-Gruppe hinzu..." sudo usermod -aG docker paperless fi } # Samba Konfiguration configure_samba() { # Backup der Original-Samba-Konfiguration sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak sudo mkdir -p /data/paperless/{backup,restore} sudo chown -R paperless:paperless /data/paperless/ sudo chmod -R 770 /data/paperless/ # Für den Share [consume] soll nur der Ordner /data/paperless/consume freigegeben werden: if ! grep -q "^\[consume\]" /etc/samba/smb.conf; then sudo tee -a /etc/samba/smb.conf > /dev/null <<'EOF' [consume] comment = Paperless Daten path = /data/paperless/consume browsable = yes writable = yes guest ok = no create mask = 0770 directory mask = 0770 valid users = paperless EOF fi # Share für Backup if ! grep -q "^\[backup\]" /etc/samba/smb.conf; then sudo tee -a /etc/samba/smb.conf > /dev/null <<'EOF' [backup] comment = Paperless Backup Daten path = /data/paperless/backup browsable = yes writable = yes guest ok = no create mask = 0770 directory mask = 0770 valid users = paperless EOF fi # Share für Restore if ! grep -q "^\[restore\]" /etc/samba/smb.conf; then sudo tee -a /etc/samba/smb.conf > /dev/null <<'EOF' [restore] comment = Paperless Restore Daten path = /data/paperless/restore browsable = yes writable = yes guest ok = no create mask = 0770 directory mask = 0770 valid users = paperless EOF fi sudo systemctl restart smbd echo "Samba Shares [consume], [backup] und [restore] wurden konfiguriert." (echo "$SAMBA_PASSWORD"; echo "$SAMBA_PASSWORD") | sudo smbpasswd -a paperless -s sudo systemctl restart smbd } # Docker-Compose-Datei erstellen deploy_containers() { echo "Erstelle docker-compose.yml im Verzeichnis von 'paperless'..." sudo mkdir -p /home/paperless cat <<EOL | sudo tee /home/paperless/docker-compose.yml > /dev/null services: broker: image: redis:7 container_name: broker restart: unless-stopped volumes: - /data/paperless/redis/_data:/data db: image: postgres:16 container_name: db restart: unless-stopped volumes: - /data/paperless/postgresql/_data:/var/lib/postgresql/data environment: POSTGRES_DB: paperless POSTGRES_USER: paperless POSTGRES_PASSWORD: $DB_PASSWORD webserver: image: ghcr.io/paperless-ngx/paperless-ngx:latest container_name: webserver restart: unless-stopped depends_on: - db - broker - gotenberg - tika ports: - "8001:8000" volumes: - /data/paperless/consume:/usr/src/paperless/consume - /data/paperless/data:/usr/src/paperless/data - /data/paperless/media:/usr/src/paperless/media - /data/paperless/export:/usr/src/paperless/export environment: PAPERLESS_ADMIN_USER: $ADMIN_USER PAPERLESS_ADMIN_PASSWORD: $ADMIN_PASSWORD PAPERLESS_REDIS: redis://broker:6379 PAPERLESS_DBHOST: db PAPERLESS_TIKA_ENABLED: 1 PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000 PAPERLESS_TIKA_ENDPOINT: http://tika:9998 PAPERLESS_OCR_LANGUAGE: deu PAPERLESS_TIME_ZONE: Europe/Berlin PAPERLESS_CONSUMER_ENABLE_BARCODES: "true" PAPERLESS_CONSUMER_ENABLE_ASN_BARCODE: "true" PAPERLESS_CONSUMER_BARCODE_SCANNER: ZXING PAPERLESS_EMAIL_TASK_CRON: '*/10 * * * *' USERMAP_UID: "1002" USERMAP_GID: "1002" gotenberg: image: gotenberg/gotenberg:8.8 restart: unless-stopped command: - "gotenberg" - "--chromium-disable-javascript=false" - "--chromium-allow-list=.*" tika: image: ghcr.io/paperless-ngx/tika:latest container_name: tika restart: unless-stopped EOL cd /home/paperless sudo docker compose up -d } # Hauptprogramm update_and_install_dependencies add_docker_repo ensure_paperless_user_and_group install_docker configure_samba deploy_containers sleep 60 sudo chown -R paperless:paperless /data/paperless # Lokale IP-Adresse ermitteln LOCAL_IP=$(hostname -I | awk '{print $1}') echo -e "\n🚀 **Paperless ist jetzt bereit!**" echo -e "🔗 **Zugriff im Browser:** http://$LOCAL_IP:8001\n" echo -e "🔗 ** Bitte einmal neu booten"
Um die Scripte unter Linux vom Webserver zu laden, kannst du auch folgenden Befehl verwenden.
wget https://blog.smarthomeundmore.de/wp-content/uploads/install_paperless.sh wget https://blog.smarthomeundmore.de/wp-content/uploads/backup.sh wget https://blog.smarthomeundmore.de/wp-content/uploads/restore.sh
Danach müssen sie mit:
chmod +x install_paperless.sh chmod +x backup.sh chmod +x restore.sh
ausführbar gemacht werden.
Script backup.sh
#!/bin/bash # Skript: backup.sh # Dieses Skript führt ein Backup über docker-compose aus und verschiebt anschließend die Backup-Datei(en). echo "Starte Backup: Ein Backup wird jetzt durchgeführt..." # Wechsel in das Verzeichnis, in dem sich die docker-compose Datei befindet cd /home/paperless || { echo "Fehler: Verzeichnis /home/paperless nicht gefunden."; exit 1; } # Führe den docker-compose Befehl aus sudo docker compose exec webserver document_exporter ../export -z # Prüfe, ob der Befehl erfolgreich war if [ $? -eq 0 ]; then echo "Backup erfolgreich abgeschlossen." # Prüfen, ob das Quellverzeichnis existiert if [ -d "/data/paperless/export" ]; then # Sicherstellen, dass das Zielverzeichnis existiert (falls nicht, wird es angelegt) mkdir -p /data/paperless/backup # Prüfen, ob im Quellverzeichnis Dateien vorhanden sind if compgen -G "/data/paperless/export/*" > /dev/null; then echo "Verschiebe Backup-Datei(en) nach /data/paperless/backup..." mv /data/paperless/export/* /data/paperless/backup/ if [ $? -eq 0 ]; then echo "Datei(en) erfolgreich verschoben." else echo "Fehler beim Verschieben der Datei(en)." fi else echo "Keine Datei(en) im Verzeichnis /data/paperless/export gefunden." fi else echo "Quellverzeichnis /data/paperless/export existiert nicht." fi else echo "Fehler beim Backup." fi
Script restore.sh
#!/bin/bash # Skript: restore.sh # Dieses Skript stellt ein Backup wieder her. set -e echo "Starte Wiederherstellung: Das Backup wird nun wiederhergestellt..." DOCKER_COMPOSE_FILE="/home/paperless/docker-compose.yml" # Funktion zum Auskommentieren der Umgebungsvariablen in docker-compose.yml comment_out_env_vars() { echo "Kommentiere PAPERLESS_ADMIN_USER und PAPERLESS_ADMIN_PASSWORD in der docker-compose.yml aus..." # Erstelle ein Backup der Datei, falls noch nicht gesichert if [ ! -f "${DOCKER_COMPOSE_FILE}.bak" ]; then sudo cp "$DOCKER_COMPOSE_FILE" "${DOCKER_COMPOSE_FILE}.bak" fi # Setze sicherheitshalber Schreibrechte sudo chmod u+w "$DOCKER_COMPOSE_FILE" # Füge das `#` nur hinzu, falls es noch nicht vorhanden ist sudo sed -i 's/^\( *PAPERLESS_ADMIN_USER: \)/#\1/' "$DOCKER_COMPOSE_FILE" sudo sed -i 's/^\( *PAPERLESS_ADMIN_PASSWORD: \)/#\1/' "$DOCKER_COMPOSE_FILE" echo "Variablen erfolgreich auskommentiert." } # Variablen auskommentieren, bevor das Skript weiterläuft comment_out_env_vars # Verzeichnisse definieren BACKUP_DIR="/data/paperless/restore" EXPORT_DIR="/data/paperless/export" DIRECTORIES_TO_DELETE=( "/data/paperless/consume" "/data/paperless/export" "/data/paperless/media" "/data/paperless/postgresql" "/data/paperless/redis" ) # Prüfe, ob das Backup-Verzeichnis existiert if [ ! -d "$BACKUP_DIR" ]; then echo "Fehler: Backup-Verzeichnis $BACKUP_DIR existiert nicht." exit 1 fi # Schritt 1: Docker Compose herunterfahren echo "Wechsle in /home/paperless und fahre Docker Compose herunter..." cd /home/paperless || { echo "Fehler: Verzeichnis /home/paperless nicht gefunden."; exit 1; } sudo docker compose down # Schritt 2: Lösche die angegebenen Verzeichnisse echo "Lösche die folgenden Verzeichnisse:" for dir in "${DIRECTORIES_TO_DELETE[@]}"; do echo " $dir" if [ -d "$dir" ]; then sudo rm -rf "$dir" echo " -> $dir gelöscht." else echo " -> $dir existiert nicht, überspringe..." fi done # Schritt 3: Erstelle das Export-Verzeichnis neu echo "Erstelle das Verzeichnis $EXPORT_DIR..." sudo mkdir -p "$EXPORT_DIR" if [ $? -ne 0 ]; then echo "Fehler: Konnte $EXPORT_DIR nicht erstellen." exit 1 fi # Schritt 4: Suche nach einer Archivdatei im Backup-Verzeichnis (z. B. *.zip) ARCHIVE_FILE=$(find "$BACKUP_DIR" -maxdepth 1 -type f -name "*.zip" | head -n 1) if [ -z "$ARCHIVE_FILE" ]; then echo "Fehler: Keine Archivdatei (*.zip) im Backup-Verzeichnis gefunden." exit 1 fi echo "Gefundene Archivdatei: $ARCHIVE_FILE" # Schritt 5: Kopiere die Archivdatei in das Export-Verzeichnis echo "Kopiere die Archivdatei nach $EXPORT_DIR..." sudo cp "$ARCHIVE_FILE" "$EXPORT_DIR" if [ $? -ne 0 ]; then echo "Fehler beim Kopieren der Archivdatei." exit 1 fi # Schritt 6: Wechsel in das Export-Verzeichnis und entpacke die Archivdatei cd "$EXPORT_DIR" || { echo "Fehler: Konnte nicht in $EXPORT_DIR wechseln."; exit 1; } # Überprüfe, ob 'unzip' installiert ist und installiere es gegebenenfalls if ! command -v unzip >/dev/null 2>&1; then echo "Das Paket 'unzip' ist nicht installiert. Versuche, es zu installieren..." if command -v apt-get >/dev/null 2>&1; then sudo apt-get update && sudo apt-get install -y unzip elif command -v yum >/dev/null 2>&1; then sudo yum install -y unzip else echo "Kein unterstützter Paketmanager gefunden. Bitte installiere 'unzip' manuell." exit 1 fi fi # Entpacken der Archivdatei ARCHIVE_BASENAME=$(basename "$ARCHIVE_FILE") echo "Entpacke $ARCHIVE_BASENAME..." unzip "$ARCHIVE_BASENAME" if [ $? -ne 0 ]; then echo "Fehler beim Entpacken von $ARCHIVE_BASENAME." exit 1 fi echo "Archiv erfolgreich entpackt." # Optional: Entferne die kopierte Archivdatei, falls sie nicht mehr benötigt wird # sudo rm "$ARCHIVE_BASENAME" # Schritt 7: Starte Docker Compose Container neu echo "Wechsle zurück nach /home/paperless und starte die Container..." cd /home/paperless || { echo "Fehler: Verzeichnis /home/paperless nicht gefunden."; exit 1; } sudo -u paperless docker compose up -d if [ $? -ne 0 ]; then echo "Fehler: Docker Compose konnte nicht gestartet werden." exit 1 fi sudo chown -R paperless:paperless /data/paperless/consume /data/paperless/media sudo chmod -R 775 /data/paperless/consume /data/paperless/media sudo chown paperless:paperless /home/paperless/docker-compose.yml sleep 60 cd /home/paperless # Schritt 8: Führe den Importbefehl aus echo "Führe Importbefehl aus..." sudo docker compose exec webserver document_importer ../export sudo chown -R paperless:paperless /data/paperless if [ $? -eq 0 ]; then echo "Import erfolgreich abgeschlossen." else echo "Fehler beim Import." exit 1 fi echo " Bitte einmal das System neu booten ! " echo "---------------------------ENDE--------------------------------"
ASN QR Codes generieren
Avery Zweckform QR-Code Generator von Tobias L. Meier: https://tobiasmaier.info/asn-qr-code-label-generator/
Home Assistant Rest API Sensoren
Im Video habe ich auch gezeigt, wie man einen Sensor in Home Assistant erstellt, um sich die Anzahl der Dokumente im Posteingang anzeigen zu lassen. Die Informationen dazu habe ich von Flemming´s Blog, wo einige Beispielsensoren zu finden sind. Tolle Arbeit und sehr gut erklärt.
Monitoring Paperless-ngx in Home-Assistant – Flemming’s Blog
Empfohlene Hardware für die Digitalisierung und die QR Codes
Ein weiterer Scanner, der häufiger im Kontext mit paperless-ngx genannt wird, ist der Brother ADS-1700W. Da ich diesen allerdings nicht selber getestet habe, kann ich keine direkte Empfehlung dazu aussprechen.
Vorschau | Produkt | Preis | |
---|---|---|---|
![]() |
Brother ADS-1700W Kompakter und intelligenter Dokumentenscanner |… | 349,00 EUR | Bei Amazon kaufen |
Solltest du in den Scripten noch Fehler finden, kannst du mir gerne deine Korrekturen als Mail zukommen lassen. Meine Kontakdaten findest du im Impressum.