Hướng Dẫn Cài PostgreSQL Trên VPS Ubuntu Và Bảo Mật Cơ Bản

Hướng dẫn cài PostgreSQL trên VPS Ubuntu, tạo database và user riêng, cấu hình pg_hba.conf, chỉ cho phép kết nối cần thiết, kiểm tra service, backup và xử lý lỗi phổ biến.

PostgreSQL là hệ quản trị cơ sở dữ liệu mã nguồn mở phổ biến cho website, API và ứng dụng cần tính toàn vẹn dữ liệu cao. Trên VPS Ubuntu, việc cài PostgreSQL khá đơn giản qua APT, nhưng để dùng an toàn cho production bạn cần làm thêm nhiều bước: tạo role riêng thay vì dùng superuser, tạo database theo từng ứng dụng, hiểu cơ chế xác thực trong `pg_hba.conf`, tránh mở port 5432 ra Internet nếu không cần, cấu hình listen address đúng mục đích và thiết lập backup. Bài viết này hướng dẫn từ cài đặt, đăng nhập bằng `psql`, tạo user/database, cấp quyền, cho phép remote theo IP cụ thể khi cần, kiểm tra firewall, backup bằng `pg_dump` và xử lý các lỗi thường gặp như `peer authentication failed`, `connection refused` hoặc `no pg_hba.conf entry`.

Điểm quan trọng Hãy lựa chọn dịch vụ dựa trên nhu cầu sử dụng thực tế và theo dõi tài nguyên thường xuyên để có hiệu quả tốt nhất.

PostgreSQL là một hệ quản trị cơ sở dữ liệu quan hệ mạnh, phù hợp cho API, website, hệ thống quản trị, ứng dụng SaaS và nhiều workload cần transaction, index, JSON, constraint và truy vấn phức tạp.

Trên VPS Ubuntu, bạn có thể cài PostgreSQL bằng package manager rất nhanh. Tuy nhiên, phần quan trọng không nằm ở lệnh apt install, mà ở cách tạo role, database, quyền truy cập và network đúng nhu cầu.

Nếu bạn mới làm quen Linux, có thể xem trước bài Các lệnh Linux cơ bản trên VPS Ubuntu. Nếu đang triển khai ứng dụng bằng container, bài Cài Docker và Docker Compose trên VPS Ubuntu sẽ hữu ích để so sánh mô hình chạy database trực tiếp trên host và chạy bằng container.

1. PostgreSQL phù hợp cho những hệ thống nào?

PostgreSQL thường được dùng cho:

  • backend web/API;
  • hệ thống ERP/CRM;
  • SaaS;
  • ứng dụng tài chính;
  • hệ thống GIS qua PostGIS;
  • ứng dụng cần JSONB;
  • data warehouse nhỏ và vừa;
  • hệ thống cần transaction chặt chẽ.

Điểm mạnh của PostgreSQL là hệ sinh thái phong phú, tính tuân thủ SQL cao và nhiều tính năng nâng cao.

2. Có nên cài PostgreSQL trực tiếp trên VPS?

Có, nếu bạn muốn:

  • cấu hình đơn giản;
  • systemd quản lý service;
  • ít lớp abstraction;
  • backup trực tiếp bằng công cụ PostgreSQL;
  • dễ quản lý file cấu hình ở cấp hệ điều hành.

Container hóa cũng là lựa chọn tốt trong nhiều dự án, nhưng cần quản lý volume, backup và lifecycle khác.

3. Chuẩn bị VPS Ubuntu

Bạn cần:

  • Ubuntu Server đang được hỗ trợ;
  • quyền sudo;
  • đủ RAM và storage;
  • backup/snapshot nếu đây là server đang chạy production;
  • firewall.

Nếu cần một VPS Linux cho database hoặc backend, có thể tham khảo VPS tại HUONG CLOUD và chọn RAM/storage theo workload thực tế.

4. Cập nhật hệ thống

sudo apt update
sudo apt upgrade -y

Nếu có reboot-required, nên xử lý trước khi đưa database vào production.

5. Cài PostgreSQL từ repository Ubuntu

Cách đơn giản nhất:

sudo apt install postgresql postgresql-contrib -y

Kiểm tra service:

sudo systemctl status postgresql

