部署 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
。