−25%

на годовую оплату Windows, до 31.10. К тарифам

EQVPS
Начать

Управление VPS через REST API и curl: статус, питание, переустановка, продление

Всё, что вы делаете в кабинете после заказа сервера, — проверить состояние, перезагрузить, посмотреть метрики, переименовать, переустановить ОС, продлить на несколько месяцев, отменить и передумать — в виде готовых команд curl с реальными ответами.

Заказ сервера через API — один запрос, это разобрано в статье Заказ VPS за 4 вызова API. Здесь — всё, что после него: рутинные действия, которые иначе пришлось бы прокликивать в кабинете, в виде команд curl, которые можно вставить в скрипт.

Каждую команду ниже мы выполнили против нашего API перед публикацией, а ответы — сокращённые копии того, что пришло.

Подготовка

Две переменные сокращают команды:

export API=https://api.eqvps.com/api/v1/eqvps
export EQVPS_TOKEN='paste-your-token-here'

Токен берётся из POST /auth/register или в кабинете: Настройки → API-токены. Если машиной пользуются другие люди, не оставляйте его в истории shell: достаточно читать из файла через export EQVPS_TOKEN=$(cat ~/.eqvps_token).

Найти свои серверы

curl -s $API/services -H "Authorization: Bearer $EQVPS_TOKEN"

У каждой записи есть id вроде 47HZ7YF — код услуги, который принимают все остальные вызовы. Полная картина по одному серверу:

curl -s $API/services/47HZ7YF -H "Authorization: Bearer $EQVPS_TOKEN"
{ "data": {
    "id": "47HZ7YF", "status": "active", "queued": false,
    "product": { "slug": "nano", "name": "Nano" },
    "specs": { "vcpu": 2, "memory_mb": 1024, "disk_gb": 15 },
    "hostname": "agent-box",
    "vm": { "state": "running", "uptime": 5340 },
    "access": { "method": "ssh", "host": "203.0.113.10", "port": 21521, "user": "root", "nat": true, ... } } }

В access — как войти. На тарифе со своим IPv4 порт 22, на NAT-тарифе — ваш личный проброшенный порт. Вызов только читает, так что опрашивать его в цикле безопасно.

Если заказ был без ключа SSH, пароль root показывается один раз:

curl -s "$API/services/47HZ7YF?reveal=1" -H "Authorization: Bearer $EQVPS_TOKEN"

Пока сервер загружается, ответ говорит password_pending, и одноразовый показ не тратится. Подождите полминуты и спросите снова.

Питание: включить, выключить, перезагрузить

curl -s -X POST $API/services/47HZ7YF/power \
  -H "Authorization: Bearer $EQVPS_TOKEN" -H "Content-Type: application/json" \
  -d '{"action": "reboot"}'

action — это start, stop или reboot. Сервер, который ещё не активен (создаётся или приостановлен за неоплату), отвечает 409 Service is not active. Это не ошибка вашего скрипта — сначала проверьте status.

Метрики

curl -s "$API/services/47HZ7YF/metrics?timeframe=day" -H "Authorization: Bearer $EQVPS_TOKEN"

CPU, память, сеть и диск рядами. timeframe — hour (по умолчанию), day, week или month. Удобно для cron-задачи, которая напишет вам, если диск растёт и растёт. Счётчики трафика за текущий период — в статье Скорость и трафик.

Переименовать сервер

curl -s -X POST $API/services/47HZ7YF/hostname \
  -H "Authorization: Bearer $EQVPS_TOKEN" -H "Content-Type: application/json" \
  -d '{"hostname": "web-01"}'

Новое имя применяется внутри работающей системы через гостевой агент, на Linux без перезагрузки. Если сервер выключен или вы удалили qemu-guest-agent, вызов вернёт 409 agent_unavailable и ничего не изменит.

Переустановить ОС

Эта команда стирает диск. API требует вписать в confirm текущее имя сервера, поэтому скрипт с ошибочным id не сотрёт чужую машину:

curl -s -X POST $API/services/47HZ7YF/reinstall \
  -H "Authorization: Bearer $EQVPS_TOKEN" -H "Content-Type: application/json" \
  -d '{"os_id": 4, "confirm": "web-01"}'

os_id берётся из списка available_os вашего тарифа в GET /products или из данных самого сервера. Переустановка идёт в фоне — опрашивайте GET /services/{id}, пока status снова не станет active.

Продление и баланс

Серверы продлеваются раз в месяц с предоплаченного баланса. Сколько стоят более длинные сроки для этого сервера:

curl -s $API/services/47HZ7YF/renew-options -H "Authorization: Bearer $EQVPS_TOKEN"

Оплатить вперёд, скажем, три месяца одним вызовом:

curl -s -X POST $API/services/47HZ7YF/renew \
  -H "Authorization: Bearer $EQVPS_TOKEN" -H "Content-Type: application/json" \
  -d '{"months": 3}'

