# IT Career Solution — cPanel ডিপ্লয় গাইড

এই গাইড ধরে ধরে itcareersolution.com-এ (সম্পূর্ণ PHP/MySQL cPanel হোস্টিং) Laravel সাইটটি বসানো যাবে।
কোনো step বাদ দেবেন না — বিশেষ করে **WordPress ব্যাকআপ** ও **.env**।

---

## ০. যা যা লাগবে

| জিনিস | প্রয়োজন |
|---|---|
| cPanel লগইন | ফাইল ম্যানেজার / MySQL / Domains / Terminal |
| PHP | ৮.৩ বা তার বেশি (`php -v`) |
| PHP extension | `pdo_mysql`, `mbstring`, `openssl`, `tokenizer`, `xml`, `ctype`, `json`, `fileinfo`, `curl` |
| MySQL | ১টি ডাটাবেস + ১টি ইউজার |
| Apache | `mod_rewrite` চালু (cPanel-এ সাধারণত থাকে) |
| SSL | Let's Encrypt (cPanel → SSL/TLS Status → Run AutoSSL) |

> এই প্রজেক্টে Vite/Tailwind লাগে না — CSS/JS সরাসরি `public/`-এ আছে। তাই `npm build` দরকার নেই।

---

## ১. WordPress ব্যাকআপ (সবচেয়ে আগে!)

১. cPanel → **File Manager** → `public_html` সিলেক্ট → **Compress** → `wordpress-backup-YYYYMMDD.zip` → ডাউনলোড করে নিজের পিসিতে রাখুন।
২. cPanel → **phpMyAdmin** → বর্তমান WordPress ডাটাবেস সিলেক্ট → **Export** → Format: **SQL** → **Go** → `.sql` ফাইল ডাউনলোড করুন।
৩. cPanel → **MySQL Databases**-এ চাইলে ডাটাবেসের নাম মনে রাখুন (পরে দরকার হলে restore করতে পারবেন)।
৪. নিশ্চিত হোন ব্যাকআপ ফাইল দুটো (zip + sql) পিসিতে খুলে দেখা যায়।

> ⚠️ এই দুটো ব্যাকআপ ছাড়া পুরোনো সাইট মুছবেন না।

---

## ২. MySQL ডাটাবেস ও ইউজার তৈরি

১. cPanel → **MySQL Databases**।
২. **New Database**: নাম দিন, যেমন `itcs` → cPanel নামকে `cpuser_itcs` বানাবে।
৩. **MySQL Users** → নতুন ইউজার + শক্ত পাসওয়ার্ড দিন (যেমন `itcs_user`)।
৩. **Add User To Database** → দুটো সিলেক্ট → **ALL PRIVILEGES** → **Make Changes**।

লিখে রাখুন:
```
DB_DATABASE = cpuser_itcs
DB_USERNAME = cpuser_itcs
DB_PASSWORD = <আপনার সেট করা পাসওয়ার্ড>
DB_HOST     = 127.0.0.1 (কখনো localhost)
```

---

## ২.৫. ডেমো ডাটা বাদ দেবেন কি?

সাইটের সব কনটেন্ট (কোর্স, শাখা, SEO) ডিফল্টভাবে `database/data/*.json` থেকে আসে — তাই কনটেন্টের জন্য seed দরকার নেই।
তবে **একজন অ্যাডমিন লাগবে** লগইন করার জন্য। তাই একবার seed চালিয়ে অ্যাডমিন বানিয়ে সাথে সাথে পাসওয়ার্ড বদলাবেন (ধাপ ৯)।

---

## ৩. ফাইল আপলোড

আপনি পাবেন `itcs-deploy-YYYYMMDD.zip` প্যাকেজ (এতে `vendor/` সহ সব আছে)।

**যদি ডকুমেন্ট রুট বদলাতে পারেন (সুপারিশকৃত — পদ্ধতি A):**
১. cPanel → File Manager → হোম ডিরেক্টরিতে (public_html-এর বাইরে) `itcs` নামে ফোল্ডার বানান।
২. `itcs-deploy.zip` আপলোড করে `itcs/`-এর ভিতরে **Extract** করুন।
৩. cPanel → **Domains** → `itcareersolution.com` → **Manage** → **Document Root** = `/home/cpuser/itcs/public` → Save।
   - Primary domain-এ অপশন না থাকলে **পদ্ধতি B** ব্যবহার করুন।

