ติดตั้ง PostgreSQL บน VPS Ubuntu — ฐานข้อมูลแทน MySQL

หากคุณกำลังมองหาฐานข้อมูลที่ เสถียร รองรับ JSON, ฟังก์ชันขั้นสูง และทำ Transaction ได้แน่นกว่า MySQL คำตอบที่นักพัฒนาส่วนใหญ่นึกถึงก็คือ PostgreSQL ฐานข้อมูล Open Source ที่ใช้กันในระบบใหญ่ ๆ ทั้ง Discord, Instagram และ Apple iCloud

บทความนี้จะพาคุณติดตั้ง PostgreSQL บน VPS Ubuntu 22.04 ตั้งแต่ต้นจนใช้งานได้จริง สร้าง Database, สร้าง User, ตั้งรหัสผ่าน และอนุญาตให้แอปพลิเคชันภายนอกเชื่อมต่อได้อย่างปลอดภัย

สิ่งที่ต้องมีก่อน: VPS Ubuntu 20.04/22.04 ที่มี Root หรือ Sudo access, เข้าถึงได้ผ่าน SSH และ Firewall เปิด Port 22 (SSH) แล้ว

PostgreSQL คืออะไร ทำไมต้องใช้

PostgreSQL (อ่านว่า "โพสต์เกรส-คิว-เอล") เป็นระบบจัดการฐานข้อมูลเชิงสัมพันธ์แบบ Object-Relational (ORDBMS) ที่พัฒนามาตั้งแต่ปี 1986 จนถึงปัจจุบัน มีจุดเด่นเรื่อง ACID compliance ที่เคร่งครัด, รองรับ JSONB เก็บเอกสารแบบ NoSQL ในตารางเดียวกับข้อมูล Relational และมี Type system ที่ละเอียดกว่า MySQL อย่างชัดเจน

PostgreSQL vs MySQL ต่างกันอย่างไร

หัวข้อPostgreSQLMySQL
LicensePostgreSQL License (BSD-like)GPL + Commercial (Oracle)
ACID Complianceเต็มรูปแบบทุก Engineเฉพาะ InnoDB
JSON SupportJSONB (index ได้)JSON (จำกัด)
ReplicationStreaming, LogicalMaster-Slave, Group
เหมาะกับAnalytics, Data warehouse, GIS, แอปที่ต้อง Transaction แน่นเว็บทั่วไป, WordPress, Read-heavy

ขั้นที่ 1 — อัปเดตระบบและติดตั้ง PostgreSQL

เริ่มต้นด้วยการอัปเดต Package list และติดตั้ง PostgreSQL พร้อม contrib ที่รวมส่วนเสริมไว้ครบ:

sudo apt update && sudo apt upgrade -y
sudo apt install postgresql postgresql-contrib -y

ตรวจสอบเวอร์ชันและสถานะ:

sudo systemctl status postgresql
psql --version

ถ้าเห็น Active: active (exited) และเวอร์ชัน psql (PostgreSQL) 14.x หรือใหม่กว่า แสดงว่าติดตั้งสำเร็จ ตั้งให้ Autostart หลัง Reboot:

sudo systemctl enable postgresql

ขั้นที่ 2 — เข้าถึง psql ด้วย User postgres

หลังติดตั้ง PostgreSQL จะสร้าง Linux user ชื่อ postgres ขึ้นมาโดยอัตโนมัติ ใช้ user นี้เข้าสู่ Console:

sudo -i -u postgres
psql

เมื่อเห็น Prompt postgres=# แสดงว่าเข้ามาที่ Console ของ PostgreSQL เรียบร้อยแล้ว ลองดู Database ที่มี:

\l

ออกจาก psql ด้วย \q และกลับเป็น user ปกติด้วย exit

ขั้นที่ 3 — สร้าง Database และ User ใหม่

สำหรับโปรดักชัน ไม่ควรใช้ user postgres ตรง ๆ ให้สร้าง user เฉพาะของแอปแทน เปิด psql อีกครั้ง:

sudo -u postgres psql

สร้าง user, database, และให้สิทธิ์:

-- สร้าง user พร้อมรหัสผ่าน
CREATE USER myapp WITH PASSWORD 'StrongPassword123!';

-- สร้าง database โดยให้ owner เป็น user ข้างต้น
CREATE DATABASE myapp_db OWNER myapp;

-- ให้สิทธิ์เต็มกับ user นี้บน database
GRANT ALL PRIVILEGES ON DATABASE myapp_db TO myapp;

\q

ทดสอบ Login ด้วย user ที่สร้างขึ้น:

psql -U myapp -d myapp_db -h 127.0.0.1 -W

ใส่รหัสผ่านที่ตั้งไว้ ถ้าเข้าได้ก็พร้อมใช้งานในแอปได้แล้ว

ขั้นที่ 4 — ตั้งค่าให้รับการเชื่อมต่อจากภายนอก

โดย default PostgreSQL จะรับเฉพาะ Connection จาก localhost เท่านั้น ถ้าต้องการให้แอปบนอีกเซิร์ฟเวอร์เชื่อมต่อได้ ต้องแก้ 2 ไฟล์

4.1 แก้ postgresql.conf

sudo nano /etc/postgresql/14/main/postgresql.conf

หา listen_addresses แล้วเปลี่ยนเป็น:

listen_addresses = '*'

4.2 แก้ pg_hba.conf อนุญาต IP ที่จะเข้ามาเชื่อม

sudo nano /etc/postgresql/14/main/pg_hba.conf

เพิ่มบรรทัดท้ายไฟล์ (เปลี่ยน 192.168.1.100/32 เป็น IP ของแอปจริง):

# TYPE  DATABASE    USER    ADDRESS            METHOD
host    myapp_db    myapp   192.168.1.100/32   scram-sha-256

⚠️ ห้ามใช้ 0.0.0.0/0 เพราะจะเปิดให้ทุก IP บนอินเทอร์เน็ตเชื่อมต่อได้ — ระบุ IP ที่จำเป็นเท่านั้น และใช้ scram-sha-256 เป็นวิธีการ Authenticate แทน md5 ที่อ่อนกว่า

Restart PostgreSQL ให้ค่าใหม่มีผล:

sudo systemctl restart postgresql

4.3 เปิด Firewall

PostgreSQL ใช้ Port 5432 ถ้าใช้ UFW ให้อนุญาตเฉพาะ IP ที่ต้องการ:

sudo ufw allow from 192.168.1.100 to any port 5432

ขั้นที่ 5 — สำรองข้อมูลด้วย pg_dump

PostgreSQL มาพร้อมเครื่องมือสำรองข้อมูลในตัวชื่อ pg_dump ใช้สร้างไฟล์ SQL ของฐานข้อมูล:

sudo -u postgres pg_dump myapp_db > /backup/myapp_db_$(date +%F).sql

คืนค่าจากไฟล์ Backup:

sudo -u postgres psql myapp_db < /backup/myapp_db_2026-05-13.sql

เคล็ดลับ: ตั้ง cron job ให้รัน pg_dump ทุกวันตอนตี 3 แล้วส่งไฟล์ขึ้น S3 หรือ Cloud Storage จะปลอดภัยกว่าเก็บไว้บนเครื่องเดียวกัน

ขั้นที่ 6 — คำสั่ง psql พื้นฐานที่ต้องรู้

ติดตั้ง PostgreSQL บน Ubuntu VPS — ขั้นตอนแบบเจาะลึก

หากคุณเช่า VPS ใหม่จาก AsiaGB (Ubuntu 22.04, เริ่มต้น 500 บาท/เดือน) สิ่งแรกที่ควรทำหลัง SSH เข้าเครื่องคือเช็กว่ามี PostgreSQL เวอร์ชันใดอยู่ใน Repository ของ Ubuntu บางครั้งเวอร์ชันใน Repository มาตรฐานอาจเก่ากว่าเวอร์ชันล่าสุดหลายรุ่น ถ้าต้องการเวอร์ชันใหม่สุดให้เพิ่ม PostgreSQL Official APT Repository เข้าไปก่อน:

# เพิ่ม PostgreSQL official repository (ถ้าต้องการเวอร์ชันล่าสุด)
sudo apt install -y postgresql-common
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh

# จากนั้นติดตั้งตามปกติ
sudo apt update
sudo apt install -y postgresql postgresql-contrib

เมื่อติดตั้งเสร็จ Service จะถูกตั้งให้รันอัตโนมัติทันที ตรวจสอบว่า PostgreSQL เปิด Port 5432 ฟังอยู่จริงด้วยคำสั่ง:

sudo ss -tlnp | grep 5432

ถ้าเห็นบรรทัดที่ระบุ 127.0.0.1:5432 แสดงว่า PostgreSQL พร้อมรับการเชื่อมต่อจาก localhost แล้ว ขั้นตอนนี้สำคัญเพราะถ้า Port ไม่ขึ้นมา มักเกิดจาก Service ไม่ได้สตาร์ต หรือมี Process อื่นจองพอร์ตไว้ ลองดู Log ที่ /var/log/postgresql/ เพื่อหาสาเหตุ

หมายเหตุเรื่องเวอร์ชัน: Path ของไฟล์ตั้งค่า (เช่น /etc/postgresql/14/main/) จะเปลี่ยนเลขตามเวอร์ชันที่ติดตั้ง ถ้าใช้ PostgreSQL 16 ก็เปลี่ยนเป็น /etc/postgresql/16/main/ ตรวจสอบเลขเวอร์ชันด้วย ls /etc/postgresql/ ก่อนแก้ไฟล์เสมอ

สร้าง Database, User และจัดการสิทธิ์อย่างละเอียด

ในหัวข้อก่อนหน้าเราสร้าง User และ Database แบบรวบรัดผ่านคำสั่ง SQL ภายใน psql แล้ว แต่ PostgreSQL ยังมีเครื่องมือ Command-line ที่เรียกได้จาก Shell โดยตรงโดยไม่ต้องเข้า psql ก่อน ได้แก่ createuser และ createdb ซึ่งสะดวกเวลาเขียน Script อัตโนมัติ:

# สร้าง user แบบ interactive (จะถามสิทธิ์ทีละข้อ)
sudo -u postgres createuser --interactive --pwprompt

# สร้าง database พร้อมระบุ owner
sudo -u postgres createdb -O myapp myapp_db

เรื่องสิทธิ์ (Privileges) ใน PostgreSQL มีรายละเอียดมากกว่าที่หลายคนคิด การ GRANT ALL PRIVILEGES ON DATABASE ให้สิทธิ์ระดับ "เชื่อมต่อและสร้าง Schema" เท่านั้น แต่ไม่ได้ครอบคลุมสิทธิ์บน ตารางที่ถูกสร้างขึ้นภายหลัง โดยอัตโนมัติ ตั้งแต่ PostgreSQL 15 เป็นต้นมา สิทธิ์บน Schema public ถูกจำกัดเข้มขึ้น คุณจึงต้องให้สิทธิ์บน Schema ด้วยอย่างชัดเจน:

sudo -u postgres psql -d myapp_db
-- ให้ user เป็นเจ้าของ schema public
GRANT ALL ON SCHEMA public TO myapp;

-- ให้สิทธิ์บนตารางที่จะสร้างในอนาคตโดยอัตโนมัติ
ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT ALL ON TABLES TO myapp;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT ALL ON SEQUENCES TO myapp;
\q

ตรวจสอบรายชื่อ Role และสิทธิ์ที่มีได้ด้วย \du ภายใน psql และถ้าต้องการดูสิทธิ์ของตารางแต่ละตัวให้ใช้ \dp tablename วิธีนี้ช่วยให้คุณ Debug ปัญหา "Permission denied for table" ที่พบบ่อยเวลาแอปเชื่อมต่อด้วย User ที่ไม่ใช่ Owner ได้รวดเร็วขึ้น

คำสั่งระดับสิทธิ์ครอบคลุม
GRANT ALL ON DATABASEDatabaseConnect, สร้าง Schema
GRANT ALL ON SCHEMA publicSchemaสร้างตาราง/Object ใน schema
GRANT ALL ON ALL TABLESTableตารางที่มีอยู่ ณ ตอนนั้น
ALTER DEFAULT PRIVILEGESFuture objectsตารางที่จะสร้างในอนาคต

ตั้งค่าความปลอดภัยและ Remote Access ให้รัดกุม

การเปิดให้ PostgreSQL รับการเชื่อมต่อจากภายนอกเป็นจุดที่เสี่ยงต่อความปลอดภัยมากที่สุด หากตั้งค่าไม่รอบคอบ Bot ที่สแกนหา Port 5432 ทั่วอินเทอร์เน็ตจะพยายาม Brute-force รหัสผ่านของคุณทันที กฎเหล็กคือ เปิดเฉพาะเท่าที่จำเป็น และซ้อนการป้องกันหลายชั้น (Defense in depth)

ใน postgresql.conf ถ้าแอปกับ Database อยู่คนละเครื่องในเครือข่ายภายใน (Private Network) ให้ระบุเฉพาะ IP ภายในแทนการใช้ '*' ที่ฟังทุก Interface:

# ฟังเฉพาะ private IP ของ VPS แทน '*' (ปลอดภัยกว่า)
listen_addresses = 'localhost,10.0.0.5'

