विषय पर बढ़ें

कॉन्फ़िगरेशन रेफ़रेंस

Evey सर्वर की हर सेटिंग कहाँ सेट होती है, जब कोई सेटिंग एडमिन पैनल और environment दोनों में हो तो किसका मान लागू होता है, और रीस्टार्ट किस चीज़ के लिए ज़रूरी है। वेरिएबल खुद नीचे दिए गए दस पेजों में विषय के हिसाब से दिए गए हैं; यह पेज उस एडमिन के लिए है जो compose फ़ाइल बदलता है, या सोचता है कि कोई वेरिएबल अनदेखा क्यों हो रहा है।

दो जगह, एक नियम

जो सर्वर शुरू होने से पहले मौजूद होना चाहिए - secret, स्टोरेज के रास्ते, सार्वजनिक पता, रिवर्स प्रॉक्सी की जानकारी - वह compose फ़ाइल में environment वेरिएबल के रूप में जाता है। जो एडमिन बाद में ट्यून करता है - भाषाएँ, ट्रांसकोडिंग की सीमाएँ, हार्डवेयर एक्सेलेरेशन, शेड्यूल, प्लगइन की सीमाएँ - वह एडमिन पैनल में सेट होता है, डेटाबेस में सहेजा जाता है, कंटेनर अपडेट होने पर भी बना रहता है, और ज़्यादातर बिना रीस्टार्ट के लागू होता है।

जो सेटिंग दोनों जगह है, उसके लिए क्रम हमेशा एक ही है:

  1. पैनल में सहेजे गए मान को प्राथमिकता मिलती है। हर बार शुरू होने पर सर्वर पहले environment पढ़ता है, फिर हर फ़ील्ड को डेटाबेस में रखे मान से बदल देता है, अगर वहाँ कोई मान हो। कोई वेरिएबल सहेजे गए मान को कभी नहीं बदलता।
  2. जब तक कुछ सहेजा न गया हो, वेरिएबल लागू होता है। पैनल उसे मौजूदा डिफ़ॉल्ट के रूप में दिखाता है; डिफ़ॉल्ट पर रीसेट करें सहेजा गया मान हटा देता है, और अगली बार शुरू होने से वेरिएबल फिर लागू होता है।
  3. पहले से तय डिफ़ॉल्ट तब लागू होता है जब दोनों में से कुछ भी सेट न हो।

Secret इसका अपवाद हैं: पैनल अपना सहेजा हुआ कोई पासवर्ड या कुंजी कभी नहीं दिखाता, और EVEY_TMDB_API_KEY जैसा वेरिएबल पहली बार इस्तेमाल होने पर डेटाबेस में कॉपी हो जाता है, ताकि पैनल दिखा सके कि आपकी अपनी कुंजी इस्तेमाल हो रही है।

रीस्टार्ट किसके लिए ज़रूरी है

  • किसी environment वेरिएबल को बदलने पर हमेशा कंटेनर दोबारा बनाना होता है (docker compose up -d): प्रोसेस अपना environment एक ही बार पढ़ता है।
  • पैनल में किया गया बदलाव ज़्यादातर सेटिंग्स के लिए तुरंत लागू होता है (सर्वर का नाम, लॉग स्तर, अनुरोधों की सीमाएँ, हार्डवेयर एक्सेलेरेशन, SMTP, सिंगल साइन-ऑन, रिमोट एक्सेस, प्लगइन की सीमाएँ, और इतिहास रखने की अवधियाँ अगली रोज़ की सफ़ाई में)।
  • जो सेटिंग्स सर्वर शुरू होते समय पढ़ी जाती हैं, उन पर पैनल रीस्टार्ट पर लागू लिखता है: लाइब्रेरी फ़ाइल मॉनिटर और स्कैन का अंतराल, ट्रांसकोड कैश बजट, ट्रांसकोडिंग का उन्नत सीमाएँ कार्ड, इंट्रो प्रदाता, और कॉन्फ़िगरेशन प्रविष्टियाँ में जाने-पहचाने ऑपरेटर फ़्लैग (किसी और कुंजी की पंक्ति यह संकेत नहीं दिखाती)। सहेजने से आपकी पसंद रख ली जाती है, रीस्टार्ट से लागू होती है।

