Quá trình deploy một ứng dụng bao gồm việc cài đặt các thành phần cần thiết, cấu hình hệ thống và đảm bảo ứng dụng hoạt động một cách đúng đắn trên môi trường hoạt động thực tế. Bài viết này mô tả ngắn gọn quá trình mình thực hiện deploy một ứng dụng Spring Boot với cơ sở dữ liệu MySQL lên server như thế nào.
- Trang bị server
Để có thể deploy ứng dụng, chắc chắn sẽ phải cần có một hạ tầng (infrastructure) mà người dùng có thể truy cập được. Để có thể deploy được, việc ta cần phải làm là đưa ứng dụng và các thành phần cần thiết để có thể chạy được ứng dụng trên hạ tầng này.
Với ứng dụng di động, hạ tầng thường sẽ là các kho ứng dụng như Google Play, App Store. Còn với ứng dụng web, hạ tầng sẽ là một không gian máy chủ, không gian hoạt động giống như một chiếc máy tính thông thường với public IP, nghĩa là có thể được truy cập thông qua môi trường internet. Vì ứng dụng mà mình deploy là Web, nên mình sẽ chọn sử dụng một server từ những nhà cung cấp dịch vụ. Có hai lựa chọn phổ biến là Linux Server và Window Server, vì Linux mang nhiều lợi ích hơn khi sử dụng làm server, nên mình quyết định chọn Linux, lí do tại sao các bạn có thể tìm hiểu thêm.
Vậy việc cần làm bây giờ làm tìm được một Linux Server, ta có thể dễ dàng tìm được bằng cách tra cứu trên google, có rất nhiều nhà cung cấp đến từ Việt Nam và cả nước ngoài.
Bên cạnh đó, bạn có thể sử dụng dịch vụ server được cung cấp bởi DigitalOcean vì giá cả hợp lý lẫn độ ổn định, các bạn hoàn toàn có thể sử dụng server từ những nhà cung cấp khác. Ở đây, các gói server của Digital Ocean rất đa dạng, tuỳ vào nhu cầu sử dụng mà có thể chọn gói hợp lý.
Các gói server của DigitalOcean
- Kết nối tới server
Sau khi đã chọn mua server, nhà cung cấp sẽ cần trả về một số thông tin server bao gồm: địa chỉ server, tài khoản, mật khẩu. Ta sẽ dùng những thông tin này để truy cập vào bên trong server từ bên ngoài (client), quá trình này được gọi là SSH, các bạn có thể tìm hiểu thêm về giao thức này.
SSH có thể thực hiện được thông qua command-line với cú pháp: ssh user@serverip. Nếu máy client đang sử dụng hệ điều hành Window thì có thể cần sẽ cần thêm bước kích hoạt SSH
Sau khi sử dụng lệnh ssh tới server với user là root, lúc này ta cần nhập thêm password chính là password được cung cấp thi khi thuê/mua server.
Giao diện shell
Nếu sau khi nhập password, một shell sẽ được tạo ra giữa client và server, nếu hiện ra màn hình Welcome như trên thì ta đã thực hiện ssh thành công.
- Cài đặt môi trường server
Do ứng dụng cần deploy là Spring Boot kết nối tới MySQL, nên ta sẽ cần cài đặt một số package như jre, mysql để chạy được ứng dụng trong server. Trong Linux, lệnh apt là một lệnh phổ biến để quản lý các package tìm kiếm, tải xuống, cập nhật, gỡ bỏ. Mình sẽ tiến hành cài đặt từng package cần thiết bằng apt.
3.1 Cài đặt JRE
Tại sao lại là JRE chứ không phải JDK ? Do là chúng ta chỉ muốn chạy chương trình, chứ không phải xây dựng ra chương trình. Vì vậy chỉ cần cài JRE là đủ dùng.
Để kiểm tra các package JRE có thể cài, mình sử dụng câu lệnh apt search jre. Câu lệnh này sẽ thực hiện tìm kiếm tất các cả package mà có tên chứa từ khoá jre.
Apt search list
Kết quả trả về cho mình một số cách package có chứa tên jre. Do mình sử dụng JDK 17 để xây dựng ứng dụng, vì vậy mình sẽ cài JRE 17. Như ta thế, có một vài package cùng tên là openjdk-17-jre nhưng lại có chút khác ở tên như headless, zero.
Vậy những package jre này có chức năng gì ? Mình có thể kiểm tra bằng lệnh apt show package_name để xem thông tin chi tiết hơn về một package. Vậy mình sẽ tiến hành xem chi tiết từng package jre này.
JRE headless
JRE zero
Lệnh apt show sẽ trả về các thông tin chi tiết về package. Thông qua phần mô tả, mình thấy là JRE Headless là phiên bản rút gọn của JRE bằng chỉ thực thi các chương trình không có giao diện đồ hoạ (GUI), còn JRE Zero chính là JRE Headless nhưng sử dụng một Virtual Machine khác tên Zero VM thay cho VM mặc định của JRE. Vì vậy, mình quyết định cài đặt JRE headless thông qua câu lệnh sudo apt install openjdk-17-jre-headless.
Để kiểm tra cài đặt thành công, gõ lệnh java –version, nếu console hiện ra thông tin về Jre vừa cài đặt có nghĩa là đã cài đặt thành công.
Java version
3.2 Cài đặt MySQL
Để cài đặt MySQL, mình sẽ thực hiện theo từng bước một. Sorry vì phần này hơi nhiều bước và hướng dẫn cũng chi tiết, anh em chỉ cần follow thôi nha.
Mặc định MySQL sẽ không cho phép truy cập từ bên ngoài, tức là từ những nơi không cùng địa chỉ với nơi MySQL được cài. Để có thể cho phép MySQL kết nối được từ bên ngoài, hãy thực hiện theo .
Sau khi thực hiện theo hướng dẫn trên, có thể kiểm tra kết nối trên MySQL Workbench từ Client.
Nhập các thông tin host, port, username, password rồi chọn Test Connection. Nếu hiển thị thông báo Sucessfully thì kết nối đã thành công.
- Đóng gói ứng dụng
Trước khi đưa ứng dụng vào server, mình sẽ thực hiện đóng gói để tạo ra một chương trình có thể chạy được thông qua JRE luôn. Mình đã tạo một ứng dụng Spring Boot bằng Maven, trả về api được lấy từ MySQL như bên dưới:
Trước khi đóng gói, mình sẽ thay đổi thông tin cấu hình bao gồm kết nối cơ sở dữ liệu. File application-deploy.yml là file chứa thông tin cấu hình cho môi trường deploy, mình sẽ để nó được active trong application.yml
Để đóng gói, chọn maven package trong IDE, hoặc dùng lệnh ./mvnw clean package. Một số build tool khác như gradle, ant cũng có cơ chế tương tự.
Sau khi đóng gói, một file jar sẽ được tạo ra có thể chạy thông qua command-line. Việc này cũng được thực thi tương tự ở trong server.
- Đưa ứng dụng vào server
Để đưa ứng dụng vào server, mình sẽ sử dụng một lệnh phổ biến của linux là scp nhằm chuyển File giữa các máy tính.
Trước khi bắt đầu, mình sẽ tạo ra một folder tên artifacts trong server để lưu trữ các packaged program thông qua lệnh mkdir /artifacts.
Mình sẽ tiến hành chuyển file jar từ phía client (máy của mình) lên server thông qua lệnh như sau:
Lúc này, ta có thể kiểm tra xem file jar đã tồn tại trong server chưa, nếu hiển thị như bên dưới có nghĩa là file đã được gửi đi thành công.
- Chạy ứng dụng trong server
Sau khi đưa file jar vào trong server, mình sẽ thực thi câu lệnh tương tự như chạy trên máy client.
Thực thi chương trình trong server
Sau khi đã chạy thành công, có thể kiểm tra bằng cách truy cập địa chỉ server kèm theo số port của ứng dụng trên trình duyệt.
Kiểm tra chương trình trong server
Như lúc này, ứng dụng đã chạy thành công và mình có thể truy cập được từ bên ngoài thông qua url. Tuy nhiên, chương trình lúc này chỉ đang chạy trên shell được giữa client và server, nếu như shell bị đóng lại, thì ứng dụng cũng sẽ bị tắt đi khiến mình không truy cập được nữa, như bên dưới.
Ứng dụng không thể truy cập được nữa
Để có thể chạy được ứng dụng ngay cả khi không kết nối tới server, mình cần khiến nó chạy ngầm trong server dưới dạng một service của server. Để tạo ra được service, trước tiên, mình tạo ra file deploy-demo.service để khai báo ra một service như bên dưới. Các thông tin cần cho một service, các bạn sửa lại thông tin User và ExecStart phù hợp trên máy mình. Chú ý các giá trị viết liền dấu ‘=’.
[Unit]
Description=Deploy Demo
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=root
ExecStart=/usr/bin/java -jar /artifacts/deploy-demo-0.0.1-SNAPSHOT.jar
[Install]
WantedBy=multi-user.target
Sau khi đã tạo ra file service, mình sử dụng lệnh scp để gửi file service vào server. Các bạn hoàn toàn có thể tạo ra file service ngay trong server, sử dụng một số text editor như nano, vi để cấu hình thông tin.
Gửi file service tới server
Sau khi đã có file service, thực thi câu lệnh sau:
sudo systemctl start deploy-demo.service
Mặc định thì các service trong linux không được tự động bật khi start hệ điều hành. Để làm điều đó thì cần phải enable service:
sudo systemctl enable deploy-demo.service
Sau khi đã khởi động service, có thể kiểm tra trạng thái thông qua câu lệnh sau:
sudo systemctl status deploy-demo.service
Nếu như service trả về status là active tức là đã chạy thành công.
Cuối cùng, truy cập địa chỉ ứng dụng hoặc sử dụng lệnh curl để kiểm tra ứng dụng đã chạy thành công hay chưa.
- Cập nhật ứng dụng trong server
Việc cập nhật chương trình trong quá trình sử dụng là tất yếu, để cập nhật lại ứng dụng, các bạn thực hiện lại các thao tác:
Đóng gói lại ứng dụng sau khi đã cập nhật.
Dùng lệnh scp gửi file vào trong service.
Sử dụng lệnh “sudo systemctl restart {service-name}” để khởi động lại service.
Chạy thêm lệnh “sudo systemctl deamon-reloaded” nếu hệ thống báo yêu cầu.
Sau các thao tác trên, ứng dụng trong server sẽ được cập nhật lại.
Như vậy, bài viết trên đã mô tả lại quá trình mình thực hiện deploy ứng dụng Spring Boot với MySQL trên Linux server. Có thể thấy, việc deploy cũng khá đơn giản, tuy nhiên nếu có sự thay đổi từ ứng dụng thì việc repdeploy khá mất công và đòi hỏi sự tính toán kỹ càng.
Bộ môn Ứng dụng phần mềm
Trường Cao đẳng FPT Mạng cá cược bóng đá
cơ sở Hà Nội