白嫖免费的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-preview

依次通过以下命令来安装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的免费计划不能自定义域名,但是我们可以通过其他的方式自定义域名,比如cloudflareworker, 具体的实现可以搜索cloudflare workers reverse proxy.

总结

虽然shuttle仅支持三个项目和有限的计算资源但是仅仅测试和试玩还是足够的, 如果真的需要需要足够的资源和在线访问,可能需要自己买云主机或者VPS了。

参考链接