Docker Volumes auf SMB Share Proxmox

shirocko

Cadet 3rd Year
Registriert
Juni 2012
Beiträge
33
Hallo zusammen,

ich bin seit einer Weile dabei meine Docker Umgebung von meiner Synology Disk Station auf meine Docker VM unter Proxmox umzuziehen. Das klappt bisher auch soweit alles wunderbar.

Nun würde ich gerne alle Docker Volumes auf einen SMB Shares lagern, welcher vom Proxmox Host bereitgestellt wird.
Das ermöglicht mir schneller und einfacher auf die Daten zuzugreifen, besonders relevant für Backups und auch für den geplanten Zugriff auf die Dateien meiner Paperless NGX Umgebung.

Ich habe für das SMB Share auf dem Proxmox Host einen neuen SMB User angelegt mit dem Namen "smbdocker" und mit diesem mounte ich das Share auch über die /etc/fstab innerhalb der Docker VM.
Bash:
//192.168.1.70/dockerdata /dockerdata cifs credentials=/root/.smbcredentials_dockerdata,uid=1000,gid=988,file_mode=0664,dir_mode=0750
Die UID 1000 ist mein Standard Benutzer in der Docker VM und 988 die Docker Linux Gruppe.

Für den ersten Container acme.sh klappt die Ablage auch ohne Probleme.

Nun wollte ich aber den Paperless NGX Stack umziehen und stoße hier immer wieder auf Berechtigungsprobleme, besonders mit der Postgre SQL Datenbank. Diese möchte scheinbar während der Installation die Ordnerrechte ändern, was auf dem SMB Share nicht klappt. Und auch der Redis Container beschwert sich über fehlende Rechte, wenn ich den Mount nicht mit 777 oder 770 ausführe.

Hier einmal mein Paperless NGX Stack (über Portainer):
Code:
version: "3.9"
services:
  redis:
    image: redis
    container_name: PaperlessNGX-REDIS
    restart: no
    volumes:
      - /dockerdata/data/paperlessngx/redis:/data:rw

  db:
    image: postgres:16
    container_name: PaperlessNGX-DB
    restart: always

    volumes:
      - /dockerdata/data/paperlessngx/db:/var/lib/postgresql/data:rw
    environment:
      POSTGRES_DB: paperless
      POSTGRES_USER: paperless
      POSTGRES_PASSWORD: xxx

  webserver:
    image: ghcr.io/paperless-ngx/paperless-ngx
    container_name: PaperlessNGX
    restart: always
    depends_on:
      - db
      - redis
      - gotenberg
      - tika
    ports:
      - 8080:8000
    volumes:
      - /dockerdata/data/paperlessngx/data:/usr/src/paperless/data
      - /dockerdata/data/paperlessngx/media:/usr/src/paperless/media
      - /dockerdata/data/paperlessngx/export:/usr/src/paperless/export
      - /dockerdata/data/paperlessngx/dmsinput:/usr/src/paperless/consume
    environment:
      PAPERLESS_REDIS: redis://redis:6379
      PAPERLESS_DBHOST: db
      USERMAP_UID: 1045
      USERMAP_GID: 100
      PAPERLESS_TIME_ZONE: Europe/Berlin
      PAPERLESS_ADMIN_USER: xxx
      PAPERLESS_ADMIN_PASSWORD: xxx
      PAPERLESS_URL: https://paperless.xxx
      PAPERLESS_CSRF_TRUSTED_ORIGINS: https://paperless.xxx
      PAPERLESS_OCR_LANGUAGE: deu+eng
      PAPERLESS_TIKA_ENABLED: 1
      PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000/forms/libreoffice/convert#
      PAPERLESS_TIKA_ENDPOINT: http://tika:9998
      PAPERLESS_FILENAME_FORMAT: "{correspondent}/{created_year}-{created_month}-{created_day}_{correspondent} {document_type} {title}"
      PAPERLESS_TRASH_DIR: ../media/trash
      PAPERLESS_OCR_USER_ARGS: '{"continue_on_soft_render_error": true, "invalidate_digital_signatures": true}'

  gotenberg:
    image: gotenberg/gotenberg
    restart: on-failure:5
    container_name: PaperlessNGX-GOTENBERG
    ports:
      - 3000:3000
    command:
      - "gotenberg"
      - "--chromium-disable-routes=true"
 
  tika:
    image: ghcr.io/paperless-ngx/tika
    container_name: PaperlessNGX-TIKA

    ports:
      - 9998:9998
    restart: always

