Paperless-ngx mit Docker auf Synology NAS: cannot dereference 'var/lib/mysql/mysql.sock': No such file or directory

Pfandfinder

Lieutenant
Registriert
Nov. 2020
Beiträge
711
Hallo,

ich habe derzeit paperless-ngx per docker auf meinem vps am laufen und möchte es lokal auf mein synology NAS übertragen. habe alle daten übertragen aber der Datenbank-Container meldet sehr oft den Fehler:

Code:
chown: cannot dereference 'var/lib/mysql/mysql.sock': No such file or directory

Wenn ich die ganzen Daten aber am PC testweise starte mit Docker Desktop funktioniert es problemlos. Was ist denn das Problem ? Ich verwende als Datenbank MariaDB.

Code:
db:
  image: docker.io/library/mariadb:10
 
Wie hast du Paperless übertragen?
Hast du ein Datenbank-Dump gemacht?
Welche Version von MariaDB oder MySQL hast du auf den VPS genutzt?
Hast du Paperless auf den VPS in Docker laufen lassen?

Zeig mal deine docker-compose.yml
Ein Update auf MariaDB 11 kann auch nicht schaden.

Fragen über Fragen...
Ergänzung ()

Code:
db:
 image: mariadb:11
 
Zuletzt bearbeitet von einem Moderator:
Hab alles (Ordner database, media, etc. Und die configs) als tar verpackt und wieder entpackt auf dem NAS. Auf dem vps die gleiche config also version 10. Und ja lief natürlich dort auch mit docker. Update auf 11 und das von GitHub teste ich mal.
 
Solch eine Aktion kann bei einer Datenbank in die Hose gehen! Der Weg über einen Export (Dump) ist der richtige! Das kannst du über phpMyAdmin machen wie auch im Container oder im DS-Aufgabenplaner. Das von Github kannst du lassen, das ist meiner Meinung nach 2 Jahre alter Kram.

Wenn Paperless im VPN noch läuft, mache als Erstes einen Dump der Datenbank!!!
 
Zuletzt bearbeitet:
Weil das einfach bei Datenbanken so ist und auch schon immer so war. Einfach die entsprechende Anleitung zur MariaDB Datenbank lesen. Wer mutig ist, kopiert die gemounteten Files und versucht sein Glück. Das Problem wird dich irgendwann einmal beschäftigen. Besser ist es daher vorher, sich mit der Problematik auseinanderzusetzen und zu testen. Die Problematik ist aber auch nur bei Datenbank-Container.

Ich kann nicht sagen, wie oft du deinen Container updatest, aber selbst bei einer Neuinstallation kannst du u.U. Probleme mit dem Tag verursachen. Damit wird immer die letzte Version vom Server gezogen, diese können aber bei beiden Installationen unterschiedlich sein und so einen Fehler verursachen. Mit einem Dump passiert sowas nicht!

Ich würde den Container neu und clean aufsetzen und ein Dump einspielen.
 
Soll also bedeuten dass auch Backups mit Restic gar nicht sauber sind.. ? Ich sichere so regelmäßig die Datenordner von docker Programmen, auch der Datenbank (Container sind dabei heruntergefahren)
 
Wenn es um die Datenbank geht, ist es immer eine Gefahr. Ich glaube, das habe ich dir schon einmal geschrieben, wenn ich mich richtig erinnere. In dem Zusammenhang war die Frage, ob man die DB anhält oder nicht.

Ich würde den Umzug nicht einfach so machen. Datenbanken erfordern meistens bisschen mehr Aufmerksamkeit als SQLite. Paperless als auch der Umzug auf eine DS ist aber kein Problem.

Entferne den Stack einmal und füge diesem mit dem neuen Container-Image wie in #3 angegeben hinzu und starte den Stack.

Einen Dump kannst du wie geschrieben auf unterschiedliche Wege machen, aus dem Container, mit anderen Containern oder über den Aufgabenplaner und dann ab ins Backup. Wer es lieber mag, kann das auch über eine GUI wie phpMyAdmin (Container oder Synology-App) oder Adminer (Container) machen. Der Container muss und darf natürlich nicht angehalten werden, da dieser ansonsten ja nicht erreichbar wäre. Auch ein Export zum kompletten Wechsel zu einer anderen DB wäre kein Problem, das wird aber in Paperless über die Exportfunktion gemacht.

Läuft Paperless noch auf den VPS? Kannst du dort einen Dump oder Export (Paperless) sicherheitshalber noch machen?
 