PostgreSQL package trên Ubuntu thường tạo cluster mặc định và khởi động service sau cài đặt.

6. Kiểm tra phiên bản PostgreSQL

psql --version

Hoặc:

sudo -u postgres psql -c 'SELECT version();'

Không nên copy cấu hình từ một phiên bản PostgreSQL khác mà chưa kiểm tra đường dẫn và option tương thích.

7. User postgres là gì?

Sau khi cài, hệ thống có OS user:

postgres

và PostgreSQL role mặc định cùng tên.

Đây là role quản trị mạnh. Không nên để ứng dụng dùng role này.

8. Mở PostgreSQL shell bằng psql

sudo -u postgres psql

Bạn sẽ thấy prompt:

postgres=#

Thoát bằng:

\q

9. Xem danh sách database

Trong psql:

\l

Xem role:

\du

Xem connection info:

\conninfo

10. Tạo database cho ứng dụng

Ví dụ:

CREATE DATABASE appdb;

Không nên dùng chung một database cho nhiều ứng dụng không liên quan nếu bạn cần tách quyền và backup rõ ràng.

11. Tạo user/role riêng

CREATE USER appuser WITH PASSWORD 'MAT_KHAU_MANH';

Sau đó:

GRANT ALL PRIVILEGES ON DATABASE appdb TO appuser;

Với PostgreSQL hiện đại, quyền schema có thể cần cấu hình thêm tùy cách ứng dụng tạo table.

12. Cấp quyền schema phù hợp

Kết nối vào database:

\c appdb

Cấp quyền:

GRANT USAGE, CREATE ON SCHEMA public TO appuser;

Hoặc thiết kế schema riêng cho ứng dụng.

Không nên cấp superuser chỉ để giải quyết lỗi permission.

13. Test đăng nhập bằng user ứng dụng

Từ shell:

psql -h 127.0.0.1 -U appuser -d appdb

Bạn sẽ được hỏi password.

Nếu login thành công, role/database cơ bản đã hoạt động.

14. peer authentication failed nghĩa là gì?

Đây là lỗi thường gặp khi bạn chạy:

psql -U appuser

mà PostgreSQL đang dùng peer cho local socket.

Cách dễ test password authentication là dùng TCP local:

psql -h 127.0.0.1 -U appuser -d appdb

15. File cấu hình PostgreSQL nằm ở đâu?

Có thể tìm bằng:

sudo -u postgres psql -c 'SHOW config_file;'

Xem pg_hba.conf:

sudo -u postgres psql -c 'SHOW hba_file;'

Điều này tốt hơn đoán đường dẫn theo phiên bản.

16. postgresql.conf dùng để làm gì?

Đây là file cấu hình server chính, bao gồm:

  • listen_addresses;
  • port;
  • memory;
  • logging;
  • connection limit;
  • WAL;
  • autovacuum.

Không nên chỉnh hàng loạt thông số “tuning PostgreSQL” từ một bài trên Internet mà không có benchmark.

17. pg_hba.conf là gì?

pg_hba.conf kiểm soát client nào được phép kết nối, database/user nào và phương thức xác thực nào được dùng.

Một dòng HBA có thể xác định:

  • local hay host;
  • database;
  • user;
  • CIDR;
  • auth method.

Đây là lớp rất quan trọng khi mở PostgreSQL ra network.

18. Có nên mở PostgreSQL ra Internet?

Không nếu ứng dụng chạy cùng VPS.

Nếu app và PostgreSQL ở cùng máy, hãy dùng:

127.0.0.1:5432

và giữ database không public.

Chỉ mở remote khi có nhu cầu thật như app server tách riêng.

19. Cho phép PostgreSQL lắng nghe network

Trong postgresql.conf, cấu hình:

listen_addresses = 'localhost,10.0.0.10'

hoặc một IP cụ thể.

Không nên đặt:

listen_addresses = '*'

rồi mở firewall toàn Internet nếu không cần.

20. Thêm HBA rule cho một IP cụ thể

Ví dụ app server có IP private:

10.0.0.20

Bạn có thể thêm:

host    appdb    appuser    10.0.0.20/32    scram-sha-256

Sau đó reload PostgreSQL.

21. Reload cấu hình PostgreSQL

sudo systemctl reload postgresql