Der DB Container wirft anschließend im Log folgenden Fehler:
Code:
initdb: error: could not access directory "/var/lib/postgresql/data": Permission denied
chmod: changing permissions of '/var/lib/postgresql/data': Operation not permitted
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

Und der Redis Container diesen Fehler:
Code:
1:M 03 Feb 2025 20:18:09.304 # Fatal error: can't open the RDB file dump.rdb for reading: Permission denied
1:M 03 Feb 2025 20:18:09.304 # Fatal error loading the DB, check server logs. Exiting.

Und Paperless selbst wirft diesen Fehler:
Code:
Paperless-ngx docker container starting...
Creating directory /usr/src/paperless/data/index
mkdir: cannot create directory ‘/usr/src/paperless/data/index’: Permission denied

Gibt es eine Möglichkeit einen SMB/CIFS Share für diesen Zweck korrekt zu konfigurieren? (NFS wäre natürlich auch denkbar, wenn es hilft)

Edit:
Hier noch die SMB Share Config zur Info:
Code:
[dockerdata]
  comment = dockershare
  path = /dockerdata
  valid users= @smbgroupdocker
  browsable = yes
  writable = yes
  read only  = no
  guest ok = no
  force create mode = 775
  force directory mode = 775
  inherit permissions = yes
  force user = smbdocker
  force group = smbgroupmedia

Danke
shirocko
 
Konfiguriere doch den Share im Nas einmal mit NFS und SMB. Lesend über SMB zugreifen dürfte ja nicht das Problem werden. Dann kann Linux/ die Container ganz normal arbeiten.
 
Ich könnte den Share auf dem Proxmox Host als NFS konfigurieren.
Von der NAS möchte ich bezüglich der Container weg und möchte das Laufwerk lokal auf dem Proxmox Host nutzen. Meine NAS schaltet sich nachts ab, da ich sie dort nicht benötige und sie Strom sparen kann.
Dafür dann stattdessen der stromsparende Proxmox Mini PC.
Sollte es denn rechtetechnisch mit einem NFS Share vom Proxmox Host besser klappen und die Docker Container können ihre Ordnerrechte selbst passend setzen?

Das Verzeichnis später als SMB Share für den Backup Zugriff zusätzlich anzubieten würde dann natürlich parallel funktionieren.
 
NFS ist jedenfalls deutlich geeigneter als SMB.
 
Windows 10/11 kann ab der Pro Version auch NFS Shares mounten. Der Client ist da nun dabei, nur nach installieren
 
Ok ich habe jetzt einmal testweise auf einen nfs share umgestellt.
NFS Share:
/nfs/exports/dockerdata
chmod 777
chown nobody:nogroup

In der /etc/exports habe ich dann
Code:
/nfs/exports/dockerdata         192.168.1.71(rw,sync,no_subtree_check)

In der Docker VM habe ich das Verzeichnis dann gemountet mittels:
Code:
mount -t nfs 192.168.1.70:/nfs/exports/dockerdata /dockerdata

Der Überordner sieht dann sieht folgt aus:
Code:
drwxrwxrwx   4 nobody nogroup       4096 Feb  3 21:24 dockerdata/

Die Ordner, die ich innerhalb von /dockerdata erstelle haben dann folgende Rechte:
drwxr-xr-x 2 nobody nogroup 4096 Feb 3 21:30 config/
drwxr-xr-x 2 nobody nogroup 4096 Feb 3 21:31 data/

Hier bleibt das Schreibrecht direkt nur noch bei "nobody" durch die Systemstandards.

Wenn ich nun den Stack starten möchte erhalte ich noch vor dem Starten der Container folgenden Fehler:
Failed to deploy a stack: time="2025-02-03T21:35:20Z" level=warning msg="/data/compose/9/docker-compose.yml: the attribute version is obsolete, it will be ignored, please remove it to avoid potential confusion" Network paperless_smb_default Creating Network paperless_smb_default Created Container PaperlessNGX-REDIS Creating Container PaperlessNGX-GOTENBERG Creating Container PaperlessNGX-DB Creating Container PaperlessNGX-TIKA Creating Container PaperlessNGX-DB Created Container PaperlessNGX-TIKA Created Container PaperlessNGX-REDIS Created Container PaperlessNGX-GOTENBERG Created Container PaperlessNGX Creating Container PaperlessNGX Created Container PaperlessNGX-DB Starting Container PaperlessNGX-GOTENBERG Starting Container PaperlessNGX-TIKA Starting Container PaperlessNGX-REDIS Starting Container PaperlessNGX-TIKA Started Container PaperlessNGX-GOTENBERG Started Error response from daemon: error while creating mount source path '/dockerdata/data/paperlessngx/redis': chown /dockerdata/data/paperlessngx/redis: operation not permitted

Edit:
Ok ich konnte den Fehler beheben mittels der Option "no_root_squash" in der /etc/exports.

Da das NFS Share ja nun komplett offen ist (777 und nobody) könnte es doch vermutlich ein größeres Sicherheitsrisiko darstellen.
Kann/sollte ich hier noch irgendwelche Einstellungen abändern bzgl. des NFS Shares?
 
Zuletzt bearbeitet:
Verstehe ich das richtig, du hast das Permission Problem nun "gelöst", indem du den NFS Share einfach mit 777 teilst? Das hättest du natürlich mit SMB auch gekonnt. 🤷‍♂️

Sind denn die Benutzer, z.B. der in der Fehlermeldung genannte postgres auch Teil der GID mit der du den Share mountest? Wenn nicht, bleibt ja nur die "other" Permission.
 
Sykehouse schrieb:
Verstehe ich das richtig, du hast das Permission Problem nun "gelöst", indem du den NFS Share einfach mit 777 teilst?
Nicht ganz. Die Lösung bestand nicht im Setzen von 777, sondern in der Option no_root_squash. Damit durfte der Erstellungsprozess der Postgres Datenbank dann die Ordnerberechtigung auf dem Ziel NFS Server anpassen. Dieser Part funktionierte halt über SMB nicht, da die Ordnerrechte scheinbar fix sind mit dem Mount.

Den User postgres kann ich nicht explizit der Mount Gruppe hinzufügen, weil dieser auf dem Docker System nicht existiert. Dieser wird ja nur innerhalb des Postgres Containers angelegt.

Eventuell versuche ich es morgen noch einmal mit 777 als Recht über SMB, aber zumindest funktioniert dieser Weg erst einmal. Auch wenn es mir etwas zu offen erscheint den Zugriff zwar auf die Docker VM zu beschränken, aber sonst alles komplett ungeschützt zu haben. Theoretisch kann jeder Prozess auf dem Docker Host alle Daten in dem Verzeichnis ändern oder löschen. Nicht besonders reizvoll...
 
Ich hab ein annähernd ähnliches Setup und kann dir sagen: Du willst keine Datenbanken auf ein SMB Share legen welches du in Docker mappst. Dafür ist SMB nicht gedacht und wird IMMER für Probleme sorgen, mal ganz unabhängig von der Berechtigungsproblematik. Ich hatte die Problematik mit Jellyfin, mit FoundryVTT und mit Paperless-ngx.

