Khi sử dụng framework web Ruby on Rails, mặc định, ứng dụng của bạn sẽ được cấu hình để sử dụng SQLite làm cơ sở dữ liệu. SQLite là một cơ sở dữ liệu quan hệ nhẹ, di động và dễ sử dụng, hoạt động tốt trong môi trường ít bộ nhớ, và thực sự phù hợp với nhiều trường hợp, đặc biệt là khi bắt đầu một dự án nhỏ hoặc để phát triển cục bộ.
Tuy nhiên, đối với các ứng dụng phức tạp hơn, đòi hỏi tính toàn vẹn dữ liệu cao, hiệu suất xử lý lớn và khả năng mở rộng lập trình mạnh mẽ, PostgreSQL sẽ là một lựa chọn mạnh mẽ và linh hoạt hơn nhiều.
Trong bài blog này, tôi sẽ hướng dẫn bạn cách thiết lập một môi trường phát triển Ruby on Rails kết nối với cơ sở dữ liệu PostgreSQL trên máy chủ Ubuntu 18.04. Chúng ta sẽ cùng cài đặt và cấu hình PostgreSQL, sau đó kiểm tra thiết lập bằng cách tạo một ứng dụng Rails sử dụng PostgreSQL làm máy chủ cơ sở dữ liệu .
Yêu cầu trước khi bắt đầu
Để thực hiện theo hướng dẫn này, bạn sẽ cần chuẩn bị các yếu tố sau:
- Một máy chủ Ubuntu 18.04 bao gồm một người dùng non-root có quyền
sudo
và một tường lửa (firewall). - Một môi trường phát triển Ruby on Rails đã được cài đặt trên máy chủ Ubuntu 18.04 của bạn.
Bước 1 – Cài đặt PostgreSQL
Để cấu hình Ruby on Rails tạo ứng dụng web của bạn với PostgreSQL làm cơ sở dữ liệu, trước tiên chúng ta sẽ cài đặt cơ sở dữ liệu này lên máy chủ của bạn.
Sử dụng quyền sudo
, hãy cập nhật chỉ mục gói APT của bạn để đảm bảo các kho lưu trữ của bạn được cập nhật:
sudo apt update
Tiếp theo, cài đặt PostgreSQL và các thư viện phát triển của nó:
sudo apt install postgresql postgresql-contrib libpq-dev
Trong lệnh trên, gói postgresql
chứa chương trình PostgreSQL chính, trong khi postgresql-contrib
bổ sung một số tính năng mở rộng khả năng của PostgreSQL. libpq-dev
là một thư viện PostgreSQL cho phép các client gửi truy vấn và nhận phản hồi từ máy chủ back-end, từ đó cho phép ứng dụng của bạn giao tiếp với cơ sở dữ liệu của nó.
Sau khi PostgreSQL và các phụ thuộc của nó đã được cài đặt, bước tiếp theo là tạo một vai trò (role) mà ứng dụng Rails của bạn sẽ sử dụng sau này để tạo cơ sở dữ liệu.
Bước 2 – Tạo một vai trò cơ sở dữ liệu mới (Database Role)
Trong PostgreSQL, các role (vai trò) có thể được sử dụng tương tự như người dùng (users) trong Linux để tổ chức quyền và phân quyền. Bước này sẽ chỉ cho bạn cách tạo một vai trò superuser mới cho tên người dùng Ubuntu của bạn, cho phép bạn hoạt động trong hệ thống PostgreSQL để tạo và cấu hình cơ sở dữ liệu.
Để tạo một vai trò superuser PostgreSQL, hãy sử dụng lệnh sau, thay thế từ được tô sáng bằng tên người dùng Ubuntu 18.04 của bạn:
sudo -u postgres createuser -s sammy -P
Vì bạn đã chỉ định cờ -P
, bạn sẽ được nhắc nhập mật khẩu cho vai trò mới của mình. Nhập mật khẩu mong muốn của bạn, đảm bảo ghi lại nó để bạn có thể sử dụng nó trong một file cấu hình ở bước sau.
Trong lệnh này, bạn đã sử dụng createuser
để tạo một vai trò có tên sammy
. Cờ -s
cấp cho người dùng này quyền superuser, và sudo -u
cho phép bạn chạy lệnh từ tài khoản postgres
được tự động tạo khi cài đặt PostgreSQL.
Lưu ý: Vì chế độ xác thực cho PostgreSQL trên Ubuntu 18.04 bắt đầu là ident
, theo mặc định, một người dùng Ubuntu chỉ có thể hoạt động trong PostgreSQL với một vai trò có cùng tên. Để biết thêm thông tin, hãy kiểm tra tài liệu chính thức của PostgreSQL về xác thực.
Nếu bạn không sử dụng cờ -P
và muốn đặt mật khẩu cho vai trò sau khi tạo, hãy vào console PostgreSQL với lệnh sau:
sudo -u postgres psql
Bạn sẽ nhận được kết quả như sau, cùng với dấu nhắc cho console PostgreSQL:
Output
psql (10.9 (Ubuntu 10.9-0ubuntu0.18.04.1))
Type "help" for help.
postgres=#
Console PostgreSQL được chỉ ra bởi dấu nhắc postgres=#
. Tại dấu nhắc PostgreSQL, nhập lệnh này để đặt mật khẩu cho vai trò cơ sở dữ liệu mới, thay thế tên được tô sáng bằng tên bạn đã tạo:
\\\\password sammy
PostgreSQL sẽ nhắc bạn nhập mật khẩu. Nhập mật khẩu mong muốn của bạn tại dấu nhắc, sau đó xác nhận lại.
Bây giờ, thoát console PostgreSQL bằng cách nhập lệnh này:
\\\\q
Dấu nhắc thông thường của bạn sẽ xuất hiện lại.
Trong bước này, bạn đã tạo một vai trò PostgreSQL mới với quyền superuser. Bây giờ bạn đã sẵn sàng tạo một ứng dụng Rails mới sử dụng vai trò này để tạo cơ sở dữ liệu.
Bước 3 – Tạo một ưng dụng Rails mới
Với một role đã được cấu hình cho PostgreSQL, giờ đây bạn có thể tạo một ứng dụng Rails mới được thiết lập để sử dụng PostgreSQL làm cơ sở dữ liệu.
Đầu tiên, điều hướng đến thư mục home của bạn:
cd ~
Tạo một ứng dụng Rails mới trong thư mục này, thay thế appname
bằng tên bạn muốn đặt cho ứng dụng của mình:
rails new appname -d=postgresql
Tùy chọn -d=postgresql
thiết lập PostgreSQL làm cơ sở dữ liệu.
Sau khi bạn đã chạy lệnh này, một thư mục mới có tên appname
sẽ xuất hiện trong thư mục home của bạn, chứa tất cả các yếu tố của một ứng dụng Rails cơ bản.
Tiếp theo, di chuyển vào thư mục của ứng dụng:
cd appname
Bây giờ bạn đã tạo một ứng dụng Rails mới và đã di chuyển vào thư mục gốc của dự án, bạn có thể cấu hình và tạo cơ sở dữ liệu PostgreSQL từ bên trong ứng dụng Rails của mình.
Bước 4 – Cấu hình và tạo cơ sở dữ liệu của bạn (Configuring and Creating Your Database)
Khi tạo các cơ sở dữ liệu development
và test
cho ứng dụng của bạn, Rails sẽ sử dụng vai trò PostgreSQL mà bạn đã tạo cho tên người dùng Ubuntu của mình. Để đảm bảo Rails tạo các cơ sở dữ liệu này, bạn sẽ thay đổi file cấu hình cơ sở dữ liệu của dự án. Sau đó, bạn sẽ tạo các cơ sở dữ liệu của mình.
Một trong những thay đổi cấu hình cần thực hiện trong ứng dụng Rails của bạn là thêm mật khẩu cho vai trò PostgreSQL bạn đã tạo ở bước trước. Để giữ thông tin nhạy cảm như mật khẩu an toàn, việc lưu trữ chúng trong một biến môi trường (environment variable) thay vì viết trực tiếp vào file cấu hình là một ý tưởng tốt.
Để lưu trữ mật khẩu của bạn trong một biến môi trường khi đăng nhập, hãy chạy lệnh sau, thay thế APPNAME
bằng tên ứng dụng của bạn và PostgreSQL_Role_Password
bằng mật khẩu bạn đã tạo ở bước trước:
echo 'export APPNAME_DATABASE_PASSWORD="PostgreSQL_Role_Password"' >> ~/.bashrc
Lệnh này ghi lệnh export
vào file ~/.bashrc
của bạn để biến môi trường sẽ được đặt khi đăng nhập.
Để xuất biến cho phiên hiện tại của bạn, hãy sử dụng lệnh source
:
source ~/.bashrc
Bây giờ bạn đã lưu mật khẩu của mình vào môi trường, đã đến lúc thay đổi file cấu hình.
Mở file cấu hình cơ sở dữ liệu của ứng dụng của bạn trong trình soạn thảo văn bản ưa thích của bạn. Bài hướng dẫn này sẽ sử dụng nano
:
nano config/database.yml
Dưới phần default
, tìm dòng pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
và thêm các dòng được tô sáng sau, điền thông tin xác thực của bạn và biến môi trường bạn đã tạo. Nó sẽ trông giống như thế này:
...
default: &default
adapter: postgresql
encoding: unicode
# For details on connection pooling, see Rails configuration guide
# <http://guides.rubyonrails.org/configuring.html#database-pooling>
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: sammy
password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %>
development:
<<: *default
database: appname_development
...
Điều này sẽ làm cho ứng dụng Rails chạy cơ sở dữ liệu với vai trò và mật khẩu chính xác. Lưu và thoát bằng cách nhấn CTRL+x
, Y
, sau đó ENTER
.
Để biết thêm thông tin về cấu hình cơ sở dữ liệu trong Rails, hãy xem tài liệu Rails.
Bây giờ bạn đã thực hiện các thay đổi đối với config/database.yml
, hãy tạo các cơ sở dữ liệu của ứng dụng bằng cách sử dụng lệnh rails
:
rails db:create
Sau khi Rails tạo cơ sở dữ liệu, bạn sẽ nhận được kết quả như sau:
Output
Created database 'appname_development'
Created database 'appname_test'
Như kết quả đầu ra cho thấy, lệnh này đã tạo một cơ sở dữ liệu development
và test
trong máy chủ PostgreSQL của bạn.
Bây giờ bạn đã có một cơ sở dữ liệu PostgreSQL được kết nối với ứng dụng Rails của mình. Để đảm bảo rằng ứng dụng của bạn đang hoạt động, bước tiếp theo là kiểm tra cấu hình của bạn.
Bước 5 – Kiểm tra cấu hình của bạn
Để kiểm tra xem ứng dụng của bạn có thể sử dụng cơ sở dữ liệu PostgreSQL hay không, hãy thử chạy ứng dụng web của bạn để nó sẽ hiển thị trong trình duyệt.
Sử dụng lệnh rails server
, hãy chạy ứng dụng web của bạn trên máy chủ web tích hợp sẵn trong ứng dụng Rails của bạn.
rails server --binding=127.0.0.1
Cờ --binding
liên kết ứng dụng của bạn với một địa chỉ IP được chỉ định. Theo mặc định, cờ này sẽ liên kết Rails với 0.0.0.0
, nhưng vì điều này có nghĩa là Rails sẽ lắng nghe tất cả các interface, việc sử dụng 127.0.0.1
để chỉ định localhost
sẽ an toàn hơn. Theo mặc định, ứng dụng lắng nghe trên cổng 3000
.
Khi ứng dụng Rails của bạn đang chạy, dấu nhắc lệnh của bạn sẽ biến mất, được thay thế bằng kết quả này:
Output
=> Booting Puma
=> Rails 5.2.3 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.6.3-p62), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://127.0.0.1:3000
Use Ctrl-C to stop
Để kiểm tra xem ứng dụng của bạn có đang chạy không, hãy mở một cửa sổ terminal mới trên máy chủ của bạn và sử dụng lệnh curl
để gửi yêu cầu đến 127.0.0.1:3000
:
curl <http://127.0.0.1:3000>
Bạn sẽ nhận được rất nhiều kết quả đầu ra bằng HTML, kết thúc bằng một cái gì đó như:
Output
...
<strong>Rails version:</strong> 5.2.3<br />
<strong>Ruby version:</strong> 2.6.3 (x86_64-linux)
</p>
</section>
</div>
</body>
</html>
Nếu ứng dụng Rails của bạn đang chạy trên một máy chủ từ xa và bạn muốn truy cập nó thông qua trình duyệt web, một cách dễ dàng là liên kết nó với địa chỉ IP công cộng của máy chủ của bạn. Đầu tiên, mở cổng 3000
trong tường lửa của bạn:
sudo ufw allow 3000
Tiếp theo, tra cứu địa chỉ IP công cộng của máy chủ của bạn. Bạn có thể làm điều này bằng cách chạy lệnh curl
sau:
curl <http://icanhazip.com>
Điều này sẽ trả về địa chỉ IP công cộng của bạn. Sử dụng nó với lệnh rails server
, thay thế server_public_IP
bằng IP công cộng của máy chủ của bạn:
rails server --binding=server_public_IP
Bây giờ bạn sẽ có thể truy cập ứng dụng Rails của mình trong trình duyệt web cục bộ thông qua địa chỉ IP công cộng của máy chủ trên cổng 3000
bằng cách truy cập:
http://server_public_IP:3000
Tại URL này, bạn sẽ tìm thấy trang chào mừng của Ruby on Rails. Điều này có nghĩa là ứng dụng của bạn đã được cấu hình đúng và kết nối với cơ sở dữ liệu PostgreSQL.
Sau khi kiểm tra cấu hình, nếu bạn muốn đóng cổng 3000
, hãy sử dụng lệnh sau.
sudo ufw delete allow 3000
Kết luận
Trong bài blog này, chúng ta đã cùng nhau xây dựng một ứng dụng web Ruby on Rails được cấu hình để sử dụng PostgreSQL làm cơ sở dữ liệu trên máy chủ Ubuntu 18.04. Chúng ta đã đi qua các bước quan trọng từ việc cài đặt PostgreSQL, tạo vai trò người dùng, cho đến việc tạo ứng dụng Rails và cấu hình nó để kết nối với cơ sở dữ liệu mạnh mẽ này. Việc sử dụng PostgreSQL thay vì SQLite mang lại sự ổn định, khả năng mở rộng và các tính năng nâng cao cần thiết cho các ứng dụng thực tế, đặc biệt là trong môi trường production.
Hy vọng hướng dẫn này sẽ giúp bạn tự tin hơn khi triển khai các dự án Rails sử dụng PostgreSQL.