erpc worker で最初のアプリをサーバーにデプロイする

erpc worker で Rust の小さな HTTP API を作り、自分のマシンで動かして、4 つのコマンドでサーバーにデプロイします。
このページは、プレリリースの ERPC CLI v0.1.0-rc.4 について説明しています。
erpc worker(別名 erpc w)は、アプリを Linux ネイティブのバイナリにコンパイルし、ERPC の VPS、新しく開始する時間課金の VPS、または自分のサーバーで動かします。動かすのは堅牢化した systemd ユニットの下で、間に Docker もランタイムも挟みません。
正常に起動しなかったリリースは、1 つ前のリリースにロールバックされます。1 台のサーバーで複数のアプリを、それぞれ自分のポートで動かせます。アプリについての設定はすべて、アプリのルートにある erpc.toml に入ります。このファイルはシークレットを含まないので、コミットできます。

前提条件

  • ERPC アカウント。このマシンで erpc login でログインしておきます(ログインと鍵)。
  • ERPC Credit。新しい時間課金の VPS に要ります。時間課金の商品は、先に購入しておく ERPC Credit から支払われ、残高で足りない開始は受け付けられません。料金は料金表と ERPC Web Dashboard にあります。
  • SSH の鍵がこのマシンにあること。ssh-keygen -t ed25519 で作るか、手持ちの鍵なら erpc config set ssh_key <path>.pub で指定します。
  • Linux 向けにビルドする手段。Mac や Windows からは、サーバー向けの Rust のターゲット(rustup target add x86_64-unknown-linux-gnu)、zig(macOS では brew install zig)、cargo-zigbuild(cargo install cargo-zigbuild --locked)が要ります。サーバーと同じ種類の Linux マシン(ERPC のサーバーはすべて x86-64)からなら、cargo のほかには何も要りません。クロスビルドのツールがない場合、アプリはこのマシン自身のツールチェーンでビルドされ、そのバイナリはリンクした glibc を必要とします(build と deploy がその版を示します)。ツールがあれば、glibc 2.31 以降向けにビルドされます。

HelloWorld をデプロイする

HelloWorld は Rust で書かれた小さな HTTP API で、鍵もシークレットもデータの回線も要りません。GET /、GET /hello/{name}、GET /healthz に応答します。
bash
erpc worker init --template helloworld   # makes ./hello-world
erpc worker run hello-world              # here: curl http://127.0.0.1:3000/
erpc worker deploy hello-world           # your VPS, or a new hourly one (price asked first)
erpc worker api / --dir hello-world      # {"message":"Hello, World!",…} from the server
  1. init は、./hello-world にアプリを erpc.toml ごと作ります。
  2. run はアプリをビルドして自分のマシンで動かすので、先に curl で呼んで確かめられます。
  3. deploy はサーバー向けにビルドしてデプロイします。お金のかかるものは、1 時間あたりの料金・残高・その残高で持つ時間を先に表示し、ターミナルでは「はい」と答えた後にだけ開始します。
  4. api は、デプロイしたアプリの API を自分のマシンから呼び出します。API はサーバーのループバックに置いたままです。
erpc worker check はアプリに足りないものを一覧にし、足りないものがあれば deploy は何かを購入する前に止まります。erpc worker build はビルドだけを実行します。サーバーを購入する前に、ビルドが失敗するかどうかを確かめる方法です。

テンプレートを選ぶ

erpc worker init が聞くのは 1 つだけ、何を作るかです。矢印キーで選びます。
  • HelloWorld は、最初に始めるためのテンプレートです。
  • HFT と pumpfun-bot は、今はどちらも pumpfun テンプレートから作られます。ValidatorsDAO/solana-stream から移植した、pump.fun(PumpSwap)の取引 bot です。
--template hft(または helloworld、pumpfun-bot、テンプレートの ID)を付けると選択画面を飛ばし、--name でアプリに名前を付けます。名前がなければ、アプリは選んだものにちなんで名付けられます(hello-world、hft-bot、pumpfun-bot)。同じ名前のディレクトリがあるときは、人が選んでいれば -2、-3 と続く名前になり、スクリプト(--yes、--json、ターミナルなし)ではエラーになります。聞く相手がおらず --template もなければ、HelloWorld が作られます。
取引 bot は、動かす前に鍵といくつかの設定が要ります。その順番は次のとおりです。
bash
erpc login                             # once per machine: the session in 1Password or the keychain
erpc worker init                       # pick with the arrow keys; makes ./<name> with erpc.toml
cd <name>
erpc worker key new                    # the trading key, in 1Password, the keychain or the keystore; prints the public key to fund
erpc worker secret put API_TOKEN --generate          # the bot's own API token, made for you and shown to nobody
erpc worker secret put ERPC_API_KEY --from-account   # the account's RPC key, read from your account (or SOLANA_RPC_ENDPOINT in [vars])
erpc worker check                      # what erpc.toml describes, and what is missing
erpc worker run --grpc --ip <IPV4>     # build and run here, with an hourly gRPC line letting this machine in
erpc worker run --check --grpc --ip <IPV4>   # the same, stopped once healthy
erpc worker deploy --new-vps --grpc    # a new hourly VPS and gRPC line, prices asked first
init は、作ったアプリに合わせてこの順番を表示します。鍵とシークレットをどこに置くかは鍵とシークレットで説明しています。

