ติดตั้ง PostgreSQL บน Rocky Linux 10

ติดตั้ง PostgreSQL บน Rocky Linux 10

หลายครั้งที่ทีม Developer มาหาแล้วบอกว่า “พี่ครับ MySQL มันช้าแล้ว ข้อมูลเยอะขึ้นเรื่อย ๆ ระบบเริ่มมีปัญหา” – นั่นแหละคือสัญญาณว่าถึงเวลาต้องมองหา Database Engine ที่แข็งแกร่งกว่าแล้ว

PostgreSQL (หรือที่เรียกกันว่า “Postgres”) คือฐานข้อมูลเชิงสัมพันธ์ (Relational Database) แบบ Open Source ที่โดดเด่นเรื่อง ACID Compliance, JSON Support, และรองรับข้อมูลขนาดใหญ่ได้ดีเยี่ยม – ไม่แปลกเลยที่องค์กรระดับโลกอย่าง Apple, Instagram, และ Spotify ต่างก็เลือกใช้

บทความนี้แนะนำการติดตั้งและตั้งค่า PostgreSQL บน Rocky Linux 10 ตั้งแต่ต้นจนใช้งานได้จริง พร้อม Hardening เบื้องต้นเพื่อความปลอดภัย


สิ่งที่คุณจะได้เรียนรู้

เมื่ออ่านบทความนี้จบ คุณจะสามารถ

  • ติดตั้ง PostgreSQL บน Rocky Linux 10 ได้อย่างถูกต้อง
  • ตั้งค่า Authentication และสร้าง User/Database ได้
  • เปิดใช้งาน Remote Connection อย่างปลอดภัย
  • ตรวจสอบสถานะและ Verify การติดตั้งด้วยตัวเอง

Prerequisites

ก่อนเริ่มต้น ตรวจสอบให้แน่ใจว่าพร้อมแล้วในทุกข้อ

รายการ รายละเอียด
OS Rocky Linux 10 (x86_64)
RAM ขั้นต่ำ 1 GB (แนะนำ 2 GB ขึ้นไป)
Disk ขั้นต่ำ 10 GB
User User ที่มีสิทธิ์ sudo
Network เข้าถึง Internet ได้
PostgreSQL Version 16.x (Stable ล่าสุด)

⚠️ หมายเหตุ: Rocky Linux 10 อิงฐานจาก RHEL 10 ใช้ dnf เป็น Package Manager และมาพร้อม SELinux เปิดใช้งานโดยค่าเริ่มต้น — บทความนี้จะไม่ปิด SELinux แต่จะแนะนำวิธีทำงานร่วมกับมัน


ขั้นตอนที่ 1  อัพเดทระบบ

เริ่มต้นด้วยการอัพเดท Package ให้เป็นเวอร์ชันล่าสุดก่อนเสมอ เป็น Best Practice ที่ไม่ควรข้ามไป

# อัพเดท package ทั้งหมดในระบบ
sudo dnf update -y

# ตรวจสอบ OS version ให้ชัดเจน
cat /etc/rocky-release
```

ผลลัพธ์ที่ควรเห็น
```
Rocky Linux release 10.x (Blue Onyx)

ขั้นตอนที่ 2  เพิ่ม PostgreSQL Official Repository

Rocky Linux มี PostgreSQL อยู่ใน Default Repository แต่แนะนำให้ใช้ PostgreSQL Official Repository (PGDG) เพราะจะได้เวอร์ชันใหม่ล่าสุดเสมอ และได้รับ Update ที่เร็วกว่า

# ติดตั้ง PGDG Repository สำหรับ Rocky Linux 10 / RHEL 10
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-10-x86_64/pgdg-redhat-repo-latest.noarch.rpm

จากนั้น Disable โมดูล PostgreSQL ที่มาพร้อมกับ AppStream เพื่อป้องกันความขัดแย้ง:

# ปิดการใช้งาน module postgresql ของ AppStream
# เพื่อให้ระบบใช้ version จาก PGDG แทน
sudo dnf -qy module disable postgresql

ตรวจสอบว่า Repository ถูกเพิ่มสำเร็จ

# แสดงรายการ repository ที่มีคำว่า postgresql
sudo dnf repolist | grep postgresql
```

ผลลัพธ์ที่ควรเห็น
```
pgdg16    PostgreSQL 16 for RHEL/Rocky 10 - x86_64
pgdg-common    PostgreSQL common RPMs for RHEL/Rocky 10 - x86_64

ขั้นตอนที่ 3  ติดตั้ง PostgreSQL 16

# ติดตั้ง PostgreSQL 16 Server และ Client
sudo dnf install -y postgresql16-server postgresql16

💡 Tip: ถ้าต้องการ PostgreSQL เวอร์ชันอื่น เช่น 15 หรือ 17 เพียงเปลี่ยนตัวเลขในชื่อ Package เช่น postgresql15-server

ตรวจสอบเวอร์ชันที่ติดตั้ง

