Shuttle 入门指南:用一行代码为 Rust 应用供给资源并一键部署
发布时间:2026/10/15 17:41:16 锦皓数字建站

云原生后端DevOps【免费下载链接】shuttleBuild ship backends without writing any infrastructure files.项目地址https://gitcode.com/gh_mirrors/sh/shuttle点击查看免费下载本文以 shuttle 开源仓库主 README 为核心展开带你从零上手安装shuttleCLI、用模板初始化 Axum 项目、编写带数据库的 Rust 服务并通过shuttle deploy在数十秒内完成生产部署。读完你将掌握 Shuttle 的完整工作流安装 → 登录 → 初始化 → 本地运行 → 部署、#[shuttle_runtime::main]宏与“资源即函数参数”的供给机制以及 CLI 常用命令与项目配置文件Shuttle.toml的用法。Shuttle 是什么shuttle 是一个 Rust 原生的云端开发平台其核心理念是用几行代码获得资源并部署你的应用无需编写任何基础设施文件YAML、Dockerfile、Terraform 等。仓库主页将其定位为 Fastest Way to Build Ship Rust Apps构建并交付 Rust 应用的最快方式主打Simple. Easy. Joyful.的开发体验。Shuttle 的核心特性见 README.mdOne-line Resource Provisioning一行代码供给资源在主文件中添加一行代码即可获得数据库等资源不需要任何 config 或 yaml 文件Rapid Development快速开发从项目初始化到部署上线只需约 2 分钟供给资源到生产环境只需数秒First-class support for popular Rust frameworks一流的主流 Rust 框架支持包括 Axum、Actix Web、Rocket以及更多见下文框架列表Security安全平台负责安全与权限开发者专注于编写好代码。从仓库结构看整个项目是一个 Cargo workspace见 Cargo.toml当前版本号为0.57.0包含admin、api-client、builder、cargo-shuttleCLI、codegen过程宏、common、ifc、mcp、runtime、service等核心 crate以及services/目录下为各 Web 框架提供的官方集成 crate。快速开始安装与登录安装 Shuttle CLI在 Linux 和 macOS 上使用官方安装脚本会自动根据你的 OS 与发行版选择正确的安装目标curl -sSfL https://www.shuttle.dev/install | bash在 Windows 上使用 PowerShell 执行等价脚本iwr https://www.shuttle.dev/install-win | iex从仓库内的 install.sh 源码看安装脚本会根据发行版走不同安装路径Arch 系使用pacman、Alpine 使用apk其余系统回退到二进制下载cargo-shuttle-$VERSION-target.tar.gz或cargo install --locked cargo-shuttle脚本还会自动检测cargo/rustup是否安装必要时引导通过 rustup 安装 Rust 工具链。安装产物是cargo-shuttle与shuttle两个命令见 install.sh因此你也可以直接通过 Cargo 手动安装cargo install --locked cargo-shuttle登录安装完成后登录你的 Shuttle 账号shuttle loginlogin命令默认走设备授权流程device authCLI 通过 WebSocket 向 Shuttle Console 申请一次性令牌并自动打开浏览器用户完成授权后 CLI 自动接收 API key见 cargo-shuttle/src/lib.rs。如果你更希望手动粘贴 API key可以改用shuttle login --prompt # 或 shuttle login --api-key YOUR_API_KEYAPI key 会被持久化保存到全局配置文件~/.config/shuttle/config.tomlLinux 下中也可以直接通过环境变量SHUTTLE_API_KEY提供见 cargo-shuttle/src/config.rs。初始化项目shuttle init登录后用内置模板初始化一个 Axum 项目shuttle init --template axum hello-world这会在hello-world/目录生成一个可运行的项目骨架。--template支持的模板在 cargo-shuttle/src/args.rs 的InitTemplateArg枚举中定义包括axum、actix-web、rocket、loco、salvo、poem、poise、rama、serenity、tower、warp以及none自定义服务无框架模板。每个模板对应官方示例仓库shuttle-examples中的固定子目录例如axum对应axum/hello-world、actix-web对应actix-web/hello-world见 cargo-shuttle/src/args.rs。init的更多选项见 cargo-shuttle/src/args.rs参数说明--template T/-t T从官方示例克隆指定框架的 starter 模板--from git_url_or_local_path从自定义 Git 仓库或本地路径克隆模板与--template互斥--subfolder path配合--from指定模板在源仓库中的子目录--force-name跳过项目名合法性/可用性校验--create-project/--create-env初始化时同时在上创建 Shuttle 项目--no-git不初始化 Git 仓库默认会执行git init并把.gitignore写入忽略规则--path dir项目生成目录默认当前目录shuttle init底层的工作流程可以从 cargo-shuttle/src/init.rs 的generate_project中看到将模板克隆到临时目录gix浅克隆等价于git clone --depth 1把Cargo.toml中的 crate 名改写为你的项目名如果是 workspace 结构则改写在Shuttle.toml的name字段中在.gitignore或--no-git时的.ignore中补充/target、.shuttle*、Secrets*.toml等推荐忽略规则见 cargo-shuttle/src/init.rs将模板文件拷贝到目标目录跳过target与.git目录若无现成 Git 仓库则自动git init。交互模式下不带任何参数直接运行shuttle initCLI 会依次引导你登录、输入项目名、选择目录与模板在线拉取官方模板清单失败时回退到内置列表并在最后询问是否同时在平台创建项目见 cargo-shuttle/src/lib.rs。一键部署shuttle deploy进入项目目录执行部署cd hello-world shuttle deploy部署成功后你会看到类似下面的输出Service Name: hello-world Deployment ID: 3d08ac34-ad63-41c1-836b-99afdc90af9f Status: running Last Updated: 2022-04-01T08:32:34Z URI: https://hello-world.shuttleapp.rs此时应用已通过https://hello-world.shuttleapp.rs对外提供访问。shuttle deploy的常用参数见 cargo-shuttle/src/args.rs--allow-dirty/--ad允许在存在未提交改动时部署--no-follow/--nf只发起部署请求不持续跟踪状态立即退出--raw输出时不显示时间戳与日志来源标记--secrets file指定自定义 secrets 文件--output-archive path把构建归档写到本地文件而不真正发起部署可用于离线检查。从源码看deploy命令cargo-shuttle/src/lib.rs的完整链路为读取 secrets → 通过cargo_metadata探测工作区中带有#[shuttle_runtime::main]的二进制 target 并收集构建参数包名、二进制名、feature、shuttle-runtime 版本等见 cargo-shuttle/src/builder.rs→ 解析代码中的基础设施注解parse_infra_from_code→ 采集 Git 构建元信息commit、branch、dirty 状态→ 将项目文件打包为 zip 归档make_archive→ 上传归档 → 发起部署请求 → 跟踪部署状态直到Running或Failed失败时自动拉取日志打印。部署状态机pending → building → in progress → running/failed/stopped定义在 common/src/models/deployment.rs。本地先跑一跑shuttle run在上云之前可以用shuttle run在本地验证应用。它会在默认端口 8000 启动服务见 runtime/README.mdshuttle run # 另开终端 curl http://localhost:8000/ # Hello, world!shuttle run的可选参数包括-p/--port port服务端口默认 8000、--external监听0.0.0.0以便局域网/外部设备访问、--raw、--releaserelease 模式构建、--bacon基于 bacon 的 watch 模式热重载等见 cargo-shuttle/src/args.rs。本地运行时CLI 会在本机拉起一个临时的 provisioner 服务器模拟资源供给并通过SHUTTLE_*环境变量把项目名、端口、API 地址等传给运行时见 cargo-shuttle/src/lib.rs。Quick Look一个完整的 Axum 应用演进示例原始版本普通 Axum Hello World一个标准的 Axum 应用长这样README.mduse axum::{routing::get, Router}; #[tokio::main] async fn main() { let app Router::new().route(/, get(hello_world)); let listener tokio::net::TcpListener::bind(127.0.0.1:3000) .await .unwrap(); println!(listening on {}, listener.local_addr().unwrap()); axum::serve(listener, app).await.unwrap(); } async fn hello_world() - static str { Hello, world! }改造为 Shuttle 版本去掉样板代码要让应用能够用单条命令部署只需把main函数标记为#[shuttle_runtime::main]并返回shuttle_axum::ShuttleAxum类型README.mduse axum::{routing::get, Router}; async fn hello_world() - static str { Hello, world! } #[shuttle_runtime::main] async fn main() - shuttle_axum::ShuttleAxum { let router Router::new().route(/, get(hello_world)); Ok(router.into()) }对比可见绑定地址、创建 listener、axum::serve等与基础设施相关的样板代码全部消失了——服务进程的监听地址由 Shuttle 运行时注入你只需要返回一个实现了Servicetrait 的 router。在 services/shuttle-axum/src/lib.rs 中可以看到AxumService通过实现shuttle_runtime::Service::bind在运行时传入的SocketAddr上启动axum::serveShuttleAxum就是ResultAxumService, Error的类型别名。再加一步一行代码拿到共享 Postgres 数据库继续增强通过#[shuttle_shared_db::Postgres]属性注解把sqlx::PgPool直接声明为main函数的参数README.mduse axum::{routing::get, Router}; async fn hello_world() - static str { Hello, world! } #[shuttle_runtime::main] async fn main( #[shuttle_shared_db::Postgres] pool: sqlx::PgPool, ) - shuttle_axum::ShuttleAxum { pool.execute(include_str!(../schema.sql)) .await .expect(failed to run migrations); let router Router::new().route(/, get(hello_world)); Ok(router.into()) }再次运行shuttle deploy你的应用就带着一个开箱即用、连接就绪的数据库上线了。这就是 Shuttle One-line Resource Provisioning 的直观体现资源以函数参数的形式注入供给、连接串、权限配置全部由平台接管无需手写任何云服务商配置。深入原理#[shuttle_runtime::main] 宏做了什么#[shuttle_runtime::main]是 shuttle-codegen crate 提供的过程宏入口实现位于 codegen/src/shuttle_main.rs。它会把你写的main函数改造成三部分真实入口fn main()手动展开#[tokio::main]——创建一个多线程 Tokio runtime 并block_on内部的启动流程codegen/src/shuttle_main.rs__loader拿到ResourceFactory逐个调用各资源属性对应的ResourceInputBuilder::build()构造资源请求序列化后交给运行时codegen/src/shuttle_main.rs__runner在资源就绪后把供给结果反序列化、通过into_resource()转成你声明的类型如sqlx::PgPool再调用你原来写的main函数宏里已被改名为__shuttle_maincodegen/src/shuttle_main.rs。宏还会做两项重要检查返回值校验#[shuttle_runtime::main]函数必须返回一个受支持的 service 类型ShuttleAxum、ShuttleRocket等否则编译报错并提示参考文档codegen/src/shuttle_main.rs。仓库的编译器测试用例见 codegen/tests/compiler_output/missing-return.rs参数属性解析如果参数缺少#[shuttle_*]属性宏会直接报错提示Try adding an attribute like#[shuttle_shared_db::Postgres]codegen/src/shuttle_main.rs。此外资源属性中的字符串字面量支持{secrets.xxx}占位符插值——宏会把factory.get_secrets()中的 secret 注入到资源配置串中如连接串里的密码例如sensitive user:{secrets.password}codegen/src/shuttle_main.rs。运行时四阶段Loading / Provisioning / Init / Running部署环境下shuttle-runtime 的启动流程定义在 runtime/src/rt.rs分为四个阶段阶段行为失败退出码Loading加载从 API 拉取项目 secrets构建ResourceFactory执行__loader生成资源请求101 / 111Provisioning供给逐个调用provision_resourceAPI轮询资源状态Provisioning/Authorizing时每 2 秒重试直到Ready121 / 131 / 132Resource Init初始化执行__runner把资源供给结果转换为函数参数并调用用户代码151Running运行调用service.bind(addr)启动服务同时监听 SIGTERM/SIGINTUnix或 Ctrl-C/Ctrl-BreakWindows优雅退出1 / 10在部署态下运行时还会在资源供给完成后通知 sidecar 关闭请求/__shuttle/shutdown并在可选的SHUTTLE_HEALTHZ_PORT上启动一个轻量 HTTP health check 服务runtime/src/rt.rs。启动前的环境检查SHUTTLE_ENV必须存在、拒绝旧的--port参数与 tracing 初始化见 runtime/src/start.rs。Secrets 管理Secrets.toml本地/部署用 secrets 通过Secrets.toml提供格式是简单的 TOML 键值对DATABASE_PASSWORD s3cr3t API_TOKEN tok_xxx本地运行shuttle run时CLI 会优先读取Secrets.dev.toml其次Secrets.toml部署shuttle deploy时只读取Secrets.toml见 cargo-shuttle/src/lib.rs部署时 secrets 会随部署请求一起上传供运行时供给资源、注入到ResourceFactory中运行时以SecretT包装类型管理 secretDebug/Display输出会被替换为[REDACTED ...]值在Drop时会被清零zeroize以防止内存泄露见 common/src/secrets.rsshuttle init生成的.gitignore会自动包含Secrets*.toml避免 secrets 被误提交见 cargo-shuttle/src/init.rs。项目配置Shuttle.toml在项目根目录的Shuttle.toml中可以按需配置项目级行为schema 定义见 cargo-shuttle/src/config.rs# 部署时额外包含被忽略的文件支持 glob 模式 [deploy] include [assets/**, config/*.json] # 存在未提交改动时拒绝部署可用 --allow-dirty 覆盖 deny_dirty true # 构建产物中需要复制到运行容器的文件服务运行所需如模板、静态资源 [build] assets [templates/**]注意Shuttle.toml首字母大写小写的shuttle.toml会被检测并给出警告提示cargo-shuttle/src/config.rs。项目与平台的关联 ID 则记录在内部文件.shuttle/config.toml中id字段由shuttle project link/init/deploy自动维护。常用 CLI 命令速查除init、run、deploy外shuttle还提供完整的项目管理能力命令清单见 cargo-shuttle/src/args.rs命令别名作用shuttle project create --name nproj start在平台创建项目shuttle project listproj ls列出你有权限访问的项目shuttle project statusproj stat查看当前项目状态shuttle project linkproj将当前工作区关联到某个项目shuttle project deleteproj rm删除项目连同数据库、secrets、自定义域名shuttle deployment listdepl ls分页列出服务的部署记录shuttle deployment status [ID]depl stat查看某次部署状态shuttle deployment redeploy [ID]depl重新部署历史版本shuttle deployment stopdepl停止当前运行中的部署shuttle logs—查看当前部署日志--latest查看最近一次部署shuttle resource listres ls列出项目资源--show-secrets显示连接串等敏感值shuttle resource delete typeres rm删除某类资源如database::shared::postgresshuttle certificate add domaincert为自定义域名添加 SSL 证书shuttle accountacc查看账号信息shuttle logout—退出登录--reset-api-key同时重置 API keyshuttle upgrade—升级 CLI--preview安装 main 分支的未发布版本全局选项适用于所有子命令见 cargo-shuttle/src/args.rs--wd/--working-directory path指定工作目录、--name、--id、--output json|normal、--debug、--offline、--api-url url自定义 API 地址等。官方维护的周边仓库Shuttle 生态由多个仓库构成README.md仓库说明shuttle本仓库所有库 crate 与 Shuttle CLIshuttle-examples官方维护、可直接部署到 Shuttle 的示例项目shuttle-docs托管在 docs.shuttle.dev 的完整文档www官网与博客deploy-action用于持续部署的 GitHub Actionawesome-shuttle由社区维护的 Shuttle 托管项目资源清单shuttlings一套 Rust 编码挑战是上手 Rust Shuttle 的绝佳练习支持的框架与自定义集成services/目录下的 crate 提供了官方的一等first-class框架集成返回类型对应关系如下见 codegen/src/lib.rs返回类型crate框架ShuttleAxumshuttle-axumaxum默认 0.8通过axum-0-7feature 支持 0.7ShuttleActixWebshuttle-actix-webactix-webShuttleRocketshuttle-rocketrocketShuttleSalvoshuttle-salvosalvoShuttlePoemshuttle-poempoemShuttleRamashuttle-ramaramaShuttleSerenityshuttle-serenityserenity / poiseDiscord BotShuttleTowershuttle-towertowerShuttleWarpshuttle-warpwarp如果现有框架不在列表中你也可以自行实现集成只需为你的框架实现shuttle_service::Servicetrait核心是async fn bind(self, addr: SocketAddr) - Result(), Error详见 services/README.md。进一步阅读开发本仓库请参考 DEVELOPING.md参与贡献请阅读 CONTRIBUTING.md框架集成的完整文档入口services/README.md 与各 crate 自带的 README如 services/shuttle-axum/README.md运行时的更多细节runtime/README.md部署模型的类型定义DeploymentRequest、BuildArgs、BuildMeta等common/src/models/deployment.rsCLI 集成测试覆盖工作目录不存在、项目 ID 缺失等边界场景cargo-shuttle/tests/integration/main.rs。至此你已经走通了 Shuttle 的完整主线安装 CLI → 登录 → 用模板初始化 → 本地验证 → 一键部署并理解了#[shuttle_runtime::main]、资源供给四阶段与 secrets/配置机制。下一步建议基于官方shuttle-examples挑选你熟悉的框架示例把一行代码拿数据库的模式应用到真实业务中。赞分享云原生后端DevOps【免费下载链接】shuttleBuild ship backends without writing any infrastructure files.项目地址https://gitcode.com/gh_mirrors/sh/shuttle点击查看免费下载相关推荐50个精选 recipes用Google Workspace CLI实现办公自动化50个精选 recipes用Google Workspace CLI实现办公自动化 Google Workspace CLI是一款强大的命令行工具能够帮助用Shuttle项目部署指南从源码到可执行应用的完整流程Shuttle项目部署指南从源码到可执行应用的完整流程 终极指南如何快速构建macOS快捷菜单工具Shuttle Shuttle是一款专为macOS设桌面应用开发工具使用 shuttle-actix-web 在 Shuttle 上部署 Actix Web 应用使用 shuttle actix web 在 Shuttle 上部署 Actix Web 应用 导读 shuttle actix web https://lin云原生后端DevOps创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。