Rustで書いたWebアプリをどこにデプロイしたらいいかわからなかったので色々調べたらそれっぽい記事があったので参考にしながら自分でもやってみたことをメモに残します。
RustのWebアプリケーションフレームワークは Rocket を使うものとします。
(前提)
- Rustのnightlyがインストール済みである。
- Heroku CLIをインストール済みで
$ heroku login
も済んでいる。
Rocketアプリを作るディレクトリではnightlyをデフォルトにする
このディレクトリ配下はstableではなくnightlyが標準で適用されます。
$ cd rust/rocket
$ rustup override set nightly
Rocketアプリを作る
$ cargo new hello-rocket --bin
HerokuのRust用buildpackを適用する
このbuildpackがビルドとデプロイをいい感じにやってくれます。
$ cd hello-rocket
$ heroku create --buildpack https://github.com/emk/heroku-buildpack-rust.git
RustConfigを作る
プロジェクトのルートにRustConfig
というファイルを作ります。
buildpackが標準ではstableを使ってビルドするようになっているので、それを上書きする設定です。
VERSION=nightly
Cargo.tomlの依存関係にrocketとrocket_codegenを加える
(省略)
[dependencies]
rocket = "0.3.6"
rocket_codegen = "0.3.6"
Rocket.tomlを作る
よくわからないけど公式のドキュメントを参考にしてこんな感じにしました。
[development]
address = "localhost"
port = 5000
log = "normal"
[staging]
address = "0.0.0.0"
port = 80
log = "normal"
[production]
address = "0.0.0.0"
port = 80
log = "critical"
Procfileを作る
プロジェクトのルートにProcfile
というファイルを作ります。
Herokuで使われる設定ファイル(?)です。
web: ROCKET_PORT=$PORT ./target/release/hello-rocket
hello-rocket
の部分は適宜変更します。
Herokuに環境変数を追加する
Heroku上でRocket.toml
のproduction
設定が使われるようにします。
$ heroku config:set ROCKET_ENV=production
環境構築これで終わり
お疲れ様でした。
main.rsを編集する
https://rocket.rs/guide/getting-started/ を参考にしてmain.rs
を書き換えました。
#![feature(plugin)]
#![plugin(rocket_codegen)]
extern crate rocket;
#[get("/")]
fn index() -> &'static str {
"Hello, world!"
}
fn main() {
rocket::ignite().mount("/", routes![index]).launch();
}
ローカルで動作確認
ローカルでRocketアプリを起動します。
$ cargo run
その後ブラウザでhttp://localhost:5000/
を開いてHello, world!
と表示されていればOKです。
Herokuにデプロイ
$ git add .
$ git commit -m "Initial commit"
$ git push heroku master
初回はちょっと時間がかかります。
Heroku上で動作確認
https://fierce-plateau-19045.herokuapp.com/ を開くとHello, world!
と表示されることが確認できると思います。
以上です。
(ほとんどこの記事を参考にしました: http://www.duelinmarkers.com/2017/10/21/how-to-deploy-a-rocket-application-to-heroku.html )