# Org Switch Desk — cPanel edition

এই ZIP cPanel-এর Node.js Selector-এর জন্য। Frontend আগে থেকেই build করা আছে। Runtime-এ npm dependency নেই। Node.js 22.13+ / 24.x নির্বাচন করুন।

## ১. File Manager-এ upload

1. cPanel → File Manager → Home directory খুলুন।
2. public_html-এর বাইরে `org-switch-desk` নামে folder বানান।
3. ওই folder-এর ভেতরে `org-switch-cpanel.zip` upload করে Extract করুন।
4. যাচাই করুন: `/home/YOUR_CPANEL_USER/org-switch-desk/app.js` আছে। `app.js` যেন অতিরিক্ত কোনো nested folder-এর ভেতরে না থাকে। একই স্তরে `server.cjs`, `package.json`, `lib` এবং `public` থাকবে।

আগের Node/Vinext source ZIP এই নতুন package-এর সঙ্গে মেশাবেন না। প্রথমে upload করা public source folder-এর backup রাখুন; app চালু হলে অপ্রয়োজনীয় source/ZIP সেখান থেকে সরান। cPanel তৈরি করা `.htaccess` মুছবেন না।

## ২. CREATE APPLICATION

- Node.js version: 22.x-এর সর্বশেষ version অথবা 24.x
- Application mode: Production
- Application root: `org-switch-desk`
- Application URL: `orgnew24.adobesub.store`
- URL path: খালি বা `/` — subfolder নয়
- Application startup file: `app.js`

Root-এ `/home/username/` নিজে যোগ করবেন না যদি cPanel relative root চায়। উপরের নাম account home-এর ভেতরের folder বোঝায়। Domain ভিন্ন হলে নিজের domain নির্বাচন করুন।

## ৩. Environment variables

Create form বা app-এর Edit page-এ Add Variable দিয়ে:

| Name | Value |
| --- | --- |
| APP_ORIGIN | https://orgnew24.adobesub.store |
| APP_PASSWORD | আপনার নিজের কমপক্ষে ১২ অক্ষরের password |

`APP_ORIGIN`-এ শেষে slash দেবেন না। নিজের domain অন্য হলে সেই HTTPS origin দিন। Password এখানে উদাহরণ হিসেবে দেওয়া হয়নি; নিজেরটি লিখুন। Username default `admin`; বদলাতে চাইলে `APP_USERNAME` variable দিন। Password source code-এ লিখবেন না।

Create/Save করে Restart Application চাপুন। Run NPM Install বা build দরকার নেই, কারণ dependencies নেই এবং public folder-এ compiled frontend আছে। Hosting interface বাধ্যতামূলক করলে Run NPM Install empty dependency list নিয়েই শেষ হবে। PORT নিজে সেট করার প্রয়োজন নেই।

## ৪. ব্যবহার

HTTPS website খুলুন। Browser sign-in box-এ username `admin` এবং APP_PASSWORD-এ দেওয়া password লিখুন। তারপর Single/Bulk input → Add to queue → Start / Resume।

Refresh icon শুধু status দেখে। Page reload-এর পরে queue নিজে শুরু হয় না; Resume চাপুন। কাজ চলতে browser tab খোলা ও computer awake রাখুন। Queue ও result এই browser-এর local storage-এ থাকে; অন্য browser/device-এ sync হয় না।

এক email-এর সর্বোচ্চ ১০টি switch attempt-এর পরে status যাচাই হয়। Transfer না হলে একই email-এর নতুন cycle; verified হলে পরের email। Cooldown/permanent error থামে। Timeout/5xx-এর পরে আগে reconciliation করে। API accepted কিন্তু status pending হলে শুধু status poll করে।

## সমস্যা হলে

- `SETUP_REQUIRED`: APP_ORIGIN ও APP_PASSWORD ঠিক করে Save এবং Restart দিন।
- `LOGIN_REQUIRED`: username/password পুনরায় দিন। ১৫ বার ভুল credential দিলে একই server worker-এ ১৫ মিনিট অপেক্ষা করুন।
- আগের file list দেখালে: app-এর Application URL/domain এবং root mapping মিলিয়ে Restart দিন। তখন app-এর screenshot ও Passenger log-এর error অংশ প্রয়োজন; password পাঠাবেন না।
- `Cannot find module app.js`: ZIP ভুল folder-এ extract হয়েছে। Application root-এর সরাসরি ভেতরে app.js থাকতে হবে।
- `ERR_REQUIRE_ESM`: পুরোনো package.json-এর সঙ্গে মিশে গেছে। নতুন package.json-এ `type: commonjs` আছে।
- 503/start error: Node 22.13+ আছে কি এবং `app.js` startup file কি না দেখুন। App-এর error log দেখুন।
- `UPSTREAM_NETWORK_ERROR`: hosting-এর outbound HTTPS দিয়ে reseller.ado-besoft.com:443-এ access দরকার; hosting provider-কে connectivity/TLS error পরীক্ষা করতে বলুন।
- `ORIGIN_REJECTED`: APP_ORIGIN-এর scheme/domain/port browser-এর URL-এর সঙ্গে হুবহু মেলান।
- `COOLDOWN` / 429: server-এর দেওয়া সময় শেষ হতে দিন।

## পরীক্ষা ও সীমা

এই cPanel package-এ ১০টি server test এবং shared retry engine-এর ১৬টি test পাস করেছে। Frontend production build সম্পন্ন। Real organization transfer পরীক্ষার জন্য চালানো হয়নি। User-এর cPanel-এ package upload ও app start এখনও করা হয়নি; hosting-এর runtime/outbound access-এর ওপর live কাজ নির্ভর করে।

Local test: APP_ORIGIN, APP_PASSWORD এবং প্রয়োজনে PORT environment দিয়ে `node app.js`। `node --test tests/*.test.cjs` দিয়ে server test চালাতে পারেন।

## Sources

- https://docs.cloudlinux.com/cloudlinuxos/lve_manager/#node-js-selector-client-plugin
- https://docs.litespeedtech.com/lsws/cp/cpanel/cloudlinux/
- https://www.phusionpassenger.com/library/indepth/nodejs/reverse_port_binding.html