ใน pg_hba.conf ลำดับของบรรทัดมีความสำคัญ — PostgreSQL จะอ่านจากบนลงล่างและใช้บรรทัดแรกที่ตรงกับ Connection ทันที จึงควรวางกฎที่เฉพาะเจาะจง (IP เดียว) ไว้ก่อนกฎที่กว้างกว่า และใช้ scram-sha-256 เป็นวิธี Authenticate เสมอ:

# TYPE  DATABASE   USER    ADDRESS           METHOD
local   all        all                       peer
host    myapp_db   myapp   10.0.0.10/32      scram-sha-256
host    all        all     127.0.0.1/32      scram-sha-256

เพื่อความปลอดภัยขั้นสูง ควรเปิดใช้งาน SSL บน Connection ระหว่างแอปกับ Database เพื่อเข้ารหัสข้อมูลที่วิ่งผ่านเครือข่าย ตั้งค่าใน postgresql.conf:

ssl = on
ssl_cert_file = '/etc/ssl/certs/server.crt'
ssl_key_file = '/etc/ssl/private/server.key'

จากนั้นบังคับให้ Connection จากภายนอกต้องใช้ SSL โดยเปลี่ยน host เป็น hostssl ใน pg_hba.conf ฝั่งแอปก็เพิ่ม ?sslmode=require ต่อท้าย Connection String

⚠️ Checklist ความปลอดภัย: ตั้งรหัสผ่านที่ยาว ≥ 16 ตัวอักษร, ปิด Firewall ทุก Port ยกเว้นที่ใช้จริง, อย่าใช้ User postgres เชื่อมต่อจากแอป, และพิจารณาเปลี่ยน Port 5432 เป็นเลขอื่นเพื่อหลบการสแกนอัตโนมัติ (Security through obscurity เป็นเพียงชั้นเสริม ไม่ใช่ชั้นหลัก)

Backup, Restore และ Tuning เบื้องต้น

นอกจาก pg_dump ที่ใช้ Backup ทีละ Database แล้ว PostgreSQL ยังมี pg_dumpall สำหรับ Backup ทั้ง Cluster (รวม Role และ Global setting) และ pg_restore สำหรับคืนค่าจากไฟล์ Backup รูปแบบ Custom ที่บีบอัดและคืนค่าได้เร็วกว่าไฟล์ SQL ธรรมดา แนะนำให้ Backup ในรูปแบบ Custom format:

# Backup แบบ custom format (บีบอัด + restore เลือกตารางได้)
sudo -u postgres pg_dump -Fc myapp_db > /backup/myapp_db_$(date +%F).dump

# Restore จากไฟล์ custom format
sudo -u postgres pg_restore -d myapp_db --clean /backup/myapp_db_2026-06-07.dump

# Backup ทั้ง cluster (รวม role + permission)
sudo -u postgres pg_dumpall > /backup/full_cluster_$(date +%F).sql

ด้าน Tuning เบื้องต้น ค่า Default ของ PostgreSQL ถูกตั้งมาให้รันได้บนเครื่องที่มี RAM น้อยมาก เพื่อให้เข้ากันได้กับฮาร์ดแวร์ทุกระดับ ดังนั้นบน VPS ที่มี RAM พอสมควรคุณควรปรับค่าหลัก ๆ เหล่านี้ใน postgresql.conf ให้เหมาะกับขนาดเครื่อง:

พารามิเตอร์คำแนะนำทำหน้าที่
shared_buffers~25% ของ RAMหน่วยความจำที่ PostgreSQL ใช้ Cache ข้อมูล
effective_cache_size~50–75% ของ RAMบอก Planner ว่ามี Cache ของ OS เท่าไร
work_mem16–64MBหน่วยความจำต่อการ Sort/Hash หนึ่งครั้ง
maintenance_work_mem256MB–1GBใช้ตอน VACUUM, CREATE INDEX
max_connections100 (ใช้ Pooler ถ้าต้องมาก)จำนวน Connection พร้อมกันสูงสุด

ถ้าแอปของคุณเปิด Connection จำนวนมาก ควรใช้ Connection Pooler อย่าง PgBouncer คั่นกลางแทนที่จะเพิ่ม max_connections สูง ๆ เพราะทุก Connection ของ PostgreSQL กินหน่วยความจำพอสมควร อย่าลืมรัน sudo systemctl restart postgresql ทุกครั้งหลังแก้ค่าใน postgresql.conf และใช้คำสั่ง VACUUM ANALYZE เป็นระยะเพื่อให้ Planner มีสถิติล่าสุดและคืนพื้นที่ที่ถูกลบไปแล้ว

