Initial commit

This commit is contained in:
Porawit Dongwang
2026-09-16 23:20:08 +07:00
commit 0041668dbb
32577 changed files with 3687927 additions and 0 deletions
@@ -0,0 +1,240 @@
# 05. Enterprise Installation & Production Deployment Guide
**Project:** Thai Traditional Massage Queue Management System (TTMQMS Enterprise)
**Target Environments:** Hospital DMZ / On-Premise Ubuntu 22.04 LTS / AWS / Google Cloud
**Containerization:** Docker & Docker Compose
**Version:** 1.0.0 Production
---
## 1. System Requirements & Hardware Specification
ก่อนเริ่มติดตั้งระบบ โปรดตรวจสอบความพร้อมของเซิร์ฟเวอร์ตามเกณฑ์ขั้นต่ำสำหรับสภาพแวดล้อม Production:
- **CPU:** 4 Cores (Intel Xeon / AMD EPYC หรือ AWS t3.xlarge ขึ้นไป)
- **RAM:** 8 GB DDR4+ (แนะนำ 16 GB สำหรับระบบที่รองรับผู้ใช้ 500+ คน/วัน)
- **Storage:** 100 GB NVMe SSD (สำหรับ Database และ Log Retention 5 ปี)
- **OS:** Ubuntu 22.04 LTS / Debian 12 / RHEL 9
- **Network:** Port 80/443 (HTTPS Web Traffic), Port 3306 (MySQL), Port 6379 (Redis), Port 8080 (HIS mTLS Gateway)
---
## 2. Automated Docker Deployment (Recommended)
วิธีที่สะดวกรวดเร็วและเป็นมาตรฐานที่สุดคือการรันผ่าน **Docker Compose** ซึ่งรวม PHP 8.1-FPM, Nginx, MySQL 8.0 และ Redis ไว้ในชุดเดียว
### Step 2.1: Clone Repository & Prepare Environment Variables
```bash
# 1. คัดลอกโค้ดจาก Git Repository
git clone https://github.com/hospital-it/ttmqms-enterprise.git /opt/ttmqms
cd /opt/ttmqms
# 2. สร้างไฟล์การตั้งค่าตัวแปรระบบ (.env)
cp .env.example .env
chmod 600 .env
# 3. แก้ไขค่ารหัสผ่านและคีย์ลับ
nano .env
```
**ตัวอย่างการตั้งค่าไฟล์ `.env`:**
```ini
APP_ENV=production
APP_DEBUG=false
APP_URL=https://ttmqms.hospital.go.th
APP_KEY=base64:7vX9/2zH+Q8L5mN3bV6xC1aS4dF0gH2jK5lP8rT9wU0=
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=ttmqms_db
DB_USERNAME=ttmqms_user
DB_PASSWORD=SuperSecretDbPassword@2026
DB_ROOT_PASSWORD=SuperSecretRootPassword@2026
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=SuperSecretRedisPassword@2026
HIS_API_URL=https://192.168.1.250:8080/api
HIS_MTLS_CERT_PATH=/etc/ssl/his/client.crt
HIS_MTLS_KEY_PATH=/etc/ssl/his/client.key
JWT_SECRET=EnterpriseJwtSecretKeyForTokenSigning9988776655
JWT_TTL_MINUTES=60
```
### Step 2.2: Build and Launch Containers
```bash
# รันคำสั่งสร้างและเริ่มต้น Docker Containers ในโหมด Background
docker compose up -d --build
# ตรวจสอบสถานะการทำงานของ Container ทั้ง 4 ตัว (nginx, php, mysql, redis)
docker compose ps
```
### Step 2.3: Initialize Database Schema & Stored Procedures
```bash
# สั่งรันสคริปต์นำเข้าโครงสร้างตาราง, Views, Triggers และ Stored Procedures
docker exec -i ttmqms-mysql mysql -u root -pSuperSecretRootPassword@2026 ttmqms_db < database/schema.sql
# ยืนยันการนำเข้าข้อมูลตัวอย่าง (Mock Data & Super Admin Account)
docker exec -i ttmqms-mysql mysql -u root -pSuperSecretRootPassword@2026 ttmqms_db -e "SELECT id, national_id, full_name, role FROM users;"
```
---
## 3. Nginx Reverse Proxy & SSL/TLS 1.3 Configuration
เพื่อความปลอดภัยสูงสุดและรองรับ PWA Service Worker อย่างสมบูรณ์ ต้องกำหนดค่า Nginx ให้บังคับใช้ **HTTPS (TLS 1.2 / 1.3)** และแนบ Security Headers
**ไฟล์การตั้งค่า `/etc/nginx/sites-available/ttmqms.conf`:**
```nginx
server {
listen 80;
server_name ttmqms.hospital.go.th;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name ttmqms.hospital.go.th;
root /opt/ttmqms/public;
index index.php index.html;
# SSL Certificates (Let's Encrypt / Hospital Enterprise CA)
ssl_certificate /etc/letsencrypt/live/ttmqms.hospital.go.th/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ttmqms.hospital.go.th/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# OWASP Security Headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline' 'unsafe-eval';" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# PWA Service Worker Routing & Static Asset Caching
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|manifest\.json)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
# Front Controller Routing (REST API & View Router)
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 60;
}
# Deny access to sensitive files (.env, git, sql)
location ~ /\.(?!well-known).* {
deny all;
}
}
```
---
## 4. CI/CD Pipeline Configuration (GitHub Actions -> Production)
การตรวจสอบคุณภาพโค้ด (Lint/Test) และ Deploy ขึ้นเซิร์ฟเวอร์โรงพยาบาลแบบอัตโนมัติเมื่อทำการ Merge เข้าสาขา `main`
**ไฟล์ `.github/workflows/deploy.yml`:**
```yaml
name: TTMQMS Enterprise CI/CD Pipeline
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
test-and-lint:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3
- name: Setup PHP 8.1
uses: shivammathur/setup-php@v2
with:
php-version: '8.1'
extensions: pdo_mysql, mbstring, gd, redis
- name: Validate PHP Syntax (Linting)
run: |
find . -name "*.php" -exec php -l {} \; | grep -v "No syntax errors" || true
deploy-production:
needs: test-and-lint
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
runs-on: ubuntu-latest
steps:
- name: Deploy via SSH to Hospital Production Server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.PROD_HOST }}
username: ${{ secrets.PROD_USER }}
key: ${{ secrets.PROD_SSH_KEY }}
script: |
cd /opt/ttmqms
git pull origin main
docker compose down
docker compose up -d --build
docker system prune -f
echo "🚀 Deployment to TTMQMS Production Server Successful!"
```
---
## 5. Manual Apache / XAMPP / MAMP / WAMP Deployment (การติดตั้งแบบคัดลอกลงโฟลเดอร์ `htdocs`)
สำหรับโรงพยาบาลที่ใช้เซิร์ฟเวอร์แบบดั้งเดิม (On-Premise Apache Web Server) หรือผู้พัฒนาที่ต้องการรันผ่านจำลองเซิร์ฟเวอร์เช่น **XAMPP, MAMP, WAMP, AppServ** สามารถติดตั้งระบบโดยการคัดลอกไฟล์ไปวางในโฟลเดอร์ `htdocs` ได้ทันที 100% เนื่องจากระบบถูกสร้างด้วย PHP 8.1 สถาปัตยกรรม Clean Architecture โดยไม่พึ่งพา Node.js Server หรือ Build Pipeline ที่ซับซ้อน
### Step 5.1: เตรียมความพร้อมโปรแกรมจำลองเซิร์ฟเวอร์ (XAMPP / MAMP)
1. ตรวจสอบเวอร์ชันของ PHP ต้องเป็น **PHP 8.1 ขึ้นไป**
2. เปิดไฟล์ `php.ini` (เช่น `C:\xampp\php\php.ini`) แล้วตรวจสอบให้แน่ใจว่าได้ลบเครื่องหมายเซมิโคลอน `;` เพื่อเปิดใช้งาน Extensions ดังนี้:
```ini
extension=pdo_mysql
extension=mbstring
extension=gd
extension=intl
extension=curl
```
*(หมายเหตุ: หากไม่มี Redis สามารถใช้งานได้ตามปกติ โดยระบบจะสลับไปใช้ Database/File Session พื้นฐาน)*
### Step 5.2: คัดลอกไฟล์ระบบไปยังโฟลเดอร์ `htdocs`
1. คัดลอกโฟลเดอร์โครงการ `ttmqms-enterprise` ทั้งหมดไปวางในโฟลเดอร์ `htdocs` ของท่าน:
- **Windows (XAMPP):** `C:\xampp\htdocs\ttmqms`
- **macOS (MAMP):** `/Applications/MAMP/htdocs/ttmqms`
- **Linux (Apache Manual):** `/var/www/html/ttmqms`
2. ระบบได้เตรียมไฟล์ `.htaccess` ไว้ที่ Root (`/ttmqms/.htaccess`) และใน `/public/.htaccess` เรียบร้อยแล้ว ซึ่งจะทำการส่งคำขอทั้งหมดไปยัง Front Controller (`public/index.php`) และป้องกันการดาวน์โหลดไฟล์ความลับเช่น `.env` โดยอัตโนมัติ
### Step 5.3: นำเข้าฐานข้อมูลผ่าน phpMyAdmin
1. เปิดเบราว์เซอร์ไปที่ `http://localhost/phpmyadmin`
2. สร้างฐานข้อมูลใหม่ชื่อ **`ttmqms_db`** (เลือก Collation เป็น `utf8mb4_unicode_ci` หรือ `utf8mb4_general_ci`)
3. คลิกแท็บ **Import (นำเข้า)** เลือกไฟล์ `database/schema.sql` แล้วกด Import (ระบบจะสร้างโครงสร้างตารางทั้ง 13 ตาราง, Views, AI Stored Procedure, Triggers และข้อมูลตัวอย่างให้อัตโนมัติในครั้งเดียว)
### Step 5.4: ตั้งค่าตัวแปรระบบในไฟล์ `.env`
1. เข้าไปที่โฟลเดอร์ `htdocs/ttmqms` ทำการคัดลอกไฟล์ `.env.example` แล้วเปลี่ยนชื่อเป็น **`.env`**
2. เปิดไฟล์ `.env` ด้วย Notepad หรือ VS Code แล้วตั้งค่าการเชื่อมต่อ MySQL ตามเครื่องของท่าน (ตัวอย่างของ XAMPP):
```ini
APP_ENV=local
APP_DEBUG=true
APP_URL=http://localhost/ttmqms
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=ttmqms_db
DB_USERNAME=root
DB_PASSWORD=
```
### Step 5.5: เข้าใช้งานระบบผ่านเว็บเบราว์เซอร์
- เปิดเบราว์เซอร์แล้วพิมพ์ URL: **`http://localhost/ttmqms`** (หรือ `http://localhost/ttmqms/public`)
- หน้าเว็บจะแสดงระบบคิวนวดแผนไทย TTMQMS Enterprise พร้อมเข้าสู่ระบบด้วยเลขบัตรประชาชนและทดสอบออกคิวได้ทันที!
---
*คู่มือฉบับนี้จัดทำขึ้นเพื่อผู้ดูแลระบบและวิศวกรเครือข่ายของโรงพยาบาลโดยเฉพาะ*