Danke, mit dump hat es nun geklappt und Paperless läuft.

wie setze ich so ein Backup aber in der Realität um ? Ich würde es eigentlich so machen: Auf dem NAS Container beenden und Backup mit Hyper Backup erstellen, danach wieder starten.

wenn ich jetzt lieber ein Dump machen soll, dann also vor dem Backup das Dump (umständlich per Putty erst drauf schalten und Befehle ausführen?) erzeugen, das am besten in /docker/paperless kopieren damit es später beim Hyper Backup mit dabei ist und dann Container beenden und Hyper Backup starten ? oder hast du eine bessere Idee wie ich das mache ?

Die Backups mache ich manuell da ich es auf eine externe HDD sichere die ich manuell anschließe.
 
Du kannst die Container bzw. die Ordner unter /docker weiterhin mit Hyperbackup sichern. Die Container musst du dabei nicht anhalten, kannst es aber über die API, wenn es sein muss. Dann musst du vor der Hyperbackup-Aufgabe die Container mittels anderer Aufgaben stoppen und nach dem Backup wieder starten. Das ist kein Problem, ich mache das aber nicht.

Entscheidend ist eher, dass, wenn es beim Wiederherstellen zu einem Fehler kommt, auch ein Dump vorhanden ist. Das kannst du einfach vorher automatisch über den Aufgabenplaner anlegen und gleich ins Hyperbackup wandern lassen. Die erstellte Datei landet dann je nach mount gleich in den Datenbank-Ordner unter Paperless/db in /docker. Dazu darf der DB-Container nicht ausgeschaltet sein! Diese Problematik betrifft auch nur Datenbanken außer SQLite.

Mach dir das Leben nicht schwerer, als es ist. Letztendlich ist das nur eine Aufgabe (Kein Terminal, SSH usw. notwendig). Bei allen läuft das hier automatisch und von alleine. Auch die User, die eine externe HDD am NAS nutzen können, lassen diese HDD automatisch einhängen und auswerfen. Besser ist es natürlich, die HDD sicher zu verwahren. Ein internes tägliches Backup würde ich dir wegen der Versionierung anraten, da ich nicht weiß, wie regelmäßig du das manuelle Backup machst.

In dem anderen Beitrag habe ich alles schon einmal geschrieben. Bevor man etwas Produktives einsetzt, sollte man auch das Wiederherstellen testen. Bei Docker ist das aber alles halb so schlimm, weil man wirklich viel machen muss bis man das schrottet.
 
wie sieht so ein Script in der Aufgabenplanung dann aus ? mit dem Befehl in der Shell habe ich ohne sudo ja keine Berechtigungen und mit sudo kommt die PW-Abfrage :

Code:
docker run --rm --network paperless_default mariadb:10 mysqldump -h db -u paperless -p'XXX' paperless > paperless_dump.sql
 