サーバーを選ぶ

deploy は、次のうち最初に当てはまるものを使います。
  1. アプリの [env.<name>] にすでに書かれているサーバー
  2. --vps <id>。アカウントの ERPC の VPS
  3. --new-vps。このマシンのタイムゾーンから見て最も近いリージョンにある、最も安い時間課金の VPS(--region と --plan で別のものを選べます)
  4. --host <address>。自分のサーバー。systemd、nftables、sudo、/usr/bin/python3 の Python 3 がある Ubuntu か Debian で、root か、パスワードなしで sudo できるユーザーで接続できること
  5. どれでもなければ、ターミナルではアカウントの稼働中の VPS が一覧で表示され、最後に「新しく開始する」が並びます
自分のサーバーでは、ワーカーのファイアウォールが SSH とアプリのポート以外の受信接続をすべて落とします。ほかのサービスを提供しているサーバーは使わないでください。

スクリプトやエージェントからデプロイする

スクリプトや、erpc ai のようなエージェントには、答えるためのターミナルがありません。2 つのフラグを付ければ、それでも作業を進められます。
bash
erpc worker deploy hello-world --new-vps --yes                     # no key: all the way, unattended
erpc worker deploy pump-sniper --new-vps --grpc --yes --prepare    # a bot: everything but its key
erpc worker deploy pump-sniper                                     # then you, at a terminal: the key, and the start
  • --yes は、コマンドが名指す時間課金の商品(--new-vps、--grpc、--shreds、--unlimited)それぞれの料金の確認に答えます。erpc がまだ鍵だけでログインする形にしていないサーバー(新しいサーバーか、--vps <ID> で指定したサーバー)への最初のログインにも答えます。このとき erpc はサーバーのパスワードで 1 回だけログインし、自分の鍵を置いて、パスワードでのログインを無効にします。--yes もターミナルもなければ、開始は何も購入する前に終了ステータス 3 で断られます。
  • 自分のサーバーの中から選ぶには、今も人が要ります。 サーバーは --new-vps、--vps <ID>、--host のどれかで指定してください。
  • --prepare は、取引用の鍵もシークレットも要らない作業をすべて済ませ、何も開始・停止・再起動しません。次にターミナルで erpc worker deploy を実行すると、鍵とシークレットを渡してアプリを開始します。取引用の鍵は、ターミナルにいる人のためにだけ読み出されます。

アプリを gRPC・Shreds・Unlimited RPC につなぐ

ERPC の時間課金の回線は、サーバーをアドレスで受け入れ、トークンを取りません。deploy にフラグを 1 つ付けると、そのサーバー向けに回線が 1 つずつ開始し、アプリはそのエンドポイントを設定として受け取ります。
フラグ回線アプリが受け取るもの
--grpcGeyser gRPCGRPC_ENDPOINT
--shredsShreds(Shredstream gRPC)SHREDS_ENDPOINT
--unlimitedサーバーのリージョンの Unlimited RPCSOLANA_SEND_RPC_ENDPOINT
  • --grpc-plan、--shreds-plan、--unlimited-plan でプランを指定しなければ、各回線はその種類で最も安いプランになります。
  • Unlimited RPC は専有のサーバーで動き、用意に最大 45 分かかります。sendTransaction と、短い一覧の読み取りメソッドに応答し、getProgramAccounts と getTokenAccountsByOwner には応答しません。エンドポイントは素の HTTP(TLS なし)で、許可リストに入れたアドレスだけを受け入れます。

自分のマシンで動かすときの回線

erpc worker run も --grpc と --shreds を受け付けます。アプリをサーバーに載せる前に、ここで本物のデータを相手に試すためです。
  • アドレス: 回線が受け入れるのは、このマシンのパブリック IPv4 アドレスで、--ip で渡します。erpc が自分で調べることはありません。
  • 購入: 新しい回線を購入するのは、ターミナルで料金を表示した後だけです。run には --yes がありません。
  • 利用終了: 実行が終わると、時間課金の回線はそれぞれ確認の後に利用を終了します。--keep-lines を付けると回線は残り、課金も続きます。ほかの終わり方(ターミナルを閉じた、Ctrl-C を 2 回押した)をした場合、回線は残り、課金されます。
  • 数値: ここでアプリが測る値には、このマシンから回線までの距離が含まれます。そのため、回線の近くのサーバーで動く同じアプリより遅くなります。

次のステップ