部署專案

接下來我們要將上個章節組建好的JAR檔放到Linux Server上跑。

透過SSH連線到Server

打開Putty,雙擊要連線到的Server

如果有替key設定passphrase的話,請在此輸入

更新系統

請定期更新Server上的軟體,輸入

安裝JRE

我們需要安裝JRE才能跑Java的程式,如果選擇JDK也是可以,不過這裡使用JRE就夠了(因為我們已經在Windows上組建好專案了,所以只需要JRE即可)。

先輸入指令檢查是否有安裝Java

你應該會看到類似下面的輸出,表示找不到Java指令,也就是我們還沒裝Java

找不到Java指令

輸入指令安裝OpenJDK版的JRE 17,headless表示沒有圖形介面,這是因為我們選擇的OS是Server版

如果輸入完指令後出現下面的畫面,請輸入使用者的密碼,以下圖來說就是test使用者的密碼,之所以需要輸入密碼是因為我們執行apt指令需要sudo權限。

這裡會告訴我們安裝JRE需要的額外套件(package),按y繼續即可

輸入指令檢查是否成功安裝Java

出現下面畫面表示成功安裝JRE 17.0.8.1

安裝MariaDB

安裝MariaDB有兩種方式

第一種是直接從Ubuntu 22.04內建的軟體庫(package repository)安裝,優點是簡單,缺點是通常安裝的軟體版本不會是最新版本,像是目前Ubuntu 22.04提供MariaDB 10.6(LTS),但目前最新的LTS為10.11。

第二種是透過MariaDB提供的軟體庫(package repository)安裝,優點是可以取得較新的版本,缺點是需要額外設定,下面連結可以取得Ubuntu 22.04下MariaDB 10.11的安裝資訊。

輸入完上面的指令後,我們需要編輯/etc/apt/sources.list.d/mariadb.sources這個檔案,這裡以nano編輯器示範,當然你也可以用你習慣使用的編輯器(如: vim)

當你輸入完上面的指令後,會看到下面的的畫面

circle-info

在nano編輯器當中,請使用鍵盤的上下左右鍵控制游標,它不像我們常用的Word、記事本可以透過滑鼠移動游標,所以如果你用滑鼠去點的話,游標不會移動,基本上滑鼠剩下選取文字的功能,這在終端機當中是蠻常見的事。

接著貼上以下文字,在這裡Ctrl + v可能會沒辦法成功貼上文字,此時請嘗試Shift + Insert,下面內容為MariaDB官方軟體庫的資訊

貼上後的畫面

貼上後按下Ctrl + x,此時系統會詢問是否要儲存檔案,請輸入y

輸入y確認

接著系統將顯示檔案的路徑及檔名,確認無誤按下Enter即可,有錯也可在此調整

最後輸入以下指令

目前安裝MariaDB 10.11.5
circle-info

在大多數的使用情況下,apt-get跟apt是可以通用的,詳情可參考以下網站,筆者建議除非有特殊需求,否則使用apt即可。

https://aws.amazon.com/tw/compare/the-difference-between-apt-and-apt-get/arrow-up-right

設定MariaDB

MariaDB正在執行
MariaDB沒有啟動
輸入root密碼,因為預設沒有設定root密碼,所以直接按Enter即可
這裡輸入n即可
這裡輸入n即可
這裡輸入y即可
這裡輸入y即可
這裡輸入y即可
這裡輸入y即可

建立資料庫

我們需要建立一個供範例程式使用的資料庫,首先,我們需要進入MariaDB設定,輸入下列指令

成功進入MariaDB的畫面

依序輸入以下SQL指令,你可以將資料庫名稱、資料庫使用者、資料庫使用者的密碼換成你想要的值

範例輸出

安裝(S)FTP軟體

為了方便管理Server上的檔案,我們需要(S)FTP軟體,你可以想成Windows的檔案總管,只不過裡面的檔案是存在遠端Server,透過(S)FTP協定可以將檔案從你的電腦傳到遠端Server。

circle-exclamation

我們將採用WinSCP作為FTP軟體,請至下方網站下載,當然你也可以根據喜好選擇其他FTP軟體

WinSCP官網

基本上安裝過程保持預設即可,如果有出現以下畫面,請點擊確認

將之前儲存在Putty的連線設定檔匯入到WinSCP
選擇匯入哪些連線設定檔

透過SFTP協定連線至Server

基本上連線設定檔因為已經在Putty設定好了,所以不須額外調整

選擇要使用的連線設定檔,並按下登入
輸入當初生成金鑰對時設定的passphase,與登入Putty時輸入的passphase相同

如果成功連線,你會看到下面的畫面

左側是你的電腦的檔案,右邊是Server的檔案

新增資料夾

我們要建立一個資料夾來放專案的JAR檔及其他資料

circle-info

目前範例程式除了資料庫以外不會有其他資料需要儲存,未來如果你的程式需要儲存其他資料的話,也可以儲存在此資料夾底下,像是儲存圖片。

左側視窗為你的電腦,右側視窗為遠端Server
雙擊進入資料夾
確定右側的遠端路徑正確後,選取要上傳到Server的檔案
WinSCP會彈出確認視窗,沒問題就按確認
上傳完成
circle-info

你也可以使用拖曳檔案的方式,譬如從本機電腦拉到遠端Server,反過來也可以。

設定資料庫連線資訊

我們以環境變數的方式設定資料庫連線資訊

請編輯/home/username/.bashrc,其中username需替換成Linux使用者名稱

在檔案最下面加入

變數名稱
變數值

Vaadin_DB_URL

jdbc:mariadb://localhost:3306/newdatabase

Vaadin_DB_USER

newdatabaseuser

Vaadin_DB_PASSWORD

password

circle-info

請將newdatabase替換為之前新增資料庫時設定的資料庫名稱

請將newdatabaseuser替換為之前新增資料庫時設定的資料庫使用者名稱

請將password替換為之前新增資料庫時設定的資料庫使用者密碼

以example資料庫為範例示範
circle-exclamation

測試環境變數是否生效

執行程式

我們要先切換到程式所在的資料夾再執行Java指令

circle-exclamation

你可以用ls指令查看目前的所在路徑下有哪些檔案

範例專案成功執行

按下Ctrl + c即可終止

終止範例專案

開放連線埠(port)

我們需要開放8080/tcp這個連線埠(port)才能讓外面的連線連入我們的Server,這部分可回顧

設定VPS-設定防火牆的章節

測試是否能正常連上

前往http://IP:8080,請將ip換成你的Server的IP,如果無法連上請確認程式正在執行、Spring Boot的連線埠是否是8080(有可能有改到程式的連線埠)、防火牆是否有開放連線埠(port)、IP資訊是否正確。

成功畫面
circle-info

通常我們在生產環境中不會直接開放8080連線埠,而是會再加一層反向代理,你可以透過設定反向代理讓使用者透過https連線到Server,另外也建議不要使用IP,而是使用域名來提供服務。

延伸閱讀

反向代理原理
使用Nginx作為反向代理
域名介紹
使用acme.sh取得TLS(SSL)憑證

Nginx 參考設定檔

請根據需求調整,不要直接照抄,不然會跑不起來

circle-exclamation

Nginx 1.24(含)以前

Nginx 1.25及以後版本

triangle-exclamation
circle-info

反向代理的其中一個好處是一臺Server(單一IP),可以同時提供多個服務,譬如現在有兩個Spring Boot的程式要跑,那只要我把兩個Spring Boot程式使用的port設定成不同的,且不會跟反向代理使用的80、443相同,就不會發生port conflict,外部連線由反向代理使用port 80、443提供服務(如: https),反向代理再將流量分別轉發到對應的Spring Boot程式即可。

使用Systemd將程式包成服務

如果你在終端機執行Java指令,程式可以執行,但此時你關閉終端機的話,程式就會終止,為了避免因為我們跟Server的SSH連線中斷造成程式終止,我們必須使用Systemd將程式包成服務。

如果你在執行systemctl相關指令時遇到下面的錯誤,請執行下面的指令,接著再重新執行原先想執行的指令

如果成功的話,你可以透過sudo systemctl status vaadin查看執行狀態,如下圖

vaadin服務正在執行

你可以將Server重新啟動來確認服務會自動啟動。

結論

如果要在生產環境中部署專案相比開發環境中的測試是需要很多額外的設定,像是本篇教學中沒有詳細提到域名、反向代理、開啟TLS(SSL)、支援IPv6、增加http header來提升安全性、啟用CDN......等等,筆者建議讀者如果有興趣的話可以自行搜尋相關資料,這些內容以目前課程專案來說可能不是那麼必要,不過這並不代表它們不重要,舉例來說,開啟TLS(SSL)可以確保server跟client之間的流量經過加密,提升系統安全性,啟用CDN可以降低client載入網頁的延遲,反向代理可以避免port conflict,讓單IP的機器可以跑不同Web服務,之後的教學會介紹現在很流行的虛擬化技術-Docker,Docker的部署筆者覺得會比上面介紹的方式還簡單,像是可以不用額外安裝資料庫。

Last updated