In einem geschlossenen Netzwerk, also lokal ohne exposing ins böse Internet, ist Docker + NFS + no_root_squash die Lösung. Dann reicht auch ein simples:

Code:
xxx.xxx.xxx.xxx:/share/paperless-ngx /mnt/paperless nfs defaults 0 0

Alternativ kannst du du mit root_squash mounten und postgresql mit einem unpriviligierten User starten und dann das Usermapping auf dem NFS Server entspechend konfigurieren. Ich sehe nur keinen wirklichen Gewinn in einer solchen config. Beispiel:

1. auf dem NFS Server einen user anlegen, z.B. "svc-paperless" mit uid und gid 1004
2. Share enlegen: /export/postgresql 192.168.1.10(rw,sync,root_squash,anonuid=1004,anongid=1004)
3. Berechtigungen konfigurieren: chown -R svc-paperless:svc-paperless /export/postgresql
und chmod 700 /export/postgresql
4. fstab auf dem dockerhost konfigurieren: 192.168.1.20:/export/postgresql /mnt/postgresql nfs rw,sync,noatime 0 0
5. User auf dem Dockerhost anlegen useradd -u 1004 -m -s /bin/bash smbuser
6. Container unter dem user ausführen mit parameter --user 1004:1004
oder die docker-compose entsprechend anpassen.

Ich persönlich spare mir sowas aber und nutze einfach no_root_squash und sichere lieber den Dockerhost bzw. die ganze Proxmox umgebung entsprechend ab.


Ich würde Proxmox übrigens NICHT als Fileserver laufen lassen, sondern dafür eine separate VM bauen die nur Fileserver spielt. Entweder mit virtuellen Disks oder mit durchgereichten Storage. Das lässt sich dan auch einfacher Backuppen.

Wenn es nur um Paperless-NGX geht: Lasse alles lokal in deiner VM und binde nur ein NFS ODER SMB share für das Consume und Export Verzeichnis ein. So kannst du per SMB Files hochladen, dein Backup exportieren und gut ist.

docker-compose Beispiel:
Code:
volumes:
      - data:/usr/src/paperless/data
      - media:/usr/src/paperless/media
      - /mnt/paperless/export:/usr/src/paperless/export
      - /mnt/paperless/import:/usr/src/paperless/consume
 
Hi @TheBeastMaster

vielen Dank für die ausführliche Rückmeldung, welche sehr informativ und hilfreich ist.
Ich melde mich erst jetzt zurück, da ich erst einmal etwas testen musste und wenig dazu kam bisher.

Ich habe mich jetzt zunächst dafür entschiedene eine Openmediavault VM auf Proxmox einzurichten mit ausreichend Speicherplatz.
Diese OMV Instanz soll nun meine zentrale Datenablage für alle Docker Volumes aus meiner Proxmox Docker VM und für meine beiden Raspberry PIs Docker Umgebungen werden.

Aktuell habe ich das NFS Share mit Rechte 777 und no_root_squash eingerichtet und eingeschränkt auf die IP der Proxmox Docker VM.
Sollte das im Homelab ein gangbares Vorgehen sein oder sollte ich doch irgendwie einzelne NFS Shares pro Container bzw. einzelne für Datenbanken erstellen, dann mit root_squash?
Extern erreichbar werden später nur einzelne Container sein, wie Nextcloud.

Openmediavault mit NFS Share hätte dann den Vorteil bzgl. zentralem Backup und ggf. Rsync zu anderen Zielen und Freigabe mittels SMB zum administrativen Zugriff von Windows aus.
 
@GrillSgt Ich habe definitiv auch Bauchschmerzen damit und würde es gerne vermeiden.
Nur die Frage ist, wie funktioniert die halbwegs sichere Alternative?

