| Age | Commit message (Collapse) | Author |
|
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.
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|
|
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>
|