Клиент обобщён, снята привязка к видеокартам

GPU это лишь один из тарифов, а клиент общего назначения. Примеры переписаны
на обычные серверы, добавлен пример с масштабированием под нагрузку.

Claude-Session: https://claude.ai/code/session_01Loz5stgQZH6ofBdMqTxiJu
Этот коммит содержится в:
2026-08-23 18:18:27 +09:00
родитель bb66bc1681
Коммит a106ba5b6b
6 изменённых файлов: 167 добавлений и 82 удалений
+18
Просмотреть файл
@@ -0,0 +1,18 @@
"""Основные операции. Токен положите в REGRU_CLOUD_TOKEN."""
from regcloud_api import RegCloud
api = RegCloud()
print("баланс:", api.balance().get("balance_data", {}).get("balance"), "р")
print("\nсерверы:")
for s in api.list():
print(f" {s['id']} {s['name']:20s} {s['status']:8s} {RegCloud.ip_of(s)}")
print("\nключи доступа:")
for k in api.ssh_keys():
print(f" {k['id']} {k['name']:15s} {k['fingerprint']}")
print("\nснимки:")
for s in api.snapshots():
print(f" {s['id']} {s['name']:20s} {s.get('size_gigabytes')} ГБ")
-28
Просмотреть файл
@@ -1,28 +0,0 @@
"""Полный цикл работы с машиной под видеокарту.
Поднимаем из готового снимка, работаем, снимаем новый образ, удаляем.
Именно так экономятся деньги: платим за часы счёта, а не за месяц простоя.
"""
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("машина удалена, снимок остался")
+37
Просмотреть файл
@@ -0,0 +1,37 @@
"""Поднимать серверы под нагрузку и гасить, когда она спала.
Тарификация идёт от часа, поэтому есть смысл держать машину не меньше часа
и не поднимать её ради пары минут работы.
"""
import time
from regcloud_api import RegCloud
api = RegCloud()
POOL_NAME = "worker-"
SIZE = "c4-m8-d120-hp"
REGION = "openstack-msk1"
def workers():
return [s for s in api.list() if s["name"].startswith(POOL_NAME)]
def scale_to(count: int):
now = workers()
while len(now) < count:
n = len(now) + 1
srv = api.create(size=SIZE, image="ubuntu-24-04-amd64",
name=f"{POOL_NAME}{n:02d}", region=REGION)
print("поднял", srv["id"])
now = workers()
while len(now) > count:
victim = now[-1]
api.destroy(victim["id"])
print("погасил", victim["id"])
now = workers()
if __name__ == "__main__":
scale_to(2)
time.sleep(5)
print("сейчас работает:", len(workers()))
+29
Просмотреть файл
@@ -0,0 +1,29 @@
"""Полный цикл: создать сервер, снять с него образ, удалить.
Приём годится для чего угодно: подготовить эталонную машину, снять образ
и дальше поднимать из него копии за пару минут вместо повторной настройки.
"""
import os
from regcloud_api import RegCloud
SIZE = os.environ.get("SIZE", "c2-m4-d60-hp")
IMAGE = os.environ.get("IMAGE", "ubuntu-24-04-amd64")
REGION = os.environ.get("REGION", "openstack-msk1")
KEY = os.environ.get("SSH_FINGERPRINT", "")
api = RegCloud()
srv = api.create(size=SIZE, image=IMAGE, name="example-01",
ssh_keys=[KEY] if KEY else None, region=REGION)
print("создан сервер", srv["id"])
info = api.wait_active(srv["id"])
print("готов, адрес", RegCloud.ip_of(info))
# ... тут настройка машины по ssh ...
api.snapshot(srv["id"], "example-base", offline=True)
print("образ поставлен в очередь, платформа сама остановит сервер")
api.destroy(srv["id"])
print("сервер удалён, образ остался")