वेरिएबल्ससमस्या निवारणकोई सीक्रेट या रेफरेंस दिख नहीं रहा

मेरी सर्विस में कोई सीक्रेट या रेफरेंस दिख नहीं रहा

आपने कोई सीक्रेट या ${{name.KEY}} रेफरेंस सेट किया, रीडिप्लॉय किया, फिर भी चल रही सर्विस को वह मान नहीं मिल रहा जिसकी आप उम्मीद कर रहे हैं।

इसका क्या मतलब है

आपका सेट किया हुआ मान सर्विस के मर्ज किए गए एनवायरनमेंट तक पहुँचा ही नहीं — या ऐप शुरू होने से पहले मर्ज के दौरान किसी और मान ने उसे ओवरराइट कर दिया।

ऐसा क्यों हो सकता है

  • रेफरेंस का टारगेट या की मौजूद नहीं है। मौजूद न होने वाले सर्विस/ऐडऑन नाम का रेफरेंस, या ऐसी की का रेफरेंस जिसे वह ऐडऑन एक्सपोज़ नहीं करता, डिप्लॉय फ़ेल करने के बजाय खाली स्ट्रिंग बन जाता है। बिल्ड लॉग हर खाली रेफरेंस के लिए कारण सहित चेतावनी दिखाता है; जो वेरिएबल बदलाव बिना बिल्ड के, सिर्फ़ रीस्टार्ट से लागू होता है, उस पर कोई चेतावनी नहीं दिखती। lizard secrets set या डैशबोर्ड से सेट किए गए रेफरेंस के लिए, जिस टारगेट का नाम बदल दिया गया है वह मौजूद नहीं माना जाता: ये रेफरेंस मौजूदा नाम से मैच होते हैं। टारगेट सर्विस वे DATABASE_URL या REDIS_URL एक्सपोज़ नहीं करती जिन्हें Lizard उसमें इंजेक्ट करता है; इनके लिए सीधे ऐडऑन का रेफरेंस दें।
  • ज़्यादा प्राथमिकता वाले किसी मान ने इसे ओवरराइड कर दिया। मान एक तय क्रम में मर्ज होते हैं — addon-issued env < project secrets < project env < app env < app secrets < platform vars — इसलिए उसी की वाला सर्विस-स्कोप सीक्रेट, प्रोजेक्ट-स्कोप (--global) सीक्रेट को चुपचाप ओवरराइड कर सकता है, और प्लेटफ़ॉर्म वेरिएबल (PORT, LIZARD_SERVICE_NAME, LIZARD_PROJECT_ID, LIZARD_PUBLIC_DOMAIN, LIZARD_PRIVATE_DOMAIN) हमेशा लागू होते हैं। आपका सेट किया हुआ PORT रूटिंग सिर्फ़ उसी सर्विस पर बदलता है जिसका पोर्ट कभी सेट नहीं किया गया। जो सर्विस lizard up से बनी है, या जिसे --port, lizard port या डैशबोर्ड से पोर्ट दिया गया है, उस पर Lizard आपका यह मान ओवरराइट कर देता है; पोर्ट lizard port <n> से बदलें।
  • बिल्ड-टाइम मान बिल्ड तक नहीं पहुँचा। ज़्यादातर वेरिएबल बदलाव बिना रीबिल्ड के लागू होते हैं — नए मान लागू करने के लिए सर्विस रीस्टार्ट होती है। VITE_* और NEXT_PUBLIC_* मान बिल्ड किए गए एसेट्स में बेक हो जाते हैं, और इनमें से किसी को lizard secrets set से या सर्विस की सेटिंग्स में बदलने पर चल रही सर्विसेज़ का रीबिल्ड तुरंत शुरू हो जाता है। डैशबोर्ड के प्रोजेक्ट Secrets पेज पर किया गया एडिट कोई रीबिल्ड शुरू नहीं करता। जो सर्विस उस समय क्रैश या स्टॉप थी, उसे छोड़ दिया जाता है। कस्टम dockerfilePath वाली सर्विस, या बिल्ड/स्टार्ट कमांड के बिना lizard up से अपलोड की गई सर्विस को ये मान बिल्ड के समय कभी नहीं मिलते।

संभावित समाधान

बिल्ड लॉग में खाली रेफरेंस जाँचें

सर्विसेज़ में शेल एक्सेस (lizard ssh) बंद है। इसलिए बिल्ड लॉग ही देखने की जगह है: हर खाली रेफरेंस के लिए उसमें कारण सहित ==> Warning: ... is empty जैसी लाइन होती है।

lizard logs --build --service api

फिर ऐडऑन की कीज़ और हर सर्विस की LIZARD_* और PORT कीज़ की लिस्ट निकालें, और उनके नाम और की को अपने रेफरेंस से मिलाएँ। दूसरी सर्विस के अपने वेरिएबल और सीक्रेट्स के रेफरेंस काम करते हैं, पर इस लिस्ट में नहीं दिखते; उन्हें lizard secrets list --service <target> से जाँचें। कीज़ को ऐडऑन के डॉक्यूमेंटेड वेरिएबल से मिलाएँ:

lizard secrets list --service api --ref

स्कोप टकराव जाँचें

दोनों स्कोप के सीक्रेट्स लिस्ट करें और तुलना करें:

lizard secrets list --service api --show
lizard secrets list --global --show

याद रखें, ऐप सीक्रेट्स प्रोजेक्ट सीक्रेट्स को ओवरराइड करते हैं — अगर उसी की के लिए सर्विस-स्कोप मान मौजूद है, तो --global से सेट किए गए किसी भी मान के ऊपर वही लागू होता है।

बिल्ड-टाइम बदलाव के बाद रीबिल्ड करें

अगर बदली गई की VITE_* या NEXT_PUBLIC_* है, और बदलाव के समय सर्विस क्रैश या स्टॉप थी, या आपने इसे डैशबोर्ड के प्रोजेक्ट Secrets पेज पर बदला था, तो रीबिल्ड ट्रिगर करें:

lizard redeploy --service api

बिल्ड-टाइम बनाम रनटाइम और बिल्ड पाइपलाइन → रीबिल्ड किन वजहों से होता है देखें।

यह भी देखें

अपडेट: