部署 Rust 應用程式
Zeabur 原則上支援所有類型的 Rust 應用程式——預設情況會自動尋找執行檔;假如專案有多個執行檔,亦可在「Service 名稱」一欄(或者是使用 ZBPACK_RUST_ENTRY
)自行指定要執行的檔案名稱。
倘若你手邊沒有專案,可以 fork zeabur/axum-template (opens in a new tab) 儲存庫到你的 GitHub 帳號,然後在 Zeabur 上試著部署。
支援的專案類型
- 單執行檔專案:即執行檔只有
src/main.rs
一個入口的 Rust 專案。Zeabur 會自動尋找cargo install
之後的產出的第一個執行檔。 - 多執行檔專案:假如除了
src/main.rs
,專案在src/bin
也有其他執行檔,請在「Service 名稱」一欄填寫「你想執行的最終產物的名稱,」或者是在zbpack.json
填寫這個設定你也可以使用環境變數{ "rust": { "entry": "your-entry" } }
ZBPACK_RUST_ENTRY
達到同樣的效果。 - Cargo Workspace monorepo:假如你的專案是由多個 crate 組成,請在「Service 名稱」一欄填寫「你想執行的最終產物的名稱。」預設情況下會
cargo install
workspace 下的 所有專案,你除了可以透過上述ZBPACK_RUST_ENTRY
的方式指定執行檔名稱外,也可以在zbpack.json
直接指定這個應用程式 workspace 所在的位置。 假如你的應用程式在 Repository 根目錄的rest-api
資料夾下,你可以這樣填寫:你也可以使用環境變數{ "rust": { "app_dir": "rest-api" } }
ZBPACK_RUST_APP_DIR
達到同樣的效果。
若你填寫的執行檔不存在,則會改用自動尋找的形式。「自動尋找」會尋找編譯出的所有執行檔案,並執行找到的第一個檔案。因為這種模式在多專案情況下很容易猜錯,因此在複雜的專案場景下(如第二和第三點提到的多執行檔專案),建議你根據〈尋找最終產物名稱〉的方式填寫正確的「Service 名稱」。
尋找最終產物名稱
最終產物可以在你專案的 target/release
中找到。具體尋找的方式:
-
你需要 Rust toolchain 才能編譯專案,可到 Rust 官方網站 (opens in a new tab) 下載。
-
clone 你要部署的專案,並且進到專案目錄。
-
執行
cargo build --release
編譯專案。$ cargo run --release Compiling zeabur v0.1.0 (/project) Finished release [optimized] target(s) in 0.65s Running `target/release/zeabur`
-
找到 Running
target/release/zeabur
那一行,擷取最後的執行檔名稱 (zeabur) 即可 -
在 Service 名稱或
ZBPACK_RUST_ENTRY
填入zeabur
。
複製其他檔案
假如你除了執行檔之外,還依賴程式碼庫的其他檔案。舉例來說:
*
|`-- public <-- 你的程式依賴這個資料夾
|`-- src
| `-- main.rs
|`-- Cargo.toml
|`-- Cargo.lock
`--- config.toml <-- 你的程式依賴這個檔案
你可以在 zbpack.json
中填寫 rust.assets
,裡面填入你想保留的資料夾或檔案,資料夾應用 /
結尾。範例如下:
{
"rust": {
"assets": [
"public/",
"config.toml"
]
}
}
自動安裝依賴
如果你的專案依賴 OpenSSL 且有在 Cargo.toml
中顯式依賴(或 Cargo.lock
間接依賴)openssl
,Zeabur 會自動安裝 openssl
執行階段函式庫。
執行環境
Zeabur 目前使用 rust:1-silm
(opens in a new tab) 作為執行映像。你的執行檔會放在 /app
目錄,並將 /
(根目錄)作為執行目錄。
Serverless 部署
不同於其他 PaaS 平台是直接將你的 Rust 應用程式打包在 Docker 容器中執行,Zeabur 同時支援使用 Serverless 部署 Rust 的方式,這可以讓你的 Rust 應用程式只有在收到請求的時候才啟動,而不是像容器一樣一直運行,浪費資源。
如果想要用 Serverless 部署 Rust 應用程式,請在環境變數中加入 ZBPACK_SERVERLESS=1
。