From 287e5e6d3fe6f70f20c178b0ded7d0c448b57ff1 Mon Sep 17 00:00:00 2001 From: jochens Date: Wed, 30 Sep 2026 11:58:37 +0200 Subject: [PATCH] bookshelf: its config dir is placed, its image is the one ace runs The config directory was the stated path /services/bookshelf/config; it is now a pathless directory the mesh places (0700, 1000:1000), and the route binding lives in a placed state dir, as in jackett and searxng. /var/lib/mesh/bookshelf stays for the broker secret. The image is pinned to the digest ace runs (hardcover, 0.4.21.182, ls36). The old pin was a February build: older than the database it would open, which Readarr-family apps migrate forward only. The sidecar dials ${port:8787}, the port the mesh assigned, not the software's own (the same one-line change as #154). Not carried from HAL: its install hook seeded config.xml with an API key (the image writes its own on first start, and the data keeps it) and registered nzbget, qbittorrent and jackett through the API with wrong hosts and ports, so ace's bookshelf has no download client and no indexer today. Wiring them is provisioning work that depends on the download-client and jackett providers, and on where ace's books and downloads live (hq 153). Verified: catalogue tests with MESH_CATALOGUE; a scratch resolution with ace's assignment composes books.zurag.be and keeps the port to the mesh; a throwaway container at the pinned digest on a fresh 0700 1000:1000 dir answered /ping and /api/v1/system/status (401 on a wrong key); client.ts typechecks strict, found the key in config.xml and read the queue. --- modules/bookshelf/module.json | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/modules/bookshelf/module.json b/modules/bookshelf/module.json index 4447e4b..49441d8 100644 --- a/modules/bookshelf/module.json +++ b/modules/bookshelf/module.json @@ -39,10 +39,15 @@ "path": "/var/lib/mesh/bookshelf", "mode": "0700" }, + { + "id": "state", + "type": "directory", + "mode": "0700", + "place": "." + }, { "id": "config", "type": "directory", - "path": "/services/bookshelf/config", "mode": "0700", "owner": "1000:1000" }, @@ -50,7 +55,7 @@ "id": "server", "type": "container", "name": "bookshelf", - "image": "ghcr.io/pennydreadful/bookshelf@sha256:388eecc94362580eae31ee0a454be6af516f8a311f8432a521c202fb475f4359", + "image": "ghcr.io/pennydreadful/bookshelf@sha256:67498dd5ece516867d72ee642abd6c1a66b36a135c8f7da0127109564372beb1", "env": { "PUID": "1000", "PGID": "1000", @@ -60,7 +65,7 @@ "8787" ], "volumes": [ - "/services/bookshelf/config:/config", + "${dir:config}:/config", "/services/media/books:/books", "/services/media/downloads:/downloads" ] @@ -72,11 +77,11 @@ "network": "host", "volumes": [ "/var/lib/mesh/bookshelf/broker:/run/secrets/broker:ro", - "/services/bookshelf/config:/var/lib/bookshelf/config:ro" + "${dir:config}:/var/lib/bookshelf/config:ro" ], "env": { "MESH_BROKER_FILE": "/run/secrets/broker", - "MESH_BOOKSHELF_URL": "http://127.0.0.1:8787", + "MESH_BOOKSHELF_URL": "http://127.0.0.1:${port:8787}", "MESH_BOOKSHELF_CONFIG_DIR": "/var/lib/bookshelf/config" }, "artifact": "runtime" @@ -92,7 +97,7 @@ } }, "binds": { - "route": "/var/lib/mesh/bookshelf/route.json" + "route": "${dir:state}/route.json" }, "build": { "on": [