Обёртка над api.cloudvps.reg.ru. Само API несложное, но у него есть неочевидные места, на которые мы наступили на живых машинах, и которые тут обойдены. - адрес машины лежит в поле ip, networks всегда пустое - снимок нельзя снять с остановленной машины, API останавливает её сам - после снимка машина сидит в locked и не удаляется, удаление настойчивое - тарифы с картами метод sizes не показывает, их список в docs_slugs.md - тарификация идёт от часа, короткие запуски невыгодны Claude-Session: https://claude.ai/code/session_01Loz5stgQZH6ofBdMqTxiJu
29 строки
1.2 KiB
Python
29 строки
1.2 KiB
Python
"""Полный цикл работы с машиной под видеокарту.
|
|
|
|
Поднимаем из готового снимка, работаем, снимаем новый образ, удаляем.
|
|
Именно так экономятся деньги: платим за часы счёта, а не за месяц простоя.
|
|
"""
|
|
import os
|
|
from regcloud_api import RegCloud
|
|
|
|
SIZE = "c8-m32-d128-g1-a4000-gpu" # A4000 16 ГБ, 37.80 р/час
|
|
REGION = "openstack-spb1" # карты стоят только в Питере
|
|
KEY_FINGERPRINT = os.environ.get("SSH_FINGERPRINT", "")
|
|
|
|
api = RegCloud()
|
|
|
|
print("баланс:", api.balance().get("balance_data", {}).get("balance"), "р")
|
|
|
|
srv = api.create(size=SIZE, image="ubuntu-24-04-amd64-gpu", name="worker",
|
|
ssh_keys=[KEY_FINGERPRINT] if KEY_FINGERPRINT else None, region=REGION)
|
|
info = api.wait_active(srv["id"])
|
|
print("машина готова:", RegCloud.ip_of(info))
|
|
|
|
# ... тут работа на машине по ssh ...
|
|
|
|
api.snapshot(srv["id"], "worker-ready", offline=True)
|
|
print("снимок поставлен в очередь")
|
|
|
|
api.destroy(srv["id"])
|
|
print("машина удалена, снимок остался")
|