# Drutogami Courier — cPanel Shared Hosting Deploy Guide

LiteSpeed cPanel (Turbo Prestige প্ল্যান) এ deploy করার সম্পূর্ণ গাইড।
লক্ষ্য: লোকালে যা চলছে হুবহু সেটাই server এ চলবে — কিছু change হবে না।

---

## ০. লাগবে
- cPanel access (login)
- একটা domain বা subdomain (যেমন `app.tomar-domain.com`)
- লোকাল মেশিনে কাজ করা project (`I:\Claude\courier-hub`)

---

## ১. লোকালে production build (version lock — কিছু change হবে না)

লোকাল PowerShell এ, `courier-hub` ফোল্ডারে:

```powershell
# dev dependency বাদ দিয়ে optimized vendor বানাও (server এ composer লাগবে না)
composer install --no-dev --optimize-autoloader

# frontend asset (Filament) build — আগে publish করা আছে, তবু নিশ্চিত করো
php artisan filament:assets
```

> এতে `vendor/` ফোল্ডারে exact একই version এর package থাকবে। Server এ composer চালাতে হবে না — তাই কোনো version mismatch হবে না।

---

## ২. যা যা upload করবে (zip বানাও)

পুরো project zip করো **কিন্তু এগুলো বাদ দাও** (লাগবে না / নতুন বানাবে):
- `node_modules/` (লাগবে না)
- `.git/`
- `storage/logs/*.log`
- `.env` (server এ আলাদা বানাবে)

বাকি সব নাও — **বিশেষ করে `vendor/` অবশ্যই নেবে** (এটাই version lock করে)।

---

## ৩. cPanel — PHP version + extension

cPanel → **Select PHP Version** (বা MultiPHP Manager):
- PHP **8.2** (বা 8.3) সিলেক্ট করো
- Extensions টিক দাও: `intl`, `bcmath`, `mbstring`, `pdo_mysql`, `curl`, `openssl`, `fileinfo`, `gd`, `zip`, `ctype`, `json`, `tokenizer`

---

## ৪. cPanel — MySQL Database

cPanel → **MySQL Databases**:
1. Database বানাও: যেমন `user_courierhub`
2. User বানাও + শক্ত password
3. User কে database এ **ALL PRIVILEGES** দাও
4. লিখে রাখো: db name, db user, password (Step 6 এ লাগবে)

---

## ৫. ফাইল upload + extract

cPanel → **File Manager**:
1. project zip টা `/home/USER/courier-hub/` এ upload করো (public_html এর বাইরে — নিরাপদ)
2. Extract করো
3. ফোল্ডার structure: `/home/USER/courier-hub/` এর ভেতরে `app, public, vendor, artisan` ইত্যাদি

---

## ৬. Domain docroot → `public` (গুরুত্বপূর্ণ)

Laravel এর docroot হতে হবে `public/` ফোল্ডার।

**সবচেয়ে সহজ উপায় (subdomain):**
cPanel → **Domains** (বা Subdomains) → domain যোগ করার সময়:
- **Document Root** দাও: `/home/USER/courier-hub/public`

ব্যস। domain সরাসরি `public/` দেখাবে।

> যদি docroot পরিবর্তন না করা যায় (কিছু host এ public_html fixed): public_html এর ভেতরে app টা না রেখে, public_html কে symlink করো `courier-hub/public` এ — অথবা host support কে বলো docroot পাল্টে দিতে।

---

## ৭. `.env` ফাইল বানাও

File Manager এ `/home/USER/courier-hub/.env` বানাও, নিচেরটা বসাও (নিজের value দিয়ে পূরণ করো):

```env
APP_NAME="Drutogami Courier"
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=https://app.tomar-domain.com

APP_LOCALE=en
APP_FALLBACK_LOCALE=en

LOG_CHANNEL=stack
LOG_LEVEL=error

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=user_courierhub
DB_USERNAME=user_courierhub_user
DB_PASSWORD=তোমার_db_password

SESSION_DRIVER=database
SESSION_LIFETIME=120
QUEUE_CONNECTION=database
CACHE_STORE=database

# Pathao Merchant API (লোকালের মতই)
PATHAO_BASE_URL=https://api-hermes.pathao.com
PATHAO_TRACKING_URL=https://merchant.pathao.com
PATHAO_CLIENT_ID=তোমার_client_id
PATHAO_CLIENT_SECRET=তোমার_secret
PATHAO_USERNAME=তোমার_pathao_email
PATHAO_PASSWORD=তোমার_pathao_password
PATHAO_WEBHOOK_SECRET=c8a6a4c7bd5b7cbec1fc9730a6e964900f0c21afb85273d2

MAIL_MAILER=log
```

