Клиент обобщён, снята привязка к видеокартам
GPU это лишь один из тарифов, а клиент общего назначения. Примеры переписаны на обычные серверы, добавлен пример с масштабированием под нагрузку. Claude-Session: https://claude.ai/code/session_01Loz5stgQZH6ofBdMqTxiJu
Этот коммит содержится в:
@@ -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')} ГБ")
|
||||
@@ -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("машина удалена, снимок остался")
|
||||
@@ -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()))
|
||||
@@ -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("сервер удалён, образ остался")
|
||||
Ссылка в новой задаче
Block a user