Kiểm tra yêu cầu hệ thống và tải ISO Ubuntu 24.04
Trước khi triển khai, cần đảm bảo phần cứng đáp ứng yêu cầu tối thiểu cho PostgreSQL hoạt động ổn định. Đối với môi trường phát triển hoặc staging, cấu hình tối thiểu là 2 vCPU, 4GB RAM và 50GB SSD. Nếu là production, khuyến nghị 4 vCPU, 8GB RAM trở lên.
Chúng ta sẽ tải bản phát hành chính thức Ubuntu 24.04 LTS (Noble Numbat) từ nguồn tin cậy để đảm bảo tính bảo mật và tương thích. Bản Server ISO là lựa chọn tối ưu cho môi trường backend không cần giao diện đồ họa.
Thực hiện tải file ISO từ trang chủ Ubuntu bằng lệnh curl hoặc wget. Sau đó, xác minh tính toàn vẹn của file bằng checksum SHA256 để đảm bảo file không bị giả mạo.
wget https://releases.ubuntu.com/24.04/ubuntu-24.04-live-server-amd64.iso
sha256sum ubuntu-24.04-live-server-amd64.iso
Kết quả mong đợi: File ISO được tải về thành công và chuỗi checksum SHA256 khớp với giá trị công bố trên trang Ubuntu official release notes.
Cấu hình máy ảo và khởi động cài đặt
Đi vào cài đặt BIOS/UEFI của máy chủ hoặc máy ảo (VMware, VirtualBox, KVM), gắn file ISO vừa tải vào CD-ROM boot device. Đảm bảo chế độ Boot là UEFI (khuyến nghị) hoặc Legacy BIOS tùy theo phần cứng.
Khởi động máy. Tại màn hình boot, chọn "Install Ubuntu Server". Tại bước phân vùng ổ cứng, chọn "Use entire disk" để tự động phân vùng hoặc "Custom storage layout" nếu bạn muốn tách biệt partition /var/lib/pgsql cho dữ liệu DB riêng biệt để tối ưu hiệu năng.
Trong bước "Profile information", nhập tên user quản trị viên (ví dụ: admin) và tạo password mạnh. Hệ thống sẽ tự động tạo user này với quyền sudo.
Kết quả mong đợi: Ubuntu 24.04 được cài đặt hoàn tất, máy khởi động lại và bạn đăng nhập thành công vào giao diện terminal (CLI) với quyền sudo.
Cấu hình cơ bản Ubuntu 24.04
Sau khi cài đặt xong, bước đầu tiên là cập nhật toàn bộ hệ thống để đảm bảo các gói bảo mật mới nhất đã được áp dụng. Điều này đặc biệt quan trọng đối với kernel mới của Ubuntu 24.04.
sudo apt update && sudo apt upgrade -y
Kết quả mong đợi: Quá trình cập nhật chạy xong không lỗi, hiển thị thông báo "0 upgraded, 0 newly installed".
Cấu hình Network và Hostname
Để PostgreSQL hoạt động tốt trong môi trường mạng, cần thiết lập hostname cố định và cấu hình IP tĩnh (hoặc đảm bảo DHCP luôn trả về cùng một IP). Chúng ta sẽ sử dụng Netplan (cơ chế cấu hình mạng mặc định của Ubuntu 24.04) để cấu hình mạng.
Thay đổi hostname của server bằng lệnh hostnamectl. Đặt tên có ý nghĩa để dễ quản lý, ví dụ: postgres-node-01.
sudo hostnamectl set-hostname postgres-node-01
Kết quả mong đợi: Khi chạy lệnh `hostname`, terminal trả về "postgres-node-01".
Cấu hình file /etc/hosts
PostgreSQL cần phân giải địa chỉ IP của chính nó để ghi log và xử lý kết nối. Nếu hostname không được ánh xạ đúng trong /etc/hosts, server có thể gặp lỗi "could not translate host name" khi khởi động.
Thêm dòng ánh xạ địa chỉ IP của máy (hoặc 127.0.0.1 nếu dùng localhost) vào file /etc/hosts. Dưới đây là ví dụ với IP tĩnh 192.168.1.100.
sudo tee -a /etc/hosts
Kết quả mong đợi: File /etc/hosts được cập nhật, lệnh `ping postgres-node-01` trả về đúng địa chỉ IP.
Tạo user chuyên biệt cho PostgreSQL
Tuy hệ thống đã tạo user admin, nhưng tốt nhất là tạo một user system riêng biệt (non-login) cho PostgreSQL để chạy dịch vụ, tăng tính bảo mật (principle of least privilege).
sudo useradd --system --no-create-home --shell /bin/false postgres
Kết quả mong đợi: User 'postgres' được tạo trong file /etc/passwd với shell là /bin/false, không thể đăng nhập trực tiếp.
Cài đặt PostgreSQL từ Official Repository
Phiên bản PostgreSQL đi kèm trong kho mặc định của Ubuntu 24.04 (thường là v16) có thể không phải là bản mới nhất hoặc có những khác biệt về tính năng so với bản chính chủ. Để có phiên bản mới nhất và các bản vá kịp thời, chúng ta cần thêm repository chính thức của PostgreSQL (PGDG).
Thêm khóa GPG và Repository
Bước này là bắt buộc để hệ thống apt xác thực tính hợp lệ của các gói phần mềm từ nguồn PostgreSQL. Chúng ta sẽ tải key GPG và thêm file nguồn vào thư mục /etc/apt/sources.list.d/.
sudo apt install -y wget gnupg
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
echo "deb http://apt.postgresql.org/pub/repos/apt noble-pgdg main" | sudo tee /etc/apt/sources.list.d/postgresql.list
Kết quả mong đợi: Key GPG được lưu vào /etc/apt/trusted.gpg.d/ và file nguồn postgresql.list được tạo thành công.
Cập nhật và cài đặt PostgreSQL
Sau khi thêm nguồn, chạy lệnh update để apt tải danh sách gói mới. Chúng ta sẽ cài đặt gói `postgresql-16` (phiên bản mới nhất tương thích với Ubuntu 24.04 Noble) cùng với các công cụ cần thiết như `postgresql-contrib` (cung cấp các extension như PostGIS, pg_stat_statements) và `pgadmin4` nếu cần giao diện web (tùy chọn).
sudo apt update
sudo apt install -y postgresql-16 postgresql-contrib-16 postgresql-client-16
Kết quả mong đợi: Quá trình cài đặt chạy xong, hiển thị thông báo các gói đã được cài đặt. Dịch vụ PostgreSQL sẽ tự động khởi động.
Verify cài đặt
Để chắc chắn PostgreSQL đã chạy, kiểm tra phiên bản bằng lệnh psql và trạng thái dịch vụ bằng systemctl.
sudo -u postgres psql --version
systemctl status postgresql
Kết quả mong đợi: Lệnh psql trả về "psql (PostgreSQL) 16.x" và systemctl trả về trạng thái "active (running)".
Khởi động và bảo mật dịch vụ PostgreSQL
Mặc định, PostgreSQL 16 trên Ubuntu 24.04 đã được cấu hình để chỉ chấp nhận kết nối từ local (Unix socket). Để server có thể nhận kết nối từ mạng (TCP/IP) hoặc mở rộng tính năng, cần điều chỉnh file cấu hình chính.
Điều chỉnh postgresql.conf
File cấu hình chính nằm tại /etc/postgresql/16/main/postgresql.conf. Mục tiêu là cho phép server lắng nghe trên tất cả các giao diện mạng (0.0.0.0) hoặc một IP cụ thể, và tăng giới hạn kết nối nếu cần.
Thay đổi tham số `listen_addresses` từ 'localhost' thành '*' để lắng nghe mọi giao diện mạng.
sudo nano /etc/postgresql/16/main/postgresql.conf
Sửa dòng sau (bỏ comment và thay đổi giá trị):
listen_addresses = '*'
Kết quả mong đợi: File được lưu, tham số listen_addresses đã thay đổi. Cần restart dịch vụ để có hiệu lực.
Cấu hình pg_hba.conf (Xác thực mạng)
File pg_hba.conf (Host Based Authentication) kiểm soát ai được phép kết nối vào server từ đâu. Mặc định, file này chỉ cho phép kết nối qua socket Unix. Để truy cập qua TCP/IP, cần thêm quy tắc mới.
File cấu hình nằm tại /etc/postgresql/16/main/pg_hba.conf. Chúng ta sẽ thêm quy tắc cho phép user 'postgres' kết nối từ mạng nội bộ (ví dụ 192.168.1.0/24) bằng phương thức mật khẩu (md5 hoặc scram-sha-256).
sudo nano /etc/postgresql/16/main/pg_hba.conf
Thêm dòng sau vào cuối file (trước dòng "local all all peer"):
host all all 192.168.1.0/24 scram-sha-256
Giải thích: Cho phép tất cả user (all), từ tất cả database (all), ở dải IP 192.168.1.0/24, sử dụng cơ chế mã hóa scram-sha-256.
Kết quả mong đợi: File được lưu. Đây là bước quan trọng để bảo mật, tránh mở cổng 5432 cho toàn internet.
Khởi động lại dịch vụ và đặt password cho user postgres
Sau khi sửa cấu hình, cần khởi động lại dịch vụ để áp dụng thay đổi. Đồng thời, user mặc định 'postgres' chưa có password, cần đặt password để có thể kết nối qua TCP/IP (scram-sha-256 yêu cầu password).
sudo systemctl restart postgresql
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'StrongPassword123!';"
Kết quả mong đợi: Dịch vụ restart thành công (Active: active (running)) và lệnh ALTER USER trả về "ALTER ROLE".
Verify kết nối mạng
Để đảm bảo mọi thứ hoạt động, thử kết nối từ một máy khác trong cùng mạng LAN (hoặc từ chính máy này qua IP) sử dụng lệnh psql.
psql -h 192.168.1.100 -U postgres -d postgres
Khi được hỏi password, nhập 'StrongPassword123!'. Nếu kết nối thành công, prompt sẽ chuyển sang `postgres=#`.
Kết quả mong đợi: Kết nối thành công, bạn có thể chạy các câu lệnh SQL trên PostgreSQL từ xa.
Kiểm tra cổng mở
Để xác nhận cổng 5432 đang lắng nghe trên giao diện mạng, sử dụng lệnh ss hoặc netstat.
sudo ss -tlnp | grep 5432
Kết quả mong đợi: Đầu ra hiển thị dòng chứa `0.0.0.0:5432` hoặc `192.168.1.100:5432` và quy trình `postgres` đang lắng nghe.
Điều hướng series:
Mục lục: Series: Triển khai Database Temporal với PostgreSQL và Ubuntu 24.04
Phần 2: Khái niệm cơ bản và thiết kế bảng Temporal trong PostgreSQL »