Mit deinem Code würdest du einen Container erstellen, der den Dump ausführt und sich danach selbst löscht. Das kann man genauso machen wie einen dauerhaften Backup-Container, der regelmäßig einen Dump macht. Neben der GUI (siehe #11) ist das Ausführen einer Aufgabe (root) eine weitere Möglichkeit:

Code:
docker exec containername mariadb-dump --user=paperless --password=xxx paperless > /volume1/docker/paperless/db/export/$(date +%Y-%m-%d_%H-%M)_paperless-ngx.sql

Du musst nur den Containernamen der Datenbank, User, Pass, Datenbank Pfad und Dump entsprechend anpassen:
docker exec containername mariadb-dump --user=paperless --password=xxx paperless > /volume1/docker/paperless/db/export/$(date +%Y-%m-%d_%H-%M)_paperless-ngx.sql

Das restlicche, was noch schwarz ist besagt; dass ein Container angeprochen werden soll, was zu machen ist und die Variablen.

Im oben genannten Beispiel wird nur die eine Datenbank (paperless) exportiert, man kann auch mehrere Datenbanken gleichzeitig angeben oder auch ein komplettes Backup (alle Datenbanken) von MariaDB oder MySQL. Das ist aber nur notwendig, wenn mehrere Anwendungen und Dienste auch in einem Datenbank-Container (nicht Stack) laufen.

Auch das Wiedererstellen funktioniert ähnlich:
Code:
docker exec -i containername mariadb --user=paperless --password=xxx paperless < /volume1/docker/paperless/db/export/dump-datei-namen.sql

Wenn du das Datum im Dumpnamen nicht benötigst, entfernst du einfach: $(date +%Y-%m-%d_%H-%M)_ aus der Aufgabe. Dann wird der Dump (paperless-ngx.sql) bei jedem Ausführen überschrieben. Das kann man machen, wenn man täglich ein Backup mit Hyperbackup macht, da man das Datum im Hyper Backup auswählen kann. Dann muss man auch beim Wiederherstellen nicht den Dumpnamen manuell anpassen!

Im Aufgabenplaner kannst du die Häufigkeit als auch die Zeit für das Backup einstellen. Achte bitte darauf, dass die Aufgabe als Benutzer "root" eingestellt ist und dass diese Aufgabe aktiviert ist, damit sie zukünftig automatisch ausgeführt werden kann.

Natürlich kannst du diese Befehle auch direkt in der CLI, Terminal, Putty usw. absetzen. Dazu muss man aber als "root" mit sudo -i auch angemeldet sein!

Mit
Code:
find /volume1/docker/paperless/db/export/ -name "*.sql" -mtime +7 -exec rm {} \;
kannst du die alten Dumps aufräumen und nach 7 Tagen automatisch löschen. Der Wert kann natürlich angepasst werden. Eine Aufgabe als "root" ist hierfür nicht nötig!

Die compose zu zeigen bist du auch nicht nachgekommen, dann hätte man die Pfade etc. besser erkennen und anpassen können, bevor die nächste Frage kommt. Ansonsten da nachfragen woher du die Compose hast, da es viele Unterschiede in den Anleitungen gibt, welche unterschiedliche Probleme machen können. Am besten bleibt man bei original vom Entwickler.

Warum nutzt du MariaDB und nicht Postgres was bei Paperless eigentlich default ist. MairaDB/MySQL kam zuletzt erst als Datenbank dazu. Davor war noch SQLite an Bord. Hat das einen bestimmten Grund weil du noch andere Dienste mit MariaDB nutzt? Oder war das nur aus irgend einer einer Anleitung?
 
Zuletzt bearbeitet von einem Moderator:
Danke! mit dem Update auf Maria DB 11 funktioniert mysqldump ja aber nicht mehr. ist da dieser Befehl eine Alternative ?

Code:
docker run --rm --network container:paperless_db mariadb:10 sh -c 'exec mysqldump -h127.0.0.1 -upaperless -p"$0" paperless' 'xxx' > /xxx/dump.sql

Warum ich damals von SQLite zu Maria ging weiß ich nicht mehr, vermutlich weil ich davon öfter höre als PostgreSQL. Ist aber auch schon lang her inzwischen. Die compose Datei habe ich mit der Zeit immer wieder angepasst und verbessert durch verschiedene Quellen. Hier die aktuelle.

Code:
services:
  db:
    image: docker.io/library/mariadb:11
    container_name: paperless_db
    restart: no
    volumes:
      - /volume1/docker/paperless/database:/var/lib/mysql
    environment:
      MARIADB_HOST: paperless
      MARIADB_DATABASE: paperless
      MARIADB_USER: paperless
      MARIADB_PASSWORD: ${PAPERLESS_DB_PASSWORD}
      MARIADB_ROOT_PASSWORD: ${PAPERLESS_ROOT_DB_PASSWORD}

  redis:
    image: docker.io/library/redis:8
    container_name: paperless_redis
    restart: on-failure:3
    mem_limit: 512m
    mem_reservation: 256m
    cpu_shares: 768
    security_opt:
      - no-new-privileges:true
    read_only: true
    healthcheck:
      test: ["CMD-SHELL", "redis-cli ping || exit 1"]
    volumes:
      - redisdata:/data
    environment:
      TZ: Europe/Berlin

  gotenberg:
    image: docker.io/gotenberg/gotenberg:8.21.1
    container_name: paperless_gotenberg
    security_opt:
      - no-new-privileges:true
    restart: on-failure:3
    command:
      - "gotenberg"
      - "--chromium-disable-javascript=true"
      - "--chromium-allow-list=file:///tmp/.*"

  tika:
    image: ghcr.io/paperless-ngx/tika:latest
    container_name: paperless_tika
    restart: on-failure:3

  paperless:
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    container_name: paperless
    restart: no
    depends_on:
      - db
      - redis
      - gotenberg
      - tika
    ports:
      - "8000:8000"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000"]
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - /volume1/docker/paperless/data:/usr/src/paperless/data
      - /volume1/docker/paperless/export:/usr/src/paperless/export
      - /volume1/docker/paperless/media:/usr/src/paperless/media
    environment:
      PAPERLESS_REDIS: redis://redis:6379
      PAPERLESS_DBENGINE: mariadb
      PAPERLESS_DBHOST: db
      PAPERLESS_DBUSER: paperless
      PAPERLESS_DBPASS: ${PAPERLESS_DB_PASSWORD}
      PAPERLESS_DBPORT: 3306
      PAPERLESS_TIKA_ENABLED: 1
      PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
      PAPERLESS_TIKA_ENDPOINT: http://tika:9998
      PAPERLESS_SECRET_KEY: ${PAPERLESS_SECRET_KEY}
      PAPERLESS_OCR_LANGUAGE: deu+eng
      PAPERLESS_OCR_OUTPUT_TYPE: pdfa
      PAPERLESS_OCR_USER_ARGS: '{"invalidate_digital_signatures": true}'
      PAPERLESS_FILENAME_FORMAT: '{{ created_year }}/{{ doc_pk }}'
      PAPERLESS_ACCOUNT_SESSION_REMEMBER: "True"
      PAPERLESS_TIME_ZONE: Europe/Berlin
      PAPERLESS_URL: "https://192.168.10.2"
      USERMAP_UID: 1027
      USERMAP_GID: 100

volumes:
  redisdata:
 
Pfandfinder schrieb:
Danke! mit dem Update auf Maria DB 11 funktioniert mysqldump ja aber nicht mehr.
Das wäre mir neu, wie kommst du darauf? Ich halte das für ein Gerücht. Gerade MariaDB und MySQL sind da sehr gediegen.

https://mariadb.com/docs/server/clients-and-utilities/backup-restore-and-import-clients/mariadb-dump

Hast du den Befehl als Aufgabe gestartet und auch die Daten und Pfad angepasst. Den Ordner musst du vorher natürlich im Filmmanager erstellen. Im Aufgabenplaner kann man das Log exportieren.
 
Dein Befehl geht mit 11 nicht, und begebe ich mich in den Container kommt das:

Code:
# mysqldump
bin/sh: 1: mysqldump: not found

Mit Version 10 geht es noch. Laut ChatGPT ist "Ab MariaDB 11 mysqldump nicht mehr standardmäßig im Container enthalten. Du hast zwei Möglichkeiten:"

Und mit deinem Befehl kommt ein Verbindungsfehler:

Code:
mariadb-dump: Got error: 2002: "Can't connect to server on 'paperless' (115)" when trying to connect

Mit meinem docker run Befehl funktioniert es an sich nun.
 
Wo gibst du den Befehl ein?
Du sollst den Befehl entweder als Aufgabe anlegen oder in Telnet/SSH in DSM (root) eingeben.
Ergänzung ()

Außerdem ist der Befehl mariadb-dump und nicht mysqldump.
Warum nimmst du nicht die Befehle aus #13. Da ist doch wirklich alles erklärt, wie das aufgebaut ist. In #15 ist noch einmal die originale Dokumentation dazu
 
Zuletzt bearbeitet von einem Moderator:
Ja da hab ichs versucht. In der Shell kommt der Fehler. So mit --host=localhost funktioniert es nun:

Code:
docker exec paperless_db mariadb-dump --host=localhost --user=paperless --password='xxx' paperless > /volume1/docker/test.sql
 
Du hast nicht richtig gelesen! Du hast ein Fehler, weil der Speicherort nicht vorhanden ist! Ggf. musst du die entsprechenden Ordner anlegen

In #13 steht:
/volume1/docker/paperless/db/export/$(date +%Y-%m-%d_%H-%M)_paperless-ngx.sql
gemäß deiner compose aus #14 musst du den Pfad aber anpassen:
/volume1/docker/paperless/database/export/$(date +%Y-%m-%d_%H-%M)_paperless-ngx.sql
Du kannst aber jeden Pfad angeben, worauf du Lust hast, nur muss dieser eventuell im Notfall nachvollziehbar sein.

Nicht vorhanden Ordner (export) werden nicht automatisch erstellt! Auch das Log hast du nicht angehangen. Ich wette da steht: Verzeichnis ist unbekannt oder nicht vorhanden ist.
Scheinbar weißt du aber noch nicht einmal, wo du das Log herbekommst?
Warum machst du es denn nicht in Putty und postest du Ausgabe hier?
 
Doch habe richtig gelesen, export existiert ja auch, "db" hab ich auch angepasst gehabt. Es lag ja auch nur am fehlenden Parameter "--host=localhost" in deinem Befehl -> mit dem funktioniert es ja nun.
 
Zurück
Oben