
Trả lời nhanh: Quy trình chuẩn 15 phút: cài PostgreSQL từ repo chính thức PGDG (bản mới, cập nhật đều), tạo database + user riêng cho app với mật khẩu mạnh, giữ Postgres chỉ nghe localhost (app cùng máy kết nối nội bộ, an toàn và nhanh nhất), chỉnh 4-5 tham số bộ nhớ theo RAM máy, và đặt pg_dump hằng đêm qua cron. Xong checklist này, database của bạn nghiêm túc hơn 90% máy tự cài ngoài kia.
Postgres là database mặc định của giới làm sản phẩm 2026, từ dự án vibe code đến SaaS nghiêm túc. Cài để "chạy được" mất 2 phút; cài để yên tâm có dữ liệu khách cần thêm 13 phút cho đúng bài: nguồn cài chuẩn, phân quyền, an toàn mạng, bộ nhớ, backup. Bài này là 15 phút đó, dán lệnh theo thứ tự.
- Cài từ repo PGDG chính thức, bản 16 mới, vá lỗi đều, nâng cấp dễ
- Mỗi app một database + một user riêng, không xài chung superuser postgres
- Chỉ nghe 127.0.0.1; cần truy cập từ ngoài thì SSH tunnel, không mở port 5432 ra internet
- Tune 5 tham số theo RAM + pg_dump hằng đêm, nền tảng của mọi đêm ngon giấc
Bước 1: Cài từ repo chính thức
sudo apt install -y postgresql-common
sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y
sudo apt install -y postgresql-16
sudo systemctl status postgresqlVì sao không dùng bản trong repo Ubuntu: thường cũ hơn và khóa theo vòng đời Ubuntu. Repo PGDG do chính cộng đồng Postgres duy trì, bản nào cũng có, vá bảo mật nhanh.
Bước 2: Database và user riêng cho app
sudo -u postgres psql <<'SQL'
CREATE DATABASE shop;
CREATE USER shop_app WITH PASSWORD 'doi-mat-khau-manh-vao-day';
GRANT ALL PRIVILEGES ON DATABASE shop TO shop_app;
c shop
GRANT ALL ON SCHEMA public TO shop_app;
SQLNguyên tắc: tài khoản postgres (superuser) chỉ để quản trị; app kết nối bằng user riêng quyền gọn trong database của nó. Thêm app thứ hai = thêm cặp database/user mới, sự cố hay lộ key của app nào khoanh vùng app đó.
Chuỗi kết nối cho app cùng máy: postgres://shop_app:[email protected]:5432/shop
Bước 3: An toàn mạng - mặc định đúng, đừng phá
Postgres mặc định chỉ nghe localhost, giữ nguyên như vậy. Port 5432 mở ra internet là nam châm hút bot quét mật khẩu cả ngày. Các nhu cầu ngoài đều có đường an toàn:
- Kết nối từ máy cá nhân (DBeaver, psql): SSH tunnel,
ssh -L 5433:127.0.0.1:5432 user@vpsrồi trỏ công cụ vào localhost:5433. Mã hóa sẵn, không mở thêm gì. - App ở máy khác trong cùng hạ tầng: nghe thêm IP mạng riêng và giới hạn đúng IP nguồn trong pg_hba.conf, vẫn không đụng internet công cộng.
Bước 4: Tune 5 tham số theo RAM
Mặc định Postgres cấu hình rất dè để chạy được máy yếu. Trên VPS 8 GB dành riêng phần lớn cho database, sửa trong postgresql.conf (đường dẫn in ra bởi SHOW config_file;):
shared_buffers = 2GB # ~25% RAM
effective_cache_size = 6GB # ~75% RAM (chi la goi y cho planner)
work_mem = 32MB # per-sort; can than voi app nhieu ket noi
maintenance_work_mem = 512MB # cho VACUUM, CREATE INDEX
random_page_cost = 1.1 # o NVMe: doc ngau nhien re, bao cho planner bietDòng cuối đáng chú ý riêng: mặc định 4.0 là giả định thời ổ cơ (đọc ngẫu nhiên đắt gấp 4 lần tuần tự). Trên NVMe điều đó sai, hạ về 1.1 để planner mạnh dạn dùng index thay vì quét bảng. Máy chạy chung app thì giảm shared_buffers xuống ~15-20% RAM. Sửa xong: sudo systemctl restart postgresql.
Bước 5: Backup hằng đêm - 5 phút đổi lấy mọi đêm yên
sudo mkdir -p /var/backups/pg && sudo chown postgres /var/backups/pg
sudo -u postgres crontab -e
# them dong: 2h sang moi ngay, giu 7 ban
0 2 * * * pg_dump -Fc shop > /var/backups/pg/shop-$(date +%u).dumpĐịnh dạng -Fc (custom) nén sẵn và restore chọn lọc được bằng pg_restore. Đặt tên theo thứ trong tuần (%u = 1-7) tự xoay vòng 7 bản. Quan trọng nhất: tập restore thử một lần, backup chưa từng restore chỉ là niềm tin, chưa phải backup. Máy có backup hệ thống định kỳ (như backup tuần của TND) là thêm lớp ngoài cùng.
Kiểm tra sau khi cài, sáu lệnh
sudo -u postgres psql -c "SELECT version();" # phien ban that sudo -u postgres psql -c "SHOW listen_addresses;" # phai la localhost sudo -u postgres psql -c "SHOW shared_buffers;" # da nhan cau hinh chua ss -tlnp | grep 5432 # chi thay 127.0.0.1 sudo -u postgres psql -c "\du" # danh sach user va quyen psql "postgresql://app_user:[email protected]:5432/app_db" -c "SELECT 1;" # app ket noi duoc chua
Lệnh cuối là phép thử thật: nó dùng đúng chuỗi kết nối mà ứng dụng sẽ dùng. Chạy được nghĩa là user, mật khẩu, quyền và phân quyền mạng đều đúng.
Ba lỗi hay gặp khi cài lần đầu
| Thông báo | Nguyên nhân | Cách sửa |
|---|---|---|
FATAL: Peer authentication failed for user | Kết nối qua socket cục bộ nhưng tên tài khoản hệ điều hành không trùng tên user Postgres | Kết nối qua 127.0.0.1 thay vì socket, hoặc đổi dòng tương ứng trong pg_hba.conf từ peer sang scram-sha-256 |
could not connect to server: Connection refused | Dịch vụ chưa chạy, hoặc đang nghe ở địa chỉ khác | systemctl status postgresql và kiểm listen_addresses |
FATAL: password authentication failed | Sai mật khẩu, hoặc user tạo bằng mật khẩu rỗng | Đặt lại: ALTER USER app_user WITH PASSWORD 'matkhau-moi'; |
FATAL: sorry, too many clients already | Chạm trần max_connections | Đừng vội tăng số này. Đặt bộ gom kết nối phía trước, xem mục dưới |
Bộ gom kết nối, thứ nên có ngay từ đầu
Mỗi kết nối tới Postgres là một tiến trình riêng chiếm khoảng 5 tới 10 MB bộ nhớ. Ứng dụng web mở 200 kết nối là tốn 1 tới 2 GB chỉ cho việc giữ kết nối. Bộ gom kết nối giữ số kết nối thật ở mức thấp và chia sẻ cho nhiều yêu cầu:
sudo apt install -y pgbouncer # /etc/pgbouncer/pgbouncer.ini # [databases] # app_db = host=127.0.0.1 port=5432 dbname=app_db # [pgbouncer] # listen_addr = 127.0.0.1 # listen_port = 6432 # pool_mode = transaction # max_client_conn = 500 # default_pool_size = 20 sudo systemctl enable --now pgbouncer
Ứng dụng đổi cổng từ 5432 sang 6432 là xong. Chế độ theo giao dịch cho hiệu quả cao nhất với ứng dụng web, nhưng lưu ý nó không hỗ trợ câu lệnh chuẩn bị sẵn ở mức phiên và không hỗ trợ tư vấn khóa theo phiên.
Kiểm bản sao lưu có khôi phục được không
# Tao ban sao sudo -u postgres pg_dump -Fc app_db > /backup/app_db-$(date +%F).dump # Khoi phuc thu sang database khac de kiem chung sudo -u postgres createdb app_db_test sudo -u postgres pg_restore -d app_db_test /backup/app_db-$(date +%F).dump sudo -u postgres psql -d app_db_test -c "SELECT count(*) FROM ten_bang_chinh;" sudo -u postgres dropdb app_db_test
Làm đúng bốn dòng này mỗi quý. Bản sao lưu chưa từng khôi phục thử là bản sao lưu chưa được chứng minh, và đây là nơi rẻ nhất để phát hiện tệp hỏng hoặc thiếu bảng.
Câu hỏi thường gặp
Nên cài Postgres thẳng hay chạy Docker?
Cả hai đều chuẩn. Cài thẳng: đơn giản, hiệu năng trần, hợp máy chuyên database. Docker: gọn khi đi cùng cả cụm compose, đổi phiên bản dễ. Đã theo compose cho cả stack thì để Postgres trong đó cho đồng bộ, nhớ volume và giới hạn log như bài Docker.
PostgreSQL hay MySQL cho dự án mới?
Postgres đang là mặc định của hệ sinh thái mới (Prisma, Supabase, pgvector cho AI...), tính năng dày, chuẩn SQL nghiêm. MySQL vẫn tốt và quen tay giới WordPress/PHP. Không có sai lầm, chỉ có hệ sinh thái quanh dự án của bạn nghiêng bên nào.
VPS bao nhiêu RAM cho Postgres?
Dữ liệu vài GB, traffic vừa: 4 GB chạy tốt. Muốn cache nóng phần lớn dữ liệu trong RAM (điều Postgres rất thích): RAM ≥ kích thước working set. Nhưng trước khi mua RAM, ổ NVMe + index đúng thường giải quyết phần lớn cảm giác chậm.
Làm sao biết database đang khỏe?
Ba phép nhanh: pg_stat_activity xem kết nối đang làm gì; bật log_min_duration_statement = 500 bắt query chậm; và fio đo nền ổ đĩa. Chuỗi chẩn sâu hơn ở bài database chậm trong mục liên quan.
Bài viết liên quan
- Database MySQL/PostgreSQL chậm: 6 nguyên nhân
- Supabase tự host: RAM và ổ đĩa cần bao nhiêu
- VPS ổ Enterprise U.2 NVMe RAID 10 tại TND
- Self-host Umami analytics: privacy-first cho landing dev solo
- Cấu hình VPS tối thiểu để Claude Code chạy mượt cả ngày
- OpenClaw là gì? Nền tảng AI Agent mã nguồn mở đáng chú ý cho cá nhân và doanh nghiệp
- Tailscale là gì? Mạng riêng nối mọi thiết bị của bạn
- Hermes spawn subagent: chạy nhiều agent song song xử lý batch task
- VPS US vs VPS VN: khi nào chọn loại nào? Use case 2026