विषय वाले पेजों की हर टेबल में एक पैनल कॉलम है: फ़ील्ड तक का रास्ता (एडमिन से शुरू), और यह कि वह तुरंत लागू होता है या रीस्टार्ट पर, या "कोई नहीं", जब वेरिएबल का पैनल में कोई विकल्प नहीं है।

पेज किस बारे में
सर्वर और नेटवर्क सार्वजनिक पता, पोर्ट, रिवर्स प्रॉक्सी, रिमोट एक्सेस, अनुरोधों की सीमाएँ, कंटेनर का उपयोगकर्ता
डेटाबेस और खोज embedded या बाहरी Postgres और Meilisearch
खाते और साइन-इन सेशन की वैधता अवधि, साइन करने वाली कुंजी, सिंगल साइन-ऑन
लाइब्रेरी और मेटाडेटा स्कैन, मेटाडेटा की कुंजियाँ, इंट्रो की पहचान
ट्रांसकोडिंग और हार्डवेयर ग्राफ़िक्स कार्ड, क्षमता, क्वालिटी की सीमाएँ, कैश, कैलिब्रेशन क्लिप
प्लेबैक डिलीवरी और डाउनलोड स्ट्रीम पैक करने के स्विच, तैयार किए गए डाउनलोड, प्लेयर के आगे-पीछे वाले बटन
बैकग्राउंड का काम बैकग्राउंड के दौर और उनकी रफ़्तार
प्लगइन और सैंडबॉक्स सैंडबॉक्स मोड, अलग उपयोगकर्ता, संसाधन सीमाएँ, सिग्नेचर
ई-मेल और सूचनाएँ SMTP, ब्राउज़र push की कुंजियाँ
बैकअप, लॉग और निगरानी बैकअप, लॉग, इतिहास कितनी देर रखा जाए, मेट्रिक्स और tracing

मान कैसे पढ़े जाते हैं

  • हाँ/ना वाले मान 1, t, true, 0, f, false लेते हैं। समय की अवधि में इकाई ज़रूरी है: 30s, 5m, 2h (सिर्फ़ 30 अनदेखा कर दिया जाता है)। सूचियाँ कॉमा से अलग होती हैं।
  • जो मान सर्वर समझ नहीं पाता, वह लॉग में एक चेतावनी के साथ अनदेखा कर दिया जाता है (environment variable ignored, value could not be parsed), और डिफ़ॉल्ट लागू होता है। compose फ़ाइल बदलने के बाद लॉग की पहली लाइनें देखें।
  • EVEY_DB_PASSWORD और MEILI_MASTER_KEY किसी फ़ाइल से भी आ सकते हैं, जिसका नाम उसी वेरिएबल में _FILE जोड़कर दिया जाता है; साफ़ दिया गया मान फ़ाइल से ज़्यादा प्राथमिकता रखता है।

Secret

embedded Postgres और Meilisearch अपने secret पहली बार शुरू होने पर ./evey-data/keys में बनाते हैं (postgres.password, meili.key, mode 0600)। सर्वर इन्हें EVEY_DB_PASSWORD_FILE और MEILI_MASTER_KEY_FILE से पढ़ता है, जो इमेज में सेट हैं, और इसीलिए evey admin कमांड को पासवर्ड नहीं चाहिए। EVEY_DB_PASSWORD या MEILI_MASTER_KEY सिर्फ़ बाहरी डेटाबेस या सर्च इंजन के लिए सेट करें।

एक TMDB कुंजी पहले से डाली हुई है। EVEY_TMDB_API_KEY आपकी अपनी कुंजी का शुरुआती मान देता है; एडमिन → सर्वर कॉन्फ़िग → API कुंजियाँ में सेट की गई कुंजी को इससे ज़्यादा प्राथमिकता मिलती है।

जिन वेरिएबल की आपको ज़रूरत नहीं

पुराने सेटअप से अक्सर साथ चली आने वाली लाइनें, और वे कुछ क्यों नहीं बदलतीं:

लाइन यह क्यों ज़रूरी नहीं है
EVEY_LOG_DIR, EVEY_TRANSCODING_CACHE_DIR, EVEY_TRICKPLAY_CACHE_DIR इमेज इन्हें पहले से /data/logs, /cache/transcode, /data/trickplay पर सेट करती है। इन्हें दोहराने से कुछ नहीं बदलता।
EVEY_FORWARDED_PROTO पुराना हो चुका - EVEY_SERVER_BASE_URL की स्कीम से निकाला जाता है। इसे सेट करने से बस लॉग में पुराने होने की चेतावनी आती है।
EVEY_KEYFRAME_BACKFILL=on off के अलावा कुछ भी इसे चालू करता है, इसका न होना भी।
LIBVA_DRIVER_NAME libva ड्राइवर को GPU के PCI id से चुनता है। इसे सिर्फ़ तब ज़बरदस्ती सेट करें जब आपके कार्ड को ऐसा ड्राइवर चाहिए जो libva नहीं चुनता (docker exec evey-server vainfo से जाँचें)।
EVEY_PLUGINS_SANDBOX_MODE auto आपके होस्ट पर उपलब्ध सबसे मज़बूत अलगाव चुनता है। इसे साफ़ तौर पर सिर्फ़ तब सेट करें जब आप fail-closed की गारंटी चाहते हों - landlock उस प्लगइन को चलाने से मना कर देता है जिसे वह सीमित नहीं कर सकता, जबकि auto एक चेतावनी के साथ कमज़ोर अलगाव पर आ जाता है।
/dev/dri/card0 के लिए एक group_add Evey सिर्फ़ render नोड (/dev/dri/renderD*, होस्ट पर जो भी हो) खोलता है, card* कभी नहीं। ls -ln /dev/dri से जाँचें और सिर्फ़ render नोड का ग्रुप जोड़ें।

फ़ाइलों का मालिक (PUID और PGID)

डिफ़ॉल्ट: अपने-आप। जब PUID/PGID सेट न हों, तो entrypoint शुरू होते समय आपके /media* माउंट का मालिक देखता है और सर्वर को उसी उपयोगकर्ता के रूप में चलाता है, ताकि जो सुविधाएँ आपकी लाइब्रेरी में लिखती हैं (seek index की मरम्मत फ़ाइलों को उनकी जगह पर ही दोबारा बनाती है) बिना कुछ किए काम करें - न chown, न कोई कॉन्फ़िगरेशन। शुरू होने का लॉग बताता है कि क्या चुना गया:

evey: media mounts owned by 1026:100 (detected on /media) - running the
server as that user so write features (seek-index repair) work out of the box

केवल वास्तव में माउंट किया गया /media* ही गिना जाता है: इमेज का अपना खाली /media (हर Debian इमेज में एक होता है) अनदेखा किया जाता है, इसलिए कहीं और, जैसे /data के नीचे, रखी लाइब्रेरी बिना किसी स्वामित्व चेतावनी के शुरू होती है।

जब मीडिया माउंट अलग-अलग उपयोगकर्ताओं के हों, तो Evey जितना हो सके उतना संभालता है: सर्वर उस उपयोगकर्ता को अपनाता है जिसके सबसे ज़्यादा माउंट हैं, और बाकी माउंट के ग्रुप में अतिरिक्त ग्रुप के रूप में जुड़ जाता है, ताकि उन माउंट पर मरम्मत तब काम करे जब उनकी फ़ाइलों में ग्रुप लिख सकता हो (शुरू होने की चेतावनी बताती है कि कौन से माउंट अब भी लिखने से मना कर सकते हैं)। अपने-आप पहचान पूरी तरह तभी छोड़ी जाती है (एक चेतावनी के साथ 1000:1000 लागू होता है) जब हर मीडिया माउंट root का हो, या प्लगइन चालू होने पर आरक्षित uid 1001 का हो - अपने मीडिया का मालिक किसी सामान्य उपयोगकर्ता को बनाएँ (chown), या compose फ़ाइल में environment: के नीचे PUID/PGID साफ़ तौर पर सेट करें:

