# Deshi Canvas — cPanel-এ live করার নির্দেশনা

এই প্যাকেজে তোমার দেওয়া ডিজাইনের ভিত্তিতে PHP + MySQL/MariaDB ওয়েবসাইট তৈরি করা হয়েছে। ক্লায়েন্ট সার্ভিস নির্বাচন করে ফর্ম জমা দেবে; অর্ডার dashboard-এ আসবে। ইমেইল ও সম্মতি দেওয়া ক্লায়েন্টের WhatsApp confirmation queue-তে যাবে। পেমেন্ট ক্লায়েন্টের সঙ্গে পরের ধাপে আলোচনা করবে।

Database, SMTP ও Meta API-এর আসল তথ্য তোমার নিজের account থেকে বসাতে হবে।

## ১. বর্তমান সাইটের backup নাও

cPanel → **File Manager** খোলো। Settings → **Show Hidden Files (dotfiles)** চালু করো।

বর্তমান ওয়েবসাইটের একটি ZIP backup তৈরি করে কম্পিউটারে download করো। Backup ও নতুন সম্পূর্ণ project ZIP **public_html-এর বাইরে** রাখবে।

তোমার screenshot-এ home directory দেখা গেছে: `/home/deshican`। পরের উদাহরণগুলো এই path অনুযায়ী লেখা। cPanel-এ আলাদা path দেখালে সেই path ব্যবহার করো।

## ২. ZIP extract করে ফাইল বসাও

নতুন ZIP `/home/deshican/`-এ upload ও extract করো। ভিতরে `deshi-canvas-dynamic` folder পাবে।

| প্যাকেজের অংশ | Hosting-এ যেখানে যাবে |
| --- | --- |
| `deshi-canvas-dynamic/deshi_canvas_app` folder | `/home/deshican/deshi_canvas_app` |
| `deshi-canvas-dynamic/public_html`-এর ভিতরের সব ফাইল ও folder | `/home/deshican/public_html/` |
| এই গাইড, tests, tools ও package.json | কম্পিউটারে বা public_html-এর বাইরে রাখবে |

বিশেষভাবে যাচাই করো:

- `/home/deshican/public_html/index.php`
- `/home/deshican/public_html/_init.php`
- `/home/deshican/public_html/.htaccess`
- `/home/deshican/public_html/assets/`
- `/home/deshican/deshi_canvas_app/bootstrap.php`
- `/home/deshican/deshi_canvas_app/vendor/`

`public_html/public_html` বা `public_html/deshi_canvas_app` বানিয়ে ফেলো না। `_init.php` public_html-এর পাশের private app folder খুঁজবে।

Backup নেওয়ার পর পুরনো `index.html` ও পুরনো legal HTML files public_html-এর বাইরে সরিয়ে রাখো। নতুন code-এ পুরনো HTML URL থেকে নতুন পেজের redirect-ও দেওয়া আছে।

## ৩. PHP version ও extension ঠিক করো

cPanel-এ **MultiPHP Manager** বা hosting-এর **Select PHP Version** খোলো।

`deshicanvas.com`-এর জন্য PHP **8.3** থাকলে সেটি নির্বাচন করো। প্যাকেজের ন্যূনতম প্রয়োজন PHP **8.2**। ফাইল upload-এর পরে version Apply করো, যাতে cPanel তার প্রয়োজনীয় PHP handler বসাতে পারে।

প্রয়োজনীয় extensions: `pdo`, `pdo_mysql`, `mbstring`, `fileinfo`, `curl`, `openssl`। অনুপস্থিত থাকলে setup page-এ নাম দেখাবে।

ডেটাবেস হিসেবে MySQL 5.7+/8.x বা MariaDB 10.4+ ব্যবহার করা যাবে। MariaDB 10.11-এ পরীক্ষা করা হয়েছে।

## ৪. Database তৈরি করো

cPanel → **Database Wizard / MySQL Database Wizard**:

1. নতুন database তৈরি করো, যেমন suffix `canvas`।
2. একটি database user ও শক্ত password তৈরি করো।
3. সেই user-কে database-এ যুক্ত করে **ALL PRIVILEGES** দাও।
4. cPanel-এ দেখানো **পূর্ণ database name ও username** কপি করো। Prefix-সহ নাম লাগবে।

উদাহরণ: `deshican_canvas` ও `deshican_canvasuser`। তোমার তৈরি নাম ভিন্ন হলে আসল নাম ব্যবহার করবে।

SQL file import করতে হবে না। প্রথম setup-এ tables ও ছয়টি service তৈরি হবে।

## ৫. Private configuration বসাও

File Manager-এ `/home/deshican/deshi_canvas_app/` খোলো।

`.env.example` কপি করে একই folder-এ **`.env`** নামে রাখো। Edit করে অন্তত নিচের তথ্য বসাও:

~~~ini
APP_ENV=production
APP_URL=https://deshicanvas.com
APP_TIMEZONE=Asia/Dhaka
SETUP_TOKEN=এখানে_নিজের_গোপন_random_setup_password
DB_DRIVER=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=তোমার_পূর্ণ_database_name
DB_USERNAME=তোমার_পূর্ণ_database_username
DB_PASSWORD="তোমার_database_password"
~~~

বাংলা placeholder-গুলো আসল তথ্য দিয়ে বদলাবে। `SETUP_TOKEN`-এ password generator দিয়ে অন্তত ৩২টি English letter, number ও symbol-এর random value ব্যবহার করো। Default `CHANGE_THIS...` value রেখে setup চালানো যাবে না।

Provider আলাদা database hostname দিলে `DB_HOST`-এ সেটি বসাবে।

Permission সাধারণত `.env`-এর জন্য **600**, app-এর `storage` folder-এর জন্য **700**, public folder-এর জন্য **755**, সাধারণ public file-এর জন্য **644** রাখো। PHP-কে নিজের `storage` ও `public_html/media` folder-এ লিখতে পারতে হবে।

## ৬. Owner account তৈরি করো

ব্রাউজারে খোলো: **https://deshicanvas.com/setup.php**

দাও:

- Private setup password: `.env`-এ দেওয়া `SETUP_TOKEN`।
- তোমার নাম।
- Owner হিসেবে যে ইমেইল দিয়ে login করবে।
- নতুন owner password এবং confirmation।

Password ১২–৭২ character রাখো; Bangla বা অন্য multibyte character ব্যবহার করলে সর্বোচ্চ সীমা ৭২ byte।

**Create secure workspace** চাপো। সফল হলে sign-in page আসবে:

**https://deshicanvas.com/admin/**

এখানে পূর্বনির্ধারিত admin password নেই। Setup-এ যে credentials তৈরি করবে সেগুলোই ব্যবহার করবে। একবার owner তৈরি হলে setup বন্ধ হয়ে যাবে।

| বিষয় | দেওয়া তথ্য |
| --- | --- |
| Business | Deshi Canvas |
| Contact / Reply-to email | info@deshicanvas.com |
| Confirmation sender | orders@deshicanvas.com |
| Phone / WhatsApp | +8801751247714 |
| Services | Data Entry, Graphic Design, Video Editing, Motion Graphics, Digital Marketing, Social Media Marketing |

## ৭. Contact, social link ও service সম্পাদনা

**Dashboard → Website settings**:

- Business name, contact email, phone, WhatsApp ও address বদলাতে পারবে।
- Facebook, Instagram, LinkedIn, YouTube, TikTok ও X-এর HTTPS link বসাতে পারবে।
- খালি social link ওয়েবসাইট বা confirmation email-এ দেখাবে না।
- Homepage ও order section-এর মূল লেখা পরিবর্তন করতে পারবে।

**Services** থেকে service add/edit/hide এবং ছবি upload করতে পারবে।

**Portfolio** থেকে ছবি ও শিরোনাম বদলাতে পারবে। Template-এর artwork-গুলো “visual concept” হিসেবে রাখা হয়েছে; নিজের কাজ দিয়ে বদলে verified portfolio প্রকাশ করো।

## ৮. Staff / Editor যুক্ত করো

Owner হিসেবে **Team members** খোলো।

নাম, email, role, temporary password ও নিজের owner password দিয়ে account তৈরি করো। Temporary login privately staff-কে দেবে। প্রথম login-এ তাকে password বদলাতে হবে।

| Role | Access |
| --- | --- |
| Owner | সব অর্ডার, content/settings, team account ও notification configuration status |
| Admin | সব অর্ডার, assignment, notes, service, portfolio ও website settings |
| Editor | কেবল নিজের assigned অর্ডার, সেই অর্ডারের attachment, status ও internal note |

**Orders → View → Assigned to** থেকে staff নির্বাচন করো। Team member inactive করলে তার আগের login session-ও বাতিল হবে।

## ৯. ইমেইল confirmation চালু করো

cPanel → **Email Accounts** থেকে `orders@deshicanvas.com` mailbox তৈরি করো বা বর্তমান mailbox ব্যবহার করো। `info@deshicanvas.com`-এ আসা reply-ও যেন পড়তে পারো তা যাচাই করো।

`orders@...`-এর পাশে **Connect Devices / Set Up Mail Client** খোলো। Recommended secure outgoing/SMTP settings কপি করে private `.env`-এ বসাও:

~~~ini
MAIL_HOST=Connect_Devices_এ_দেখানো_outgoing_server
MAIL_PORT=465
MAIL_ENCRYPTION=ssl
MAIL_USERNAME=orders@deshicanvas.com
MAIL_PASSWORD="mailbox_এর_password"
MAIL_FROM=orders@deshicanvas.com
~~~

Secure port **465** হলে `ssl`; secure port **587 / STARTTLS** দিলে `MAIL_PORT=587` ও `MAIL_ENCRYPTION=tls` ব্যবহার করো। SMTP host guess না করে hosting-এর দেওয়া নাম ব্যবহার করবে।

Confirmation email-এ order number, service, contact email, phone, WhatsApp link, website, address থাকলে address এবং পূরণ করা সব social link থাকবে।

Credentials বসানোর পর নিজের email দিয়ে test order করে inbox ও spam folder দেখো। প্রয়োজনে cPanel → **Email Deliverability** থেকে domain-এর SPF/DKIM configuration পরীক্ষা করো।

## ১০. WhatsApp confirmation চালু করো

Meta WhatsApp Cloud API setup-এর জন্য:

1. Meta-র WhatsApp Business Platform onboarding-এ business/app তৈরি বা নির্বাচন করো।
2. যে নম্বর থেকে confirmation পাঠাতে চাও, সেটি Meta-র অনুমোদিত onboarding পদ্ধতিতে যুক্ত করো।
3. **Phone Number ID**, উপযুক্ত permission-সহ production access token এবং বর্তমানে supported Graph API version সংগ্রহ করো।
4. নিচের কাঠামোর একটি **Utility** message template জমা দাও। ব্যবহারের আগে Meta-র approval প্রয়োজন।
5. Template-এর exact name ও language code কপি করে `.env` পূরণ করো।

প্রস্তাবিত template name: `deshi_canvas_order_received`

Template body:

~~~text
Hi {{1}}, we received your request {{2}} for {{3}}.
You can contact Deshi Canvas at {{4}} or on WhatsApp: {{5}}.
Website: {{6}}.
We will follow up about your project. Reply STOP to stop WhatsApp updates.
~~~

Template-এর **body-তে ঠিক ৬টি text variable** রাখবে। Header বা button variable যোগ করলে code-এর payload-ও পরিবর্তন করতে হবে।

| Variable | Code থেকে যে value যাবে |
| --- | --- |
| 1 | Client name |
| 2 | Order reference |
| 3 | Selected service |
| 4 | Dashboard-এর contact email |
| 5 | Dashboard-এর WhatsApp number |
| 6 | APP_URL / website |

`.env`-এ পূরণ করো:

~~~ini
WHATSAPP_PHONE_ID=Meta_থেকে_পাওয়া_Phone_Number_ID
WHATSAPP_TOKEN=তোমার_production_access_token
WHATSAPP_GRAPH_VERSION=Meta_দেখানো_supported_version
WHATSAPP_TEMPLATE=deshi_canvas_order_received
WHATSAPP_LANGUAGE=en
WHATSAPP_VERIFY_TOKEN=নিজের_নির্বাচিত_গোপন_random_verify_token
WHATSAPP_APP_SECRET=Meta_app_এর_App_Secret
~~~

Graph API version-এর format হবে `vXX.X`; `XX.X`-এর জায়গায় Meta-র actual supported version দিতে হবে। Language `en` রাখা হয়েছে; approved template-এর code আলাদা হলে সেটিই বসাবে।

Delivery status ও STOP reply চালু করতে Meta webhook-এ:

- Callback URL: **https://deshicanvas.com/api/whatsapp-webhook.php**
- Verify token: `.env`-এর `WHATSAPP_VERIFY_TOKEN`।
- Webhook field: **messages** subscribe করো।
- App Secret: `.env`-এর `WHATSAPP_APP_SECRET`-এ বসাও।

Client form-এর WhatsApp checkbox default-এ খালি থাকে। সম্মতি দিলে confirmation যাবে। Signed webhook-এ STOP/UNSUBSCRIBE reply এলে তার বর্তমান requests-এর pending WhatsApp messages বন্ধ হবে। Dashboard থেকেও **Stop WhatsApp updates** ব্যবহার করা যাবে। নতুন form-এ আবার সম্মতি দিলে নতুন request-এর updates চালু হতে পারে।

Meta/API provider-এর ব্যবহার অনুযায়ী charge থাকতে পারে। এই প্যাকেজ নিজে কোনো live WhatsApp account চালু করে না।

## ১১. Automatic notification-এর Cron Job বসাও

cPanel → **Cron Jobs** খোলো। Common Settings থেকে **Once Per Minute** নির্বাচন করো।

| Minute | Hour | Day | Month | Weekday |
| --- | --- | --- | --- | --- |
| * | * | * | * | * |

PHP 8.3-এর EasyApache binary থাকলে **Command** field-এ শুধু নিচের line বসাও:

~~~bash
/opt/cpanel/ea-php83/root/usr/bin/php /home/deshican/deshi_canvas_app/cron.php >> /home/deshican/deshi_canvas_app/storage/worker.log 2>&1
~~~

Command field-এ পাঁচটি `*` যোগ করবে না; সেগুলো schedule fields-এ দেওয়া হয়েছে।

PHP 8.2 ব্যবহার করলে hosting-এ binary থাকলে `ea-php83` বদলে `ea-php82` হবে। Provider অন্য CLI PHP path দিলে প্রথম অংশে তাদের path বসাবে। CLI PHP-তেও প্রয়োজনীয় extensions থাকতে হবে।

প্রতি cron run-এ pending messages process হবে। Cron interval অনুযায়ী confirmation পাঠানোর চেষ্টা হবে। Integration configure না থাকলে order সংরক্ষিত থাকবে এবং status **Setup needed** দেখাবে।

Dashboard → **Notifications → Process pending messages now** দিয়েও পরীক্ষা করা যাবে। Failed connection-এর জন্য retry আছে। Provider গ্রহণ করেছে মানেই email inbox delivery নিশ্চিত নয়; WhatsApp-এর delivered/read status webhook থেকে আসে।

## ১২. Live test

নিজের email ও নিজের WhatsApp number দিয়ে public form পূরণ করো:

1. কোনো payment ছাড়াই order submit হওয়া উচিত।
2. Success message-এ `DC-...` order reference পাওয়া উচিত।
3. Dashboard → Orders-এ একই reference দেখা উচিত।
4. একই submit পুনরায় পাঠালে দ্বিতীয় order তৈরি হওয়া উচিত নয়।
5. Cron চালুর পর নিজের email-এ contact information পাওয়া উচিত।
6. WhatsApp checkbox tick, API credentials ও approved template থাকলে নিজের নম্বরে confirmation পাওয়া উচিত।
7. Editor তৈরি করে কেবল assigned order দেখতে পারছে কি না পরীক্ষা করো।
8. Website settings-এ social link বসিয়ে public site ও পরের confirmation email-এ দেখা যাচ্ছে কি না দেখো।

## সাধারণ সমস্যা

| সমস্যা | কী দেখবে |
| --- | --- |
| আগের সাইট দেখায় | public_html path, index.php, পুরনো cache/CDN এবং browser refresh |
| 500 error | PHP 8.2+, cPanel error log, .htaccess ও PHP handler; backup রেখে hosting support-এর সঙ্গে মিলিয়ে নাও |
| “being configured” / 503 | Private app folder-এর অবস্থান, .env, database credentials ও user privileges |
| Setup-এ missing extension | নির্বাচিত PHP version-এর extension চালু করো |
| বারবার session expired | Cookies, HTTPS, private storage write permission; form নতুন করে reload |
| File বড় হওয়ায় submit হয় না | সর্বোচ্চ 10 MB; HTTPS project link ব্যবহার করো। .user.ini কার্যকর হতে hosting-এ সময় লাগতে পারে |
| Email Setup needed | MAIL_* configuration ও mailbox password |
| Email retry / smtp_failed | SMTP host, port, encryption, credentials, outbound SMTP access ও hosting mail limits |
| WhatsApp Setup needed | Phone ID, token, supported API version, template name ও language |
| WhatsApp meta_* error | Meta permission, template approval, recipient/number ও Meta error code |
| Notifications নিজে থেকে যাচ্ছে না | Cron schedule, CLI PHP path ও private storage/worker.log |

Code update করার সময় নিজের `.env`, `storage` folder, database ও uploaded `public_html/media` সংরক্ষণ করবে। Backup-এ database-এর সঙ্গে private app storage ও uploaded media রাখবে।

## Reference

- [cPanel File Manager](https://docs.cpanel.net/cpanel/files/file-manager/)
- [cPanel Database Wizard](https://docs.cpanel.net/cpanel/databases/database-wizard/)
- [cPanel PHP version](https://docs.cpanel.net/cpanel/software/multiphp-manager-for-cpanel/)
- [cPanel Mail Client settings](https://docs.cpanel.net/cpanel/email/set-up-mail-client/)
- [cPanel Cron Jobs](https://docs.cpanel.net/cpanel/advanced/cron-jobs/)
- [WhatsApp Business Platform](https://business.whatsapp.com/products/business-platform)
- [WhatsApp messaging policy](https://business.whatsapp.com/policy)

Code local পরিবেশে পরীক্ষা করা হয়েছে। Actual server, SMTP account ও live Meta account-এ সংযোগের পরে ১২ নম্বর ধাপের live test সম্পন্ন করবে।
