12 KiB
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
# 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:
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
# รันคำสั่งสร้างและเริ่มต้น 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
# สั่งรันสคริปต์นำเข้าโครงสร้างตาราง, 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:
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:
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)
- ตรวจสอบเวอร์ชันของ PHP ต้องเป็น PHP 8.1 ขึ้นไป
- เปิดไฟล์
php.ini(เช่นC:\xampp\php\php.ini) แล้วตรวจสอบให้แน่ใจว่าได้ลบเครื่องหมายเซมิโคลอน;เพื่อเปิดใช้งาน Extensions ดังนี้:(หมายเหตุ: หากไม่มี Redis สามารถใช้งานได้ตามปกติ โดยระบบจะสลับไปใช้ Database/File Session พื้นฐาน)extension=pdo_mysql extension=mbstring extension=gd extension=intl extension=curl
Step 5.2: คัดลอกไฟล์ระบบไปยังโฟลเดอร์ htdocs
- คัดลอกโฟลเดอร์โครงการ
ttmqms-enterpriseทั้งหมดไปวางในโฟลเดอร์htdocsของท่าน:- Windows (XAMPP):
C:\xampp\htdocs\ttmqms - macOS (MAMP):
/Applications/MAMP/htdocs/ttmqms - Linux (Apache Manual):
/var/www/html/ttmqms
- Windows (XAMPP):
- ระบบได้เตรียมไฟล์
.htaccessไว้ที่ Root (/ttmqms/.htaccess) และใน/public/.htaccessเรียบร้อยแล้ว ซึ่งจะทำการส่งคำขอทั้งหมดไปยัง Front Controller (public/index.php) และป้องกันการดาวน์โหลดไฟล์ความลับเช่น.envโดยอัตโนมัติ
Step 5.3: นำเข้าฐานข้อมูลผ่าน phpMyAdmin
- เปิดเบราว์เซอร์ไปที่
http://localhost/phpmyadmin - สร้างฐานข้อมูลใหม่ชื่อ
ttmqms_db(เลือก Collation เป็นutf8mb4_unicode_ciหรือutf8mb4_general_ci) - คลิกแท็บ Import (นำเข้า) เลือกไฟล์
database/schema.sqlแล้วกด Import (ระบบจะสร้างโครงสร้างตารางทั้ง 13 ตาราง, Views, AI Stored Procedure, Triggers และข้อมูลตัวอย่างให้อัตโนมัติในครั้งเดียว)
Step 5.4: ตั้งค่าตัวแปรระบบในไฟล์ .env
- เข้าไปที่โฟลเดอร์
htdocs/ttmqmsทำการคัดลอกไฟล์.env.exampleแล้วเปลี่ยนชื่อเป็น.env - เปิดไฟล์
.envด้วย Notepad หรือ VS Code แล้วตั้งค่าการเชื่อมต่อ MySQL ตามเครื่องของท่าน (ตัวอย่างของ XAMPP):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 พร้อมเข้าสู่ระบบด้วยเลขบัตรประชาชนและทดสอบออกคิวได้ทันที!
คู่มือฉบับนี้จัดทำขึ้นเพื่อผู้ดูแลระบบและวิศวกรเครือข่ายของโรงพยาบาลโดยเฉพาะ