# VPS সেটআপ গাইড — ৫০+ দোকান হোস্ট করার জন্য

## প্রথমে: "আনলিমিটেড" বলে কিছু নেই

| যা লেখা থাকে | আসলে যা মানে |
|---|---|
| আনলিমিটেড ব্যান্ডউইথ | **Unmetered** — পোর্ট স্পিড সীমিত (১০০ Mbps / ১ Gbps)। মাসে কত TB যাবে তার হিসাব নেই, কিন্তু fair-use নীতিতে বেশি চাপ দিলে থ্রটল বা নোটিশ |
| আনলিমিটেড কোর | এমন কিছু নেই। vCPU সবসময় নির্দিষ্ট সংখ্যায় বিক্রি হয় |
| আনলিমিটেড হোস্টিং/ডিস্ক | শেয়ার্ড হোস্টিংয়ের মার্কেটিং। VPS-এ ডিস্ক সবসময় নির্দিষ্ট GB |

**যা দেখে কিনবেন:** vCPU সংখ্যা · RAM · NVMe SSD কত GB · মাসিক ট্রান্সফার কত TB · পোর্ট স্পিড। এই পাঁচটা সংখ্যা লেখা না থাকলে ওই প্রোভাইডার বাদ দিন।

---

## আপনার আসল লোড

ধরা যাক ৫০টি দোকান, গড়ে মাসে ৫০০ অর্ডার:

| | হিসাব |
|---|---|
| মাসিক অর্ডার | ৫০ × ৫০০ = ২৫,০০০ |
| ল্যান্ডিং পেজ ভিউ | ২% কনভার্শন ধরে ≈ ১২ লাখ/মাস |
| দৈনিক গড় | ≈ ৪২,০০০ ভিউ |
| পিক আওয়ার (সন্ধ্যা ৭–১১টা) | ≈ ১০–১৫ রিকোয়েস্ট/সেকেন্ড |
| ডিস্ক (ছবি, চ্যাট, ভয়েস) | দোকানপ্রতি ২–৫ GB → ১০০–২৫০ GB |
| ব্যান্ডউইথ | ছবিসহ ≈ ৬০০–৮০০ GB/মাস |

### ⚠️ সবচেয়ে বড় ঝুঁকি: লাইভ চ্যাটের পোলিং

আপনার লাইভ চ্যাট পোলিং-ভিত্তিক (WebSocket নয়) — শেয়ার্ড cPanel-এর জন্য সেটাই ঠিক ছিল। কিন্তু ৫০ দোকানে একসাথে ১০০ জন ভিজিটর থাকলে, প্রতি ৫ সেকেন্ডে পোল মানে **শুধু চ্যাটেই ২০ রিকোয়েস্ট/সেকেন্ড** — অর্ডারের চেয়ে বেশি।

তিনটি সহজ উপায়:
1. পোলের ব্যবধান ৫ → ১০ সেকেন্ড করুন (অর্ধেক লোড)
2. চ্যাট বক্স বন্ধ থাকলে পোল বন্ধ রাখুন, খুললেই শুরু
3. ট্যাব ব্যাকগ্রাউন্ডে গেলে থামান (`document.visibilityState`)

তিনটিই ছোট JS পরিবর্তন, কিন্তু সার্ভার খরচ অর্ধেকে নামিয়ে আনবে।

---

## যা কিনবেন

### শুরুতে (১–২৫ দোকান)

```
৪ vCPU  ·  ৮ GB RAM  ·  ১৬০ GB NVMe  ·  ৫ TB ট্রান্সফার
```

### ২৫–৬০ দোকান হলে

```
৮ vCPU  ·  ১৬ GB RAM  ·  ৩২০ GB NVMe  ·  ৮ TB ট্রান্সফার
```

**NVMe জরুরি** — সাধারণ SSD নয়। ৫০টা MySQL ডাটাবেজে ডিস্কের গতিই আসল পার্থক্য গড়ে।

### লোকেশন

| অবস্থান | ঢাকা থেকে লেটেন্সি |
|---|---|
| **সিঙ্গাপুর** | ৫০–৮০ ms ← সবচেয়ে ভালো |
| মুম্বাই | ৬০–৯০ ms |
| ইউরোপ/আমেরিকা | ২০০–৩০০ ms — নেবেন না |

