गाइडDiscord बॉट होस्ट करें

Discord बॉट होस्ट करें

Lizard पर Discord बॉट होस्ट करने के लिए उसे बैकग्राउंड वर्कर के रूप में चलाएँ। गेटवे बॉट Discord से एक आउटबाउंड कनेक्शन खोलता है और कोई HTTP सर्व नहीं करता, इसलिए उसे lizard up --port 0 (containerPort=0) से डिप्लॉय करें और हर बॉट टोकन के लिए एक ही रेप्लिका रखें। Lizard package.json से Node.js बॉट को पहचान लेता है और उसे npm run start से शुरू करता है; Python बॉट के लिए Procfile में web: लाइन चाहिए।

टेस्ट की स्थिति: उदाहरण बॉट discord.js 14.27.0 के साथ लोकल में चलता है और नकली टोकन देने पर TokenInvalid के साथ बंद हो जाता है। हमने इसका बिल्ड प्लान lizardpack से जाँचा — यह वह बिल्ड प्लानर है जिसे Lizard चलाता है। हमने यह गाइड अभी तक Lizard से असली Discord के साथ नहीं चलाई है; इस पर भरोसा करने से पहले एक टेस्ट मैसेज भेजें और लॉग देखें।

शुरू करने से पहले

  • बॉट टोकन। Discord Developer Portal में एक ऐप्लिकेशन बनाएँ, Bot खोलें और Reset Token दबाएँ। टोकन किसी को न दिखाएँ: जिसके पास टोकन है, वही बॉट को कंट्रोल करता है।
  • Message Content intent। उदाहरण !ping पढ़ता है, इसलिए Bot → Privileged Gateway Intents में Message Content Intent चालू करें। जो बॉट सिर्फ़ स्लैश कमांड का जवाब देता है, उसे इसकी ज़रूरत नहीं।
  • सर्वर में बॉट। OAuth2 → URL Generator में bot स्कोप और View Channels, Send Messages और Read Message History परमिशन पर टिक करें, फिर URL खोलकर एक सर्वर चुनें।
  • Lizard CLI और प्लान। CLI इंस्टॉल करें और lizard login चलाएँ। सर्विसेज़ Lizard Pro या उसके 7-दिन के ट्रायल (कार्ड ज़रूरी) पर चलती हैं; प्राइसिंग देखें।

बॉट लिखें

एक फ़ोल्डर बनाएँ जिसमें दो फ़ाइलें हों।

package.json:

{
  "name": "discord-bot",
  "private": true,
  "type": "module",
  "scripts": {
    "start": "node bot.js"
  },
  "dependencies": {
    "discord.js": "^14.27.0"
  }
}

bot.js:

import { Client, Events, GatewayIntentBits } from "discord.js";
 
const token = process.env.DISCORD_TOKEN;
if (!token) {
  console.error("DISCORD_TOKEN is not set");
  process.exit(1);
}
 
const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent,
  ],
});
 
client.once(Events.ClientReady, (ready) => {
  console.log(`Logged in as ${ready.user.tag}`);
});
 
client.on(Events.MessageCreate, async (message) => {
  if (message.author.bot) return;
  if (message.content === "!ping") {
    await message.reply("pong");
  }
});
 
client.login(token);

package-lock.json बनाने के लिए npm install चलाएँ, और लॉक फ़ाइल को package.json के बगल में रखें: लॉक फ़ाइल होने पर Lizard डिपेंडेंसी npm ci से इंस्टॉल करता है। एक .gitignore जोड़ें जिसमें node_modules और .env हों।

बॉट को अपने कंप्यूटर पर आज़माने के लिए टोकन को किसी फ़ाइल में सेव किए बिना पेस्ट करें, फिर बॉट शुरू करें:

read -rs DISCORD_TOKEN && export DISCORD_TOKEN
npm start

जिस चैनल को बॉट देख सकता है, उसमें !ping टाइप करें; बॉट pong जवाब देगा। डिप्लॉय करने से पहले लोकल कॉपी बंद कर दें। अगर दो कॉपी चल रही हों, तो दोनों हर मैसेज का जवाब देंगी।

वर्कर के रूप में डिप्लॉय करें

बॉट के फ़ोल्डर से:

lizard init --name discord-bot
lizard add --service bot
read -rs DISCORD_TOKEN
lizard secrets set DISCORD_TOKEN="$DISCORD_TOKEN" --service bot
lizard up --service bot --port 0
  • lizard add --service bot एक खाली सर्विस बनाता है; lizard up --service bot कोड अपलोड करके उसी सर्विस में डिप्लॉय करता है।
  • lizard secrets set टोकन को सिर्फ़ bot सर्विस पर स्टोर करता है। वेरिएबल्स और सीक्रेट्स देखें।
  • --port 0 वर्कर मोड चालू करता है: Lizard न PORT सेट करता है, न पोर्ट हेल्थ चेक चलाता है, न कोई HTTP रूट जोड़ता है। सर्विस पर अब भी onlizard.com डोमेन दिख सकता है, लेकिन वहाँ कुछ जवाब नहीं देता।

