質問: rust で何かしらの (cli や web) アプリを作成した際に、それを既存の unix 系サーバーにデプロイするにあたっては、どのようなフローが一般的でしょうか?
回答: Rustでアプリを開発するときの基本的な手順はすでにご存知であるという前提で回答しますね。例えば`Cargo.toml`で依存クレートを指定したり、`cargo build --release`でアプリをビルドしたりする方法については知っているものとします。(ご存知なければこの辺を読んでください) Rustはコンパイル言語ですので、Rubyなどのスクリプト言語とは異なり、アプリを実行する環境にコンパイラなどのRustツールチェインをインストールする必要はありません。開発環境のOSとデプロイ環境のOSが同じなら、基本的に`target/release`ディレクトリにある単一のバイナリファイルをサーバーにコピーするだけでデプロイが完了します。 例えばUbuntuでビルドしたバイナリをEC2のUbuntu環境にコピーしたときは当然動きますし、同じLinuxなら別のディストリビューション(Amazon Linuxなど)にコピーしても動くのが普通です。 バイナリファイルには依存しているクレートの内容も含まれています。ですから `gem install`のような操作も不要です。 一方、バイナリファイルに含まれないものもあります。 * Webアプリの場合はHTMLテンプレートや画像のようなリソースファイル * Rust以外の言語で書かれたライブラリ(ネイティブライブラリなど) + 例:MySQL、PostgreSQLのクライアントライブラリ、OpenSSL 前者はバイナリと一緒にコピーして、後者はOSの`apt`や`yum`などのパッケージ管理システムでインストールすることになります。 もし開発環境とデプロイ環境のOSが異なるなら、CIを使って自動ビルドするのが良いでしょう。また、OSが一致する場合でも、手元でビルドすると何かとミスをする機会が増えてしまうので、CIで自動ビルドするほうが安全かもしれません。リポジトリをGitHubに置いているならGitHub Actions、TravisCI、CircleCIなどが使えますし、GitLabに置いているならGitLab Actionsが使えます。 まとめると、 * CIをセットアップして、デプロイ環境向けのバイナリを自動ビルドできるようにする + Webアプリなどではリソースファイルとバイナリを一緒にしてtarballに固めておく * CIで作成したファイルをサーバーにコピーする * ネイティブライブラリをサーバーにインストールする なお、Linuxではネイティブライブラリもバイナリに含めることもできます。以前、記事を書いたので参考にしてください。 * RustのLinux muslターゲット(その1:Linux向けのポータブルなバイナリを作る)