वह सबसे छोटा checkout surface चुनें जो आपके पास पहले से मौजूद चीज़ों में फिट बैठे। एक payment request एक link है जो आप किसी को भेजते हैं — किसी website की ज़रूरत नहीं, और किसी client को invoice भेजने का सबसे तेज़ तरीका। एक point of sale app उसी instance को product list वाले एक till में बदल देता है, जो market stall पर फ़ोन से भी काम करता है। एक pay button किसी static site के लिए HTML का एक snippet भर है। एक shop plugin किसी असली storefront में Bitcoin को एक payment method के तौर पर जोड़ता है और order status अपने-आप वापस लिख देता है। और REST API invoices जारी करता है, उनकी state बताता है और settle होने पर एक webhook कॉल करता है, जो सबसे अच्छी तरह टिकने वाला integration है क्योंकि यह सिर्फ़ HTTP और एक shared secret पर निर्भर है।
आप जो भी चुनें, webhook जोड़ें और फिर परखें कि वह चलता है। ऐसा invoice जो settle हो जाए और आपके application को कभी सूचित न करे, वह failure mode है जिसे कोई नहीं पकड़ पाता, क्योंकि अलग-अलग देखने पर दोनों तरफ़ सब सही लगता है: पैसा पहुँच गया, customer ने एक confirmation page देखा, और order अधूरा पड़ा रह गया। जान-बूझकर खुद को एक settled-invoice webhook भेजें, पुष्टि करें कि आपके endpoint को यह मिला, और payload पर भरोसा करने के बजाय signature जाँचें — वह endpoint सार्वजनिक है और कोई भी उस पर post कर सकता है।
रात वाला backup कोई Lightning restore path नहीं है
इस page पर यही एक चेतावनी है जो आपका समय नहीं बल्कि पैसा ले सकती है, और प्रोजेक्ट का अपना documentation भी ठीक इन्हीं शब्दों में इसे कहता है: पुरानी Lightning channel state ज़हरीली होती है। कल रात के channel database की copy restore करके node को चलने देने का मतलब है ऐसी state प्रसारित करना जिसे आपका counterparty पहले ही बदल चुका है — जिसे protocol धोखा देने की कोशिश मानता है और उन्हें पूरा channel balance देकर सज़ा देता है। इसलिए store database, configuration और invoice इतिहास के लिए archive सही है, पर यह channels के लिए कोई recovery योजना नहीं है। static channel backup को लगातार मशीन से बाहर copy करें, सबसे नई वाली रखें, और अगर आप कभी किसी archive से पूरा server restore करें, तो यह जानते हुए करें कि Lightning वाले हिस्से को सीधे restore के बजाय documented recovery प्रक्रिया चाहिए।
यह समझ लेने के बाद, रूटीन छोटा है। deployment एक backup script देता है जो volumes को archive करता है और blockchain data छोड़कर database dump करता है, और यह एक passphrase स्वीकार करता है ताकि archive box से निकलने से पहले ही encrypt हो जाए। इसे किसी timer पर चलाएँ, फिर नतीजे को किसी दूसरे jurisdiction वाली मशीन पर उसी तरह भेजें जैसे backups गाइड बताता है — यहाँ अतिरिक्त दस मिनट खर्च करके एक append-only repository बनाना उचित है, क्योंकि किसी compromised payment server को यह मिटा पाने में सक्षम नहीं होना चाहिए कि उसने क्या-क्या process किया।
cd ~/BTCPayServer/btcpayserver-docker
export BTCPAY_BACKUP_PASSPHRASE="a long passphrase you keep elsewhere"
./btcpay-backup.sh # archives volumes + database, skips the chain
# then ship the archive offsite, and keep the channel backup separately
इसके बाद upgrades आते हैं, और payment box वह अकेली मशीन है जहाँ "इसे बाद में, जान-बूझकर update करें" सही नीति है। deployment का अपना update script है जो compose file दोबारा बनाता है और नई images pull करता है; इसे तब चलाएँ जब आपने release notes पढ़ लिए हों, तब नहीं जब किसी cron job का मन करे। पहले archive लें। एक बार में एक ही release बढ़ाएँ। और पिछला version कहीं लिखकर रखें, क्योंकि एक मिनट में किया जा सकने वाला rollback ही पूरी चीज़ को कम-जोखिम वाला बनाता है।
./btcpay-update.sh # deliberate, after reading the release notes
df -h / # the check that should be an alert, not a habit
आख़िर में, एक अलर्ट और एक रिमाइंडर सेट करें। अलर्ट disk usage पर है — एक blockchain node मशीन की वह अकेली process है जो अपने-आप बढ़ती है, और एक भरा हुआ volume checkout को ऐसे तरीके से गिरा देता है जिसे पहचानना मुश्किल होता है क्योंकि और कुछ नहीं बदला। इसे अस्सी प्रतिशत पर चलाएँ, पचानवे पर नहीं। रिमाइंडर मासिक है, और इसका मकसद है store खोलकर दो चीज़ें देखना: कि invoices अब भी settle हो रहे हैं, और कि आपके खोले गए Lightning channels अब भी जीवित हैं। एक payment processor चुपचाप फेल होता है, और आपको इसका पता तब चलता है जब कोई customer बताता है कि वह भुगतान नहीं कर सका।