Ga naar hoofdinhoud

Configuratie

Alles is een Spring-property en elke property is te overschrijven via omgevingsvariabelen (relaxed binding: app.ister.server.nameAPP_ISTER_SERVER_NAME). Veel instellingen hebben daarnaast een eigen korte env var, hieronder vermeld. De standaardwaarden zijn verstandig voor een single-node thuisopstelling.

Kernservices

InstellingEnv varStandaardOpmerkingen
Databasehost / poort / naamDB_HOST / DB_PATH / DB_NAMElocalhost / 5432 / isterPostgreSQL
Database-inloggegevensDB_USER / DB_PASSWORDister / isterwijzig dit in productie
ConnectionpoolDB_POOL_SIZE20afspelen waaiert uit naar veel gelijktijdige queries
Connectie-timeout (ms)DB_CONNECTION_TIMEOUT10000hoe lang een thread op een poolverbinding wacht voordat het faalt
RabbitMQSPRING_RABBITMQ_HOST / _PORT / _USERNAME / _PASSWORDlocalhost, 5672, user/passwordpoort valt terug op de RabbitMQ-standaard 5672
OIDC-issuerOIDC_URLhttp://keycloak:8060/realms/IsterKeycloak-compatibel; de standaard matcht de meegeleverde dev-Keycloak. Productie: bijv. https://keycloak.example.com/realms/Home

Identiteit en paden

InstellingEnv varStandaardOpmerkingen
app.ister.server.nameAPP_ISTER_SERVER_NAMETest servermoet uniek zijn per node
app.ister.server.urlAPP_ISTER_SERVER_URLhttp://localhost:8080hoe clients én andere nodes deze node bereiken
app.ister.cluster.nameAPP_ISTER_CLUSTER_NAMEde servernaamdezelfde waarde op elke node van een cluster
CachemapCACHE_DIR/cache/afbeeldingen, podcastdownloads
Tijdelijke mapTMP_DIR/tmp/ister/HLS-transcode-uitvoer
app.ister.server.websocket.allowed-originsAPP_ISTER_SERVER_WEBSOCKET_ALLOWED_ORIGINSleegextra origins die de GraphQL-websocket-handshake accepteert. De publieke host uit app.ister.server.url is automatisch toegestaan (beide schema's, elke poort), dus dit is alleen nodig als de server onder een tweede naam wordt aangeboden. * staat elke origin toe.

Metadata en talen

InstellingEnv varStandaardOpmerkingen
app.ister.server.TMDB.apikeyAPP_ISTER_SERVER_TMDB_APIKEYniet gezetTMDB API read access token. Zonder deze wordt het ophalen van film-/seriemetadata overgeslagen — je krijgt kale bestandsnamen.
app.ister.server.TMDB.max-requests-per-second30blijft onder TMDB's limiet van ~40 rps
app.ister.worker.tmdb.certification-countryUSISO 3166-1-land waarvan de keuring/leeftijdsclassificatie (bv. 16, PG-13, TV-MA) bij films en shows wordt opgeslagen; valt terug op US en daarna op een willekeurig land dat er een heeft.
app.ister.languagesISTER_LANGUAGESen,nlkommagescheiden ISO-639-1-tags; de eerste = primair. Bepaalt in welke talen metadata wordt opgehaald én welke talen de zoekindex krijgt. Wijzigen vereist een re-scan plus rebuildSearchIndex — zie Zoeken.
app.ister.worker.musicbrainz.min-request-interval-millis1100tussenruimte tussen MusicBrainz-aanroepen; blijft net boven hun 1-verzoek-per-seconde-beleid — alleen verlagen tegen je eigen mirror

Zoeken (Typesense)

Env varStandaard
TYPESENSE_ENABLEDfalse
TYPESENSE_HOST / TYPESENSE_PORT / TYPESENSE_PROTOCOLlocalhost / 8108 / http
TYPESENSE_API_KEY / TYPESENSE_COLLECTIONleeg / media

Zie Zoeken voor de procedure om in te schakelen en te herindexeren.

Transcoding

InstellingEnv varStandaardOpmerkingen
FFmpeg-mapFFMPEG_DIR/usr/binmap met ffmpeg/ffprobe
mkvextract / subtile-ocrMKVEXTRACT / SUBTILE_OCR/usr/bin/...extractie en OCR van beeldondertitels
app.ister.server.subtitle-ocr-default-languageengOCR-taal die wordt aangenomen voor ingebedde beeldondertitels zonder taaltag; leeg schakelt OCR voor taggeloze streams uit
app.ister.server.subtitle-ocr-tessdata-dirSUBTITLE_OCR_TESSDATA_DIRimage: /usr/share/tesseract/tessdata-bestmap met tessdata_best-modellen; wordt per taal alleen gebruikt als <taal>.traineddata er staat, anders geldt het distro-model (tessdata_fast). De images bevatten eng nld deu fra spa ita por; voeg talen toe met --build-arg TESSDATA_BEST_LANGS="…" of mount een map
app.ister.server.subtitle-ocr-dpi / -threshold / -borderSUBTITLE_OCR_DPI / _THRESHOLD / _BORDER300 / 0.6 / 10doorgegeven aan subtile-ocr; verhoog de threshold als randen in de letters lopen, verlaag hem als dunne halen wegvallen
app.ister.server.subtitle-ocr-char-blacklistSUBTITLE_OCR_CHAR_BLACKLIST``/`_~``
app.ister.server.subtitle-ocr-timeoutSUBTITLE_OCR_TIMEOUT10mlimiet per mkvextract-/subtile-ocr-run; de best-modellen zijn drie tot vier keer trager dan fast
app.ister.server.subtitle-ocr-cleanupSUBTITLE_OCR_CLEANUPtruenabewerking van de systematische OCR-fouten van dvd-lettertypen, waar het puntje van de i de stok raakt ("dit Is wat", "belleve", "Just", "Jullle"). Gebruikt het hunspell-woordenboek van de taal: een hoofdletter-I/J midden in de zin op een gewoon woord wordt klein (namen blijven staan), en een onbekend woord wordt vervangen als precies één i/l-herspelling een woord is. Zonder woordenboek draait alleen de ingebouwde functiewoordregel (een "Is"/"It" midden in de zin); andere talen dan Engels en Nederlands blijven onaangeroerd
app.ister.server.subtitle-ocr-dictionariesSUBTITLE_OCR_DICTIONARIESeng=en_US,nld=nl_NLOCR-taal → naam van het hunspell-woordenboek voor die nabewerking; subtitle-ocr-dictionary-dir (SUBTITLE_OCR_DICTIONARY_DIR, /usr/share/hunspell) is de map met <naam>.dic/.aff en subtitle-ocr-hunspell (SUBTITLE_OCR_HUNSPELL, hunspell) het programma. De images installeren hunspell-en-us en hunspell-nl; voeg een distro-woordenboekpakket toe voor een andere taal
app.ister.transcoder.hls.hwaccelHLS_HWACCELnonevaapi (Intel/AMD) of nvdec (NVIDIA); het compose-bestand toont de benodigde device-mappings
app.ister.transcoder.hls.hwaccel-deviceHLS_HWACCEL_DEVICE/dev/dri/renderD128alleen VAAPI
app.ister.transcoder.hls.max-concurrent-filesHLS_MAX_CONCURRENT_FILES2gelijktijdig getranscodeerde bestanden; pre-transcoding deelt dit budget

Geavanceerde transcoding

Zelden aan te raken — de standaardwaarden passen bij de meeste opstellingen. Deze hebben geen eigen korte env var (gebruik relaxed binding, bijv. APP_ISTER_TRANSCODER_HLS_MAX_BACKGROUND_FILES). De mechaniek erachter staat in de architectuurgids, Transcoding.

PropertyStandaardOpmerkingen
app.ister.transcoder.hls.max-concurrent-passes4gelijktijdig lopende FFmpeg-passes (threadpoolgrootte)
app.ister.transcoder.hls.max-background-files1bestanden die een achtergrond-pre-transcode mag vasthouden, onder het interactieve budget
app.ister.transcoder.hls.max-background-passes2passes die een achtergrond-pre-transcode mag vasthouden
app.ister.transcoder.hls.background-nice10nice-waarde voor achtergrondpasses, zodat interactief afspelen de CPU wint
app.ister.transcoder.hls.nice-path/usr/bin/nicepad naar de nice-binary voor bovenstaande
app.ister.transcoder.hls.cache-retention-hours2een transcode-cachemap wordt pas verwijderd na zo lang onaangeraakt (en voorbij zijn keep-until)
app.ister.transcoder.hls.segment-stability-ms200een segmentbestand moet zo lang ongewijzigd zijn voordat het als klaar telt
app.ister.transcoder.hls.pass-timeout-multiplier4pass-timeout = mediaduur × dit
app.ister.transcoder.hls.pass-timeout-min-seconds1800…maar nooit onder deze ondergrens
app.ister.transcoder.hls.pass-stall-timeout-seconds60breek een pass af die zo lang geen nieuw segment schrijft
app.ister.transcoder.hls.upload-drain-timeout-ms300000multi-node: hoe lang na afloop van een pass segmenten naar de vragende node geüpload blijven worden
app.ister.server.hls.segment-timeout-ms60000hoe lang een HTTP-.ts-verzoek op dat segment van de encoder wacht
app.ister.server.hls.master-playlist-timeout-ms120000hoe lang een master.m3u8-verzoek op het genereren van de playlists wacht

Pre-transcoding en prefetch

Twee achtergrondmechanismen warmen de transcode-cache op zodat afspelen direct start. Pre-transcoding werkt vanuit de continue-watching-lijst; prefetch reageert op wat een play queue nú doet. Zie de architectuurgids, Transcoding.

PropertyStandaardOpmerkingen
app.ister.worker.pretranscode.enabledtrueruntime gecheckt: false stopt de 15-minuten-pre-transcode-planning volledig
app.ister.server.pretranscode.keep-minutes30hoe lang een voor-getranscodeerd bestand warm blijft voordat het geveegd mag worden
app.ister.server.prefetch.enabledtrueprefetch het volgende item in een play queue tijdens afspelen
app.ister.server.prefetch.video-threshold-seconds120begin de volgende video te prefetchen na zoveel seconden in de huidige
app.ister.server.prefetch.track-threshold-seconds60idem, voor audiotracks
app.ister.server.prefetch.track-depth2hoeveel komende tracks vooruit te prefetchen
app.ister.server.prefetch.keep-hours24hoe lang een geprefetcht bestand warm blijft

Continue watching

Env varStandaardOpmerkingen
CONTINUE_WATCHING_HISTORY_DAYS150hoe ver de continue-watching-lijst terugkijkt; bepaalt ook wat pre-transcoding warm houdt
CONTINUE_WATCHING_REBUILD_CRON0 30 3 * * *nachtelijke zelfherstel-rebuild
CONTINUE_WATCHING_REBUILD_ENABLEDtrueruntime gecheckt: false slaat zowel de nachtelijke rebuild als de eenmalige startup-backfill over die een lege tabel vult

Gebruik hier bij voorkeur de korte env vars in plaats van de lange property-namen: de onderliggende properties zijn inconsistent gebonden (…rebuild.enabled met een punt, maar …rebuild-cron met een streepje) — de env vars verbergen dat.

Cache-opschoning en podcasts

InstellingStandaardOpmerkingen
CACHE_CLEANUP_ENABLED / CACHE_CLEANUP_CRONtrue / 0 30 4 * * *dagelijkse zombie-sweep van cache- en tmp-mappen
CACHE_CLEANUP_DRY_RUNtruehij logt alleen totdat je dit op false zet — zie Onderhoud
CACHE_CLEANUP_MIN_AGE24hverwijdert nooit bestanden jonger dan dit
app.ister.server.cache-cleanup.podcast-retention-days30gedownloade podcastafleveringen verlopen hierna, tenzij iemand middenin een aflevering zit
app.ister.worker.podcast.auto-download-count3nieuwste afleveringen die per feed automatisch worden gedownload
app.ister.worker.podcast.refresh-cron0 10 * * * *feeds elk uur verversen
app.ister.worker.podcast.refresh-min-interval-minutes30een feed wordt binnen dit venster niet opnieuw opgehaald, ook al vuurt de cron

Externe metadata-endpoints

Elke externe service die de server aanroept is een property met de echte service als standaard, dus normaal stel je hier niets van in. Ze bestaan zodat een deployment via een proxy of mock kan lopen — de CI van de chart wijst ze allemaal naar één WireMock-pod:

spring.cloud.openfeign.client.config.tmdb.url, app.ister.worker.tmdb.image-base, app.ister.worker.musicbrainz.base / .coverart-release-base / .coverart-release-group-base / .commons-filepath-base, app.ister.worker.openlibrary.base / .covers-base / .author-photo-base, app.ister.worker.wikidata.entity-base / .api-base, app.ister.worker.wikipedia.summary-template, app.ister.api.podcast.itunes-base.

Libraries en directories

app.ister.disk.libraries[n].* en app.ister.disk.directories[n].* bepalen wat er gescand wordt — volledig behandeld in Libraries en media-indeling. Helper-nodes krijgen schijven van andere nodes toegewezen met app.ister.helper.disks[n].name (+ .jobs), en een eigenaar geeft jobfamilies uit handen met app.ister.helper.offload-jobs — zie Multi-node.

Health, metrics en overige interne knoppen

De Spring Actuator (/actuator/health, /actuator/metrics, /actuator/prometheus) draait op een eigen poort, zodat die buiten de publieke API blijft. Die poortscheiding is de enige bescherming — de actuator-endpoints zelf zijn niet-geauthenticeerd — dus publiceer of proxy poort 8081 nooit. Zie Installatie.

PropertyStandaardOpmerkingen
management.server.port8081poort voor de Actuator-endpoints
management.endpoints.web.exposure.includehealth,metrics,prometheuswelke Actuator-endpoints beschikbaar zijn
app.ister.server.blur-hash.chunk-size500afbeeldingen per chunk tijdens de BlurHash-sweep (houdt een chunk onder de RabbitMQ-consumer-timeout)
app.ister.server.segment-detect.chunk-size4afleveringen die per intro-/outro-detectiebericht worden gefingerprint; houd een chunk ruim onder de RabbitMQ-consumer-timeout
app.ister.server.crop-detect-backfilltrueontsnappingsluik: false slaat de eenmalige crop-detectie-heranalyse van elk bestaand bestand bij de eerste scan na de upgrade over — zie Onderhoud
app.ister.server.segment-detect-backfilltruezelfde ontsnappingsluik voor het eenmalige intro-/outro-fingerprinten van elke bestaande aflevering

Lokale overrides (ontwikkeling)

Draai je vanuit de broncode, dan gaan machinespecifieke instellingen in gegitignorede *-local.properties-bestanden naast het properties-bestand van de module (bijv. core/src/main/resources/core-local.properties); ./gradlew bootRun activeert automatisch het local-profiel. Containerdeployments gebruiken in plaats daarvan omgevingsvariabelen.