# รายงานการตรวจสอบปัญหา Service hrms-api-org

**วันที่ตรวจสอบ:** 30 เมษายน 2026
**เครื่องเป้าหมาย:** 192.168.1.63 (hrms)
**Service:** hrms-api-org
**Container Image:** forgejo.chamomind.com/hrms-bangkok/hrms-api-org:v1.1.64

---

## สรุปสถานะปัญหา

| รายการ | สถานะ |
|---------|--------|
| Container Status | Running (ถูก restart เมื่อ 3 ชั่วโมงก่อน) |
| Memory Usage | 144.2 MiB / 2 GiB (7.04%) |
| CPU Usage | 0.02% |
| สถานะหลัก | **พบปัญหา Memory Leak และ Heap Overflow** |

---

## รายละเอียดปัญหา

### 1. JavaScript Heap Out of Memory (รุนแรง)

**ข้อความ Error:**
```
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
```

**สาเหตุ:**
- Node.js default heap size ~1GB
- ระหว่างประมวลผล `batch_update_posMasters` มีข้อมูลจำนวนมาก:
  - posMaster count: **22,635** records
  - historyCreateIds: **17,554** records
  - posMasterAssigns: **1,141** records
- Garbage Collection ทำงานหนักเกินไป:
  ```
  Mark-Compact 1007.9 (1042.1) -> 1001.0 (1043.6) MB, 262.34 / 0.00 ms
  ```
- การประมวลผลใช้เวลานาน (48.9 วินาที ในครั้งแรก)

**ผลกระทบ:**
- Application crash และ restart อัตโนมัติ
- ข้อมูลที่กำลังประมวลผลอาจสูญหายหรือไม่สมบูรณ์

---

### 2. AMQ Channel Timeout (RabbitMQ)

**ข้อความ Error:**
```
Error: Channel closed by server: 406 (PRECONDITION-FAILED) with message
"PRECONDITION_FAILED - delivery acknowledgement on channel 1 timed out.
Timeout value used: 1800000 ms (30 นาที)"
```

**สาเหตุ:**
- Process ค้างเนื่องจาก heap overflow
- ไม่สามารถ acknowledge message ภายใน timeout period (30 นาที)
- RabbitMQ ปิด connection เนื่องจากถือว่า consumer ไม่ตอบสนอง

---

### 3. Container Restart Loop

**หลักฐาน:**
```
hrms-api-org   Up 2 hours (restart 3 hours ago)
```

- Container ถูก restart เมื่อประมาณ 3 ชั่วโมงก่อน
- ปัจจุบันใช้งานได้ปกติ แต่มีความเสี่ยงที่จะเกิดปัญหาซ้ำ
- เมื่อมี workload หนักเข้า อาจเกิด heap overflow ซ้ำอีก

---

## วิธีแก้ไขปัญหา

### วิธีที่ 1: เพิ่ม Node.js Heap Size (แนะนำ)

แก้ไขไฟล์ `/home/dev/repo/compose.yaml` เพิ่ม `NODE_OPTIONS` environment variable:

```yaml
hrms-api-org:
  container_name: hrms-api-org
  image: ${GITEA_INSTANCE}/hrms-bangkok/hrms-api-org:${API_ORG}
  restart: unless-stopped
  deploy:
    resources:
      limits:
        memory: 2G
  ports:
    - "20201:13001"
    - "20401:13002"
  env_file:
    - .env
  environment:
    DB_NAME: hrms_organization
    # เพิ่มบรรทัดนี้เพื่อขยาย heap size เป็น 1.5GB
    NODE_OPTIONS: --max-old-space-size=1536
```

**คำสั่ง apply:**
```bash
cd /home/dev/repo
docker compose pull hrms-api-org
docker compose up -d hrms-api-org
```

---

### วิธีที่ 2: เพิ่ม Docker Memory Limit

หากวิธีที่ 1 ยังไม่พอ ให้เพิ่ม memory limit เป็น 4GB:

```yaml
hrms-api-org:
  container_name: hrms-api-org
  image: ${GITEA_INSTANCE}/hrms-bangkok/hrms-api-org:${API_ORG}
  restart: unless-stopped
  deploy:
    resources:
      limits:
        memory: 4G  # เพิ่มจาก 2G เป็น 4G
  ports:
    - "20201:13001"
    - "20401:13002"
  env_file:
    - .env
  environment:
    DB_NAME: hrms_organization
    NODE_OPTIONS: --max-old-space-size=3072  # 75% ของ 4GB
```

---

### วิธีที่ 3: ปรับปรุง Query Logic (ระยะยาว)

ปัญหานี้เกิดจากการโหลดข้อมูลจำนวนมากในครั้งเดียว แนะนำให้:

1. **ใช้ Pagination** สำหรับ batch_update_posMasters
2. **แบ่ง batch** ให้เล็กลง (เช่น ทำละ 1,000 records)
3. **ใช้ Streaming** แทนการโหลดทั้งหมดลง memory
4. **เพิ่ม Connection Pool** ขนาดเพื่อให้ query เร็วขึ้น

ต้องแก้ไขที่ source code ของ hrms-api-org

---

## ขั้นตอนการแก้ไขด่วน (Immediate Fix)

**SSH ไปที่เครื่อง hrms:**
```bash
ssh -i ~/.ssh/id_warunee dev@192.168.1.63
```

**แก้ไขไฟล์ compose.yaml:**
```bash
cd /home/dev/repo
vi compose.yaml
```

เพิ่ม `NODE_OPTIONS: --max-old-space-size=1536` ใน environment section ของ `hrms-api-org`

**Deploy ใหม่:**
```bash
./deploy.sh hrms-api-org
```

หรือ:
```bash
docker compose pull hrms-api-org
docker compose up -d hrms-api-org
```

**ตรวจสอบสถานะ:**
```bash
docker logs -f hrms-api-org
```

---

## การตรวจสอบหลังแก้ไข

หลังจากแก้ไขแล้ว ให้ตรวจสอบ:

```bash
# ตรวจสอบสถานะ container
docker ps | grep hrms-api-org

# ตรวจสอบ log ล่าสุด
docker logs --tail 100 hrms-api-org

# ตรวจสอบ resource usage
docker stats hrms-api-org --no-stream
```

**สัญญาณที่ดี:**
- ไม่พบข้อความ "JavaScript heap out of memory"
- ไม่พบ "PRECONDITION_FAILED" error
- batch_update_posMasters ใช้เวลาน้อยลง

---

## สรุป

| ประเด็น | รายละเอียด |
|---------|-------------|
| **ปัญหาหลัก** | JavaScript Heap Out of Memory |
| **ความรุนแรง** | High - ทำให้ service restart |
| **วิธีแก้ไขด่วน** | เพิ่ม NODE_OPTIONS=--max-old-space-size=1536 |
| **วิธีแก้ไขระยะยาว** | ปรับปรุง query logic ให้ใช้ memory น้อยลง |
| **ปัจจัยเสี่ยง** | ข้อมูล 22,635+ records ถูกโหลดพร้อมกัน |

---

## เอกสารอ้างอิง

- **Node.js Heap Size:** https://nodejs.org/docs/latest-v20.x/api/cli.html#--max-old-space-sizesize
- **Docker Memory Limits:** https://docs.docker.com/config/containers/resource_constraints/
- **RabbitMQ Consumer Timeout:** https://www.rabbitmq.com/consumers.html#acknowledgement-timeout

---

*รายงานนี้จัดทำโดย Claude Code Security Audit Specialist*
