প্রকল্প সম্পর্কে
CloudPath একটি সেলফ-হোস্টেড IoT কন্ট্রোল প্ল্যাটফর্ম যা লোকাল মেশিনে অথবা পাবলিক নেটওয়ার্কে ডেপ্লয় করা সম্ভব। এর লক্ষ্য হলো "ডিভাইস অ্যাক্সেস, স্ট্যাটাস দেখা এবং রিমোট কন্ট্রোল"-কে একটি সাধারণ কন্ট্রোল প্লেনে পরিণত করা, কোনো নির্দিষ্ট ডেভেলপমেন্ট বোর্ডের ডেডিকেটেড সফটওয়্যারে সীমাবদ্ধ না রাখা। প্রজেক্টটি MIT লাইসেন্সের অধীনে ওপেন সোর্স এবং প্রধানত তিনটি অংশ নিয়ে গঠিত: একটি সিঙ্গেল বাইনারি সেন্ট্রাল সার্ভিস cloudpath-server, প্রতিটি কম্পিউটার বা সাইটে চলমান গেটওয়ে cloudpath-edge, এবং প্লাগইন Registry কন্ট্রোল প্লেনের জন্য কমান্ড-লাইন টুল cloudpath। প্রযুক্তিগতভাবে ব্যাকএন্ডে Go এবং ফ্রন্টএন্ডে React ব্যবহার করা হয়েছে; WebUI বিল্ড আউটপুট সার্ভার সাইডে এমবেড করা থাকে এবং ডাটাবেস হিসেবে SQLite-এর WAL মোড ব্যবহৃত হয়, যা CGO ছাড়াই Linux বা arm64-এ ক্রস-কম্পাইল করা সম্ভব।
কর্তৃত্বের বিভাজন
সেন্ট্রাল সার্ভিস হলো প্রত্যাশিত অবস্থা (desired state), ভাড়াটে (tenant) এবং অডিটের একমাত্র কর্তৃপক্ষ। এটি RBAC, টোকেন, রেট লিমিটিং, রিটেনশন পিরিয়ড, প্লাগইন ডিরেক্টরি এবং রানিং ইনস্ট্যান্সের প্রত্যাশিত অবস্থা, সেইসাথে অপারেশন ডিসপ্যাচ এবং রিসিট সেটেলমেন্টের দায়িত্ব পালন করে। গেটওয়ে হলো পর্যবেক্ষণ অবস্থার (observed state) একমাত্র কর্তৃপক্ষ, যা সর্বশেষ সফলভাবে প্রয়োগ করা স্ন্যাপশট সংরক্ষণ করে এবং ডিভাইস সুপারভিশন, ব্যাক-অফ রিস্টার্ট এবং অফলাইন ইভেন্ট বাফারিং পরিচালনা করে। নেটওয়ার্ক বিচ্ছিন্ন হলেও এটি চলতে থাকে এবং পুনরায় সংযুক্ত হলে শুধুমাত্র চূড়ান্ত স্ন্যাপশট প্রয়োগ করে, মাঝখানের সাইড-ইফেক্টগুলো রিপ্লে করে না। ডিভাইসের পরিচয় ভাড়াটে, গেটওয়ে এবং ডিভাইসের ট্রিপলেট দ্বারা নির্ধারিত হয় এবং অনলাইন ট্রান্সমিশন কি হিসেবে edge_id এবং device_id-এর সমন্বয় ব্যবহৃত হয়। অ্যাকাউন্ট সেশনের অধীনে, গেটওয়ে থেকে সার্ভার এবং তারপর ব্রাউজারের রিয়েল-টাইম লিঙ্ক WebSocket-এর মাধ্যমে চলে, আর REST হিস্ট্রি কুয়েরি এবং ম্যানেজমেন্ট অপারেশনের দায়িত্ব নেয়।
প্লাগইন সিস্টেম
প্রজেক্টটি তিন ধরনের প্লাগইন আলাদা করে: Driver ডিফল্টভাবে গেটওয়ে সাইডে চলে এবং ডিভাইস ডিসকভারি, কানেকশন, প্রোটোকল পার্সিং, ক্যাপাবিলিটি ম্যাপিং এবং ডিভাইস অ্যাকশনের দায়িত্ব নেয়; Application সেন্ট্রাল সার্ভিস সাইডে চলে এবং বিজনেস অবজেক্ট, বাইন্ডিং, রুলস, টাস্ক এবং ডোমেইন API পরিচালনা করে; Connector গেটওয়ে বা সেন্ট্রাল সার্ভিসে চলার পরিকল্পনা করা হয়েছে, যা MQTT, Webhook ইত্যাদি নোটিফিকেশন এবং ডাটা এক্সিটের জন্য ব্যবহৃত হবে (বর্তমানে এটি লক্ষ্য হিসেবে রাখা হয়েছে)। কোর সিস্টেম কোনো নির্দিষ্ট হার্ডওয়্যারের জন্য কোড লেখে না, নতুন ডিভাইস মানে একটি Driver প্লাগইন। রেফারেন্স ড্রাইভার stcb এবং বেশ কিছু অ্যাপ্লিকেশন প্লাগইন আলাদা রিপোজিটরি হিসেবে প্রকাশিত হয়, যেখানে Go প্লাগইন টেমপ্লেট, উদাহরণ অ্যাপ্লিকেশন এবং বাইনারি থেকে হোস্ট পর্যন্ত E2E টেস্ট স্কাফোল্ডিং প্রদান করা হয়। প্লাগইন ইনস্টল করার আগে Manifest, সামঞ্জস্যতা রেঞ্জ, Release অ্যাসেট এবং সামারি যাচাই করা হয় এবং ভার্সন, digest ও উৎস একটি লক ফাইলে রেকর্ড করা হয়।
দ্রুত শুরু করা
Go, Node, pnpm এবং ঐচ্ছিক task ইনস্টল করার পর, task setup দিয়ে ডিপেন্ডেন্সি পুল করা হয় এবং task build দিয়ে দুটি বাইনারি তৈরি করা হয়। সার্ভার ডিফল্টভাবে 127.0.0.1:8080-এ লিসেন করে এবং /healthz হেলথ চেক প্রদান করে। হার্ডওয়্যার না থাকলে বিল্ট-ইন ডেমো অ্যাডাপ্টার দিয়ে ডিভাইস অনলাইন, অপারেশন এক্সিকিউশন এবং ডিসকানেক্ট-রিকানেক্ট যাচাই করা যায়। আসল সিরিয়াল ডিভাইস ব্যবহারের ক্ষেত্রে প্রথমে সংশ্লিষ্ট Driver প্লাগইন ইনস্টল ও এনাবল করতে হবে, তারপর লোকাল edge.yaml-এ plugin_host চালু করে সিরিয়াল পোর্ট এবং অ্যাডাপ্টার উল্লেখ করতে হবে। প্রথমবার অ্যাডমিন অ্যাকাউন্ট ইনস্টল করার পর সার্ভিসটি অ্যাকাউন্ট মোডে প্রবেশ করে, যেখানে হেলথ চেক, স্ট্যাটিক রিসোর্স এবং অথেন্টিকেশন ইন্টারফেস ছাড়া সবকিছুর জন্য ক্রেডেনশিয়াল প্রয়োজন হয়।
ম্যানেজমেন্ট কনসোল
লগইন করার পর ওভারভিউ, ডিভাইস লিস্ট এবং ডিটেইলস, রানিং রেকর্ড (ইভেন্ট), অ্যাপ্লিকেশন ও প্লাগইন এবং ইনস্ট্যান্স ডিটেইলস, গেটওয়ে লিস্ট ও ডিটেইলস এবং সেটিংস অ্যাক্সেস করা যায়। অ্যাডমিনদের জন্য আলাদা মেম্বার, পারমিশন এবং অ্যাক্সেস টোকেন পেজ রয়েছে। ডিভাইস ডিটেইলস পেজের অপারেশন প্যানেলে অ্যাডাপ্টারের ঘোষিত হোয়াইটলিস্ট অনুযায়ী বাটন তৈরি হয়; সরাসরি API ব্যবহার করে কমান্ড পাঠানো এবং ইভেন্ট স্ট্রিম ও গেটওয়ে অনলাইন স্ট্যাটাস কুয়েরি করা সম্ভব। অপারেশনের স্ট্যাটাস pending, sent, ok, failed, timeout হতে পারে। দীর্ঘক্ষণ রিসিট না আসলে ব্যাকগ্রাউন্ড ক্লিনিং টাস্ক এটিকে টাইমআউট হিসেবে চিহ্নিত করে। ইভেন্ট এবং ফাইনাল স্টেট অপারেশন ডিফল্টভাবে ৩০ দিন সংরক্ষিত থাকে।
নিরাপত্তা ডিজাইন
README এক্সপোজার এরিয়াকে L0 সিঙ্গেল মেশিন, L1 ইন্টারনাল নেটওয়ার্ক বা রিভার্স প্রক্সি এবং L2 পাবলিক নেটওয়ার্ক—এই তিন স্তরে ভাগ করেছে এবং সতর্ক করেছে যেন L0 কনফিগারেশন সরাসরি পাবলিক নেটওয়ার্কে না রাখা হয়। ক্রেডেনশিয়ালের দুটি মোড রয়েছে: শেয়ারড সার্ভিস টোকেন সামঞ্জস্যতার জন্য, আর অ্যাকাউন্ট মোড সেশন কুকি লগইন, admin, operator এবং viewer—এই তিন স্তরের রোল এবং cp_ প্রিফিক্সযুক্ত ভাড়াটে টোকেন প্রদান করে। স্কোপ read, write, admin, edge-এর সাবসেট হতে পারে। প্লেইন টেক্সট শুধুমাত্র তৈরির সময় একবার রিটার্ন করা হয়, ডাটাবেসে শুধুমাত্র SHA-256 এবং শর্ট প্রিফিক্স সংরক্ষিত থাকে। Secret-গুলো সার্ভার কনফিগারেশন এবং অডিটে secret://name হ্যান্ডেল হিসেবে থাকে, প্লেইন টেক্সট শুধুমাত্র টার্গেট গেটওয়ে লোকাল প্রোভাইডার দ্বারা পার্স করা হয়। প্লাগইনকে অবশ্যই manifest-এ স্পষ্টভাবে পারমিশন ঘোষণা করতে হবে; সার্ভার প্লেইন টেক্সট সংরক্ষণ বা ফরওয়ার্ড করে না। এছাড়া অপারেশন হোয়াইটলিস্ট, প্যারামিটার দৈর্ঘ্য ও ক্যারেক্টার লিমিট, রিকোয়েস্ট বডি লিমিট, WebSocket রিড লিমিট, SPA পাথ ট্রাভার্সাল প্রোটেকশন, অপারেশন ও লগইন রেট লিমিটিং এবং এক সেট সিকিউরিটি রেসপন্স হেডার রয়েছে।
ডেপ্লয়মেন্ট এবং মাল্টি-গেটওয়ে অ্যাক্সেস
অফিসিয়াল গাইড কন্টেইনার-নির্ভর নয় এমন পাবলিক ডেপ্লয়মেন্ট ধাপ প্রদান করে: প্রথমে বিল্ড আউটপুটের আর্কিটেকচার অ্যাসারশন করা (রিলিজ ম্যাট্রিক্সে Linux arm64 অন্তর্ভুক্ত), তারপর systemd ইউনিট ব্যবহার করে একটি ডেডিকেটেড নন-রুট অ্যাকাউন্টের মাধ্যমে সার্ভিস চালানো, সিক্রেটগুলো 0600 এনভায়রনমেন্ট ফাইলে রাখা এবং সবশেষে nginx রিভার্স প্রক্সি ব্যবহার করে HTTPS ও WSS প্রদান করা। WebSocket-এর জন্য আলাদা আপগ্রেড হেডার এবং দীর্ঘ রিড টাইমআউট কনফিগার করতে হয়। অথেন্টিকেশন এই প্রোডাক্ট নিজেই পরিচালনা করে, তাই রিভার্স প্রক্সি লেয়ার পাবলিক রাখা হয়। কন্টেইনার এবং Compose মোডও ব্যবহার করা যায়, তবে হোস্ট আর্কিটেকচার ইমেজের সাথে মিল থাকতে হবে। একাধিক কম্পিউটার একটি সার্ভারে যুক্ত করা একটি সাধারণ ব্যবহার: অ্যাডমিন প্রতিটি কম্পিউটারের জন্য edge scope-এর ভাড়াটে টোকেন তৈরি করেন এবং WSS এন্ডপয়েন্ট, টোকেন ও নির্ধারিত edge_id ব্যবহারকারীকে দেন। ব্যবহারকারী রিলিজ থেকে সংশ্লিষ্ট প্ল্যাটফর্মের বাইনারি ডাউনলোড করেন, checksums যাচাই করেন এবং লোকাল কনফিগারেশন ফাইল পূরণ করে রান করেন। গেটওয়েতে এক্সপোনেনশিয়াল ব্যাক-অফ রিকানেক্ট সুবিধা রয়েছে, অফলাইন ইভেন্টগুলো বাউন্ডেড বাফারে থাকে এবং রিকানেক্টের পর রিপ্লে হয়। ভিন্ন ভাড়াটের ডিভাইস, ইভেন্ট, অপারেশন এবং ইনস্ট্যান্স একে অপরের থেকে অদৃশ্য থাকে এবং একটি গেটওয়ে অফলাইন হলে অন্যটি প্রভাবিত হয় না।
টেস্টিং এবং রিলিজ
টেস্টিং-এর মধ্যে রয়েছে Go ইউনিট টেস্ট, রেস ডিটেকশন, ফ্রন্টএন্ড ফ্রোজেন ইনস্টলেশন এবং টাইপ চেকিং, প্লাগইন টেমপ্লেট ফ্লো এবং অ্যাগ্রিগেটেড গেট কমান্ড। রিলিজ ভার্সন ট্যাগ দ্বারা ট্রিগার হয়, যা ছয়টি প্ল্যাটফর্ম ম্যাট্রিক্সে বিল্ড করে এবং একটি ইউনিফাইড checksums ফাইল তৈরি করে। রিপোজিটরিতে পাবলিক বাউন্ডারি অডিট, Markdown লিঙ্ক চেক এবং workflow স্ট্রাকচার চেক করার স্ক্রিপ্ট গেটও রয়েছে।
বর্তমান সীমাবদ্ধতা
README বর্তমান অবস্থা এবং লক্ষ্য অবস্থার মধ্যে স্পষ্ট পার্থক্য করেছে: Connector এবং নোটিফিকেশন রানটাইম, MQTT এবং Modbus অ্যাক্সেস, রিমোট OTA, টাইম-সিরিজ অ্যাগ্রিগেশন, সেন্ট্রাল কি ম্যানেজমেন্ট, ডিস্ট্রিবিউটেড কোটা এবং মাল্টি-সার্ভার এখনও বাস্তবায়িত হয়নি। ভাড়াটে টোকেন সেশন শুধুমাত্র REST-এ আছে, ব্রাউজার রিয়েল-টাইম চ্যানেলে নেই। একই এক্সটার্নাল ড্রাইভার দিয়ে একাধিক রিয়েল বোর্ড চালানো, হট-প্লাগিং এবং অপারেশন রিসিট কভার করা ফিল্ড E2E এখনও সম্পন্ন হয়নি, তাই প্রোটোকল এবং রিয়েল বোর্ড প্রমাণ না আসা পর্যন্ত মাল্টি-বোর্ড লিঙ্ক যাচাই করা হয়নি বলে গণ্য করা হয়। প্রজেক্টের নীতি হলো "বাস্তবায়িত হয়নি এমন ক্ষমতাকে বর্তমান অবস্থা হিসেবে লেখা যাবে না"।
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.