Hoặc trong SQL:

SELECT pg_reload_conf();

Không cần restart toàn database cho mọi thay đổi.

22. Kiểm tra port 5432

sudo ss -tulnp | grep 5432

Nếu chỉ thấy:

127.0.0.1:5432

thì PostgreSQL chỉ listen local IPv4.

23. Mở firewall chỉ cho IP cần thiết

Nếu dùng UFW và remote client IP là 203.0.113.50:

sudo ufw allow from 203.0.113.50 to any port 5432 proto tcp

Không dùng:

sudo ufw allow 5432/tcp

cho toàn Internet nếu không có lý do rõ ràng.

24. connection refused nghĩa là gì?

Có thể do:

  • PostgreSQL không chạy;
  • không listen IP đó;
  • firewall chặn;
  • port sai;
  • route lỗi.

Kiểm tra:

sudo systemctl status postgresql
sudo ss -tulnp | grep 5432

25. no pg_hba.conf entry nghĩa là gì?

PostgreSQL đã nhận request nhưng không tìm thấy HBA rule phù hợp.

Kiểm tra:

  • client IP;
  • database;
  • username;
  • auth method;
  • thứ tự rule.

Sau khi sửa, reload cấu hình.

26. password authentication failed

Kiểm tra password/role:

ALTER USER appuser WITH PASSWORD 'MAT_KHAU_MOI';

Không gửi password plain text qua chat hoặc log.

27. SCRAM-SHA-256 là gì?

PostgreSQL hỗ trợ SCRAM cho password authentication hiện đại.

Nếu client/library đã hỗ trợ, scram-sha-256 là lựa chọn phù hợp hơn các phương thức password cũ.

Không ép SCRAM nếu client quá cũ chưa hỗ trợ; hãy nâng client thay vì hạ bảo mật nếu có thể.

28. Backup database bằng pg_dump

pg_dump -h 127.0.0.1 -U appuser -d appdb > appdb.sql

Với format custom:

pg_dump -Fc -h 127.0.0.1 -U appuser -d appdb -f appdb.dump

Format custom linh hoạt hơn với pg_restore.

29. Restore database

Tạo database mới rồi:

pg_restore -h 127.0.0.1 -U appuser -d appdb appdb.dump

Hoặc với SQL plain:

psql -h 127.0.0.1 -U appuser -d appdb < appdb.sql

Luôn test restore định kỳ. Backup không được kiểm thử có thể vô dụng khi cần khôi phục.

30. Backup toàn cluster

PostgreSQL có pg_dumpall để dump role/database ở dạng logic.

Ví dụ:

sudo -u postgres pg_dumpall > cluster.sql

Tuy nhiên, với hệ thống lớn, chiến lược backup có thể cần physical backup/WAL archiving thay vì chỉ logical dump.

31. Tự động backup bằng cron/systemd timer

Bạn có thể tạo script backup và chạy định kỳ.

Nhưng đừng để password plain text trong script.

Có thể dùng .pgpass với permission 600 hoặc cơ chế secret khác phù hợp.

32. .pgpass là gì?

File client credential có dạng:

hostname:port:database:username:password

Đặt quyền:

chmod 600 ~/.pgpass

Nếu quyền quá rộng, PostgreSQL client có thể bỏ qua file vì lý do bảo mật.

33. Kiểm tra dung lượng database

Trong SQL:

SELECT pg_size_pretty(pg_database_size('appdb'));

Xem table lớn:

SELECT
  relname,
  pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 20;

34. Kiểm tra connection hiện tại

SELECT pid, usename, datname, client_addr, state
FROM pg_stat_activity;

Đây là view rất hữu ích khi ứng dụng có quá nhiều connection hoặc connection treo.

35. Có nên tăng max_connections?

Không nên chỉ tăng vì ứng dụng báo hết connection.

Mỗi connection tốn tài nguyên. Với workload lớn, connection pooler như PgBouncer có thể phù hợp hơn.

Hãy tìm nguyên nhân trước:

  • app leak connection;
  • pool config sai;
  • traffic tăng;
  • connection idle quá nhiều.

36. RAM PostgreSQL nên cấu hình thế nào?

Không có một bộ thông số đúng cho mọi VPS.