ঢাকার ভেতরে ডেটাসেন্টার সবচেয়ে দ্রুত, কিন্তু আপটাইম ও ব্যাকআপে সাধারণত দুর্বল। সিঙ্গাপুরই ভারসাম্যপূর্ণ।

### প্যানেল

cPanel-এর লাইসেন্স এখন ব্যয়বহুল (মাসে $৪৫+)। বিকল্প:

| প্যানেল | খরচ | মন্তব্য |
|---|---|---|
| **CloudPanel** | ফ্রি | হালকা, দ্রুত, নতুনদের জন্যও সহজ |
| **CyberPanel** | ফ্রি | OpenLiteSpeed বিল্ট-ইন — আপনি LiteSpeed চেনেন |
| aaPanel | ফ্রি | চীনা, ইংরেজি ডকুমেন্টেশন দুর্বল |

আপনার সাইট এখন LiteSpeed-এ চলছে, তাই **CyberPanel** সবচেয়ে পরিচিত লাগবে।

---

## ফোল্ডার কাঠামো

```
/home/sunnahti/
├── app/
│   └── bzr.php                ← শেয়ার্ড কোর (ওয়েবরুটের বাইরে)
├── license/
│   ├── license-server.php
│   ├── loader-template.php
│   └── panel.css
└── public_html/
    ├── subs/
    │   ├── index.php          ← sub-router.php
    │   └── domains.json       ← অটো তৈরি
    └── sites/
        ├── .htaccess          ← রিডাইরেক্ট ম্যাপ (অটো)
        ├── ashik/
        │   ├── index.php      ← লোডার (অটো)
        │   ├── uploads/
        │   └── sessions/
        └── rahim/
```

`app/` ও `license/` ওয়েবরুটের বাইরে রাখুন — কেউ সরাসরি `bzr.php` ডাউনলোড করতে পারবে না।

---

## catch-all vhost — কাস্টম ডোমেইনের চাবি

VPS-এর আসল সুবিধা এখানেই। **একবার এটা বসালে সব কাস্টম ডোমেইন কাজ করবে**, প্রতিটি হাতে যোগ করতে হবে না।

### OpenLiteSpeed / CyberPanel

Virtual Host → নতুন ভার্চুয়াল হোস্ট `catchall`:
- Document Root: `/home/sunnahti/public_html/subs`
- Domain: `*` (Listener-এ ডিফল্ট ম্যাপিং হিসেবে যোগ করুন)

### Nginx

```nginx
server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    root /home/sunnahti/public_html/subs;
    index index.php;

    ssl_certificate     /etc/ssl/catchall/fullchain.pem;
    ssl_certificate_key /etc/ssl/catchall/privkey.pem;

    location / { try_files $uri $uri/ /index.php$is_args$args; }
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    }
    # uploads-এ PHP চলবে না
    location ~ ^/uploads/.*\.php$ { deny all; }
}
```

`default_server` শব্দটাই মূল — যে হোস্টনেম আর কোথাও মেলে না, সব এখানে আসবে, আর রাউটার `domains.json` দেখে ঠিক দোকানে পাঠাবে।

---

## SSL

```bash
curl https://get.acme.sh | sh
```

**ওয়াইল্ডকার্ড (`*.sunnahti.com`)** — DNS-01 লাগে:
```bash
export CF_Token="আপনার-cloudflare-api-token"
acme.sh --issue --dns dns_cf -d sunnahti.com -d '*.sunnahti.com'
```

**কাস্টম ডোমেইন** — সাধারণ HTTP-01 যথেষ্ট (A রেকর্ড আসার পর):
```bash
acme.sh --issue -d ashiksshop.com -d www.ashiksshop.com \
        -w /home/sunnahti/public_html/subs
```

কাস্টমার যাচাই সম্পন্ন করলে এই কমান্ডটা স্বয়ংক্রিয়ভাবে চালানোর জন্য একটা ছোট ক্রন লিখে নিতে পারবেন — `domains.json` পড়ে যেগুলোর সার্ট নেই সেগুলো ইস্যু করবে।

