summaryrefslogtreecommitdiff
path: root/f3s/beets-art/helm-chart
AgeCommit message (Collapse)Author
2026-07-10beets-art: unpin from r1 + cap CPU to 1 (thermal fix)Paul Buetow
The beets-art CronJob was hard-pinned to r1 via nodeSelector, and its CPU limit was 2 (half the 4-core passively-cooled Beelink N100 on f1). The daily noon fetchart/embedart sweep sustained ~35% CPU for ~28 min and pushed f1 to ~95 C, tripping the FreebsdCpuTemperatureHigh alert (>=80 C for 5m). Two changes: 1. Cap the container CPU limit from 2 to 1. The run takes ~2x longer but stays well under the 6h activeDeadlineSeconds and roughly halves the sustained thermal load. 2. Unpin the CronJob from r1 so the scheduler can spread it. This is a manifest/config change, not a storage migration: the music library is already shared NFS (mounted at the same path on all three r-nodes). The only thing forcing r1 was the music PV/PVC being declared RWO (single-node mount) while shared with Navidrome, which is itself pinned to r1 by its local-path SQLite data PVC. Flip navidrome-music PV/PVC to ReadWriteMany so beets-art can mount it on any r-node alongside the read-only Navidrome pod. Also move beets-art-state from local-path (pinned to r1) to a static NFS-backed RWX PV/PVC so the job's SQLite state is reachable from any node. SQLite-over-NFS is acceptable here because concurrencyPolicy: Forbid guarantees a single writer (no lock contention), and the state is regenerable. Application requires recreating the bound music PVC (access-mode changes are immutable on a bound PVC) and the state PVC; see deploy notes.
2026-05-13f3s/beets-art: schedule at noon Europe/Sofia instead of 03:30 UTCPaul Buetow
Use the CronJob timeZone field (GA since k8s 1.27, supported by the k3s 1.32 cluster) so cron interprets the schedule in local time directly, avoiding manual UTC conversion. Amp-Thread-ID: https://ampcode.com/threads/T-019e223a-d137-705e-879b-84130c0e78ea Co-authored-by: Amp <amp@ampcode.com>
2026-05-13f3s/beets-art: fix fetchart silently disabled by string-not-list configPaul Buetow
beets 2.x parses `sources: coverart itunes amazon albumart` as a single key whose value is "*", rejects it with UnknownPairError, and the entire fetchart plugin fails to load. Net effect: every job ran "successfully" but fetched zero cover art (verified: 0/195 albums had artpath set; all existing cover.jpg files predated the deployment). Convert sources and cover_names to proper YAML lists so the plugin loads. Confirmed network egress is fine (CAA + iTunes return HTTP 200). Amp-Thread-ID: https://ampcode.com/threads/T-019e223a-d137-705e-879b-84130c0e78ea Co-authored-by: Amp <amp@ampcode.com>
2026-05-13f3s/beets-art: pipe yes into embedart to bypass interactive promptPaul Buetow
beet embedart (no -f) hard-codes a "Modify artwork for N albums (Y/n)?" confirmation with no flag to suppress it. The CronJob has no stdin, so the command exits with "stdin stream ended while input required" and embedart never runs. Pipe `yes` into the command; safety still relies on embedart.ifempty:no and embedart.compare_threshold:50 from config. Amp-Thread-ID: https://ampcode.com/threads/T-019e223a-d137-705e-879b-84130c0e78ea Co-authored-by: Amp <amp@ampcode.com>
2026-05-13f3s/beets-art: fix BEETSDIR being read-only (state.pickle write failure)Paul Buetow
The ConfigMap mount at /etc/beets is kernel-enforced read-only, so beets could not write its incremental import state file (state.pickle), which broke incremental: yes — every nightly run would re-walk the entire library. Fix: point BEETSDIR at the writable state PVC (/state) and pass -c /etc/beets/config.yaml on every beet invocation so the ConfigMap is still the single source of truth for config. Also fix the Justfile run-now recipe to use a bash shebang so $() works. Amp-Thread-ID: https://ampcode.com/threads/T-019e223a-d137-705e-879b-84130c0e78ea Co-authored-by: Amp <amp@ampcode.com>
2026-05-13f3s/beets-art: nightly k3s CronJob to fetch+embed cover art for NavidromePaul Buetow
Adds a beets-based CronJob that runs every night on r1 (where the Navidrome music PVC lives), fetching external cover.jpg into each album folder and embedding art into audio files. Idempotent on re-runs: - import.incremental skips already-known album folders - fetchart skips albums that already have cover art - embedart with ifempty:no + compare_threshold:50 only fills missing embeds and refuses risky overwrites Navidrome picks new art up via its existing 1h scan; no Navidrome change required. Reuses navidrome-music-pvc directly (RWO is fine because both pods pin to r1 via nodeSelector). State (library.db, logs) lives on a small local-path PVC, regenerable by deleting the PVC. Files: f3s/beets-art/helm-chart/{Chart.yaml,README.md,templates/*.yaml} f3s/beets-art/Justfile (status, logs, run-now, suspend, resume, shell) f3s/argocd-apps/services/beets-art.yaml Amp-Thread-ID: https://ampcode.com/threads/T-019e223a-d137-705e-879b-84130c0e78ea Co-authored-by: Amp <amp@ampcode.com>