เคล็ดลับ: เว็บ pgtune ช่วยคำนวณค่าตั้งต้นที่เหมาะกับ RAM และจำนวน Core ของ VPS คุณได้อัตโนมัติ ลองนำผลลัพธ์ไปปรับใน postgresql.conf แล้ววัดผลด้วย Query จริงก่อนใช้บนโปรดักชัน

เปลี่ยนรหัสผ่าน User postgres เพื่อความปลอดภัย

หลังติดตั้งครั้งแรก user postgres ไม่มีรหัสผ่านระดับ database ให้ตั้งใหม่:

sudo -u postgres psql
ALTER USER postgres WITH PASSWORD 'AnotherStrongPassword!';
\q

สรุป Checklist หลังติดตั้ง PostgreSQL

  1. ติดตั้ง postgresql และ postgresql-contrib พร้อมเปิด Autostart
  2. เปลี่ยนรหัสผ่าน user postgres ทันที
  3. สร้าง user และ database แยกตามแอป — ห้ามใช้ postgres ในโปรดักชัน
  4. แก้ postgresql.conf และ pg_hba.conf เฉพาะเมื่อต้องการ Remote Access
  5. เปิด Firewall เฉพาะ IP ที่จำเป็น ห้ามเปิด 0.0.0.0/0
  6. ตั้ง pg_dump backup รายวันแล้วส่งออกนอกเซิร์ฟเวอร์

คำถามที่พบบ่อย (FAQ)

PostgreSQL กับ MySQL ควรเลือกตัวไหนสำหรับเว็บทั่วไป?

ถ้าเว็บของคุณเป็น WordPress หรือ CMS สำเร็จรูปที่รองรับ MySQL เป็นหลัก การใช้ MySQL/MariaDB จะติดตั้งง่ายและเข้ากันได้ดีกว่า แต่ถ้าคุณกำลังพัฒนาแอปเองที่ต้องการ Transaction ที่เข้มงวด, เก็บข้อมูลแบบ JSONB, หรือทำงาน Analytics ที่ซับซ้อน PostgreSQL จะตอบโจทย์มากกว่าและขยายตัวได้ดีในระยะยาว ทั้งสองตัวรันได้สบายบน VPS ของ AsiaGB ที่เริ่มต้น 500 บาท/เดือน

ติดตั้ง PostgreSQL ต้องใช้ VPS สเปกเท่าไร?

PostgreSQL รันได้บน VPS ขั้นต่ำที่มี RAM 1GB สำหรับโปรเจกต์เล็กหรือทดสอบ แต่ถ้าจะใช้งานจริงที่มี Traffic หรือข้อมูลหลายหมื่นแถวขึ้นไป แนะนำ RAM อย่างน้อย 2GB เพื่อให้ปรับ shared_buffers และ work_mem ได้เหมาะสม VPS Linux SSD ของ AsiaGB ให้ Full Root Access จึงปรับแต่งค่าเหล่านี้ได้อิสระ

ลืมรหัสผ่าน User postgres ต้องทำอย่างไร?

เนื่องจาก Linux user postgres เข้า psql ได้ผ่าน peer authentication โดยไม่ต้องใช้รหัสผ่าน คุณจึงรีเซ็ตได้เสมอด้วย sudo -u postgres psql แล้วรัน ALTER USER postgres WITH PASSWORD 'รหัสใหม่'; โดยไม่ต้องรู้รหัสเดิม ขอแค่มีสิทธิ์ sudo บนเครื่อง VPS

จะให้ pg_dump รัน Backup อัตโนมัติทุกวันได้อย่างไร?

ใช้ cron job ของระบบ โดยรัน sudo crontab -u postgres -e แล้วเพิ่มบรรทัด เช่น 0 3 * * * pg_dump -Fc myapp_db > /backup/myapp_db_$(date +\%F).dump เพื่อ Backup ทุกวันตอนตี 3 แนะนำให้ส่งไฟล์ขึ้น Cloud Storage และตั้งให้ลบ Backup เก่าเกิน 14 วันออกอัตโนมัติเพื่อประหยัดพื้นที่

ต้องการ VPS สำหรับ Database ที่เสถียรและเร็ว?

AsiaGB VPS Linux SSD เริ่มต้น 500 บาท/เดือน Full Root Access เลือกทำเลไทย / สิงคโปร์ พร้อมเปิด Port อิสระ

ดูแพ็กเกจ VPS