Ich würde am liebsten das NFS Share unter einem Service User betreiben den alle Docker Container für den Zugriff nutzen, aber der genau nur für diesen Zwecke existiert.
Zusätzlich kann ich aber noch meinen normalen oder den root User nehmen, um darüber Änderungen an Dateien vorzunehmen oder Daten zu sichern.
Nur bisher hat sich ja gezeigt, dass z.B. die Postgres DB immer die Ordnerrechte ändern will im Laufe der Startphase und dafür sind root Rechte auf dem NFS Zielsystem notwenig, was bisher mittels no_root_squash ermöglicht wurde.

Wie sieht hier der saubere Weg über einen Service User aus, den ich für alle Docker Container verwenden kann und der auf das identische NFS Share schreibt, nur in unterschiedliche Unterordner?

Edit:
Ich nun mal testweise folgendes probiert:
Auf OMV habe ich einen User und eine Gruppe erstellt mit dem Namen "dockerdata".
UID und GID = 2000
Gleiche User und Gruppe auf dem Docker Host erstellt, welche UID und GID.
Damit sollte schon einmal das Mapping passen.
Nun habe ich das NFS Share exportiert mit anonuid=2000,anongid=2000
Und den NFS Ordner habe ich berechtigt mit
drwxrws---+ 4 dockerdata dockerdata 4096 10. Feb 22:54 dockerdata

Im Portainer Stack habe ich nun bei jedem Container ergänzt:
user: 2000:2000

Trotzdem kann ich den Stack nicht starten mit der Meldung:
Failed to deploy a stack: Network paperlessngx_nfs_default Creating Network paperlessngx_nfs_default Created Container PaperlessNGX-GOTENBERG Creating Container PaperlessNGX-TIKA Creating Container PaperlessNGX-REDIS Creating Container PaperlessNGX-DB Creating Container PaperlessNGX-TIKA Created Container PaperlessNGX-REDIS Created Container PaperlessNGX-DB Created Container PaperlessNGX-GOTENBERG Created Container PaperlessNGX Creating Container PaperlessNGX Created Container PaperlessNGX-TIKA Starting Container PaperlessNGX-DB Starting Container PaperlessNGX-GOTENBERG Starting Container PaperlessNGX-REDIS Starting Container PaperlessNGX-GOTENBERG Started Container PaperlessNGX-TIKA Started Container PaperlessNGX-REDIS Started Container PaperlessNGX-DB Started Container PaperlessNGX Starting Error response from daemon: error while creating mount source path '/mnt/dockerdata/paperlessngx/export': chown /mnt/dockerdata/paperlessngx/export: operation not permitted
Es wird also immer noch versucht ein chown auszuführen, was scheinbar fehlschlägt.
Ich bin für jede Idee dankbar.

...
Nachdem ich nun beim Start jedes Mal den Fehler permission denied für verschiedene Volumes erhalten habe, ist der Stack plötzlich gestartet und die Ordner wurden angelegt. Aber innerhalb des Paperless Containers erscheinen weiterhin ständig die Meldungen:
Adjusting permissions of paperless files. This may take a while.
chown: changing ownership of '/usr/src/paperless/export': Operation not permitted
chown: changing ownership of '/usr/src/paperless/data': Operation not permitted
chown: changing ownership of '/usr/src/paperless/data/index': Operation not permitted
chown: changing ownership of '/usr/src/paperless/media': Operation not permitted
chown: changing ownership of '/usr/src/paperless/media/documents': Operation not permitted
chown: changing ownership of '/usr/src/paperless/media/documents/originals': Operation not permitted
chown: changing ownership of '/usr/src/paperless/media/documents/thumbnails': Operation not permitted
chown: changing ownership of '/usr/src/paperless/consume': Operation not permitted
...
/sbin/docker-prepare.sh: line 74: /usr/src/paperless/data/migration_lock: Permission denied


Paperless-ngx docker container starting...
Mapping UID and GID for paperless:paperless to 1045:100
usermod: Permission denied.
usermod: cannot lock /etc/passwd; try again later.

Jemand eine Idee?
 
Zuletzt bearbeitet:
Zurück
Oben