docker-compose.yml
services:
  evey:
    environment:
      PUID: "1026"   # सर्वर को इस user id से चलाएँ  (होस्ट पर: `id -u <media-owner>`)
      PGID: "100"    # ...और इस group id से

साफ़ दिए गए मानों को हमेशा अपने-आप पहचान से ज़्यादा प्राथमिकता मिलती है।

यह कैसे काम करता है: कंटेनर root के रूप में बस उतनी देर शुरू होता है जितनी देर में वह अपने अंदर के उपयोगकर्ता का UID/GID बदल सके (और Evey के अपने फ़ोल्डर /data, /cache का मालिक बदल सके - आपके मीडिया माउंट का कभी नहीं), फिर अपने अधिकार छोड़ देता है। compose के group_add: से दिए गए अतिरिक्त ग्रुप (जैसे /dev/dri हार्डवेयर ट्रांसकोडिंग के लिए आपके होस्ट का render ग्रुप) अधिकार छोड़ने के बाद भी बने रहते हैं। सर्वर का प्रोसेस खुद कभी root के रूप में नहीं चलता।

बिल्कुल बिना root का विकल्प: अगर कुछ पल का root भी आपको मंज़ूर नहीं है, तो इसकी जगह अपनी compose फ़ाइल में सर्विस पर user: "UID:GID" सेट करें। entrypoint देखता है कि वह root के बिना शुरू हुआ है और UID/GID बदलना छोड़ देता है (मीडिया के मालिक की पहचान भी) - तब ./evey-data को उस UID के लिए लिखने लायक रखना आपकी ज़िम्मेदारी है।

Note

प्लगइन चालू होने पर PUID=1001 मना है: यह अंदर का evey-plugin उपयोगकर्ता है, जिसे अलग रखा जाता है ताकि प्लगइन कभी सर्वर की पहचान न ले सकें। मीडिया डिफ़ॉल्ट रूप से पढ़ने-लिखने के लिए माउंट होता है ताकि मरम्मत सीधे काम करे; अगर आप सिर्फ़ पढ़ने वाली लाइब्रेरी चाहते हैं, तो मीडिया volume के आगे :ro जोड़ें (तब मरम्मत एक साफ़ त्रुटि के साथ फ़ेल होती है)।

जो वेरिएबल सर्वर नहीं पढ़ता

कुछ वेरिएबल compose फ़ाइलों में दिखते हैं, पर सर्वर उन्हें नहीं पढ़ता:

  • EVEY_HTTP_PORT, EVEY_DOMAIN, MEDIA_DIR: इन्हें रिपॉज़िटरी की अपनी docker-compose.yml इस्तेमाल करती है (खुला पोर्ट, साथ आने वाले Caddy का डोमेन, मीडिया का रास्ता), Evey नहीं। EVEY_HTTP_PORT सिर्फ़ होस्ट का पोर्ट है: कंटेनर हमेशा 9091 पर सुनता है और compose ${EVEY_HTTP_PORT:-9091}:9091 जोड़ता है। वहाँ EVEY_VERSION इमेज का tag है; सर्वर इसे /healthz पर सिर्फ़ तब दिखाता है जब उसके binary में कोई वर्ज़न न हो।
  • EVEY_WEB_DIR (/srv, जहाँ वेब इंटरफ़ेस की फ़ाइलें हैं), और EVEY_DB_PASSWORD_FILE, MEILI_MASTER_KEY_FILE, EVEY_IMAGE_REPO, EVEY_IMAGE_RUNTIMES: इमेज की बनावट से मेल खाते हैं। इन्हें बदलना समर्थित नहीं है।
  • EVEY_SUPERVISED, EVEY_COMPANION_PIDS, EVEY_RESTART_EXIT_CODE, EVEY_LAUNCHER_BIN, EVEY_PLUGIN_LAUNCHER: entrypoint और प्लगइन launcher इन्हें अपने इस्तेमाल के लिए सेट करते हैं।
  • EVEY_BANNER=off सिर्फ़ लॉग में शुरू होने वाला बैनर छिपाता है; NO_COLOR उसके रंग हटाता है।