**যদি ডকুমেন্ট রুট বদলানো না যায় (পদ্ধতি B):**
১. `public_html`-এর ভিতরের পুরোনো WordPress ফাইল সরিয়ে (ব্যাকআপ থাকলে) `itcs-deploy.zip` Extract করুন, যাতে `public_html/index.php`, `public_html/vendor/`, `public_html/public/` থাকে।
২. `public_html/.htaccess` ফাইল বানিয়ে নিচেরটুকু বসান:

```apache
# public_html/.htaccess  (সতর্কতা: app পুরোটা public_html-এ থাকলে এটা বাধ্যতামূলক)
Options -Indexes
<IfModule mod_rewrite.c>
    RewriteEngine On

    # সংবেদনশীল ফাইল/ফোল্ডার সরাসরি অ্যাক্সেস বন্ধ
    RewriteRule ^(\.env.*|\.git|app|bootstrap|config|database|resources|routes|storage|tests|vendor)(/|$) - [F,L]
    RewriteRule ^(artisan|composer\.json|composer\.lock|package\.json|package-lock\.json|vite\.config\.js|phpunit\.xml|README\.md|server\.php)$ - [F,L]

    # সব রিকোয়েস্ট public/ ফোল্ডারে পাঠাও
    RewriteCond %{REQUEST_URI} !^/public/
    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

# .env কখনোই যেন ওপেন না হয়
<FilesMatch "^\.env">
    Require all denied
</FilesMatch>
```

---

## ৪. `.env` তৈরি

১. File Manager-এ app ফোল্ডারে (A হলে `itcs/`, B হলে `public_html/`) `.env.production.example` কপি করে নাম দিন `.env`।
২. `.env` এডিট করে ধাপ ২-এর MySQL তথ্য ও URL বসান:

```env
APP_ENV=production
APP_DEBUG=false
APP_URL=https://itcareersolution.com

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=cpuser_itcs
DB_USERNAME=cpuser_itcs
DB_PASSWORD=আপনার_আসল_পাসওয়ার্ড

SESSION_SECURE_COOKIE=true
```

> `APP_KEY` ইতিমধ্যেই বসানো আছে (`.env.production.example`-এ)। চাইলে ধাপ ৫-এ নতুন করে generate করতে পারেন।
> শুধু http-তে টেস্ট করলে `SESSION_SECURE_COOKIE=false` রাখুন।

---

## ৫. Terminal (SSH) দিয়ে কমান্ড

cPanel → **Terminal** খুলুন। ধাপ ৩-A হলে:

```bash
cd ~/itcs
php artisan key:generate --force
php artisan migrate --force
php artisan db:seed --force          # শুধু একবার — ডেমো অ্যাডমিন/স্টুডেন্ট বানাবে
php artisan config:clear
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan storage:link
```

> **Terminal না থাকলে:** cPanel → **Cron Jobs** → Add New Cron Job → Command:
> `/usr/local/bin/php /home/cpuser/itcs/artisan migrate --force`
> Common Settings: *Once Per Minute* → Save → ১ মিনিট অপেক্ষা করে Cron টি **Delete** করুন।
> একইভাবে `key:generate`, `config:cache` ইত্যাদি চালান।

---

## ৫.১ পারমিশন (File Manager → Permissions)

- `storage/` এবং `bootstrap/cache/` → **755** (কিছু হোস্টে **775**)
- `public/uploads/` → **755** (অ্যাডমিন এখানে ছবি আপলোড করবে)
- `.env` → **600** বা **644**

---

## ৬. SSL

cPanel → **SSL/TLS Status** → `itcareersolution.com` টিক দিয়ে **Run AutoSSL**।
সব ঠিক থাকলে `http` → `https` হবে অটো। তারপর `.env`-এ `SESSION_SECURE_COOKIE=true` নিশ্চিত করুন।

---

## ৭. চেকলিস্ট (ব্রাউজারে খুলে দেখুন)

