# SMS Gateway — Production Deployment Guide (cPanel)

SmsHubBd SMS Gateway Laravel 12 + Vue/Inertia প্রজেক্ট live server-এ deploy করার সম্পূর্ণ গাইড।

---

## ১. সার্ভার রিকোয়ারমেন্ট

| Item | Minimum |
|------|---------|
| PHP | **8.2+** (8.3 recommended) |
| Extensions | `pdo_mysql`, `openssl`, `mbstring`, `json`, `curl`, `fileinfo`, `tokenizer`, `xml`, `ctype`, `session`, `bcmath` |
| Database | **MySQL 8** বা MariaDB 10.6+ |
| Web server | Apache (cPanel default) + `mod_rewrite` |
| SSL | **HTTPS** (Let's Encrypt — cPanel AutoSSL) |
| Node.js | **18+** (শুধু WhatsApp Marketing চালু করলে, VPS/dedicated) |
| Disk | 2GB+ (uploads/logs সহ) |

**Shared cPanel:** SMS Gateway + queue + cron চলবে। WhatsApp Node server (`whatsapp-server/`) সাধারণ shared hosting-এ চালানো কঠিন — VPS বা আলাদা Node server লাগতে পারে।

---

## ২.৫ Terminal ছাড়া cPanel Deploy (File Manager + phpMyAdmin only)

Terminal/SSH না থাকলে **সব preparation local PC-তে** করুন, server-এ শুধু upload + browser setup।

### A. Local PC-তে (Windows/XAMPP) — একবার

PowerShell / CMD:

```powershell
cd C:\xampp\htdocs\sms
composer install --no-dev --optimize-autoloader
cmd /c "npm ci && npm run build"
C:\xampp\php\php.exe artisan key:generate --show
```

`key:generate --show` যে key দেখাবে সেটা copy করুন — server `.env`-এ `APP_KEY=` লাইনে paste করবেন।

### B. Zip বানিয়ে upload (cPanel File Manager)

Project folder zip করুন। **অবশ্যই থাকতে হবে:**

| Folder/File | কেন লাগে |
|-------------|----------|
| `vendor/` | Server-এ composer চালানো যায় না |
| `public/build/` | CSS/JS — white screen হলে এটাই missing |
| `app/`, `bootstrap/`, `config/`, `routes/`, `resources/`, `storage/` | Laravel core |
| `artisan`, `composer.json`, `composer.lock` | — |

**Upload করবেন না:** local `.env`, `node_modules/`, `.git/`, `tests/`

1. cPanel → **File Manager** → `home/username/` → folder `sms` (বা আপনার নাম)
2. Zip upload → **Extract**
3. cPanel → **Domains** → Document Root:
   ```
   /home/username/sms/public
   ```

### C. Database (phpMyAdmin)

1. cPanel → **MySQL Databases** → database + user তৈরি → ALL PRIVILEGES
2. cPanel → **phpMyAdmin** → database select → **Import** → local SQL file
3. Database name, username, password note করুন

### D. `.env` (File Manager → Edit)

`.env.production.example` copy → rename `.env` → fill:

```env
APP_ENV=production
APP_DEBUG=false
APP_URL=https://yourdomain.com
APP_KEY=base64:PASTE_FROM_LOCAL_key_generate_show

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=cpanel_db_name
DB_USERNAME=cpanel_db_user
DB_PASSWORD=your_password

SESSION_SECURE_COOKIE=true
SETUP_TOKEN=my-secret-setup-token-12345
```

> `APP_URL` = browser-এ যে URL দিয়ে site খুলবেন (subfolder হলে `https://domain.com/sms`)

### E. Permissions (File Manager)

1. `storage` folder → Right click → **Change Permissions** → **775** → ✅ Recurse into subdirectories
2. Same for `bootstrap/cache` → **775**

### F. Browser setup (Terminal ছাড়াই)

1. `.env`-এ `SETUP_TOKEN` set করুন (উপরে দেখুন)
2. Browser-এ খুলুন:
   ```
   https://yourdomain.com/setup-once.php?token=my-secret-setup-token-12345
   ```
3. সব **OK** দেখলে homepage খুলুন
4. **Security:** `setup-once.php`, `deploy-check.php` delete করুন

### G. Cron (Terminal ছাড়াও করা যায়)

cPanel → **Cron Jobs** → **Every Minute** — PHP path hosting support থেকে জেনে নিন (often `/usr/local/bin/php`):

```
* * * * * cd /home/username/sms && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
* * * * * cd /home/username/sms && /usr/local/bin/php artisan queue:work --stop-when-empty --max-time=55 >> /dev/null 2>&1
```

Cron path না জানলে hosting support-কে জিজ্ঞেস করুন — Terminal লাগে না, শুধু Cron Jobs UI।

### H. Error দেখতে (Terminal ছাড়া)

- `deploy-check.php` upload করে খুলুন — কোন check FAIL দেখায়
- File Manager → `storage/logs/laravel.log` → last lines
- Temporarily `.env`: `APP_DEBUG=true` → reload → error note → `false` করুন

---

## ২. Deploy করার আগে (Local PC-তে)

### A. Production build তৈরি করুন

```powershell
cd C:\xampp\htdocs\sms-gateway
composer install --no-dev --optimize-autoloader
cmd /c "npm ci && npm run build"
C:\xampp\php\php.exe artisan test
```

### B. Upload করবেন — কী upload করবেন, কী করবেন না

**Upload করুন:**
- `app/`, `bootstrap/`, `config/`, `database/`, `public/` (build সহ), `resources/`, `routes/`, `storage/` (খালি structure), `vendor/` (অথবা server-এ `composer install`)
- `artisan`, `composer.json`, `composer.lock`, `package.json`, `package-lock.json`
- `.env.production.example` (reference)

**Upload করবেন না:**
- `.env` (local secrets)
- `node_modules/` (server/build PC-তে build করলে লাগে না)
- `tests/`, `.git/`, `storage/logs/*.log`
- `storage/app/private/*` (dev uploads)
- `database/*.sqlite`
- `composer-setup.php`

---

## ৩. cPanel — Step by Step

### Step 1: MySQL Database তৈরি

1. cPanel → **MySQL Databases**
2. Database তৈরি: e.g. `cpanel_smsgateway`
3. User তৈরি + strong password
4. User-কে database-এ **ALL PRIVILEGES** দিন
5. Hostname note করুন (সাধারণত `localhost` বা `127.0.0.1`)

### Step 2: ফাইল upload

**Option A (Recommended):** Subfolder deploy + document root

1. `File Manager` → `home/username/` → folder: `sms-gateway`
2. Zip upload করে extract
3. cPanel → **Domains** → your domain → **Document Root** সেট করুন:
   ```
   /home/username/sms-gateway/public
   ```

**Option B:** `public_html` — শুধু `public/` folder-এর ভিতরের ফাইল `public_html`-এ copy + Laravel root এক level উপরে রাখুন (advanced, Option A সহজ)

### Step 3: PHP Version

1. cPanel → **Select PHP Version** (or MultiPHP Manager)
2. **PHP 8.2** বা **8.3** select
3. Extensions enable: `pdo_mysql`, `fileinfo`, `mbstring`, `curl`, `openssl`

### Step 4: `.env` ফাইল

1. Server-এ `.env.production.example` copy করে `.env` বানান
2. Fill করুন:

```env
APP_ENV=production
APP_DEBUG=false
APP_URL=https://yourdomain.com
APP_KEY=base64:...   # php artisan key:generate

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=...
DB_USERNAME=...
DB_PASSWORD=...

SESSION_SECURE_COOKIE=true
SESSION_ENCRYPT=true

MAIL_MAILER=smtp
MAIL_HOST=mail.yourdomain.com
...
```

3. Terminal/SSH:
```bash
cd ~/sms-gateway
php artisan key:generate
```

### Step 5: Permissions

```bash
chmod -R 775 storage bootstrap/cache
chown -R username:username storage bootstrap/cache
```

(cPanel File Manager → storage → Permissions → 775)

### Step 6: Laravel setup commands

cPanel → **Terminal** (or SSH):

```bash
cd ~/sms-gateway
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan db:seed --class=AdminUserSeeder --force
php artisan storage:link
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan sitemap:generate
```

অথবা: `bash deploy/cpanel-post-deploy.sh`

**গুরুত্ব:** Production-এ `ADMIN_PASSWORD` `.env`-এ দিয়ে তারপর seed করুন। Default `admin123456` শুধু local-এ।

### Step 7: Cron Jobs (অবশ্যই)

cPanel → **Cron Jobs** → **Every Minute**:

```bash
* * * * * cd /home/username/sms-gateway && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
```

**Queue worker** (database queue — SMS/WhatsApp bulk job):

```bash
* * * * * cd /home/username/sms-gateway && /usr/local/bin/php artisan queue:work --stop-when-empty --max-time=55 --tries=3 >> /dev/null 2>&1
```

> `/usr/local/bin/php` path cPanel → Terminal-এ `which php` দিয়ে verify করুন।

### Step 8: SSL / HTTPS

1. cPanel → **SSL/TLS Status** → AutoSSL enable
2. `.env`: `APP_URL=https://yourdomain.com`
3. `SESSION_SECURE_COOKIE=true`

### Step 9: Admin Control Center configure

Login: `https://yourdomain.com/login` → Admin panel

| Area | Path | Configure |
|------|------|-----------|
| Global branding | Admin → Settings → Global | Site name, logo, favicon |
| SMS rates | Settings → Pricing | Random, Non-Masking, Masking, WhatsApp rates |
| Payments | Settings → Payments | bKash + EPS credentials, **callback URL override** |
| SMS gateway | Settings → Phone Device | Device tokens, intervals |
| WhatsApp | Settings → WhatsApp | Server URL + API key |
| Tawk.to | Settings → Support | Property ID + Widget ID (guest chat) |
| OpenAI | Settings → Auth/AI | Guardrail + Blog AI (optional) |

---

## ৪. Payment Gateway (Live)

### bKash
- Sandbox **OFF**
- Live credentials
- Callback whitelist: `https://yourdomain.com/payments/bkash/callback`
- Admin → Payments → Callback URL override (same HTTPS URL)
- `BKASH_MOCK=false`

### EPS
- Base URL: `https://pgapi.eps.com.bd` (sandbox নয়)
- `EPS_MOCK=false`

---

## ৫. WhatsApp Marketing (Optional)

Node sidecar `whatsapp-server/` — VPS বা same server-এ:

```bash
cd ~/sms-gateway/whatsapp-server
cp .env.example .env
# WA_SERVER_API_KEY = same as Laravel Admin → WhatsApp settings
npm install
npm start   # or PM2: pm2 start server.js --name wa-server
```

Laravel `.env`:
```env
WA_SERVER_URL=http://127.0.0.1:8001
WA_SERVER_API_KEY=your-shared-secret
```

Admin panel-এও same API key save করুন।

---

## ৬. Performance Optimization (Production)

Deploy পর এই commands চালান:

```bash
php artisan config:cache
php artisan route:cache
php artisan view:cache
composer install --optimize-autoloader --no-dev
```

**Already optimized in codebase:**
- Inertia + Vite production build (`public/build/`)
- Database cache/session/queue
- Marketing content cached 1 hour
- DB indexes on SMS logs (migrations)

**Recommendations:**
- cPanel → **Optimize Website** (optional)
- Cloudflare CDN (static assets)
- `LOG_LEVEL=warning` production-এ
- MySQL (SQLite production-এ ব্যবহার করবেন না)

**Bulk SMS note:** Immediate bulk campaigns `dispatchSync` ব্যবহার করে — খুব বড় CSV upload-এ PHP `max_execution_time` বাড়াতে হতে পারে (cPanel PHP settings → 120–300s)।

---

## ৭. Security Checklist

- [ ] `APP_DEBUG=false`
- [ ] `APP_ENV=production`
- [ ] Strong `ADMIN_PASSWORD` + login পর password change
- [ ] MySQL user — শুধু own database access
- [ ] `.env` file web থেকে accessible নয় (Laravel `public/` root-এর বাইরে)
- [ ] `BKASH_MOCK=false`, `EPS_MOCK=false`
- [ ] WhatsApp `WA_SERVER_API_KEY` set (empty = no auth)
- [ ] HTTPS + secure cookies
- [ ] `storage/` ও `bootstrap/cache/` writable, বাকি read-only where possible
- [ ] Production-এ `php artisan db:seed` (full) চালাবেন না — শুধু `AdminUserSeeder` প্রয়োজন হলে

---

## ৮. Go-Live Verification

| Test | URL / Action |
|------|----------------|
| Health | `GET https://yourdomain.com/up` → 200 |
| Homepage | `/` loads, pricing cards show rates |
| Register / Login | OTP flow works |
| Top Up | bKash/EPS redirect (sandbox test first if needed) |
| Send SMS | Dashboard → Quick SMS |
| Admin | `/admin` devices, settings save |
| Cron | Wait 1 min → overflow/reminders logs check |
| Queue | Bulk SMS job processes |
| Storage | Upload logo/blog image → displays |
| Sitemap | `/sitemap.xml` exists |

Logs: `storage/logs/laravel.log`

---

## ৯. Troubleshooting

### White screen / blank page (কিছুই দেখায় না)

Production-এ `APP_DEBUG=false` থাকলে PHP error লুকিয়ে **সাদা/খালি পেজ** দেখায়। নিচের checklist অনুসরণ করুন:

**১. Document Root ঠিক আছে কিনা (সবচেয়ে গুরুত্বপূর্ণ)**

cPanel → Domains → Document Root অবশ্যই Laravel-এর `public` folder:

```
/home/username/sms/public
```

❌ ভুল: project root (`/home/username/sms`) বা `public_html`-এ সব file মিশিয়ে রাখা  
✅ সঠিক: `public/` folder-ই web root

**২. Server `.env` — local copy করবেন না**

Live server-এ `.env.production.example` copy করে `.env` বানান। Local `.env` (যেখানে `APP_URL=http://localhost/sms`) upload করলে site blank হতে পারে।

```env
APP_ENV=production
APP_DEBUG=false
APP_URL=https://yourdomain.com          # trailing slash নয়; subfolder হলে /sms যোগ করুন
APP_KEY=base64:...                      # php artisan key:generate

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=cpanel_db_name
DB_USERNAME=cpanel_db_user
DB_PASSWORD=your_password
```

**৩. Database import-এর পর `.env` DB credentials match করুন**

phpMyAdmin-এ database import করলেও `.env`-এ live DB name/user/password সঠিক না হলে white screen হবে।

**৪. `vendor/` ও `public/build/` upload হয়েছে কিনা**

| Missing | Fix |
|---------|-----|
| `vendor/` | `composer install --no-dev --optimize-autoloader` |
| `public/build/` | Local-এ `npm run build` → `public/build/` folder upload |

**৫. Permissions**

```bash
chmod -R 775 storage bootstrap/cache
```

**৬. Cache clear (local cache upload করলে)**

```bash
php artisan optimize:clear
php artisan config:cache
php artisan route:cache
php artisan view:cache
```

**৭. Error দেখতে (temporary)**

`.env`-এ briefly: `APP_DEBUG=true` → page reload → error message note করুন → আবার `false` করুন।  
অথবা `storage/logs/laravel.log` দেখুন।

**৮. Diagnostic script**

`public/deploy-check.php` upload করে browser-এ খুলুন:

```
https://yourdomain.com/deploy-check.php
```

যা FAIL দেখাবে সেটা fix করুন। Fix-এর পর **deploy-check.php delete** করুন।

**৯. Browser check**

F12 → Console/Network — `build/assets/*.js` 404 হলে `public/build/` missing বা `APP_URL` ভুল।

---

| Problem | Fix |
|---------|-----|
| White screen | উপরের checklist + `deploy-check.php` + `laravel.log` |
| 500 error | `storage/logs/laravel.log` check; permissions 775 on storage |
| Blank CSS/JS | `npm run build` → `public/build/` exists |
| Images 404 | `php artisan storage:link` |
| bKash Forbidden | HTTPS callback URL whitelist + Admin override |
| Session logout | `SESSION_DOMAIN`, `APP_URL` match domain |
| Queue stuck | Cron queue worker running; `failed_jobs` table check |
| Slow site | `config:cache`, enable OPcache in cPanel PHP |

**Cache clear (emergency):**
```bash
php artisan optimize:clear
php artisan config:cache
php artisan route:cache
```

---

## ১০. Local → Live data migration

SQLite/local MySQL থেকে live:

1. Export local MySQL dump (phpMyAdmin)
2. Import to cPanel phpMyAdmin
3. `.env` production settings
4. `php artisan storage:link`
5. Copy `storage/app/public/*` uploads via FTP

অথবা fresh install + `AdminUserSeeder` + Admin panel থেকে settings manually।

---

## Quick Reference — cPanel Cron (copy-paste)

Replace `username` and PHP path:

```
* * * * * cd /home/username/sms-gateway && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1
* * * * * cd /home/username/sms-gateway && /usr/local/bin/php artisan queue:work --stop-when-empty --max-time=55 --tries=3 >> /dev/null 2>&1
```

---

**Support:** Deploy পর issue হলে `storage/logs/laravel.log` এর শেষ ৫০ লাইন + browser error screenshot রাখুন।