git रिपॉज़िटरी के अंदर lizard up वे फ़ाइलें छोड़ देता है जो .gitignore में लिखी हैं। git के बाहर यह .env फ़ाइलें भी अपलोड कर देता है, इसलिए इस फ़ोल्डर की किसी फ़ाइल में टोकन न रखें, या पहले git init चलाएँ। लोकल कोड से डिप्लॉय करें देखें।

अगर आप git push to deploy रखना चाहते हैं, तो फ़ोल्डर को GitHub पर पुश करें और रिपॉज़िटरी कनेक्ट करें, फिर सर्विस को वर्कर मोड में बदलें:

lizard port 0 --service bot
lizard redeploy --service bot

हर टोकन के लिए एक रेप्लिका

हर रेप्लिका उसी टोकन से अपना गेटवे सेशन खोलती है, इसलिए हर रेप्लिका हर मैसेज का जवाब देती है। बॉट सर्विस को एक ही रेप्लिका पर रखें। जब आप वर्कर का नया वर्ज़न डिप्लॉय करते हैं, तो Lizard नया प्रोसेस शुरू करने से पहले पुराना प्रोसेस बंद कर देता है, इसलिए बॉट थोड़ी देर के लिए उपलब्ध नहीं रहेगा। 2,500 से ज़्यादा सर्वर में मौजूद बॉट को Discord की sharding इस्तेमाल करनी होगी; यह कोड में बदलाव है, उसी प्रोसेस की ज़्यादा रेप्लिका चलाना नहीं।

Python बॉट

discord.py के लिए उसे requirements.txt में लिखें और एक Procfile जोड़ें:

web: python bot.py

lizardpack Procfile की सिर्फ़ web: लाइन पढ़ता है, वर्कर के लिए भी, और worker: लाइन को नज़रअंदाज़ करता है। Procfile न होने पर यह python main.py चलाता है, इसलिए अगर बॉट main.py में है, तो Procfile की ज़रूरत नहीं। उन्हीं कमांड और --port 0 से डिप्लॉय करें। Python वर्ज़न चुनने के लिए रनटाइम वर्ज़न देखें।

डेटा Managed Postgres में रखें

कंटेनर के अंदर लिखी गई फ़ाइलें अगले डिप्लॉय पर खो जाती हैं। सेटिंग्स, स्कोर या क्यू Managed Postgres में रखें:

lizard add postgres
lizard secrets set DATABASE_URL='${{postgres.DATABASE_PRIVATE_URL}}' --service bot

सिंगल कोट्स आपके शेल को ${{…}} पढ़ने से रोकते हैं; बॉट शुरू होने पर Lizard रेफ़रेंस को असली वैल्यू में बदलता है, और वेरिएबल बदलने से बॉट रीस्टार्ट होता है। process.env.DATABASE_URL को pg जैसे क्लाइंट से पढ़ें। हैंडलर ऐसे बनाएँ कि दो बार चलने पर भी कोई नुकसान न हो: रीस्टार्ट होने पर अधूरा काम दोबारा चल सकता है।

जाँचें कि बॉट काम कर रहा है

lizard port --service bot
lizard logs --service bot --tail 50
lizard ps

lizard port worker mode प्रिंट करता है। लॉग में Logged in as और बॉट का नाम दिखता है। फिर अपने सर्वर में !ping टाइप करें और एक pong का इंतज़ार करें। running दिखने वाले वर्कर की भी यह जाँच ज़रूरी है: हो सकता है प्रोसेस चल रहा हो, लेकिन Discord उसे रिजेक्ट कर रहा हो।

आम समस्याएँ

लक्षणसमाधान
An invalid token was provided, फिर रीस्टार्टDeveloper Portal में टोकन रीसेट करें और bot सर्विस पर DISCORD_TOKEN फिर से सेट करें।
Privileged intent provided is not enabled or whitelistedMessage Content Intent चालू करें, या कोड से GatewayIntentBits.MessageContent हटा दें।
बॉट ऑनलाइन है लेकिन !ping पर जवाब नहीं देताintent के बिना मैसेज का कंटेंट खाली आता है। यह भी जाँचें कि बॉट उस चैनल को देख सकता है और उसमें मैसेज भेज सकता है।
हर मैसेज के दो जवाब आते हैंकोई दूसरी कॉपी भी यही टोकन इस्तेमाल कर रही है: कोई लोकल प्रोसेस, दूसरी रेप्लिका या कोई दूसरा होस्ट। lizard ps देखें।
डिप्लॉय हेल्थ चेक का इंतज़ार करता रहता हैसर्विस वर्कर मोड में नहीं है। lizard port 0 --service bot चलाएँ, फिर lizard redeploy --service bot।
DISCORD_TOKEN is not setसीक्रेट किसी दूसरी सर्विस पर या प्रोजेक्ट लेवल पर है। lizard secrets list --service bot चलाएँ।

जो बॉट सिर्फ़ Interactions Endpoint URL के ज़रिए स्लैश कमांड का जवाब देता है, वह असल में HTTP सर्विस है: उसे असली पोर्ट के साथ डिप्लॉय करें और Discord को उसका HTTPS URL दें।

संबंधित

अपडेट: