Запуск, наблюдение и оплата приложения с erpc worker

erpc worker status показывает, работает ли ваше приложение и сколько оно стоит в час. Каждый запуск сначала показывает свою цену, а erpc worker delete --release-server завершает gRPC, Shreds и Unlimited RPC, которые приложение использует почасово, а затем его почасовой сервер.
Эта страница описывает ERPC CLI v0.1.0-rc.4 — пререлиз.

Проверка приложения

$ erpc worker status --env prod
api-prod on 203.0.113.10: running, release 20261101T093000Z-1a2b3c4d, pid 4217, up 2h 14m
  current 20261101T093000Z-1a2b3c4d, previous 20261028T171500Z-9f8e7d6c, 2 releases kept
  WAF: listening on port 8080, forwarding to 127.0.0.1:3000, since 2026-11-01T09:30:12Z; requests 5120, forwarded 5043, blocked 71, connections refused 12, app errors 6, addresses banned now 1
  `erpc worker delete --release-server --env prod` ends what this app is charged for.
status показывает, заблокировано приложение или работает, какой релиз запущен и с какого времени. Если вы вошли в аккаунт, он также показывает, сколько окружение стоит в час, — каждую позицию с ценой, которая списывается за неё с вашего аккаунта, — и кредит вашего аккаунта с тем, на сколько его хватит. --json передаёт то же самое в hourly.charged.
О позиции, которой нет среди списаний аккаунта, сообщается, что её нет среди них, а не что она завершена, потому что этот список может отставать от запуска на минуту. Без сессии или когда списания вашего аккаунта не удаётся прочитать, status сообщает то, что числится на учёте.

Управление приложением

КомандаЧто делает
erpc worker logs -n 200, logs -fЖурнал приложения и агента. Управляющий символ в строке выводится как ?
erpc worker startЗапускает приложение и отправляет ключ, если воркер заблокирован
erpc worker stop, stop --lockОстанавливает его; --lock также удаляет ключ из памяти
erpc worker restartОстанавливает и снова запускает его
erpc worker releasesРелизы, хранимые на сервере (deploy.keep_releases)
erpc worker rollback, rollback --to <release>Возвращается к предыдущему релизу или к указанному. Отклоняется, а используемый релиз остаётся как был, если порт проверки работоспособности того релиза теперь занят другим работающим воркером
erpc worker api <PATH>Читает API приложения с этой машины, при этом API остаётся на loopback сервера (-X POST, -d '{...}' для изменения)
erpc worker trades [--profit]Сделки приложения на его сервере
erpc worker listПриложения на этой машине и где каждое из них развёрнуто; --prune убирает те, чей erpc.toml исчез
API_TOKEN приложения читается здесь и попадает на сервер через стандартный ввод — ни в какой командной строке и ни в каком журнале его нет. Каждая команда воркера принимает --env <name> (по умолчанию default) и --json, за исключением secret unlock и secret lock: они относятся к keystore этой машины, а не к приложению, и не принимают --env. Запущенная из любого места, команда находит своё приложение по имени, под которым его знает erpc; secret put, secret rm, key import, firewall allow и firewall deny принимают приложение только через --dir.

Как работают почасовые списания

  • Каждый запуск сначала показывает свою цену. В терминале запуск происходит только после ответа «да»; с --yes таким «да» служит сама командная строка, в которой названо, что запускать.
  • Почасовой продукт оплачивается из ERPC Credit, который покупается заранее, а запуск, не покрытый кредитом, отклоняется. Цены — на странице Цены и в ERPC Web Dashboard.
  • Новый VPS ставится на учёт, как только он назван, ещё до того, как он готов. Следующее развёртывание берёт его в работу, а не покупает другой.
  • Для deploy запуск, на который не пришёл ответ, отправляется снова, но никогда как новый. Его ключ запроса остаётся на учёте ([env.<name>.starting]), поэтому повторный запуск той же команды отправляет тот же запрос. После некоторых ответов он остаётся, пока вы не удалите его вручную (Покупка, которую erpc не может поставить на учёт). erpc worker run ничего не ставит на учёт, поэтому при следующем запуске он создаёт новый запрос.
  • Развёртывайте по одному окружению за раз. Два одновременно начатых развёртывания одного окружения могут совершить две покупки, и это не поддерживается.
  • Существует ли ещё линия, определяется тем, что списывается с аккаунта. Линию, которая не тарифицируется почасово, erpc никогда не завершает: завершите её в панели.