---

## MySQL টিউনিং

`/etc/mysql/my.cnf` (৮ GB RAM ধরে):

```ini
[mysqld]
innodb_buffer_pool_size      = 4G      # RAM-এর ~৫০%
innodb_log_file_size         = 512M
innodb_flush_method          = O_DIRECT
innodb_flush_log_at_trx_commit = 2      # COD অর্ডারে ১ সেকেন্ড ঝুঁকি গ্রহণযোগ্য
max_connections              = 300
table_open_cache             = 4000
slow_query_log               = 1
long_query_time              = 1
```

৫০টি ডাটাবেজে ~২,০০০ টেবিল হবে — `table_open_cache` কম থাকলে সেটাই প্রথম বাধা হয়ে দাঁড়াবে।

## PHP

```ini
opcache.enable                = 1
opcache.memory_consumption    = 256
opcache.max_accelerated_files = 20000
opcache.validate_timestamps   = 1
opcache.revalidate_freq       = 2       ; কোর আপডেট ২ সেকেন্ডে সবাই পাবে
memory_limit                  = 256M
upload_max_filesize           = 20M
post_max_size                 = 24M
max_execution_time            = 60
```

`bzr.php` ২ MB-র বড় একটি ফাইল — opcache ছাড়া প্রতি রিকোয়েস্টে পার্স করতে হবে, সার্ভার তিন-চার গুণ ধীর হয়ে যাবে। **opcache অবশ্যই চালু রাখবেন।**

---

## Cloudflare (ফ্রি) — অবশ্যই

- ছবি ও CSS ক্যাশ করে **ব্যান্ডউইথ ৬০–৮০% কমিয়ে দেয়**
- DDoS ও বট আটকায়
- বাংলাদেশে তাদের এজ আছে, তাই সাইট দ্রুত খোলে

⚠️ **সার্টিফিকেট ইস্যু করার সময় প্রক্সি (কমলা মেঘ) বন্ধ রাখুন**, নাহলে যাচাই ব্যর্থ হবে। ইস্যু হওয়ার পর চালু করুন।

---

## ব্যাকআপ — প্রথম দিন থেকেই

৫০ জন কাস্টমারের ডেটা মানে ৫০টা ব্যবসা আপনার হাতে। একদিন ডেটা হারালে ব্যবসা শেষ।

```bash
# প্রতিদিন রাত ২টা — সব DB আলাদা ফাইলে
0 2 * * * for db in $(mysql -N -e "SHOW DATABASES" | grep ^shop_); do \
  mysqldump --single-transaction $db | gzip > /backup/$db-$(date +\%F).sql.gz; done
```

- **VPS-এর বাইরে** রাখুন (Backblaze B2 সস্তা, বা Google Drive)
- ৭ দিনের দৈনিক + ৪ সপ্তাহের সাপ্তাহিক
- মাসে একবার **ফিরিয়ে এনে পরীক্ষা করুন** — যে ব্যাকআপ কখনো restore করে দেখা হয়নি, সেটা ব্যাকআপ নয়

---

## চালু করার আগে চেকলিস্ট

- [ ] ৫টি সংখ্যা লেখা আছে এমন VPS (vCPU / RAM / NVMe / ট্রান্সফার / পোর্ট)
- [ ] সিঙ্গাপুর বা মুম্বাই
- [ ] `*.sunnahti.com` ওয়াইল্ডকার্ড A রেকর্ড + ওয়াইল্ডকার্ড SSL
- [ ] catch-all vhost বসানো ও পরীক্ষিত
- [ ] opcache চালু, `revalidate_freq = 2`
- [ ] MySQL টিউন করা, slow query log চালু
- [ ] ব্যাকআপ ক্রন চলছে **এবং একবার restore করে দেখা হয়েছে**
- [ ] `app/` ও `license/` ওয়েবরুটের বাইরে
- [ ] লাইভ চ্যাটের পোল ইন্টারভাল ১০ সেকেন্ড
- [ ] দুটি টেস্ট দোকান বানিয়ে অর্ডার, কুরিয়ার বুকিং ও ফোন-চেক করে দেখা
