# Somity Keeper Lite — cPanel Shared Hosting Deploy Guide

ডোমেইন: **somitykeeper-lite.com** · Laravel 13 · PHP 8.3 · MySQL
একই অ্যাপ পরিবেশন করে: marketing site + `/secret` superadmin panel + `/api/v1` (মোবাইল অ্যাপ)।

> পুরনো `DEPLOY-LIVE.txt` = AmarAuto-এর, উপেক্ষা করুন। এটাই authoritative।

---

## ০) লোকালে artifact বানান (shared hosting-এ composer/npm ভরসা করবেন না)

শেয়ার্ড হোস্টে RAM/টাইমআউট সীমিত — তাই vendor আর built asset **লোকালে** বানিয়ে আপলোড করুন।

```bash
cd api

# PHP deps — প্রোডাকশন, dev বাদ
composer install --no-dev --optimize-autoloader --classmap-authoritative

# Frontend (Vite + Tailwind 4) → public/build তৈরি করে
npm ci
npm run build            # public/build/ তৈরি হবে

# পুরো api/ ফোল্ডার zip করুন — কিন্তু বাদ দিন:
#   node_modules/  .env  database/database.sqlite  .git  storage/*.log
zip -r ../somity-deploy.zip . \
  -x 'node_modules/*' '.env' '.git/*' 'storage/logs/*' 'database/*.sqlite'
```

`vendor/` আর `public/build/` অবশ্যই zip-এ থাকতে হবে।

---

## ১) cPanel-এ PHP 8.3 + extension

- **MultiPHP Manager** → somitykeeper-lite.com → **PHP 8.3** সেট করুন।
- **Select PHP Version → Extensions** → এগুলো on থাকা চাই:
  `bcmath, ctype, curl, fileinfo, gd, intl, json, mbstring, openssl, pdo_mysql, tokenizer, xml, zip`
- হোস্টের CloudLinux হলে **Select PHP Version → Options** এ `max_execution_time ≥ 60`, `memory_limit ≥ 256M`.

---

## ২) ফোল্ডার লেআউট (গুরুত্বপূর্ণ)

Laravel-এর docroot হতে হয় শুধু `public/`, কিন্তু cPanel-এ ডোমেইনের docroot = `public_html/`।
**সঠিক পদ্ধতি: অ্যাপ `public_html`-এর বাইরে, শুধু public-এর কনটেন্ট ভেতরে।**

```
/home/USER/
├── somity/                ← পুরো Laravel অ্যাপ (zip এখানে extract)
│   ├── app/ bootstrap/ config/ routes/ vendor/ storage/ ...
│   └── public/            ← এর কনটেন্ট public_html-এ যাবে
└── public_html/           ← ডোমেইন docroot (public/ এর কপি)
    ├── index.php          ← নিচে পাথ ঠিক করতে হবে
    ├── .htaccess
    └── build/  storage/  ...
```

ধাপ:
1. zip **`/home/USER/somity/`**-তে extract করুন (File Manager → Extract)।
2. `somity/public/` এর **সব ফাইল** `public_html/`-এ move/copy করুন।
3. `public_html/index.php` এডিট করে দুই লাইন ঠিক করুন:

```php
// আগে:  require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../somity/vendor/autoload.php';

// আগে:  $app = require_once __DIR__.'/../bootstrap/app.php';
$app = require_once __DIR__.'/../somity/bootstrap/app.php';
```

> বিকল্প (হোস্ট docroot বদলাতে দিলে): **Domains** → docroot = `somity/public` করে দিলে index.php এডিট লাগে না। না দিলে উপরের পদ্ধতিই ব্যবহার করুন।

---

## ৩) MySQL ডেটাবেস

**MySQL Databases** এ:
1. ডেটাবেস বানান: `USER_somity`
2. ইউজার বানান + শক্ত পাসওয়ার্ড
3. ইউজারকে ডেটাবেসে **ALL PRIVILEGES** দিন
4. নাম/ইউজার/পাসওয়ার্ড টুকে রাখুন (নিচে .env-এ লাগবে)

---

## ৪) `.env` (প্রোডাকশন)

`somity/` ফোল্ডারে `.env` বানান (`.env.example` কপি করে)। মূল মানগুলো:

```dotenv
APP_NAME="Somity Keeper Lite"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://somitykeeper-lite.com
APP_KEY=            # ধাপ ৫-এ generate হবে

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=USER_somity
DB_USERNAME=USER_somityuser
DB_PASSWORD=********

# Redis লাগবে না — সব database driver
SESSION_DRIVER=database
CACHE_STORE=database
QUEUE_CONNECTION=sync      # shared hosting-এ persistent worker নেই → sync (নিচে দ্রষ্টব্য)

FILESYSTEM_DISK=local

# প্রথম superadmin (seed-এ ব্যবহৃত হবে — ডিফল্ট পাসওয়ার্ড বদলান)
SUPERADMIN_EMAIL=akandmahfuz@gmail.com
SUPERADMIN_PASSWORD=<শক্ত-পাসওয়ার্ড>

# Mail (OTP/ইনভয়েস) — হোস্টের SMTP বা external
MAIL_MAILER=smtp
MAIL_HOST=...
MAIL_PORT=587
MAIL_USERNAME=...
MAIL_PASSWORD=...
MAIL_FROM_ADDRESS=no-reply@somitykeeper-lite.com
MAIL_FROM_NAME="Somity Keeper Lite"

# bKash / FCM push / SMS gateway key থাকলে এখানে যোগ করুন
```

