# Deploy & Rollout Runbook (Phase 10)
อัปเดต: 24 กุมภาพันธ์ 2026

## เป้าหมาย

- Deploy บริการ `WepAppOpusApi` ไป production แบบปลอดภัย
- มี regression gate ก่อนปล่อย
- มี smoke test หลังปล่อย
- มี rollback step ชัดเจน

## Target Environment

- Host: `192.166.82.95`
- User: `root`
- Service Port: `22222`
- PM2 app name: `wepappopusapi`
- Deploy directory: `/opt/lnwads/WepAppOpusApi`

## 1) Pre-flight Checklist

- [ ] เซิร์ฟเวอร์มี Node.js 20+ และ PM2
- [ ] มี `.env` ใน `/opt/lnwads/WepAppOpusApi`
- [ ] ค่า env สำคัญตั้งครบ:
  - `PORT=22222`
  - `API_ACCESS_TOKEN_ENC` (แนะนำ) หรือ `API_ACCESS_TOKEN` (legacy)
  - `DATABASE_URL` (prod) หรือ `ADS_DB_PATH`
  - `TOKEN_ENCRYPTION_KEY` (จำเป็นเมื่อใช้ token แบบ encrypted)
- [ ] ถ้าเปิด login mode (`LOGIN_REQUIRED=true`) ให้ตั้ง:
  - `LOGIN_SECRET`
  - `CSRF_ALLOWED_ORIGINS`

## 2) Regression Gate (Local)

ก่อน deploy ให้รันทดสอบทั้งหมด:

```bash
cd WepAppOpusApi
npx vitest run
```

## 3) Deploy (Automated Script)

ใช้สคริปต์เดียวจบ:

```bash
cd WepAppOpusApi
npm run deploy:rollout
```

ค่า override ที่ใช้ได้:

```bash
DEPLOY_HOST=192.166.82.95 \
DEPLOY_USER=root \
DEPLOY_PORT=22 \
DEPLOY_DIR=/opt/lnwads/WepAppOpusApi \
PM2_APP_NAME=wepappopusapi \
RUN_TESTS=1 \
npm run deploy:rollout
```

สคริปต์จะทำ:
1) `npx vitest run` (ถ้า `RUN_TESTS=1`)
2) `rsync` โค้ดขึ้นเซิร์ฟเวอร์
3) remote `npm ci`
4) remote `npm run db:migrate`
5) restart/start PM2
6) remote `npm run rollout:smoke`

## 4) Smoke Test (Manual/After Deploy)

```bash
curl -s http://127.0.0.1:22222/health
curl -s http://127.0.0.1:22222/ready
curl -s http://127.0.0.1:22222/metrics/json
curl -s http://127.0.0.1:22222/bridge/status
```

และตรวจ log:

```bash
pm2 logs wepappopusapi --lines 120
```

## 5) Rollout Strategy

1. Deploy WepAppOpusApi เวอร์ชันใหม่บน `22222`
2. ยืนยัน smoke test ผ่าน
3. เปิดการใช้งานจาก UI ตาม feature ที่ต้องการ (profile mode / caching / security)
4. เฝ้าดู `metrics/json` + PM2 logs อย่างน้อย 30-60 นาที

## 6) Rollback

### 6.1 App rollback (เร็วที่สุด)
- กลับไป git tag/commit ก่อนหน้า แล้ว deploy ซ้ำ
- หรือ sync โค้ดเวอร์ชันก่อนหน้าแล้ว `pm2 restart wepappopusapi --update-env`

### 6.2 Emergency disable (ถ้าต้องหยุดชั่วคราว)

```bash
pm2 stop wepappopusapi
```

### 6.3 Feature rollback (ไม่ต้อง rollback โค้ดทั้งหมด)
- ปิด login mode: `LOGIN_REQUIRED=false` (ถ้าต้องการ bypass auth ชั่วคราว)
- ปิด CSRF origin guard: `CSRF_ORIGIN_CHECK_ENABLED=false`
- ปิด security headers: `SECURITY_HEADERS_ENABLED=false`

> หลังแก้ env ต้อง `pm2 restart wepappopusapi --update-env`

## 7) Post-rollout Acceptance

- [ ] `/health` = ok
- [ ] `/ready` = ready
- [ ] `/bridge/status` คืนค่า DB backend ถูก
- [ ] dashboard หน้าหลักเข้าได้และดึงข้อมูลจริงได้
- [ ] token profile CRUD ยังทำงาน
- [ ] log ไม่มี error ต่อเนื่อง 5xx