Các tham số như:

  • shared_buffers;
  • work_mem;
  • maintenance_work_mem;
  • effective_cache_size

phụ thuộc RAM, số connection và query thực tế.

Không nên copy các con số tuning từ VPS khác.

37. Autovacuum có nên tắt không?

Không nên trong hầu hết hệ thống production.

PostgreSQL cần vacuum để quản lý dead tuples và transaction ID.

Nếu autovacuum gây tải, hãy tuning đúng table thay vì tắt toàn bộ.

38. Log PostgreSQL

Tìm log path/config bằng:

SHOW log_directory;
SHOW logging_collector;

Trên Ubuntu, systemd/journal và file log có thể được dùng tùy package/config.

Đừng bật log mọi statement lâu dài trên production nếu không cần vì có thể làm disk tăng rất nhanh.

39. Kết hợp logrotate

Nếu PostgreSQL ghi log ra file text, hãy kiểm tra cơ chế rotation native và package.

Không để hai cơ chế rotate cùng một file nếu chưa hiểu tương tác.

Bạn có thể tham khảo bài Cấu hình logrotate trên VPS Ubuntu.

40. Tình huống thực tế: web app cùng VPS

Mô hình đơn giản:

Nginx
  ↓
App backend
  ↓
PostgreSQL 127.0.0.1:5432

Trong mô hình này, không cần mở 5432 public.

App dùng role appuser, không dùng postgres.

41. Tình huống thực tế: app server và database tách máy

Mô hình:

App VPS 10.0.0.20
     ↓ private network
DB VPS 10.0.0.10:5432

Nên:

  • listen trên private IP;
  • HBA chỉ cho app IP;
  • firewall chỉ cho app IP;
  • không expose public nếu không cần.

42. Checklist PostgreSQL production cơ bản

  • PostgreSQL đã cập nhật.
  • App có user riêng.
  • Không dùng superuser cho app.
  • Port 5432 không public nếu không cần.
  • pg_hba.conf chỉ cho đúng IP/user/database.
  • Dùng SCRAM khi client hỗ trợ.
  • Backup định kỳ.
  • Test restore.
  • Monitor disk/RAM/connection.
  • Có monitoring và alert.

43. FAQ về PostgreSQL trên VPS Ubuntu

PostgreSQL mặc định dùng port nào?

Mặc định là TCP 5432.

Có nên mở 5432 ra Internet?

Không nếu không cần. Nên giới hạn bằng private network hoặc source IP cụ thể.

App có nên dùng user postgres không?

Không. Hãy tạo role riêng với quyền tối thiểu.

peer authentication failed xử lý thế nào?

Thường do kết nối local socket đang dùng peer auth. Test qua 127.0.0.1 và cấu hình HBA phù hợp.

Backup nên dùng pg_dump hay pg_dumpall?

pg_dump phù hợp từng database; pg_dumpall có thể dump nhiều database/role dạng logical. Hệ thống lớn có thể cần chiến lược khác.

Có cần restart PostgreSQL sau mỗi thay đổi HBA không?

Thường chỉ cần reload cấu hình.

Kết luận

Cài PostgreSQL trên VPS Ubuntu khá đơn giản, nhưng cấu hình an toàn cần thêm nhiều bước: tạo user riêng, giữ database không public nếu không cần, cấu hình HBA đúng nguồn truy cập và có backup được kiểm thử.

Đừng dùng superuser cho ứng dụng và đừng mở 5432 toàn Internet chỉ để kết nối cho tiện. Với production, mô hình tốt nhất là network tối thiểu, quyền tối thiểu và backup/monitoring đầy đủ.

Nếu bạn đang cần VPS Ubuntu tại HUONG CLOUD để chạy PostgreSQL, API hoặc website, hãy ưu tiên RAM, storage và khả năng backup theo dung lượng database thực tế thay vì chỉ nhìn số vCPU.

Nguồn tham khảo

Kết luận

Nếu chưa chắc cấu hình hoặc loại dịch vụ nào phù hợp, hãy gửi nhu cầu thực tế để đội ngũ hỗ trợ tư vấn trước khi mua.

Chưa biết nên chọn gói nào?

Xem bảng giá VPS hoặc liên hệ đội ngũ hỗ trợ để chọn cấu hình phù hợp.

Xem bảng giá VPS →