---

## ৫) artisan bootstrap (SSH দিয়ে — cPanel → Terminal বা SSH)

`somity/` ফোল্ডার থেকে (PHP 8.3 বাইনারি পাথ সহ):

```bash
cd ~/somity
PHP=/opt/cpanel/ea-php83/root/usr/bin/php

$PHP artisan key:generate --force        # APP_KEY বসাবে
$PHP artisan migrate --force             # টেবিল + ৪টি প্ল্যান + SMS টেমপ্লেট (data-migration)
$PHP artisan db:seed --force             # superadmin তৈরি
$PHP artisan storage:link                # public/storage → storage/app/public

# ক্যাশ (গতি):
$PHP artisan config:cache
$PHP artisan route:cache
$PHP artisan view:cache
$PHP artisan event:cache
```

> **storage:link cPanel-এ:** symlink `somity/public/storage` → `somity/storage/app/public` বানায়, কিন্তু আপনার docroot `public_html`। তাই আপলোড করা ফাইল দেখাতে `public_html`-এ একটা symlink/কপি লাগবে:
> ```bash
> ln -s ~/somity/storage/app/public ~/public_html/storage
> ```
> হোস্ট symlink আটকালে: `.env`-এ ফাইল সার্ভিং adjust করুন বা হোস্টকে বলুন।

**SSH না থাকলে:** key/migrate/seed একটা সাময়িক protected রুট বা cPanel "Cron (একবার)" দিয়ে চালান — কিন্তু বেশিরভাগ BD হোস্টে (Exonhost/Hostever) jailed SSH দেয়, সেটাই সহজ।

---

## ৬) Cron — **বাধ্যতামূলক** (৭টি daily job)

billing snapshot/enforce, DPS/loan/FDR reminder, reconcile — সব Laravel scheduler-এ।
cPanel → **Cron Jobs** → প্রতি মিনিটে একটা এন্ট্রি:

```
* * * * * /opt/cpanel/ea-php83/root/usr/bin/php /home/USER/somity/artisan schedule:run >> /dev/null 2>&1
```

এই একটা লাইনই সব শিডিউল সামলাবে (schedule:run নিজেই ঠিক সময়ে ঠিক কমান্ড চালায়)।

---

## ৭) Queue নিয়ে দ্রষ্টব্য

- এখন কোনো job আসলে queue-তে যায় না → **`QUEUE_CONNECTION=sync`** নিরাপদ ও সহজ (কাজ inline চলে)।
- ভবিষ্যতে ভারী async দরকার হলে: `QUEUE_CONNECTION=database` + একটা cron:
  `* * * * * ... artisan queue:work --stop-when-empty --max-time=55`

---

## ৮) SSL + https ফোর্স

- cPanel → **SSL/TLS Status** → **Run AutoSSL** (Let's Encrypt) — somitykeeper-lite.com + www।
- `.env` এ `APP_URL=https://...` থাকায় Laravel https লিংক বানাবে। http→https রিডাইরেক্ট cPanel বা `public_html/.htaccess`-এ:
```apacheconf
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
```

---

## ৯) প্রথম লগইন যাচাই

- `https://somitykeeper-lite.com/secret` → superadmin login (env-এর email + password)।
- **প্রথম লগইনেই পাসওয়ার্ড বদলান** (Profile)।
- Onboarding: `https://somitykeeper-lite.com` → self-signup → trial org কাজ করছে কিনা দেখুন।

---

## ১০) Flutter অ্যাপকে live API-তে পয়েন্ট করুন

মোবাইল অ্যাপের API base URL:
```
https://somitykeeper-lite.com/api
```
(রুট গুলো `/api/v1/...` — যেমন `POST /api/v1/auth/login-pin`)

`Flutter UI/`-তে base URL কনস্ট্যান্ট খুঁজে এই মানে বদলে **release APK** বিল্ড করুন। APK চাইলে `public_html`-এ রেখে `/download` পেজ থেকে বিতরণ করা যায় (settings টেবিলে `apk_download_url`)।

---

## ১১) রি-ডিপ্লয় (পরের আপডেটে)

```bash
# লোকালে:
composer install --no-dev -o && npm run build
# → vendor/ + public/build/ সহ নতুন zip

# সার্ভারে (~/somity):
$PHP artisan down                 # maintenance mode
# নতুন ফাইল আপলোড/extract (storage/ আর .env রাখুন অক্ষত)
$PHP artisan migrate --force
$PHP artisan optimize             # config+route+view cache রিফ্রেশ
$PHP artisan up
```

> **সতর্কতা:** কোড বদলালে সবসময় `config:clear && config:cache` — নইলে পুরনো cache থেকে চলবে।

---

## দ্রুত চেকলিস্ট

- [ ] PHP 8.3 + extensions
- [ ] অ্যাপ `~/somity`, public কনটেন্ট `public_html`, index.php পাথ ঠিক
- [ ] MySQL DB + user + privilege
- [ ] `.env` production (APP_ENV/DEBUG/URL/DB/SUPERADMIN/MAIL)
- [ ] key:generate · migrate --force · db:seed --force · storage:link · optimize
- [ ] storage symlink `public_html/storage`
- [ ] Cron `schedule:run` প্রতি মিনিটে
- [ ] AutoSSL + https redirect
- [ ] superadmin login + পাসওয়ার্ড বদল
- [ ] Flutter base URL → https://somitykeeper-lite.com/api → release build