# ตรวจสอบ version ของ PostgreSQL ที่ติดตั้ง
/usr/pgsql-16/bin/postgres --version
```

ผลลัพธ์
```
postgres (PostgreSQL) 16.x

ขั้นตอนที่ 4  Initialize Database Cluster

ก่อนจะเริ่มใช้งาน PostgreSQL ได้ ต้อง Initialize Database Cluster ก่อน (ทำครั้งเดียว):

# สร้าง Database Cluster เริ่มต้น
# คำสั่งนี้จะสร้างไฟล์ฐานข้อมูลใน /var/lib/pgsql/16/data/
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
```

ผลลัพธ์ที่ควรเห็น
```
Initializing database ... OK

⚠️ ข้อควรระวัง: ห้ามรันคำสั่งนี้ซ้ำหากมีข้อมูลอยู่แล้ว เพราะจะทำให้ข้อมูลถูกลบทิ้ง!


ขั้นตอนที่ 5  เปิดใช้งานและ Start Service

# เปิด service ให้ start อัตโนมัติเมื่อ reboot
sudo systemctl enable postgresql-16

# Start service ตอนนี้เลย
sudo systemctl start postgresql-16

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

ผลลัพธ์ที่ควรเห็น
```
● postgresql-16.service - PostgreSQL 16 Database Server
     Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled)
     Active: active (running) since ...

ขั้นตอนที่ 6 ตั้งค่า PostgreSQL เบื้องต้น

6.1 ตั้ง Password ให้ postgres Superuser

PostgreSQL จะสร้าง System User ชื่อ postgres ให้อัตโนมัติ ต้องตั้ง Password ก่อนใช้งาน:

# เข้าสู่ PostgreSQL shell ในฐานะ postgres user
sudo -u postgres psql

เมื่อเข้ามาแล้วจะเห็น Prompt postgres=# จากนั้นรันคำสั่งนี้:

-- ตั้ง password ให้ postgres superuser
-- เปลี่ยน 'YourStrongPassword@2024' เป็น password ที่แข็งแกร่ง
ALTER USER postgres WITH PASSWORD 'YourStrongPassword@2024';
-- ออกจาก psql
\q

6.2 สร้าง Database User และ Database สำหรับ Application

แนวปฏิบัติที่ดีคือ ไม่ควรใช้ User postgres สำหรับ Application โดยตรง ให้สร้าง User แยกต่างหาก:

# เข้า psql ในฐานะ postgres
sudo -u postgres psql
-- สร้าง user สำหรับ application
-- เปลี่ยน 'appuser' และ 'AppUserPassword@123' ตามต้องการ
CREATE USER appuser WITH PASSWORD 'AppUserPassword@123';
-- สร้าง database และกำหนดเจ้าของ
CREATE DATABASE myappdb OWNER appuser;
-- ให้สิทธิ์ทั้งหมดบน database ที่สร้าง
GRANT ALL PRIVILEGES ON DATABASE myappdb TO appuser;
-- ตรวจสอบ user ที่มีอยู่
\du

-- ตรวจสอบ database ที่มีอยู่
\l

-- ออกจาก psql
\q
```
ผลลัพธ์ `\du` ที่ควรเห็น:
```
                   List of roles
 Role name |  Attributes
-----------+------------------------------------------------------------
 appuser   |
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS

ขั้นตอนที่ 7  ตั้งค่า Authentication (pg_hba.conf)

ไฟล์ pg_hba.conf คือ “ประตูรักษาความปลอดภัย” ของ PostgreSQL ควบคุมว่า User ไหนจะเชื่อมต่อจากที่ไหนได้อย่างไร

# เปิดไฟล์ pg_hba.conf
sudo nano /var/lib/pgsql/16/data/pg_hba.conf

ค้นหาบรรทัดที่มี local และ host แล้วแก้ให้เป็นดังนี้

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# การเชื่อมต่อผ่าน Unix Socket (local) - ให้ใช้ peer authentication
local   all             postgres                                peer

# การเชื่อมต่อ local อื่น ๆ - ใช้ scram-sha-256 (แข็งแกร่งกว่า md5)
local   all             all                                     scram-sha-256

# IPv4 local connections - ต้องมี password
host    all             all             127.0.0.1/32            scram-sha-256

# IPv6 local connections
host    all             all             ::1/128                 scram-sha-256

💡 Tip: scram-sha-256 คือวิธี Authentication ที่ปลอดภัยที่สุดใน PostgreSQL 16 แนะนำให้ใช้แทน md5 เสมอ

บันทึกไฟล์ แล้ว Reload PostgreSQL

# Reload configuration โดยไม่ต้อง restart service
sudo systemctl reload postgresql-16

ขั้นตอนที่ 8 ตั้งค่า Firewall

8.1 เปิด Port ด้วย firewalld

PostgreSQL ใช้ Port 5432 โดยค่าเริ่มต้น

# เปิด port 5432 สำหรับ zone public
sudo firewall-cmd --permanent --add-port=5432/tcp

# Reload firewall
sudo firewall-cmd --reload

# ตรวจสอบว่า port ถูกเพิ่มแล้ว
sudo firewall-cmd --list-ports

⚠️ ข้อควรระวัง: การเปิด Port 5432 สู่ Internet โดยตรงถือว่าเสี่ยงมาก หากต้องการให้ Remote Connection ควรใช้ SSH Tunnel หรือ VPN แทน หรือจำกัด Source IP ให้เฉพาะที่เชื่อใจ


ขั้นตอนที่ 9 เปิดใช้งาน Remote Connection (Optional)

ถ้าต้องการให้ Application Server อื่นเชื่อมต่อมายัง Database Server นี้ ต้องทำ 2 ขั้นตอน

9.1 แก้ไข postgresql.conf

sudo nano /var/lib/pgsql/16/data/postgresql.conf

ค้นหาบรรทัด listen_addresses แล้วแก้ไข:

# ค่าเริ่มต้นคือ 'localhost' ซึ่งรับเฉพาะ local connection
# เปลี่ยนเป็น '*' เพื่อรับทุก interface หรือระบุ IP ที่ต้องการ
listen_addresses = '*'
# Port มาตรฐาน ไม่ต้องเปลี่ยนหากไม่จำเป็น
port = 5432

9.2 เพิ่ม Rule ใน pg_hba.conf

sudo nano /var/lib/pgsql/16/data/pg_hba.conf

เพิ่มบรรทัดนี้ที่ท้ายไฟล์ (เปลี่ยน IP เป็น Network ของคุณ)

# อนุญาตให้ appuser เชื่อมต่อจาก network 192.168.1.0/24 เท่านั้น
# ห้ามใส่ 0.0.0.0/0 เพราะจะเปิดให้ทุกคนเข้าได้!
host    myappdb         appuser         192.168.1.0/24          scram-sha-256

Restart PostgreSQL เพื่อให้การเปลี่ยนแปลงมีผล:

sudo systemctl restart postgresql-16

ขั้นตอนที่ 10 — SELinux Context (สำคัญสำหรับ Rocky Linux)

Rocky Linux เปิด SELinux ไว้ค่าเริ่มต้น ถ้า PostgreSQL ทำงานปกติแต่ Remote Connection ไม่ได้ อาจเกิดจาก SELinux ให้ตรวจสอบก่อน

# ตรวจสอบว่า SELinux block connection อยู่หรือเปล่า
sudo ausearch -c 'postmaster' --raw | audit2allow -M postgresql_remote

ถ้ามีการ Block จริง ให้รัน

# อนุญาตให้ PostgreSQL รับ remote connection ผ่าน SELinux
sudo setsebool -P postgresql_can_rsync 1

ทดสอบและ Verify

ทดสอบการเชื่อมต่อ Local

# ทดสอบเชื่อมต่อด้วย appuser ไปยัง myappdb
psql -h 127.0.0.1 -U appuser -d myappdb -W
```

