Shuttle
Build & ship backends without writing any infrastructure files.
Install / Use
/learn @shuttle-hq/ShuttleREADME
<div align="center">⭐ If you find Shuttle interesting, consider starring this repo to help spread the word.</div> <br>
Features
- One-line Resource Provisioning: Get a database or other resource by adding a single line of code to your main file. No config or yaml files required.
- Rapid Development: It takes 2 minutes from project initialization to a deployed project. It takes seconds to provision a resource, and get it deployed to production.
- First-class support for popular Rust frameworks: Axum, Actix Web, Rocket, and more
- Security: Let us worry about the security & permissions while you focus on writing good code. <br>
Quick Start
On Linux and macOS, you can use this install script, which will automatically install the correct target for your OS and distro:
curl -sSfL https://www.shuttle.dev/install | bash
On Windows, you can use this install script to do the same:
iwr "https://www.shuttle.dev/install-win" | iex
After installing, log in with:
shuttle login
To initialize your project, simply write:
shuttle init --template axum hello-world
And to deploy it, write:
cd hello-world
shuttle deploy
And... that's it!
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
Feel free to build on top of the generated hello-world boilerplate or take a stab at one of our examples.
For the full documentation, visit our docs. <br> <br>
Quick Look
Below is a basic "Hello World" application written in Axum:
use 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!"
}
In order to be able to deploy it with a single command, we update the snippet as follows:
use 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())
}
Now, with just shuttle deploy, you can see your application live. But let's enhance it further by adding a shared Postgres database:
use 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())
}
Now, if we run shuttle deploy, we'll have an up and running project with a database inside & ready to use.
<br>
<br>
Repositories
| Name | Description | |-|-| | shuttle 🚀 (This repo) | All library crates and the Shuttle CLI. | | shuttle-examples 👨🏫 | Officially maintained examples of projects that can be deployed on Shuttle. | | shuttle-docs 📃 | Documentation hosted on docs.shuttle.dev. | | www 🌍 | Our website shuttle.dev, including the blog and more. | | deploy-action ⚙ | GitHub Action for continuous deployments. | | awesome-shuttle 🌟 | An awesome list of Shuttle-hosted projects and resources that users can add to. | | shuttlings ⚔️ | A collection of Rust code challenges. A great way to get started with using Rust and Shuttle. | <br> <br>
Contributing to Shuttle
Contributing to Shuttle is highly encouraged! Even if you are not planning to submit any code, joining our Discord server and providing feedback helps us a lot!
Check out our contributing docs and find the appropriate repo above to contribute to. For development of this repo, check the development docs.
Algora Bounties 💰
To offload work from the engineering team on low-priority issues, we will sometimes add a cash bounty to issues. Sign up to the Algora Console to find open issues with bounties.
Contributors ✨
Thanks goes to these wonderful people:
<!-- markdownlint-disable --> <a href="https://github.com/shuttle-hq/shuttle/graphs/contributors"> <img src="https://contrib.rocks/image?repo=shuttle-hq/shuttle" /> </a>Made with contrib.rocks.
<!-- invisible -->