অ্যাপ চালানো
রিয়েলটাইম, TCP/UDP পোর্ট ও প্রাইভেট নেটওয়ার্ক
গেম সার্ভার, VoIP, IoT কিংবা নিজস্ব TCP/UDP সার্ভিস — যেসব অ্যাপ HTTP-র বাইরে সরাসরি নিজস্ব পোর্টে কানেকশন গ্রহণ করে, সেগুলো Meghly-তে চালানোর গাইড।
সাধারণ ওয়েবসাইট ও API চলে HTTPS-এ, Meghly-র রাউটারের মাধ্যমে। তবে কিছু অ্যাপ্লিকেশন সরাসরি নিজস্ব পোর্টে কানেকশন গ্রহণ করে:
| অ্যাপ্লিকেশন | যা প্রয়োজন |
|---|---|
| গেম সার্ভার | UDP বা TCP পোর্ট |
| VoIP / PBX (Asterisk, FreeSWITCH) | SIP-এর জন্য UDP পোর্ট, RTP-র জন্য UDP পোর্টের রেঞ্জ এবং রিয়েলটাইম মোড |
| GPS ট্র্যাকার ও IoT ডিভাইস | TCP বা UDP পোর্ট |
| MQTT ব্রোকার, RADIUS | TCP বা UDP পোর্ট |
| চ্যাট, নোটিফিকেশন ও লাইভ ড্যাশবোর্ড | বাড়তি কিছুই প্রয়োজন নেই — WebSocket সাধারণ HTTPS ঠিকানাতেই কাজ করে |
পাবলিক পোর্ট ও রিয়েলটাইম মোড ব্যবহারের জন্য সেগুলো আপনার হোস্টিং প্ল্যানে অন্তর্ভুক্ত থাকতে হবে। কতগুলো পোর্ট পাবেন তা প্ল্যানের ওপর নির্ভর করে — বিস্তারিত দেখুন দাম অংশে।
WebSocket
WebSocket সংযোগ (যেমন SignalR, socket.io বা Laravel Reverb) আলাদা কোনো সেটিং ছাড়াই অ্যাপের HTTPS ঠিকানায় (এবং নিজস্ব ডোমেইনেও) কাজ করে। এজন্য কোনো পাবলিক পোর্টের প্রয়োজন হয় না।
পাবলিক TCP/UDP পোর্ট নেওয়া
অ্যাপের General পেজের Public TCP/UDP ports অংশে নিচের তথ্যগুলো দিন:
- Name — ছোট হাতের অক্ষরে একটি নাম, যেমন
game,sipবাrtp। - Protocol —
TCPঅথবাUDP। - How many — একটি পোর্ট, অথবা পোর্টের একটি রেঞ্জ (সর্বোচ্চ ১০০০টি)।
- App listens on — একটি পোর্ট নিলে, অ্যাপের ভেতরে যে পোর্টে সার্ভারটি রান করে (যেমন
7777)।
Meghly সার্ভারের খালি পোর্টগুলো থেকে একটি পোর্ট বরাদ্দ করে — TCP পোর্ট আসে 20000–29999 রেঞ্জ থেকে এবং UDP পোর্ট আসে 10000–19999 রেঞ্জ থেকে। পোর্ট নম্বর নিজে বেছে নেওয়া যায় না, তাই অ্যাপকে নম্বরটি এনভায়রনমেন্ট ভেরিয়েবল থেকে পড়ে নিতে হয়:
| ভেরিয়েবল | বিবরণ |
|---|---|
NODE_PUBLIC_IP | সার্ভারের পাবলিক IP — ক্লায়েন্ট এই ঠিকানায় কানেক্ট করবে |
PUBLIC_PORT_<NAME> | বাইরের পোর্ট নম্বর, যেমন PUBLIC_PORT_GAME |
PUBLIC_PORT_<NAME>_START, _END | রেঞ্জ নিলে রেঞ্জের প্রথম ও শেষ পোর্ট |
- একটি পোর্টের ক্ষেত্রে: বাইরের পোর্টে (
PUBLIC_PORT_GAME, ধরুন10001) আসা কানেকশন অ্যাপের ভেতরের পোর্টে (7777) পৌঁছে দেওয়া হয়। - রেঞ্জের ক্ষেত্রে: ভেতরে ও বাইরে পোর্ট নম্বর একই থাকে — তাই অ্যাপকে ঠিক
_STARTথেকে_ENDপর্যন্ত পোর্টগুলোতেই রান করতে হবে।
পোর্টগুলো বরাদ্দ হয় অ্যাপের worker প্রসেসে। একটি নির্দিষ্ট পোর্ট একই সময়ে দুটি প্রসেস ব্যবহার করতে পারে না, তাই ওই worker-এর একটিমাত্র instance চলে।
const dgram = require("node:dgram");
const server = dgram.createSocket("udp4");
server.on("message", (msg, from) => server.send(msg, from.port, from.address));
server.bind(7777); // "App listens on"
console.log(`খেলোয়াড়রা কানেক্ট করবে ${process.env.NODE_PUBLIC_IP}:${process.env.PUBLIC_PORT_GAME}-এ`);নিরাপত্তার কারণে কিছু পোর্ট কখনো খোলা হয় না (22, 25, 53, 80, 443, 465, 587, 993 …)। ওয়েব ট্রাফিকের জন্য সবসময় সাধারণ HTTPS ঠিকানা ব্যবহার করুন।
চলমান কানেকশন বিচ্ছিন্ন না করে ডিপ্লয় (Stateful worker)
সাধারণ ডিপ্লয়ে নতুন ভার্সন চালু হলে পুরনো ভার্সনটি বন্ধ করে দেওয়া হয়। গেম বা কল চলার মাঝখানে এমনটি ঘটলে সবার সংযোগ বিচ্ছিন্ন হয়ে যায়। তাই General → Stateful / realtime worker অংশে নির্ধারণ করে দিন, পুরনো ভার্সন বন্ধ করার আগে কীভাবে অপেক্ষা করতে হবে:
| ফিল্ড | কাজ | উদাহরণ (Asterisk) |
|---|---|---|
| Before draining, run | নতুন কাজ গ্রহণ বন্ধ করার কমান্ড (না দিলেও চলবে) | asterisk -rx "core stop gracefully" |
| In progress (prints a number) | কতগুলো কাজ চলমান আছে তা প্রিন্ট করে; প্রতি ৫ সেকেন্ড পরপর রান হয়, এবং 0 হলে ভার্সন পরিবর্তন হয় | asterisk -rx "core show channels count" |
| Drain at most (seconds) | সর্বোচ্চ কতক্ষণ অপেক্ষা করা হবে (১০–৪৮০ সেকেন্ড, ডিফল্ট ৩০০) | 300 |
HTTP ছাড়া হেলথ চেক
এ ধরনের অ্যাপে প্রায়ই কোনো HTTP সার্ভার থাকে না। তাই নতুন ভার্সন প্রস্তুত হয়েছে কি না, তা যাচাইয়ের দুটি উপায় রয়েছে:
- Ready when TCP port accepts — অ্যাপের ভেতরের একটি নির্দিষ্ট TCP পোর্ট কানেকশন গ্রহণ করতে শুরু করলেই অ্যাপটি প্রস্তুত বলে ধরা হয় (যেমন
5038)। - Ready when this command succeeds — একটি কমান্ড সফলভাবে (
0exit code দিয়ে) শেষ হলে অ্যাপটি প্রস্তুত বলে ধরা হয় (যেমনasterisk -rx "core show uptime")।
রিয়েলটাইম মোড
ভয়েস, ভিডিও ও গেমের মতো কাজে কয়েক মিলিসেকেন্ডের দেরিও টের পাওয়া যায়। Realtime mode চালু করলে অ্যাপটি নিরাপত্তা স্যান্ডবক্সের বাইরে সরাসরি সার্ভারে রান করে, ফলে latency অনেক কমে যায়। তবে অন্যান্য সব সীমা (মেমোরি, read-only ফাইল সিস্টেম ও আলাদা নেটওয়ার্ক) আগের মতোই বহাল থাকে, এবং অডিও যাতে ভেঙে না যায় সেজন্য অ্যাপটি কমপক্ষে ১টি পূর্ণ CPU পায়।
প্রাইভেট নেটওয়ার্ক (Service group)
একাধিক অ্যাপ নিজেদের মধ্যে যোগাযোগ করতে চাইলে — যেমন একটি ওয়েবসাইট, একটি পেমেন্ট সার্ভিস ও একটি worker — সবগুলোর General → Private network অংশে একই Service group নাম দিন (যেমন shop)। একই গ্রুপের অ্যাপগুলো একই সার্ভারে, একটি প্রাইভেট নেটওয়ার্কের ভেতরে চলে:
http://payments:8080- যেকোনো পোর্টে, TCP ও UDP উভয় প্রোটোকলেই যোগাযোগ করা যায়।
- প্রতিটি অ্যাপ
SERVICE_<NAME>_HOSTভেরিয়েবল পায়, আর ওয়েব অ্যাপ হলেSERVICE_<NAME>_URL-ও পায়। - Internal only চালু করলে অ্যাপটির কোনো পাবলিক ঠিকানা থাকে না — শুধু নিজের গ্রুপের অ্যাপগুলো থেকেই এতে পৌঁছানো যায় (যেমন ভেতরের কোনো API)।
আটকে গেছেন?
আমাদের ইঞ্জিনিয়ারদের সাথে সরাসরি কথা বলুন — ফোন বা ইমেইলে, বাংলায়।