ป้ายกำกับ: ขโมยข้อมูล

Docker: Samba Script เริ่มต้นระบบ (Provisioning Check )Docker: Samba Script เริ่มต้นระบบ (Provisioning Check )

ในโลกของระบบ Microservices และ Containerization การเริ่มต้นระบบฐานข้อมูลให้พร้อมใช้งานอย่างถูกต้องเป็นขั้นตอนที่สำคัญที่สุด การใช้ Docker ร่วมกับสคริปต์ Entrypoint ทำให้เราสามารถจำลองกระบวนการ Provisioning (การเตรียมระบบ) ให้เกิดขึ้นโดยอัตโนมัติก่อนที่แอปพลิเคชันจะเริ่มทำงาน

บทความนี้จะพาไปดูหลักการทำงานของสคริปต์ `entrypoint.sh` ที่ทำหน้าที่เป็นตัวจัดการระบบสำหรับ PostgreSQL Container โดยเฉพาะ เพื่อตรวจสอบและตั้งค่าฐานข้อมูลให้พร้อมใช้งานเสมือนการตั้งค่า Domain Controller ของ Samba แต่ปรับใช้กับหลักการของระบบ Relational Database Management System (RDBMS) อย่าง PostgreSQL

หลักการทำงานของ PostgreSQL Provisioning Script

สคริปต์การเริ่มต้นระบบจะแบ่งการทำงานออกเป็นขั้นตอนหลักๆ เพื่อให้มั่นใจว่าฐานข้อมูลจะถูกตั้งค่าอย่างสมบูรณ์และไม่เกิดการทับซ้อนของข้อมูลเดิม หากระบบเคยถูกใช้งานมาก่อน

  1. 1. การกำหนดตัวแปร (Environment Variables Definition)

    สคริปต์จะดึงค่า Environment Variables ที่จำเป็น เช่น ชื่อฐานข้อมูล (DB_NAME), ชื่อผู้ใช้ (DB_USER), และรหัสผ่าน (ADMIN_PASSWORD) หากไม่ได้ส่งค่ามา จะใช้ค่าเริ่มต้นที่กำหนดไว้เพื่อความยืดหยุ่นในการใช้งาน

  2. 2. การตรวจสอบสถานะ (Schema Condition Check)

    ขั้นตอนสำคัญคือการตรวจสอบว่า Schema หรือตารางหลักของระบบได้ถูกสร้างขึ้นแล้วหรือไม่ โดยการรันคำสั่ง SQL เพื่อตรวจสอบการมีอยู่ของ Object ต่างๆ การตรวจสอบนี้ช่วยป้องกันไม่ให้สคริปต์พยายามสร้างฐานข้อมูลใหม่ทับของเดิม ซึ่งอาจทำให้ข้อมูลสำคัญสูญหาย

  3. 3. การ Provisioning (Initial Setup)

    หากพบว่า Schema ยังไม่ถูกสร้าง (Provisioning) สคริปต์จะเริ่มดำเนินการตั้งค่าระบบทั้งหมด ได้แก่:

    • สร้าง Schema/Database: สร้างฐานข้อมูลหลักตามชื่อที่กำหนด
    • สร้าง Role และ User: กำหนด Role และ User สำหรับแอปพลิเคชันและผู้ดูแลระบบ
    • รัน Migration Scripts: รันไฟล์ SQL สำหรับสร้างตาราง (Tables) และกำหนดความสัมพันธ์ (Constraints) ต่างๆ
    • ใส่ข้อมูลเริ่มต้น (Seed Data): ใส่ข้อมูลตั้งต้นที่จำเป็น เช่น รายชื่อผู้ดูแลระบบ หรือค่า Config เริ่มต้น
  4. 4. การเริ่มบริการ (Service Start)

    เมื่อการตรวจสอบและตั้งค่าเสร็จสมบูรณ์ สคริปต์จะสั่งให้ PostgreSQL Service ทำงานในโหมด Foreground เพื่อให้ Container ยังคงทำงานต่อไปได้ไม่ปิดตัวเองลง

ตัวอย่างโค้ดจำลองการตรวจสอบและตั้งค่า (SQL Logic)

นี่คือตัวอย่างตรรกะการตรวจสอบในรูปแบบ SQL ที่ใช้ในการตัดสินใจว่าควรทำการ Provisioning หรือไม่:

SQL

-- ตรวจสอบว่าตาราง 'users' มีอยู่หรือไม่ (Condition Check) </code><br>SELECT EXISTS (SELECT 1 FROM information_schema.tables WHERE table_name = 'users');<br><br>-- หากตารางไม่มีอยู่ (Provisioning Logic) </code><br>CREATE ROLE app_user WITH LOGIN PASSWORD 'secure_pass';<br>CREATE TABLE IF NOT EXISTS users (<code>user_id</code> INT PRIMARY KEY, <code>username</code> VARCHAR(50) NOT NULL, <code>created_at</code> TIMESTAMP DEFAULT NOW());<br>INSERT INTO users (user_id, username) VALUES (1, 'admin');<br><br>-- คำสั่งสุดท้ายเพื่อรันบริการ </code><br>psql -h localhost -U app_user -d ${DB_NAME} -c "SELECT 1;"

บทสรุป

การใช้สคริปต์ Entrypoint สำหรับ PostgreSQL ไม่เพียงแต่ช่วยให้การ Deploy ระบบเป็นไปอย่างอัตโนมัติเท่านั้น แต่ยังช่วยให้เราสามารถควบคุมสถานะของฐานข้อมูลได้อย่างแม่นยำ ทำให้มั่นใจได้ว่าไม่ว่าระบบจะถูกรีสตาร์ทกี่ครั้ง ข้อมูลและโครงสร้างพื้นฐานที่จำเป็นจะถูกตรวจสอบและพร้อมใช้งานเสมอ นี่คือหัวใจสำคัญของการออกแบบระบบระดับ Senior Architect ในยุค Containerization