From 9729391dcc6aae438e84c55cd51698a413fa0332 Mon Sep 17 00:00:00 2001 From: dtoro Date: Tue, 7 Apr 2026 23:56:27 +0200 Subject: [PATCH] chore(docker): mount ~/Pictures read-write so file ops work; document The first phase-11 file op (inline rename) returns EROFS today because docker-compose mounts ~/Pictures read-only by default. Lightroom-style file operations (rename, move, discard-pile empty) all need to mutate the filesystem, so the right default is :rw. Flips both the backend and worker mounts to :rw with an inline comment explaining the trade-off, and adds a "Photo directory mounts and permissions" section to the README that: - States the default is now :rw - Explains exactly which endpoints fail under :ro (rename, empty discard pile, future move/copy) - Notes the implication: Mulita has full write access to whatever host directory ends up at /host/Pictures, same trust model as Lightroom's catalog folder Co-Authored-By: Claude Opus 4.6 (1M context) --- README.md | 25 +++++++++++++++++++++++++ docker-compose.yml | 9 +++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c265baf..b0a3230 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,31 @@ docker-compose up -d 4. Access the application at `http://localhost:3000` +### Photo directory mounts and permissions + +Mulita is a Lightroom-style manager — file operations (rename, move, +discard, empty discard pile) need to mutate the filesystem under your +photo mounts. The default `docker-compose.yml` mounts: + +- `${PHOTO_DIRS}` → `/photos` (read-write) +- `~/Pictures` → `/host/Pictures` (**read-write** by default so file + operations work on your system Pictures folder out of the box) + +If you want a strict read-only library — for example pointing at a +network share or your authoritative archive — change `:rw` to `:ro` +on the mount in `docker-compose.yml`. Mulita will keep working for +browsing, rating, color labels, picks, heaps, and the discard flag, +but the following endpoints will return an error from the OS +(`EROFS` / `Read-only file system`): + +- `PATCH /photos/{id}` with a new `filename` (rename) +- `DELETE /discard/empty` (file unlinks) +- Future move / copy endpoints + +**Heads up**: with `:rw`, Mulita has full write access to whatever +host directory you mount under `~/Pictures`. Treat the same way you +would Lightroom's catalog folder. + ## Architecture The application consists of 5 Docker services: diff --git a/docker-compose.yml b/docker-compose.yml index 7e351f8..e8978e8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -24,7 +24,11 @@ services: volumes: - ./mulita.yml:/app/config/mulita.yml:ro - ${PHOTO_DIRS:-./photos}:/photos:rw - - ~/Pictures:/host/Pictures:ro + # NOTE: read-write — file operations (rename, move, discard, + # empty discard pile) need to mutate the filesystem. Flip to :ro + # if you want a strict read-only library; the rename / move / + # delete endpoints will then return EROFS. + - ~/Pictures:/host/Pictures:rw - thumbs_data:/data/thumbs - proxies_data:/data/proxies - db_data:/data/db @@ -50,7 +54,8 @@ services: volumes: - ./mulita.yml:/app/config/mulita.yml:ro - ${PHOTO_DIRS:-./photos}:/photos:rw - - ~/Pictures:/host/Pictures:ro + # See backend service for the rationale on :rw. + - ~/Pictures:/host/Pictures:rw - thumbs_data:/data/thumbs - proxies_data:/data/proxies - db_data:/data/db