Verweise der Form #123 im folgenden Text beziehen sich auf die GitHub-Nummerierung, nicht auf die Nummern in diesem Repo. Geschlossene Issues wurden nicht mitgezogen und sind weiterhin nur auf GitHub lesbar.
Vorschlag für einen neuen Chart: shelfarr (https://github.com/Pedro-Revez-Silva/shelfarr) — ein selbstgehostetes Anfrage- und Verwaltungssystem für E-Books und Hörbücher im *arr-Umfeld, im Verhältnis zu Büchern etwa das, was seerr zu Filmen und Serien ist.
Dies ist eine Vormerkung, kein freigegebener Plan. Der Zuschnitt unten ist recherchiert, nicht gemessen; die offenen Punkte sind ausdrücklich als solche markiert und vor der Umsetzung zu klären.
Was es tut
Nutzer fragen Titel an, shelfarr sucht über Indexer und Direktquellen, lädt herunter und liefert an eine Bibliotheksplattform aus. Angebunden werden unter anderem Prowlarr, Jackett und NZBHydra2 als Indexer, qBittorrent, Deluge, Transmission, SABnzbd und NZBGet als Downloader sowie Audiobookshelf als Bibliothek. Suche und Metadaten kommen von Open Library, Google Books und Hardcover.
Der Bezug zum bestehenden Bestand ist damit direkt: Prowlarr und qBittorrent laufen bereits in freesailarr. shelfarr gehört aber nicht in diesen Pod — es ist kein Bestandteil der VPN-Kette, sondern ein eigenständiger Dienst mit eigener Datenhaltung und eigener Oberfläche.
Betriebsdaten (aus docker-compose.example.yml und Dockerfile, nicht gemessen)
Health-Endpunkt /up — vorhanden, im Compose-Healthcheck belegt. Angenehme Ausnahme: die Probes brauchen hier keine Ersatzkonstruktion.
Zustand in /rails/storage: SQLite-Datenbanken, Active-Storage-Dateien, Logs
Medienpfade/audiobooks, /ebooks, /downloads — bestehende Claims, gemountet, nicht angelegt (wie die Medien-Claims in freesailarr)
PUID/PGID plus CHOWN_ON_START, gosu ist im Image
SOLID_QUEUE_IN_PUMA=1 — die Hintergrundjobs laufen im Web-Prozess, es braucht also keinen getrennten Worker
RAILS_RELATIVE_URL_ROOT — Sub-Pfad-Ingress wird unterstützt
OIDC/SSO ist eingebaut (Authentik, Authelia, Keycloak) samt TOTP-2FA
Zuschnitt
StatefulSet mit PVC, nicht Deployment: der Zustand liegt in SQLite auf /rails/storage. Daraus folgt zugleich, dass es genau eine Replik gibt — SQLite auf einem Volume verträgt keine zweite, und da die Jobs im selben Prozess laufen, gibt es auch keinen zweiten Workload, der skalieren könnte. Das gehört so in values.yaml, damit niemand die Replikenzahl hochdreht und sich eine korrupte Datenbank einhandelt.
Kein oauth2-proxy. Anders als bei ytdlp-web-player bringt shelfarr OIDC selbst mit und spricht direkt mit Authentik. Ein vorgeschalteter Proxy wäre hier doppelte Authentifizierung ohne Gewinn.
Port über 1024 setzen. Der Standard ist 80; ein containerPort unter 1024 löst Trivys AVD-KSV-0117 aus. HTTP_PORT ist genau dafür da — der Chart setzt ihn selbst und leitet Service und Probes davon ab, statt beides getrennt konfigurierbar zu machen.
Die vier Punkte, die vor einer Umsetzung zu klären sind
1. RAILS_MASTER_KEY — der Punkt mit dem größten Schadenspotenzial. Der Schlüssel wird beim ersten Start automatisch erzeugt und im Storage-Volume abgelegt. Das ist bequem und für diesen Bestand falsch: Wer das Volume verliert, verliert den Schlüssel und damit alle verschlüsselten Zugangsdaten in der Datenbank — die Anwendung startet danach mit einer Datenbank, die sie nicht mehr lesen kann. Vorschlag: den Schlüssel als secrets.masterKeySecretRef über einen OnePasswordItem vorgeben, damit er reproduzierbar ist und nicht nur im PVC existiert. Zu prüfen ist, wie sich das Image verhält, wenn der Schlüssel vorgegeben wird, das Volume aber leer ist.
2. Härtung — ungemessen. Ob die Anwendung mit runAsNonRoot, festem uid und readOnlyRootFilesystem: true läuft, ist offen. Rails braucht üblicherweise ein beschreibbares /rails/tmp, und SQLite braucht Schreibrechte auf dem Storage-Verzeichnis und dessen Elternverzeichnis (für die WAL- und Journal-Dateien). Das ist zu messen, nicht anzunehmen — samt der Frage, ob CHOWN_ON_START bei einem vorgegebenen uid überhaupt noch nötig ist oder stört.
3. Renovate — das Tag-Schema hat gewechselt. Die Veröffentlichungen liefen bis v0.39.7 (31.07.2026) semantisch und sind seit dem 05.08.2026 datumsbasiert: v2026.08.05.1, zuletzt v2026.08.31.1. Eine Regel muss das treffen, und sie ist im Trockenlauf zu belegen — eine gültige Regel ist keine treffende Regel (siehe #158 und die searxng-Runde).
4. Der Libation-Begleiter — Umfang zu entscheiden. Optional lässt sich ein zweiter Container für Audible-Sicherungen betreiben, der über ein gemeinsames Volume und eine Token-Datei mit shelfarr spricht. Er ist nicht erforderlich; die erste Fassung des Charts sollte ihn nach meiner Einschätzung auslassen und ihn allenfalls später als eigenen, standardmäßig ausgeschalteten Workload nachziehen. Die Bewertung gehört aber vor die Umsetzung, nicht mitten hinein.
Aufwandseinschätzung
Vergleichsweise günstig, gemessen an den letzten Runden: ein Workload, ein PVC, ein Health-Endpunkt, der wirklich existiert, brauchbare Versionstags und keine Abhängigkeit. Die Arbeit steckt in den vier Punkten oben, nicht im Chart-Gerüst.
Vor der Umsetzung: Plan vorlegen, Freigabe einholen, Plan hier als Kommentar festhalten — wie in CLAUDE.md beschrieben.
> Migriert aus [`jk-cluster/helm-charts#247`](https://github.com/jk-cluster/helm-charts/issues/247) — urspruenglich angelegt von **jk-cluster-bot** am 2026-09-08.
>
> Verweise der Form `#123` im folgenden Text beziehen sich auf die **GitHub-Nummerierung**, nicht auf die Nummern in diesem Repo. Geschlossene Issues wurden nicht mitgezogen und sind weiterhin nur auf GitHub lesbar.
---
Vorschlag für einen neuen Chart: **shelfarr** (https://github.com/Pedro-Revez-Silva/shelfarr) — ein selbstgehostetes Anfrage- und Verwaltungssystem für E-Books und Hörbücher im *arr-Umfeld, im Verhältnis zu Büchern etwa das, was seerr zu Filmen und Serien ist.
**Dies ist eine Vormerkung, kein freigegebener Plan.** Der Zuschnitt unten ist recherchiert, nicht gemessen; die offenen Punkte sind ausdrücklich als solche markiert und vor der Umsetzung zu klären.
## Was es tut
Nutzer fragen Titel an, shelfarr sucht über Indexer und Direktquellen, lädt herunter und liefert an eine Bibliotheksplattform aus. Angebunden werden unter anderem Prowlarr, Jackett und NZBHydra2 als Indexer, qBittorrent, Deluge, Transmission, SABnzbd und NZBGet als Downloader sowie Audiobookshelf als Bibliothek. Suche und Metadaten kommen von Open Library, Google Books und Hardcover.
Der Bezug zum bestehenden Bestand ist damit direkt: Prowlarr und qBittorrent laufen bereits in `freesailarr`. shelfarr gehört aber **nicht** in diesen Pod — es ist kein Bestandteil der VPN-Kette, sondern ein eigenständiger Dienst mit eigener Datenhaltung und eigener Oberfläche.
## Betriebsdaten (aus `docker-compose.example.yml` und `Dockerfile`, nicht gemessen)
- **Image** `ghcr.io/pedro-revez-silva/shelfarr`
- **Rails-Anwendung** (Ruby 3.3.6, Puma), `RAILS_ENV=production`
- **Port** intern 80, über `HTTP_PORT` frei wählbar
- **Health-Endpunkt `/up`** — vorhanden, im Compose-Healthcheck belegt. Angenehme Ausnahme: die Probes brauchen hier keine Ersatzkonstruktion.
- **Zustand in `/rails/storage`**: SQLite-Datenbanken, Active-Storage-Dateien, Logs
- **Medienpfade** `/audiobooks`, `/ebooks`, `/downloads` — bestehende Claims, gemountet, nicht angelegt (wie die Medien-Claims in `freesailarr`)
- **PUID/PGID** plus `CHOWN_ON_START`, gosu ist im Image
- `SOLID_QUEUE_IN_PUMA=1` — die Hintergrundjobs laufen im Web-Prozess, es braucht also **keinen** getrennten Worker
- `RAILS_RELATIVE_URL_ROOT` — Sub-Pfad-Ingress wird unterstützt
- **OIDC/SSO ist eingebaut** (Authentik, Authelia, Keycloak) samt TOTP-2FA
## Zuschnitt
**StatefulSet mit PVC**, nicht Deployment: der Zustand liegt in SQLite auf `/rails/storage`. Daraus folgt zugleich, dass es **genau eine Replik** gibt — SQLite auf einem Volume verträgt keine zweite, und da die Jobs im selben Prozess laufen, gibt es auch keinen zweiten Workload, der skalieren könnte. Das gehört so in `values.yaml`, damit niemand die Replikenzahl hochdreht und sich eine korrupte Datenbank einhandelt.
**Kein oauth2-proxy.** Anders als bei `ytdlp-web-player` bringt shelfarr OIDC selbst mit und spricht direkt mit Authentik. Ein vorgeschalteter Proxy wäre hier doppelte Authentifizierung ohne Gewinn.
**Port über 1024 setzen.** Der Standard ist 80; ein `containerPort` unter 1024 löst Trivys AVD-KSV-0117 aus. `HTTP_PORT` ist genau dafür da — der Chart setzt ihn selbst und leitet Service und Probes davon ab, statt beides getrennt konfigurierbar zu machen.
## Die vier Punkte, die vor einer Umsetzung zu klären sind
**1. `RAILS_MASTER_KEY` — der Punkt mit dem größten Schadenspotenzial.** Der Schlüssel wird beim ersten Start **automatisch erzeugt und im Storage-Volume abgelegt**. Das ist bequem und für diesen Bestand falsch: Wer das Volume verliert, verliert den Schlüssel und damit alle verschlüsselten Zugangsdaten in der Datenbank — die Anwendung startet danach mit einer Datenbank, die sie nicht mehr lesen kann. Vorschlag: den Schlüssel als `secrets.masterKeySecretRef` über einen `OnePasswordItem` vorgeben, damit er reproduzierbar ist und nicht nur im PVC existiert. Zu prüfen ist, wie sich das Image verhält, wenn der Schlüssel **vorgegeben** wird, das Volume aber leer ist.
**2. Härtung — ungemessen.** Ob die Anwendung mit `runAsNonRoot`, festem uid und `readOnlyRootFilesystem: true` läuft, ist offen. Rails braucht üblicherweise ein beschreibbares `/rails/tmp`, und SQLite braucht Schreibrechte auf dem Storage-Verzeichnis *und* dessen Elternverzeichnis (für die WAL- und Journal-Dateien). Das ist zu messen, nicht anzunehmen — samt der Frage, ob `CHOWN_ON_START` bei einem vorgegebenen uid überhaupt noch nötig ist oder stört.
**3. Renovate — das Tag-Schema hat gewechselt.** Die Veröffentlichungen liefen bis `v0.39.7` (31.07.2026) semantisch und sind seit dem 05.08.2026 datumsbasiert: `v2026.08.05.1`, zuletzt `v2026.08.31.1`. Eine Regel muss das treffen, und sie ist **im Trockenlauf zu belegen** — eine gültige Regel ist keine treffende Regel (siehe #158 und die searxng-Runde).
**4. Der Libation-Begleiter — Umfang zu entscheiden.** Optional lässt sich ein zweiter Container für Audible-Sicherungen betreiben, der über ein gemeinsames Volume und eine Token-Datei mit shelfarr spricht. Er ist nicht erforderlich; die erste Fassung des Charts sollte ihn nach meiner Einschätzung **auslassen** und ihn allenfalls später als eigenen, standardmäßig ausgeschalteten Workload nachziehen. Die Bewertung gehört aber vor die Umsetzung, nicht mitten hinein.
## Aufwandseinschätzung
Vergleichsweise günstig, gemessen an den letzten Runden: ein Workload, ein PVC, ein Health-Endpunkt, der wirklich existiert, brauchbare Versionstags und keine Abhängigkeit. Die Arbeit steckt in den vier Punkten oben, nicht im Chart-Gerüst.
Vor der Umsetzung: Plan vorlegen, Freigabe einholen, Plan hier als Kommentar festhalten — wie in CLAUDE.md beschrieben.
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.
Vorschlag für einen neuen Chart: shelfarr (https://github.com/Pedro-Revez-Silva/shelfarr) — ein selbstgehostetes Anfrage- und Verwaltungssystem für E-Books und Hörbücher im *arr-Umfeld, im Verhältnis zu Büchern etwa das, was seerr zu Filmen und Serien ist.
Dies ist eine Vormerkung, kein freigegebener Plan. Der Zuschnitt unten ist recherchiert, nicht gemessen; die offenen Punkte sind ausdrücklich als solche markiert und vor der Umsetzung zu klären.
Was es tut
Nutzer fragen Titel an, shelfarr sucht über Indexer und Direktquellen, lädt herunter und liefert an eine Bibliotheksplattform aus. Angebunden werden unter anderem Prowlarr, Jackett und NZBHydra2 als Indexer, qBittorrent, Deluge, Transmission, SABnzbd und NZBGet als Downloader sowie Audiobookshelf als Bibliothek. Suche und Metadaten kommen von Open Library, Google Books und Hardcover.
Der Bezug zum bestehenden Bestand ist damit direkt: Prowlarr und qBittorrent laufen bereits in
freesailarr. shelfarr gehört aber nicht in diesen Pod — es ist kein Bestandteil der VPN-Kette, sondern ein eigenständiger Dienst mit eigener Datenhaltung und eigener Oberfläche.Betriebsdaten (aus
docker-compose.example.ymlundDockerfile, nicht gemessen)ghcr.io/pedro-revez-silva/shelfarrRAILS_ENV=productionHTTP_PORTfrei wählbar/up— vorhanden, im Compose-Healthcheck belegt. Angenehme Ausnahme: die Probes brauchen hier keine Ersatzkonstruktion./rails/storage: SQLite-Datenbanken, Active-Storage-Dateien, Logs/audiobooks,/ebooks,/downloads— bestehende Claims, gemountet, nicht angelegt (wie die Medien-Claims infreesailarr)CHOWN_ON_START, gosu ist im ImageSOLID_QUEUE_IN_PUMA=1— die Hintergrundjobs laufen im Web-Prozess, es braucht also keinen getrennten WorkerRAILS_RELATIVE_URL_ROOT— Sub-Pfad-Ingress wird unterstütztZuschnitt
StatefulSet mit PVC, nicht Deployment: der Zustand liegt in SQLite auf
/rails/storage. Daraus folgt zugleich, dass es genau eine Replik gibt — SQLite auf einem Volume verträgt keine zweite, und da die Jobs im selben Prozess laufen, gibt es auch keinen zweiten Workload, der skalieren könnte. Das gehört so invalues.yaml, damit niemand die Replikenzahl hochdreht und sich eine korrupte Datenbank einhandelt.Kein oauth2-proxy. Anders als bei
ytdlp-web-playerbringt shelfarr OIDC selbst mit und spricht direkt mit Authentik. Ein vorgeschalteter Proxy wäre hier doppelte Authentifizierung ohne Gewinn.Port über 1024 setzen. Der Standard ist 80; ein
containerPortunter 1024 löst Trivys AVD-KSV-0117 aus.HTTP_PORTist genau dafür da — der Chart setzt ihn selbst und leitet Service und Probes davon ab, statt beides getrennt konfigurierbar zu machen.Die vier Punkte, die vor einer Umsetzung zu klären sind
1.
RAILS_MASTER_KEY— der Punkt mit dem größten Schadenspotenzial. Der Schlüssel wird beim ersten Start automatisch erzeugt und im Storage-Volume abgelegt. Das ist bequem und für diesen Bestand falsch: Wer das Volume verliert, verliert den Schlüssel und damit alle verschlüsselten Zugangsdaten in der Datenbank — die Anwendung startet danach mit einer Datenbank, die sie nicht mehr lesen kann. Vorschlag: den Schlüssel alssecrets.masterKeySecretRefüber einenOnePasswordItemvorgeben, damit er reproduzierbar ist und nicht nur im PVC existiert. Zu prüfen ist, wie sich das Image verhält, wenn der Schlüssel vorgegeben wird, das Volume aber leer ist.2. Härtung — ungemessen. Ob die Anwendung mit
runAsNonRoot, festem uid undreadOnlyRootFilesystem: trueläuft, ist offen. Rails braucht üblicherweise ein beschreibbares/rails/tmp, und SQLite braucht Schreibrechte auf dem Storage-Verzeichnis und dessen Elternverzeichnis (für die WAL- und Journal-Dateien). Das ist zu messen, nicht anzunehmen — samt der Frage, obCHOWN_ON_STARTbei einem vorgegebenen uid überhaupt noch nötig ist oder stört.3. Renovate — das Tag-Schema hat gewechselt. Die Veröffentlichungen liefen bis
v0.39.7(31.07.2026) semantisch und sind seit dem 05.08.2026 datumsbasiert:v2026.08.05.1, zuletztv2026.08.31.1. Eine Regel muss das treffen, und sie ist im Trockenlauf zu belegen — eine gültige Regel ist keine treffende Regel (siehe #158 und die searxng-Runde).4. Der Libation-Begleiter — Umfang zu entscheiden. Optional lässt sich ein zweiter Container für Audible-Sicherungen betreiben, der über ein gemeinsames Volume und eine Token-Datei mit shelfarr spricht. Er ist nicht erforderlich; die erste Fassung des Charts sollte ihn nach meiner Einschätzung auslassen und ihn allenfalls später als eigenen, standardmäßig ausgeschalteten Workload nachziehen. Die Bewertung gehört aber vor die Umsetzung, nicht mitten hinein.
Aufwandseinschätzung
Vergleichsweise günstig, gemessen an den letzten Runden: ein Workload, ein PVC, ein Health-Endpunkt, der wirklich existiert, brauchbare Versionstags und keine Abhängigkeit. Die Arbeit steckt in den vier Punkten oben, nicht im Chart-Gerüst.
Vor der Umsetzung: Plan vorlegen, Freigabe einholen, Plan hier als Kommentar festhalten — wie in CLAUDE.md beschrieben.