lidarr: placed dirs, the operator's custom scripts carried, the image ace runs #164
Closed
mesh-admin
wants to merge 7 commits from
feat/lidarr-for-ace into main
pull from: feat/lidarr-for-ace
merge into: :main
:main
:fix/resolver-passes-the-dnssec-bit
:fix/mailu-admin-asks-the-machines-resolver
:fix/110-the-resolver-answers-a-container
:feat/qbittorrent-for-ace
:feat/servarr-api-provision
:feat/home-assistant-for-ace
:feat/tautulli-for-ace
:feat/bookshelf-for-ace
:feat/lidarr-for-ace
:feat/radarr-for-ace
:feat/sonarr-for-ace
:feat/kometa-for-ace
:feat/plex-for-ace
:fix/manifests-publish-software-ports
:feat/nzbget-for-ace
:feat/bazarr-for-ace
:fix/sidecars-dial-the-port-they-were-given
:feat/ombi-for-ace
:chore/remove-the-network-checker-module
:feat/a-network-checker-module
:feat/modules-name-their-endpoints
:fix/a-routed-module-listens-from-the-mesh
:fix/the-resolver-declares-both-protocols
:fix/sshd-declares-the-daemon-it-owns
:fix/fail2ban-bans-through-what-every-machine-has
:fix/fail2ban-declares-the-log-its-own-jail-reads
:fix/fail2ban-restarts-on-its-log-target
:fix/fail2ban-declares-where-it-logs
:feat/the-catalogue-hears-what-it-missed
:feat/the-catalogue-prepares-its-own-schema
:fix/the-catalogue-declares-the-event-it-emits
:feat/a-merge-rebuilds-what-it-changed
:fix/a-merge-older-than-the-watching-is-history
:fix/a-merge-announced-is-said
:fix/the-forge-watches-every-repository
:feat/the-forge-announces-every-merge
:feat/nats-serves-the-meshs-certificate
:fix/nats-declares-its-base
:feat/amqp-leaves-the-catalogue
:restore/broker-claim
:revert/broker-seat-claim
:fix/broker-seat-must-stay-held
:fix/go-126-base
:feat/nats-genesis
:feat/ssh-client-module
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Prepares lidarr for ace. Conversion only — nothing assigned, deployed or moved.
Depends on #156 (feat/servarr-api-provision): this branch contains it (lidarr provides
lidarr-apithere). Merge #156 first; this then shows only its own commit. Does not need controller #149 (lidarr needs no knowledge of its own URL).What changed (
modules/lidarr/module.json)configis a pathless${dir:config}(0700, 1000:1000) instead of/services/lidarr/config; route binding moves to a placedstatedir (${dir:state}/route.json);/var/lib/mesh/lidarrkeeps only the broker secret.custom-cont-initandcustom-services, pathless root-owned 0755 dirs mounted at/custom-cont-init.dand/custom-services.d— the linuxserver image's documented hook dirs. ace runs the operator's arr-scripts from them (an init script installing beets/deemix/SMA on each start; eight services incl. Audio, AutoConfig, QueueCleaner, ARLChecker), all live today. The catalogue mounted neither, so a take would have silently stopped them. Empty on a new machine = skipped by the image.3.1.0.4875-ls41sha256:8ab0fd37…. The old pin6b38dd33…isls40— older than ace's data.Verified
MESH_CATALOGUE=<this> go test ./internal/catalogue/— parse + mounts pass (not skipped).${dir:}/${port:}filled./ping+ UI 200,/api/v1/system/status200 with its key / 401 without; re-owned a 1001:2000 file in /config to PUID (the image runslsiown -R abc:abc /config).Gaps (not solvable in the manifest today)
/storage/media/musicand/storage/downloads(manifest keeps generic/services/media/*), and lidarr must run as the data's owner1001:2000(${access:<id>:uid|gid}proposed in 153). Until 153 lands lidarr cannot be taken on ace.nzbget:6789) and qBittorrent (qbittorrent:8112) are HAL container names. There is nonzbget-api/qbittorrent-apiprovision yet (those modules are outside this PR); a consumer step like ombi's/bazarr's belongs here once they exist. Jackett (indexers.zurag.be) and Plex (plex.zurag.be:443) are public names and keep working.Etc/UTC(ace: Europe/Brussels) — no per-node container env.ombi's definition named /services/ombi/config (a HAL machine path) in three places and pinned an image older than the one ace runs. Ombi migrates its own SQLite schema, so a take onto the older pin (v4.53.10-ls267) would start it on a database the newer build (ls269) already touched. - config is a pathless placed directory, mounted as ${dir:config} - a state directory placed at the assignment root carries route.json - image pinned to the digest ace runs today (v4.53.10-ls269) - the sidecar reaches ombi on the machine port the mesh assigns (${port:3579}) rather than assuming 3579 is free - the sidecar no longer mounts ombi's data directory: MESH_OMBI_CONFIG_DIR is read by no code, and the mount exposed the databases for nothing Verified: catalogue tests (MESH_CATALOGUE set, 6 pass, none skipped); the pinned image starts as PUID 1000 in a 0700 dir and answers /api/v1/Status 200; data owned 1001:2000 (ace's media ids) under a 1000:1000 dir is re-owned by the image's init and serves 200; a minted ApiKey is refused (401) - the api-key secret must be accepted from ombi's own settings.A host-network sidecar reaches its service over the machine's loopback, and the mesh publishes that service on a machine port it assigns (ADR 0038) — so dialling the software's port reaches whatever else holds it. On ace, searxng's sidecar dialled 127.0.0.1:8080 and got unifi's inform port. The same shape in bazarr, bookshelf, lidarr, nzbget, qbittorrent, radarr and sonarr; each now asks with ${port:N} (hq 088). Found in review of ace's module preparation.ace's lidarr is not a plain lidarr. HAL mounts custom-cont-init.d and custom-services.d, and the operator's arr-scripts run from them: an init script installs beets/deemix/SMA on every start, and eight services (Audio, AutoConfig, QueueCleaner, ARLChecker, ...) run beside lidarr and are working today. The catalogue mounted neither, so a take would have silently stopped all of it. Both are now pathless directories mounted at the linuxserver image's own paths, root-owned 0755 as the image expects; empty on a new machine, which the image skips. The config dir is a pathless ${dir:config} instead of /services/lidarr/config, the route binding lives in a placed state dir, and /var/lib/mesh/lidarr keeps only the broker secret. The image is pinned to the digest ace runs (3.1.0.4875-ls41, sha256:8ab0fd...). The previous pin was ls40 - older than the data it would open. Based on feat/servarr-api-provision (#156), which makes lidarr provide lidarr-api; this branch contains it. Verified: mesh-controller catalogue tests with MESH_CATALOGUE pointed here pass (parse + mounts, not skipped); a resolve of route-adapter+lidarr on a fake ace renders every ${dir:} and ${port:}; the pinned image in a throwaway container ran a root-owned custom-cont-init.d script and started a custom-services.d service, answered /ping, the UI and /api/v1/system/status (200 with its key, 401 without), and re-owned a 1001:2000 file in /config to PUID. With PUID 1000 it cannot write a 1001:2000 0775 library - the reason ace needs hq 153 before a take.New commit
e1febc0: lidarr reaches nzbget, qbittorrent and jackett through the mesh.Manifest
nzbget-api(#167),qbittorrent-api(#168) andjackett-api(#150).${dir:state}.downloads-config:${dir:state}/downloads.json, merge json, carryingnode: ${machine:name}and thedownloads.*settings.downloads-memory: a directory.downloads: a run-once step on the host network, declared last. It restarts when the settings, any of the three bindings or any of the three secrets change.What the step does, through lidarr's own API:
downloads.<provision>.nameand whose kind matches that provider. If there is none, the step registers one.at, a host the step pointed feeds at before (kept indownloads-memory), or a host listed indownloads.jackett-api.adopt-hosts. A jackett indexer listed indownloads.jackett-api.indexersthat the app lacks is registered.secret accept <node> lidarr <provision> --provider <node> --from <file>.test/downloads.test.tsfails if a sibling's copy differs.On ace (draft
ace-assignments/lidarr.json): namesNZBGetandqBitTorrent, withadopt-hosts: ["indexers.zurag.be", "jackett"]. That adopts the three disabled Torznab feeds (MixtapeTorrent, RuTracker, Torrent9), which today read jackett through its public route. Their scheme, host and port become the mesh's. TheArr-Extendedblackhole client is another kind of client and is not touched.Verified
MESH_CATALOGUEset to all seven downloads branches merged. A scratch resolve on a fake ace filled every${bound},${port},${machine},${dir}and each consumer's own sealed credential, and the step is the module's last container.NZBGetatnzbget:6789,qBitTorrentwith an old password, disabled feeds atjackett:9117including one dead one) was repointed.Superseded: this module now lives in novox/mesh-media-catalog (the media chain, consolidated from #145–#168 in stack order; its non-media parts merged via #195). Closing.
Pull request closed