การติดตั้ง PostgreSQL 16 บน Cloud VPS

PostgreSQL เป็นระบบจัดการฐานข้อมูลเชิงสัมพันธ์แบบ Open Source ที่ได้รับความนิยมสูง ด้วยความสามารถรองรับ JSON, Full-Text Search, Window Functions และ Extension ต่าง ๆ ทำให้เหมาะกับงานตั้งแต่เว็บแอปพลิเคชันขนาดเล็กไปจนถึงระบบ Enterprise ขนาดใหญ่ เวอร์ชัน 16 มาพร้อมกับการปรับปรุงด้าน Query Performance, Logical Replication และ Monitoring ที่ดีขึ้นอย่างมาก

บทความนี้จะแนะนำขั้นตอนการติดตั้ง PostgreSQL 16 บนเซิร์ฟเวอร์ Linux ทั้ง Ubuntu/Debian และ CentOS/AlmaLinux พร้อมตั้งค่าเบื้องต้นให้พร้อมใช้งานจริง ครอบคลุมตั้งแต่เพิ่ม Repository, ติดตั้งแพ็กเกจ, ตั้งค่า Authentication ไปจนถึงการเปิดให้เชื่อมต่อจากภายนอก

ความต้องการขั้นต่ำของระบบ

ก่อนเริ่มติดตั้ง ควรตรวจสอบว่าเซิร์ฟเวอร์มีคุณสมบัติขั้นต่ำดังนี้

  • CPU: 1 Core ขึ้นไป (แนะนำ 2 Cores สำหรับ Production)
  • RAM: 1 GB ขึ้นไป (แนะนำ 2 GB สำหรับ Production)
  • Disk: 10 GB ขึ้นไป (SSD แนะนำสำหรับประสิทธิภาพที่ดี)
  • OS: Ubuntu 22.04/24.04, Debian 12, CentOS Stream 9, AlmaLinux 9 หรือ Rocky Linux 9
  • สิทธิ์ root หรือ sudo access

ติดตั้งบน Ubuntu / Debian

เพิ่ม Official APT Repository

แพ็กเกจในคลัง Repository เริ่มต้นของ Ubuntu/Debian มักเป็นเวอร์ชันเก่า การเพิ่ม Repository อย่างเป็นทางการช่วยให้ได้เวอร์ชันล่าสุดพร้อมอัปเดตด้านความปลอดภัย

sudo apt update
sudo apt install -y gnupg2 wget

# เพิ่ม GPG Key
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

# อัปเดตรายการแพ็กเกจ
sudo apt update

ติดตั้งแพ็กเกจ

# ติดตั้งตัวเซิร์ฟเวอร์และเครื่องมือ Client
sudo apt install -y postgresql-16 postgresql-client-16

# ตรวจสอบเวอร์ชัน
psql --version

หลังติดตั้งเสร็จ ระบบจะสร้าง Cluster เริ่มต้นและเปิดให้บริการอัตโนมัติ ตรวจสอบสถานะได้ด้วยคำสั่ง

sudo systemctl status postgresql
sudo systemctl enable postgresql

ติดตั้งบน CentOS / AlmaLinux / Rocky Linux

เพิ่ม Official YUM Repository

สำหรับตระกูล RHEL ต้องเพิ่ม Repository อย่างเป็นทางการเช่นกัน และปิดโมดูลที่มาพร้อมระบบเพื่อป้องกันเวอร์ชันชนกัน

# ติดตั้ง Repository
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# ปิดโมดูลเริ่มต้น
sudo dnf -qy module disable postgresql

ติดตั้งและ Initialize

# ติดตั้งแพ็กเกจ
sudo dnf install -y postgresql16-server postgresql16

# Initialize Database Cluster
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb

# เปิดบริการและตั้งค่า Auto Start
sudo systemctl start postgresql-16
sudo systemctl enable postgresql-16

# ตรวจสอบสถานะ
sudo systemctl status postgresql-16

ข้อแตกต่างสำคัญคือ บน RHEL-based ต้องรัน initdb ด้วยตนเอง ขณะที่ Ubuntu/Debian จะสร้าง Cluster อัตโนมัติตั้งแต่ตอนติดตั้ง

ตั้งค่าเบื้องต้นหลังติดตั้ง

ตั้งรหัสผ่าน Superuser

หลังติดตั้งเสร็จ ผู้ใช้ postgres จะไม่มีรหัสผ่าน ควรตั้งรหัสผ่านทันทีเพื่อความปลอดภัย

# สลับไปยังผู้ใช้ postgres
sudo -i -u postgres

# เข้า psql แล้วตั้งรหัสผ่าน
psql
ALTER USER postgres PASSWORD 'YourStrongPassword123!';
\q

# ออกจากผู้ใช้ postgres
exit

สร้าง Database และ User สำหรับแอปพลิเคชัน

ไม่ควรใช้ Superuser ในการเชื่อมต่อจากแอปพลิเคชัน ควรสร้างผู้ใช้แยกที่มีสิทธิ์เฉพาะเท่าที่จำเป็น

sudo -i -u postgres psql

-- สร้างผู้ใช้ใหม่
CREATE USER appuser WITH PASSWORD 'AppSecurePass456!';

-- สร้างฐานข้อมูลและกำหนดเจ้าของ
CREATE DATABASE myappdb OWNER appuser;

-- ให้สิทธิ์ทั้งหมดในฐานข้อมูลนี้
GRANT ALL PRIVILEGES ON DATABASE myappdb TO appuser;

\q

ทดสอบเชื่อมต่อ

# เชื่อมต่อด้วยผู้ใช้ที่สร้างใหม่
psql -U appuser -d myappdb -h localhost

# ทดสอบคำสั่ง SQL
SELECT version();
\conninfo
\q

ทำความเข้าใจไฟล์ตั้งค่าหลัก

การตั้งค่าทั้งหมดอยู่ในไดเรกทอรี Data ซึ่งตำแหน่งจะแตกต่างกันตามระบบปฏิบัติการ

ระบบปฏิบัติการตำแหน่งไดเรกทอรี
Ubuntu/Debian/etc/postgresql/16/main/
CentOS/AlmaLinux/var/lib/pgsql/16/data/

ไฟล์สำคัญ 2 ไฟล์ที่ต้องรู้จัก

  • postgresql.conf — ไฟล์ตั้งค่าหลัก ควบคุมพฤติกรรมของเซิร์ฟเวอร์ทั้งหมด เช่น พอร์ต, หน่วยความจำ, Logging และ Performance
  • pg_hba.conf — ไฟล์ควบคุมการเข้าถึง (Host-Based Authentication) กำหนดว่าใครสามารถเชื่อมต่อจากที่ไหนได้บ้าง

ตั้งค่า pg_hba.conf สำหรับ Authentication

ไฟล์ pg_hba.conf ควบคุมว่าใครสามารถเชื่อมต่อเข้ามาได้ แต่ละบรรทัดมีรูปแบบดังนี้

# TYPE    DATABASE    USER        ADDRESS         METHOD
local     all         all                          peer
host      all         all         127.0.0.1/32     scram-sha-256
host      all         all         ::1/128          scram-sha-256

อธิบายแต่ละคอลัมน์

  • TYPE — ประเภทการเชื่อมต่อ: local (Unix Socket), host (TCP/IP), hostssl (เฉพาะ SSL)
  • DATABASE — ชื่อฐานข้อมูลที่อนุญาต ใช้ all สำหรับทุกฐานข้อมูล
  • USER — ชื่อผู้ใช้ที่อนุญาต ใช้ all สำหรับทุกคน
  • ADDRESS — IP Address หรือ CIDR ที่อนุญาต (เฉพาะ host/hostssl)
  • METHOD — วิธียืนยันตัวตน เช่น peer, scram-sha-256, md5, trust, reject

วิธี scram-sha-256 เป็นมาตรฐานที่แนะนำในเวอร์ชัน 16 เพราะปลอดภัยกว่า md5 อย่างมาก หากยังใช้ md5 อยู่ควรเปลี่ยนเป็น scram-sha-256 ทันที

เปิดให้เชื่อมต่อจากภายนอก (Remote Access)

ค่าเริ่มต้นจะรับเฉพาะการเชื่อมต่อจาก localhost เท่านั้น หากต้องการให้แอปพลิเคชันจากเครื่องอื่นเชื่อมต่อได้ ต้องแก้ไข 2 ไฟล์

แก้ไข postgresql.conf

# Ubuntu/Debian
sudo nano /etc/postgresql/16/main/postgresql.conf

# CentOS/AlmaLinux
sudo nano /var/lib/pgsql/16/data/postgresql.conf

# เปลี่ยนบรรทัด listen_addresses
listen_addresses = '*'          # รับทุก IP
# หรือระบุเฉพาะ IP
listen_addresses = '0.0.0.0'   # รับเฉพาะ IPv4 ทุก interface

แก้ไข pg_hba.conf

# เพิ่มบรรทัดอนุญาต IP ที่ต้องการ
# อนุญาตเฉพาะ IP เดียว
host    myappdb     appuser     192.168.1.100/32    scram-sha-256

# อนุญาตทั้ง Subnet
host    myappdb     appuser     192.168.1.0/24      scram-sha-256

# อนุญาตทุก IP (ไม่แนะนำสำหรับ Production)
host    all         all         0.0.0.0/0           scram-sha-256

รีสตาร์ทบริการและเปิด Firewall

# รีสตาร์ทเพื่อให้การตั้งค่ามีผล
sudo systemctl restart postgresql      # Ubuntu/Debian
sudo systemctl restart postgresql-16   # CentOS/AlmaLinux

# เปิด Firewall (UFW)
sudo ufw allow 5432/tcp

# เปิด Firewall (firewalld)
sudo firewall-cmd --permanent --add-port=5432/tcp
sudo firewall-cmd --reload

คำเตือนด้านความปลอดภัย: การเปิดพอร์ต 5432 สู่อินเทอร์เน็ตโดยตรงมีความเสี่ยงสูง ควรจำกัด IP ที่เข้าถึงได้ใน pg_hba.conf และ Firewall ให้เฉพาะเจาะจง หรือใช้ VPN/SSH Tunnel แทน

ปรับแต่ง Performance เบื้องต้น

ค่าเริ่มต้นถูกออกแบบให้ทำงานได้บนทุกเครื่อง แต่สำหรับ Production ควรปรับแต่งให้เหมาะกับทรัพยากรที่มี โดยแก้ไขใน postgresql.conf

# หน่วยความจำ
shared_buffers = '256MB'              # 25% ของ RAM (สำหรับ 1 GB RAM)
effective_cache_size = '768MB'        # 75% ของ RAM
work_mem = '4MB'                      # หน่วยความจำต่อ Operation
maintenance_work_mem = '64MB'         # สำหรับ VACUUM, CREATE INDEX

# WAL (Write-Ahead Logging)
wal_buffers = '8MB'
checkpoint_completion_target = 0.9
max_wal_size = '1GB'

# Query Planner
random_page_cost = 1.1                # ลดลงสำหรับ SSD
effective_io_concurrency = 200        # เพิ่มสำหรับ SSD

# Connection
max_connections = 100                 # ปรับตามจำนวนผู้ใช้จริง

สูตรคำนวณค่าพื้นฐานสำหรับเซิร์ฟเวอร์ที่ใช้งานฐานข้อมูลเป็นหลัก

พารามิเตอร์สูตรคำนวณตัวอย่าง (4 GB RAM)
shared_buffers25% ของ RAM1 GB
effective_cache_size75% ของ RAM3 GB
work_memRAM / max_connections / 410 MB
maintenance_work_memRAM / 16 หรือ 256 MB256 MB

หลังแก้ไขแล้วรีสตาร์ทบริการเพื่อให้มีผล จากนั้นตรวจสอบค่าด้วยคำสั่ง SHOW

sudo systemctl restart postgresql

# ตรวจสอบค่าที่ตั้งไว้
sudo -i -u postgres psql -c "SHOW shared_buffers;"
sudo -i -u postgres psql -c "SHOW effective_cache_size;"
sudo -i -u postgres psql -c "SHOW work_mem;"

ตั้งค่า Logging

Logging ที่ดีช่วยให้ตรวจสอบปัญหาและ Monitor ประสิทธิภาพได้ง่ายขึ้น เพิ่มการตั้งค่าต่อไปนี้ใน postgresql.conf

# เปิด Logging
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d.log'
log_rotation_age = 1d
log_rotation_size = 100MB

# บันทึก Query ที่ช้า
log_min_duration_statement = 1000     # บันทึก Query ที่ใช้เวลาเกิน 1 วินาที
log_statement = 'ddl'                 # บันทึกคำสั่ง DDL (CREATE, ALTER, DROP)

# ข้อมูลเพิ่มเติมใน Log
log_line_prefix = '%t [%p] %u@%d '    # เวลา, PID, ผู้ใช้, ฐานข้อมูล
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on

ตั้งค่า Automatic Vacuuming

VACUUM เป็นกระบวนการสำคัญที่ทำความสะอาดข้อมูลที่ถูกลบหรืออัปเดตแล้ว (Dead Tuples) เพื่อคืนพื้นที่และรักษาประสิทธิภาพ Autovacuum เปิดใช้งานโดยค่าเริ่มต้น แต่สามารถปรับแต่งเพิ่มเติมได้

# ตั้งค่า Autovacuum ใน postgresql.conf
autovacuum = on
autovacuum_max_workers = 3
autovacuum_naptime = '1min'
autovacuum_vacuum_threshold = 50
autovacuum_vacuum_scale_factor = 0.1
autovacuum_analyze_threshold = 50
autovacuum_analyze_scale_factor = 0.05

ตรวจสอบสถานะ Autovacuum ได้ด้วยคำสั่ง SQL

SELECT schemaname, relname, last_vacuum, last_autovacuum, 
       vacuum_count, autovacuum_count, n_dead_tup
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;

สำรองและกู้คืนข้อมูลเบื้องต้น

การสำรองข้อมูลเป็นสิ่งที่ต้องตั้งค่าตั้งแต่วันแรก เครื่องมือหลักที่ใช้คือ pg_dump และ pg_dumpall

# สำรองฐานข้อมูลเดียว
pg_dump -U postgres -d myappdb -F c -f /backup/myappdb_$(date +%Y%m%d).dump

# สำรองทุกฐานข้อมูล
pg_dumpall -U postgres -f /backup/all_databases_$(date +%Y%m%d).sql

# กู้คืนจากไฟล์ .dump
pg_restore -U postgres -d myappdb -c /backup/myappdb_20260407.dump

# กู้คืนจากไฟล์ .sql
psql -U postgres -f /backup/all_databases_20260407.sql

ตั้ง Cron Job สำหรับสำรองข้อมูลอัตโนมัติทุกวัน

# สร้างไดเรกทอรีสำรองข้อมูล
sudo mkdir -p /backup/postgresql
sudo chown postgres:postgres /backup/postgresql

# เพิ่ม Cron Job
sudo crontab -u postgres -e

# เพิ่มบรรทัดนี้ — สำรองทุกวันตี 2
0 2 * * * pg_dump -U postgres -d myappdb -F c -f /backup/postgresql/myappdb_$(date +\%Y\%m\%d).dump 2>> /var/log/pg_backup.log

# ลบไฟล์สำรองที่เก่ากว่า 30 วัน
0 3 * * * find /backup/postgresql -name "*.dump" -mtime +30 -delete

ติดตั้ง Extension ที่มีประโยชน์

จุดเด่นอย่างหนึ่งของ PostgreSQL คือระบบ Extension ที่ขยายความสามารถได้ง่าย Extension ที่แนะนำสำหรับการใช้งานทั่วไป

# ติดตั้งแพ็กเกจ Extension เพิ่มเติม
sudo apt install -y postgresql-16-postgis postgresql-contrib  # Ubuntu/Debian
sudo dnf install -y postgresql16-contrib                       # CentOS/AlmaLinux

# เปิดใช้ Extension ในฐานข้อมูล
sudo -i -u postgres psql -d myappdb

CREATE EXTENSION IF NOT EXISTS pg_stat_statements;   -- วิเคราะห์ Query Performance
CREATE EXTENSION IF NOT EXISTS pg_trgm;              -- Full-Text Search ภาษาไทย
CREATE EXTENSION IF NOT EXISTS uuid-ossp;            -- สร้าง UUID
CREATE EXTENSION IF NOT EXISTS hstore;               -- Key-Value Storage

-- ตรวจสอบ Extension ที่ติดตั้งแล้ว
SELECT extname, extversion FROM pg_extension ORDER BY extname;

ตรวจสอบสถานะหลังติดตั้งเสร็จ