Удаление приложения

erpc worker delete удаляет воркер. erpc worker delete --release-server также завершает его линии, а затем его почасовой сервер. То, что не удалось завершить, остаётся на учёте, а линия, которая не тарифицируется почасово, указывается по имени, чтобы вы завершили её в панели.
  • Обычное удаление отклоняет VPS, который был куплен, но к которому ни разу не удалось подключиться, поскольку иначе оно забыло бы его, пока за него идут списания. Обычное удаление почасового VPS, к которому удалось подключиться, снимает его с учёта, хотя за него ещё идут списания, и предупреждает об этом.
  • --forget не пытается подключиться к серверу, до которого больше невозможно достучаться, а --forget-line <id> снимает с учёта линию, завершённую вне erpc.

Измерение задержки RPC с сервера

erpc worker bench замеряет время вызовов RPC с сервера окружения: общий RPC ERPC, его Unlimited RPC и любой другой — бок о бок. Агент на сервере засекает время каждого вызова, поэтому цифры — это то, что получает приложение.
bash
erpc worker bench                                  # getSlot: shared RPC vs the Unlimited RPC
erpc worker bench --rounds 300 --interval 150      # for a plan that limits calls per second
erpc worker bench --url other=op://<vault-id>/<item-id>/url   # another provider's RPC
  • --method принимает getSlot, getBlockHeight, getLatestBlockhash или getHealth.
  • --no-shared исключает общий RPC. Значением --url может быть сам URL, ссылка op://…, keychain:… или keystore:… (на место, где хранится URL с ключом внутри; но никогда не на запись торгового ключа — такая ссылка отклоняется) либо - (значение читается со стандартного ввода или запрашивается без отображения на экране). Больше шести endpoint'ов не принимается.
  • Замер выводит p50, p90, p99, min и max, сбои с первой причиной и то, на сколько слотов каждый ответ отставал от самого свежего в том же раунде.
  • Ключи попадают на сервер только через стандартный ввод, а таблица показывает схему, хост и порт.

Резервное копирование состояния приложения

erpc worker backup on каждый день делает резервную копию состояния приложения в ERPC Global Storage, зашифрованную restic, во время --at по часам сервера и в течение 30 минут после него. Нужен тариф хранилища (erpc storage buy 5).
  • В резервную копию попадает состояние приложения, /var/lib/private/erpc-worker-<id>. Релизы не попадают, поскольку развёртывание возвращает их на место. Данные Redis и PostgreSQL не охватываются.
  • Сервер не может удалять снимки. Он никогда не хранит сессию erpc, ключ администратора аккаунта или его мастер-пароль.
  • Захваченный сервер может прочитать снимки всех машин аккаунта, включая эту; сохранить ключ репозитория, который restic никогда не меняет, и после off; добавить снимки под именем другой машины, поэтому после такого захвата проверьте, что выбирает restore latest; и заполнить хранилище аккаунта, что останавливает резервное копирование на всех машинах. erpc worker backup off сначала отзывает ключ доступа сервера, независимо от того, отвечает ли сервер.
  • restic копирует файлы как есть, пока воркер работает, поэтому базе данных может понадобиться собственный дамп, чтобы восстановиться в согласованном состоянии. Запуск, пропущенный, пока сервер был выключен, выполняется, когда сервер снова работает.
  • erpc worker backup off, status и now останавливают резервное копирование, сообщают о нём и запускают его. Снимки остаются после off, а erpc backup prune --host прореживает старые.
Восстанавливайте с этой машины после erpc backup init на ней:
bash
erpc backup restore latest --from-host erpc-worker-<id>-<tag> --path /var/lib/private/erpc-worker-<id> --target ./restored

Несколько окружений и машин

  • Несколько воркеров на одном сервере работают каждый в своём юните, делят таблицу брандмауэра сервера, и каждый открывает только свой порт.
  • У одного приложения может быть несколько окружений ([env.staging], [env.prod]), каждое со своим сервером и линиями.
  • Окружение может хранить сведения о сервере в 1Password вместо erpc.toml. Тогда любая машина, вошедшая в этот сейф, при наличии репозитория приложения может выполнять все команды; о ссылках keychain: и keystore: в таком приложении выводится предупреждение, поскольку другая машина не может их прочитать. Новое окружение хранит свои сведения в 1Password, если erpc login хранит там сессию; deploy --vault <vault-id> указывает другой сейф, а deploy --inline хранит сведения в erpc.toml.