- [ ] `https://itcareersolution.com/` — হোমপেজ ওপেন হয়
- [ ] `/courses`, `/courses/digital-marketing` — কোর্স পেজ
- [ ] `/about`, `/contact`, `/branches`, `/verify` — সবগুলো ২০০
- [ ] `/verify/ICS-2026-10457` — সার্টিফিকেট দেখা যায়
- [ ] `/sitemap.xml`, `/robots.txt` — ওপেন হয়
- [ ] `/login` → অ্যাডমিন লগইন কাজ করে
- [ ] `/admin` → কোনো ট্যাব সেভ করলে ডাটা থাকে
- [ ] অ্যাডমিন → SEO ট্যাব ও Courses ট্যাবের peri-course SEO কাজ করে
- [ ] ছবি আপলোড হয়ে `/uploads/...` থেকে দেখা যায়
- [ ] ভুল URL দিলে সুন্দর ৪০৪ পেজ আসে
- [ ] একটি টেস্ট কোর্সের `noindex` দিয়ে দেখুন `sitemap.xml` থেকে বাদ পড়ে

---

## ৮. অ্যাডমিন/ডেমো পাসওয়ার্ড পরিবর্তন (জরুরি!)

Seed করলে ডেমো লগইন থাকে (পাবলিক জায়গায় থাকা এগুলো **অবশ্যই** বদলান):

| ইমেইল | পুরোনো পাসওয়ার্ড |
|---|---|
| admin@itcs.com | Admin@123 |
| student@itcs.com | Student@123 |
| student2@itcs.com | Student@123 |

cPanel **Terminal**-এ (নিজের ইমেইল/পাসওয়ার্ড বসিয়ে):

```bash
php artisan tinker --execute "App\Models\User::where('email','admin@itcs.com')->update(['email'=>'YOUR_EMAIL','password'=>bcrypt('YOUR_NEW_STRONG_PASSWORD')]);"
```

ডেমো স্টুডেন্ট মুছে ফেলতে:

```bash
php artisan tinker --execute "App\Models\User::whereIn('email',['student@itcs.com','student2@itcs.com'])->delete();"
```

---

## ৯. ডিপ্লয় প্যাকেজ আবার বানানো (ঐচ্ছিক)

নতুন পরিবর্তনের পর প্যাকেজ রিবিল্ড করতে, প্রজেক্ট ফোল্ডারে PowerShell খুলে:

```powershell
powershell -ExecutionPolicy Bypass -File .\deploy-package.ps1
```

এটি `..\deploy\itcs-deploy-YYYYMMDD.zip` তৈরি করবে (vendor সহ, dev ফাইল বাদ দিয়ে)।

---

## ট্রাবলশুটিং

| সমস্যা | সমাধান |
|---|---|
| 500 error, কিছু দেখা যায় না | `.env` আছে কিনা, `APP_KEY` আছে কিনা; `storage/` ও `bootstrap/cache/` লিখনযোগ্য কিনা |
| সাদা পেজ / পুরোনো কনটেন্ট | `php artisan optimize:clear` তারপর `config:cache route:cache view:cache` |
| 404 সব লিংকে | `mod_rewrite` বন্ধ বা `.htaccess` ভুল; ধাপ ৩ (B) এর `.htaccess` ঠিক করুন |
| Login হচ্ছে না (cookies) | HTTPS হলে `SESSION_SECURE_COOKIE=true`, না হলে `false` |
| DB connection error | `DB_HOST=127.0.0.1` (localhost নয়), ইউজারকে ডাটাবেসে সব প্রিভিলেজ দেওয়া আছে কিনা |
| ছবি আপলোড 500 | `public/uploads` ফোল্ডার তৈরি ও 755 পারমিশন |
| Composer/terminal নেই | প্যাকেজে `vendor/` আছে তাই দরকার নেই; শুধু artisan কমান্ড ক্রন দিয়ে চালান |
| নতুন CSS/JS দেখাচ্ছে না | ব্রাউজার hard refresh (Ctrl+F5); `php artisan view:clear` |

---

## দ্রুত কমান্ড (একসাথে)

```bash
php artisan key:generate --force
php artisan migrate --force
php artisan db:seed --force
php artisan storage:link
php artisan optimize:clear
php artisan config:cache
php artisan route:cache
php artisan view:cache
```

> **নোট:** কোনো পরিবর্তনের পর `.env` এডিট করলে সবসময় `php artisan config:cache` আবার চালাবেন।