หลังตั้งค่าทุกอย่างเรียบร้อยแล้ว ตรวจสอบสถานะรวมเพื่อยืนยันว่าทุกอย่างทำงานถูกต้อง

# ตรวจสอบบริการ
sudo systemctl status postgresql

# ตรวจสอบเวอร์ชัน
sudo -i -u postgres psql -c "SELECT version();"

# ตรวจสอบฐานข้อมูลทั้งหมด
sudo -i -u postgres psql -c "\l"

# ตรวจสอบผู้ใช้ทั้งหมด
sudo -i -u postgres psql -c "\du"

# ตรวจสอบการตั้งค่าสำคัญ
sudo -i -u postgres psql -c "
SELECT name, setting, unit, short_desc
FROM pg_settings
WHERE name IN (
    'listen_addresses', 'port', 'max_connections',
    'shared_buffers', 'effective_cache_size', 'work_mem',
    'logging_collector', 'log_min_duration_statement'
)
ORDER BY name;"

# ตรวจสอบว่ารับการเชื่อมต่อได้จริง
psql -U appuser -d myappdb -h localhost -c "SELECT current_user, current_database(), inet_server_addr(), inet_server_port();"

แนวปฏิบัติด้านความปลอดภัย

หลังติดตั้งเสร็จ ควรตรวจสอบด้านความปลอดภัยเพิ่มเติมเพื่อป้องกันการเข้าถึงโดยไม่ได้รับอนุญาต

  • ใช้ scram-sha-256 — เปลี่ยน password_encryption ใน postgresql.conf เป็น scram-sha-256 และอัปเดต pg_hba.conf ให้ใช้วิธีนี้ทั้งหมด
  • จำกัด IP ใน pg_hba.conf — อย่าใช้ 0.0.0.0/0 ใน Production ระบุเฉพาะ IP หรือ Subnet ที่จำเป็น
  • ใช้ SSL/TLS — เปิด ssl = on ใน postgresql.conf และตั้งค่า Certificate เพื่อเข้ารหัสข้อมูลระหว่างทาง
  • หลักสิทธิ์น้อยที่สุด — สร้าง User แยกสำหรับแต่ละแอปพลิเคชัน ให้สิทธิ์เฉพาะที่จำเป็น ไม่ใช้ Superuser
  • อัปเดตสม่ำเสมอ — ตรวจสอบ Security Patch ทุกเดือนและอัปเดตเวอร์ชันย่อย เช่น 16.1 เป็น 16.2
  • สำรองข้อมูล — ตั้ง Backup อัตโนมัติและทดสอบกู้คืนเป็นประจำ

สรุป

การติดตั้ง PostgreSQL 16 บน Cloud VPS ไม่ใช่เรื่องยาก ขั้นตอนหลักคือเพิ่ม Repository อย่างเป็นทางการ ติดตั้งแพ็กเกจ ตั้งรหัสผ่าน Superuser สร้าง Database/User สำหรับแอปพลิเคชัน แล้วปรับแต่ง pg_hba.conf กับ postgresql.conf ให้เหมาะกับการใช้งาน สิ่งสำคัญที่ไม่ควรลืมคือตั้งค่าความปลอดภัย Logging และ Backup ตั้งแต่วันแรก เพื่อให้ระบบฐานข้อมูลพร้อมรับมือกับปัญหาที่อาจเกิดขึ้นในอนาคต

แนะนำบริการ DE

หากคุณต้องการเซิร์ฟเวอร์สำหรับรัน PostgreSQL 16 ด้วยตัวเอง Cloud VPS ของ DE เป็นตัวเลือกที่เหมาะสม เพราะให้สิทธิ์ root เต็มรูปแบบ สามารถติดตั้งและตั้งค่าได้อิสระตามที่บทความนี้แนะนำ พร้อมรองรับ SSD Storage ที่ช่วยให้ประสิทธิภาพการอ่านเขียนข้อมูลดีขึ้น

สำหรับผู้ที่ต้องการโฮสต์เว็บไซต์ที่ใช้ PostgreSQL เป็น Backend โดยไม่ต้องจัดการเซิร์ฟเวอร์เอง Cloud Hosting ของ DE ก็เป็นอีกทางเลือกที่สะดวก มีระบบจัดการผ่าน Control Panel ที่ใช้งานง่ายโดยไม่ต้องใช้ Command Line