Разверните первое приложение на сервере с помощью erpc worker

Создайте небольшой HTTP API на Rust с помощью erpc worker, запустите его на своей машине и разверните на сервере четырьмя командами.
Эта страница описывает ERPC CLI v0.1.0-rc.4 — пререлиз.
erpc worker (псевдоним erpc w) компилирует ваше приложение в нативный бинарный файл Linux и запускает его на ERPC VPS, на новом почасовом VPS или на вашем собственном сервере — в усиленном юните systemd, без Docker и без какой-либо среды выполнения между ними.
Релиз, который после запуска не прошёл проверку работоспособности, откатывается к предыдущему, а несколько приложений могут работать на одном сервере, каждое на своём порту. Всё, что касается приложения, находится в 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 (brew install zig на macOS) и cargo-zigbuild (cargo install cargo-zigbuild --locked). С машины Linux того же типа, что и сервер (у всех серверов ERPC — x86-64), не нужно ничего, кроме cargo. Без инструментов кросс-сборки приложение собирается собственным тулчейном этой машины, и тогда бинарному файлу нужна та glibc, с которой он был слинкован; её называют build и deploy. С ними приложение собирается для glibc 2.31 и новее.

Развёртывание HelloWorld

HelloWorld — небольшой HTTP API на Rust, которому не нужны ни ключ, ни секрет, ни линия данных. Он отвечает на 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 собирает его для сервера и развёртывает. Всё, что стоит денег, сначала показывается с почасовой ценой, вашим балансом и тем, на сколько хватит кредита, а в терминале запускается только после ответа «да».
  4. api вызывает API развёрнутого приложения с вашей машины, при этом API остаётся на loopback сервера.
erpc worker check показывает, чего не хватает приложению, а deploy, если чего-то не хватает, отказывается работать ещё до того, как что-либо купить. erpc worker build выполняет только сборку — так можно увидеть, что сборка не проходит, до покупки сервера.

Выбор шаблона

erpc worker init спрашивает только одно: что создать; вариант выбирается клавишами со стрелками.
  • HelloWorld — шаблон, с которого стоит начать.
  • HFT и pumpfun-bot пока оба создаются из шаблона pumpfun: это торговый бот для pump.fun (PumpSwap), перенесённый из ValidatorsDAO/solana-stream.
--template hft (или helloworld, pumpfun-bot, или ID шаблона) пропускает выбор, а --name задаёт имя приложения. Без имени приложение называется по выбранному варианту (hello-world, hft-bot, pumpfun-bot). Если каталог с таким именем уже существует, человек, который выбирает вариант, получает -2, -3 и так далее, а скрипт (--yes, --json, нет терминала) получает ошибку. Если спросить некого и --template не указан, создаётся HelloWorld.
Торговому боту перед запуском нужны ключ и несколько настроек. Порядок действий:
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> — ваш собственный сервер: Ubuntu или Debian с systemd, nftables, sudo и Python 3 в /usr/bin/python3, к которому подключаются под root или под пользователем с sudo без пароля;
  5. в остальных случаях, в терминале, — список запущенных VPS вашего аккаунта, в конце которого стоит «start a new one».
На вашем собственном сервере брандмауэр воркера отбрасывает все входящие соединения, кроме SSH и порта приложения, поэтому сервер, который обслуживает что-то ещё, для этого не подходит.

Развёртывание без человека за терминалом

У скрипта или агента, например erpc ai, нет терминала, в котором можно ответить. Два флага позволяют всё равно выполнить работу:
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 один раз входит с паролем сервера, добавляет ваш ключ и отключает вход по паролю. Без --yes и без терминала запуск отклоняется ещё до какой-либо покупки, с кодом завершения 3.
  • Выбор среди ваших серверов по-прежнему требует человека. Укажите сервер через --new-vps, --vps <ID> или --host.
  • --prepare делает всё, для чего не нужны ни торговый ключ, ни секрет, и ничего не запускает, не останавливает и не перезапускает. Следующий erpc worker deploy в терминале передаёт ключ и секреты и запускает приложение. Торговый ключ читается только для человека за терминалом.

Подключение приложения к gRPC, Shreds и Unlimited RPC

Почасовые линии ERPC пропускают сервер по его адресу и не принимают никакого токена. Каждую линию для сервера запускает свой флаг в deploy, а приложение получает её endpoint как настройку:
ФлагЛинияПриложение получает
--grpcGeyser gRPCGRPC_ENDPOINT
--shredsShreds (Shredstream gRPC)SHREDS_ENDPOINT
--unlimitedUnlimited RPC в регионе сервераSOLANA_SEND_RPC_ENDPOINT
  • Каждая линия — самая дешёвая в своём семействе, если --grpc-plan, --shreds-plan или --unlimited-plan не указывает другую.
  • Unlimited RPC работает на выделенном сервере, настройка которого занимает до 45 минут. Он обслуживает sendTransaction и короткий список методов чтения, но не getProgramAccounts и не getTokenAccountsByOwner. Его endpoint — обычный HTTP (без TLS), и он пропускает только адрес, внесённый в allowlist.

Линии для запуска на вашей машине

erpc worker run тоже принимает --grpc и --shreds, чтобы можно было опробовать приложение здесь на реальных данных, прежде чем оно попадёт на сервер.
  • Адрес: линии пропускают публичный IPv4-адрес этой машины, который вы передаёте через --ip. erpc сам его не определяет.
  • Покупка: новая линия покупается только в терминале, после того как показана её цена. У run нет --yes.
  • Завершение: когда запуск заканчивается, каждая почасовая линия завершается после вопроса. --keep-lines оставляет их, и они по-прежнему оплачиваются. Если запуск заканчивается иначе (терминал закрыт, повторное нажатие Ctrl-C), линии остаются и оплачиваются.
  • Цифры: то, что приложение измеряет здесь, включает расстояние от этой машины до линии, поэтому здесь оно работает медленнее, чем то же приложение на сервере рядом с линией.

Дальнейшие шаги