白嫖免费的Rust在线运行时shuttle
一个总是在线的服务还是很有吸引力的, 通过shuttle
可以托管自己的rust应用, 对于资源要求不多的应用或者仅仅简单的测试还是很有用的。
当前shuttle免费项目有以下限制:
具体是最新的官方说明为准, 参考页面:https://www.shuttle.rs/pricing
- 最多三个项目
- 足够多的CPU和内存(0.05 vCPU和0.2GB RAM)
- 免费的共享数据库(1GB PostgreSQL)
- 每天最多二十次部署, 最多20分钟的构建时间
- 一天的日志记录
- 1GB的出口带宽(所以某些需求就不太可能了)
- 免费的1GB对象存储
- 没有自定义域名(如果你有cloudflare账户, 可以通过worker映射自己的域名!)
还有一点值得注意的是, 应用应该不是一直在线的, 当长时间没有请求应该会将应用关闭, 当请求来了之后才会将应用拉起, 所以第一次请求的响应可能会相对于后面的响应时间比较长。
快速入门
首先需要一个shuttle账户, shuttle当前可以使用github账户登录,所以有一个github账户就能登录shuttle, 登录之后会有操作提示和API Key, 页面大致如下:
依次通过以下命令来安装shuttle
命令行工具以及创建项目。
安装cargo-shuttle
cargo install cargo-shuttle
初始化一个项目
# 首先创建一个用于存放代码的目录并接入该目录
mkdir shuttle-demo && cd shuttle-demo
# 开始初始化
cargo shuttle init
当初始化的时候会出现各种提示,比如输入项目名和API Key等, API Key需要去自己的shuttle
账户页面获取, 其他选项根据自己的意愿选择和设置即可。
值得注意的是,免费的项目因为共用同一个二级域名, 比如youerprojectname.shuttleapp.rs, 所以必须保证自己的项目名唯一,如果别人占用了,那就需要改名了。
一个空格项目结构应该如下:
├── src
│ └── main.rs
├── Cargo.toml
├── index.html
编写代码
因为是一个快速入门的例子, 所以下面的代码很简单
use axum::{routing::get, Router};
async fn hello_world() -> &'static str {
"this is project of youerning.top"
}
#[shuttle_runtime::main]
async fn main() -> shuttle_axum::ShuttleAxum {
let router = Router::new().route("/", get(hello_world));
Ok(router.into())
}
部署项目
当我们修改或者不修改自己的代码就可以开始部署项目了, 因为shuttle在初始化的时候也初始化了一个git仓库, 所以你首先需要提交代码。
# 添加当前目录的所有文件到git暂存区
git add .
# 提交代码
git commit -m "init"
# 部署项目到shuttle
cargo shuttle deploy
如果在本地可以成功执行cargo run
或者cargo build
命令, 那么在部署过程中出错一般是服务端的问题, 我们能做的只有等待一段时间再尝试部署…
本文部署的在线地址是https://youerning.shuttleapp.rs/, 有兴趣的可以访问试试。
自定义域名
虽然shuttle
的免费计划不能自定义域名,但是我们可以通过其他的方式自定义域名,比如cloudflare
的worker
, 具体的实现可以搜索cloudflare workers reverse proxy.
总结
虽然shuttle仅支持三个项目和有限的计算资源但是仅仅测试和试玩还是足够的, 如果真的需要需要足够的资源和在线访问,可能需要自己买云主机或者VPS了。