ถ้าสำเร็จจะเห็น Prompt
```
Password for user appuser:
psql (16.x)
Type "help" for help.

myappdb=>

คำสั่งตรวจสอบที่ควรรู้

-- ดู version ของ PostgreSQL
SELECT version();
-- ดู database ปัจจุบัน
SELECT current_database();
-- ดู user ปัจจุบัน
SELECT current_user;
-- ดู connection ที่ active อยู่
SELECT * FROM pg_stat_activity;
-- ออกจาก psql
\q

ตรวจสอบ Log

# ดู log ของ PostgreSQL
sudo tail -f /var/lib/pgsql/16/data/log/postgresql-*.log

# หรือดูผ่าน journald
sudo journalctl -u postgresql-16 -f

Troubleshooting ที่พบบ่อย

อาการ สาเหตุที่เป็นไปได้ วิธีแก้ไข
could not connect to server Service ยังไม่ Start sudo systemctl start postgresql-16
FATAL: password authentication failed Password ผิด หรือ pg_hba.conf ไม่ถูกต้อง ตรวจสอบ pg_hba.conf และ password
connection refused (port 5432) Firewall block หรือ listen_addresses ไม่ถูกต้อง ตรวจสอบ firewall-cmd --list-ports
permission denied SELinux block ตรวจสอบ ausearch และตั้งค่า SELinux
FATAL: role does not exist ยังไม่ได้สร้าง User CREATE USER ใน psql

สรุป

ตอนนี้คุณมี PostgreSQL 16 ที่พร้อมใช้งานบน Rocky Linux 10 แล้ว โดยมีสิ่งที่ตั้งค่าไปแล้ว ได้แก่

  • ✅ ติดตั้ง PostgreSQL 16 จาก Official PGDG Repository
  • ✅ ตั้งค่า postgres Superuser Password
  • ✅ สร้าง Application User และ Database แยกจาก Superuser
  • ✅ ตั้งค่า Authentication ด้วย scram-sha-256
  • ✅ กำหนดสิทธิ์ Firewall อย่างเหมาะสม
  • ✅ ดูแล SELinux Context


Write by SysAdmin Knowledge
https://www.sysadmin.in.th
March 25, 2026