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`.
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.confchỉ 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
- PostgreSQL Downloads – Ubuntu: https://www.postgresql.org/download/linux/ubuntu/
- PostgreSQL Documentation – Client Authentication: https://www.postgresql.org/docs/current/client-authentication.html
- PostgreSQL Documentation – pg_hba.conf: https://www.postgresql.org/docs/current/auth-pg-hba-conf.html
- PostgreSQL Documentation – pg_dump: https://www.postgresql.org/docs/current/app-pgdump.html
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 →