النشر
شكل البوت الذي يعمل أشهرًا: إعدادات من البيئة، وفحص صحة، وإغلاق نظيف.
قبل أن تبدأ
أنشئ تطبيقًا وثبّته في سيرفر اختبار واضبط ثلاثة متغيرات بيئة (انظر شغّل بوتك):
export ZRZUR_BOT_TOKEN=YOUR_BOT_TOKEN
export ZRZUR_API_URL=https://api.zrzur.com
export ZRZUR_WS_URL=wss://events.zrzur.comالكود
// Production shape: configuration from the environment, a health endpoint
// for the process manager, and a clean shutdown on SIGTERM.
import { createServer } from "node:http";
import { Client } from "@zrzur/sdk/bot";
for (const name of ["ZRZUR_BOT_TOKEN", "ZRZUR_API_URL", "ZRZUR_WS_URL"]) {
if (!process.env[name]) {
console.error(`${name} is not set`);
process.exit(2);
}
}
const bot = new Client({
token: process.env.ZRZUR_BOT_TOKEN,
apiUrl: process.env.ZRZUR_API_URL,
wsUrl: process.env.ZRZUR_WS_URL,
});
let ready = false;
bot.on("Ready", () => (ready = true));
bot.on("Disconnected", () => (ready = false));
bot.command("hello", (i) => i.reply("Hello!"));
// /healthz answers 200 once connected; bind to loopback only
const health = createServer((request, response) => {
if (request.url === "/healthz")
return response.writeHead(ready ? 200 : 503).end(ready ? "ok" : "starting");
response.writeHead(404).end();
});
health.listen(Number(process.env.HEALTH_PORT ?? 8080), "127.0.0.1");
async function shutdown() {
health.close();
bot.destroy();
process.exit(0);
}
process.on("SIGTERM", shutdown);
process.on("SIGINT", shutdown);
await bot.login();
await bot.syncCommands([{ name: "hello", description: "Say hello" }]);
console.log("ready");
شغّله بالأمر node deploy.mjs.
جرّبه
شغّله تحت مدير عمليات (systemd أو Docker أو منصة استضافة) ووجّه فحص الصحة إلى http://127.0.0.1:8080/healthz.
ما يوضحه
- يرفض البوت البدء إذا نقص متغير (رمز الخروج 2).
- يجيب
/healthzبـ200 بعد اتصال البوابة، و503 قبل ذلك. - عند SIGTERM يغلق سيرفر الصحة والبوابة ثم يخرج.
- احفظ الرمز في مخزن أسرار المنصة، وأعد تشغيل البوت بعد إعادة تعيين الرمز.