部署專案
接下來我們要將上個章節組建好的JAR檔放到Linux Server上跑。
透過SSH連線到Server
打開Putty,雙擊要連線到的Server

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

更新系統
請定期更新Server上的軟體,輸入
安裝JRE
我們需要安裝JRE才能跑Java的程式,如果選擇JDK也是可以,不過這裡使用JRE就夠了(因為我們已經在Windows上組建好專案了,所以只需要JRE即可)。
先輸入指令檢查是否有安裝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)
當你輸入完上面的指令後,會看到下面的的畫面

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

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

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

最後輸入以下指令

設定MariaDB









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

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

安裝(S)FTP軟體
為了方便管理Server上的檔案,我們需要(S)FTP軟體,你可以想成Windows的檔案總管,只不過裡面的檔案是存在遠端Server,透過(S)FTP協定可以將檔案從你的電腦傳到遠端Server。
因為FTP協定本身不加密,所以有安全上的隱憂,現在大多改用SFTP協定,可以想成加密版的FTP,不過我們還是習慣以FTP來稱呼。
我們將採用WinSCP作為FTP軟體,請至下方網站下載,當然你也可以根據喜好選擇其他FTP軟體
基本上安裝過程保持預設即可,如果有出現以下畫面,請點擊確認


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


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

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





設定資料庫連線資訊
我們以環境變數的方式設定資料庫連線資訊
請編輯/home/username/.bashrc,其中username需替換成Linux使用者名稱
在檔案最下面加入
Vaadin_DB_URL
jdbc:mariadb://localhost:3306/newdatabase
Vaadin_DB_USER
newdatabaseuser
Vaadin_DB_PASSWORD
password

設定環境變數後,為了讓環境變數生效,請關閉所有SSH連線(Putty),再重新開啟。
測試環境變數是否生效

執行程式
我們要先切換到程式所在的資料夾再執行Java指令
上面的test請換成你Linux的使用者名稱,example為剛剛新增的資料夾名稱
你可以用ls指令查看目前的所在路徑下有哪些檔案


按下Ctrl + c即可終止

開放連線埠(port)
我們需要開放8080/tcp這個連線埠(port)才能讓外面的連線連入我們的Server,這部分可回顧
測試是否能正常連上
前往http://IP:8080,請將ip換成你的Server的IP,如果無法連上請確認程式正在執行、Spring Boot的連線埠是否是8080(有可能有改到程式的連線埠)、防火牆是否有開放連線埠(port)、IP資訊是否正確。

延伸閱讀
Nginx 參考設定檔
請根據需求調整,不要直接照抄,不然會跑不起來
Nginx的設定檔在之前是儲存在/etc/nginx/sites-available資料夾底下,然後用軟連結連結到/etc/nginx/sites-enabled資料夾底下,不過較新版本的Nginx是直接儲存在/etc/nginx/conf.d底下就好。
Nginx 1.24(含)以前
Nginx 1.25及以後版本
如果你已經設定好Nginx或其他反向代理(如: Caddy Web Server),那就不要開放Sprong Boot所使用的port讓外部連線連入,同時你應該開放80/tcp、443/tcp、443/udp(只有支援quic才需要)。
使用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