> ⚠️ `APP_ENV=production`, `APP_DEBUG=false` — live এ debug off রাখবে (নিরাপত্তা)।

---

## ৮. Artisan কমান্ড চালাও (একবার)

cPanel → **Terminal** (থাকলে), নাহলে SSH দিয়ে। `cd /home/USER/courier-hub` তারপর:

```bash
php artisan key:generate           # APP_KEY বসাবে
php artisan migrate --force        # সব table বানাবে
php artisan storage:link           # public storage link
php artisan config:cache
php artisan route:cache

# Pathao Dhaka zone sync (sub-Dhaka classify করতে)
php artisan pathao:sync-zones
```

**Terminal/SSH না থাকলে:** cPanel এর "Setup Node.js/PHP App" বা একটা সাময়িক cron job দিয়ে এগুলো একবার চালাও — যেমন Cron এ একবারের জন্য:
`cd /home/USER/courier-hub && php artisan migrate --force && php artisan key:generate`
চালানোর পর cron টা মুছে দাও।

---

## ৯. Admin user বানাও

Terminal এ:
```bash
php artisan tinker
```
তারপর (নিজের email/password দাও):
```php
\App\Models\User::create([
  'name'=>'Admin',
  'email'=>'tomar@email.com',
  'password'=>\Illuminate\Support\Facades\Hash::make('তোমার_শক্ত_password'),
  'role'=>'admin',
]);
exit
```

---

## ১০. Cron Jobs (shared এ daemon নাই — এটাই মূল)

cPanel → **Cron Jobs** → এই ২টা যোগ করো (path নিজেরটা দাও):

**Scheduler (auto-pull নতুন parcel):**
```
* * * * * cd /home/USER/courier-hub && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
```

**Queue worker (rider sync, zone enrich, notification):**
```
* * * * * cd /home/USER/courier-hub && /usr/local/bin/php artisan queue:work --stop-when-empty --max-time=55 >> /dev/null 2>&1
```

> PHP path (`/usr/local/bin/php`) host ভেদে আলাদা হতে পারে — cPanel এ "Select PHP Version" পেজে বা support এ জিজ্ঞেস করে সঠিক path নাও (যেমন `/opt/cpanel/ea-php82/root/usr/bin/php`)।

---

## ১১. Pathao Webhook register (instant update — optional কিন্তু ভালো)

Pathao Merchant panel → **Developer's API → Webhook Integration**:
- **Webhook URL:** `https://app.tomar-domain.com/webhooks/pathao`
- **Secret:** `c8a6a4c7bd5b7cbec1fc9730a6e964900f0c21afb85273d2` (= `.env` এর `PATHAO_WEBHOOK_SECRET`, হুবহু same)

এতে status পাল্টানোমাত্র instant dashboard এ আসবে (cron এর ৫ মিনিট অপেক্ষা ছাড়া)।

---

## ১২. Zone classify (একবার, admin panel এ)

Browser → `https://app.tomar-domain.com/admin/pathao-zones`
- Savar / Ashulia / Keraniganj / Dhamrai ইত্যাদি sub-urban zone গুলো select করে **"Set Sub"** করো
- বাকি Dhaka zone Inside থাকবে, non-Dhaka auto Outside

---

## ১৩. টেস্ট (সব ঠিক আছে?)

1. `https://app.tomar-domain.com/admin/login` → admin login হয়? ✓
2. `https://app.tomar-domain.com/app/login` → client login হয়? ✓
3. Admin এ client বানাও → store_id + rate rule সেট করো
4. Pathao এ ওই store এ একটা parcel entry করো → ৫ মিনিটে (বা webhook এ instant) dashboard এ আসে? ✓
5. Pathao token test (Terminal): `php artisan tinker` → `app(\App\Services\Pathao\PathaoClient::class)->token();` → token আসে? ✓

---

## পরবর্তী আপডেট (কোড পাল্টালে)
1. লোকালে `composer install --no-dev -o`
2. বদলানো ফাইল + `vendor/` upload
3. Terminal: `php artisan migrate --force && php artisan config:cache && php artisan route:cache`

---

## সমস্যা হলে দ্রুত চেক
- **500 error:** সাময়িক `APP_DEBUG=true` করে error দেখো → ঠিক করে আবার `false`
- **Log:** `storage/logs/laravel.log`
- **Permission:** `storage/` আর `bootstrap/cache/` writable (755/775) হতে হবে
- **Cron চলছে না:** PHP path ভুল — সঠিক path বসাও
- **intl error:** PHP extension intl enable হয়নি — Step 3 দেখো