months — 1, 3, 6 или 12, причём 12 считается по годовой цене со скидкой. В ответе будут paid_from_balance: true и новая дата окончания. Если баланса не хватает, ничего не спишется: придут paid_from_balance: false и checkout_url для этого счёта. После пополнения POST $API/invoices/{invoice_id}/pay оплатит этот счёт с баланса; если баланса всё ещё мало, вернёт такой же checkout_url и ничего не спишет. Проверить и пополнить баланс:

curl -s $API/balance -H "Authorization: Bearer $EQVPS_TOKEN"

curl -s -X POST $API/balance/topup \
  -H "Authorization: Bearer $EQVPS_TOKEN" -H "Content-Type: application/json" \
  -d '{"amount": 25}'

В ответе на пополнение — checkout_url, крипто-оплата: USDT, USDC или ETH в сетях Base, Ethereum или Polygon. Баланс зачисляется, когда платёж подтвердится в сети. Оплата — единственный шаг, который скрипт за вас не сделает, если у него нет кошелька.

Monero тоже подходит, но только для пополнения баланса с ручной проверкой: вы отправляете XMR, передаёте ID транзакции, и мы зачисляем после сверки. Подробнее — Оплата в Monero.

Отменить и передумать

Безопасная отмена оставляет сервер работать до конца оплаченного срока и просто не продлевает его:

curl -s -X POST $API/services/47HZ7YF/cancel \
  -H "Authorization: Bearer $EQVPS_TOKEN" -H "Content-Type: application/json" \
  -d '{"type": "end_of_period", "reason": "moving the project elsewhere"}'

reason обязателен, хватит пары слов. Передумали до даты?

curl -s -X POST $API/services/47HZ7YF/cancel/undo -H "Authorization: Bearer $EQVPS_TOKEN"

Есть и "type": "immediate". Он сразу удаляет сервер вместе с данными, требует "confirm": "<имя сервера>" и отмене не подлежит. Если вы не уверены на сто процентов — используйте end_of_period.

Чтобы токен не протух

Новые токены по умолчанию живут год. Каждый ответ с авторизацией несёт заголовок X-Token-Expires-At, так что скрипт может заметить это заранее. Поменять токен на свежий:

curl -s -X POST $API/auth/token/refresh -H "Authorization: Bearer $EQVPS_TOKEN"

Старый токен перестаёт работать сразу, поэтому сначала сохраните новый.

Ошибки, которые стоит обрабатывать

КодЧто значитЧто делать
401Токена нет, он отозван или истёкОбновить или создать новый
402Не хватает баланса для действия, которое списывает только с баланса (например, смена тарифа)Пополнить и повторить тот же вызов
409Сервер не в том состоянии (ещё не активен, идёт операция, нечего отменять)Прочитать message, проверить status, повторить позже
422Поле неверное или не переданоВ ответе указано, какое
429Слишком много запросовПодождать Retry-After

Хотите то же самое не из скрипта, а из ИИ-клиента? Эти действия есть в виде MCP-инструментов — см. Как агент сам обслуживает свой VPS через MCP и справочник API. Если сервера ещё нет, выберите тариф.

Частые вопросы

Нужен ли MCP-сервер, чтобы автоматизировать VPS?

Нет. MCP — удобство для ИИ-клиентов, а каждый MCP-инструмент внутри вызывает тот же REST API. Shell-скрипт, cron или CI-пайплайн могут ходить curl-ом напрямую с тем же токеном.

Где взять токен?

Либо из POST /auth/register (агент регистрируется сам), либо в кабинете: Настройки → API-токены. Новые токены по умолчанию действуют год; POST /auth/token/refresh меняет токен на новый до истечения.

Может ли ошибочная команда стереть сервер?

Данные уничтожают только два вызова: переустановка и немедленная отмена. Оба не выполнятся, пока вы не повторите точное имя сервера в поле confirm. Перезагрузка, остановка, смена имени и продление файлы не трогают.

Чем оплачивается продление?

Предоплаченным балансом. Сервер сам продлевается каждый месяц, если баланса хватает; POST /services/{id}/renew оплачивает 1, 3, 6 или 12 месяцев вперёд одним вызовом. Если баланса не хватает, тот же вызов вернёт счёт со ссылкой на крипто-оплату и ничего не спишет.

Есть ли ограничение частоты запросов?

Да, на токен и на действие — например, 10 обновлений токена в минуту, 20 тикетов в минуту. Скрипт, который раз в несколько секунд опрашивает статус, — нормально; тот, что в цикле долбит перезагрузки, получит 429 с Retry-After.

Комментарии

Пока нет комментариев. Будьте первым.

Оставить комментарий

Комментарии проходят модерацию перед публикацией.