codai docs
Proiecte și medii

Medii administrate

VM-uri pe care codai le provizionează pentru tine pe OpenStack sau Hetzner — dimensiuni, regiuni, pornire și oprire, oprire automată și snapshot-uri.

Un mediu administrat este un VM pe care codai îl creează, îl înrolează și îl întreține. Alegi un furnizor și o dimensiune; un worker care rulează în fiecare minut provizionează mașina, instalează codaid prin cloud-init, o oprește când e inactivă și o facturează pe secundă de rulare.

Furnizorii administrați sunt în curs de lansare și se activează per cont. Până când contul tău e activat, POST /v1/environments cu un furnizor administrat răspunde 403 — Provider 'hetzner' is not available yet; use 'byo' (bring your own machine) — iar hub-ul afișează opțiunile administrate ca în curând. Propriul server funcționează pentru toată lumea.

Furnizori și regiuni

providerUnderegion implicită
openstackcodai cloud pe Cloudify (UE, România), Ubuntu 24.04eu-east-1
hetznerHetzner Cloudnbg1 (tipurile de mai jos există în fsn1, hel1 și nbg1)

Valoarea de furnizor local există în schemă, dar este rezervată; nu se provizionează.

Dimensiuni

sizevCPURAM (facturat)Flavor OpenStackTip HetznerTarif
small (implicit)22 GBb2i.2c-2gcx230,03 € / h
medium44 GBb2i.4c-4gcx330,06 € / h
large88 GBb2i.8c-8gcx430,12 € / h

Tarif = vCPU × 0,01 €/h + GB RAM × 0,005 €/h, salvat pe mediu la creare (hourlyRateMicroEur: 30 000 / 60 000 / 120 000 micro-EUR). Discul este cel inclus în flavor sau în tipul de server. Mediile cu GPU vin în curând.

Creează unul

În hub.codai.ro/projects deschide un proiect → Mediu nou, alege codai cloud (OpenStack) sau Hetzner, o dimensiune, timpul de inactivitate (5–1440 de minute) și, opțional, un plafon lunar de buget în euro.

Mediul pornește în starea creating. Worker-ul creează serverul (creating → enrolling când acesta are un IP public), cloud-init instalează codaid ca serviciu de sistem și îl înrolează cu un token generat de worker, iar mediul devine running. Pe ambii furnizori, în producție, asta a durat cam două-trei minute. La înrolare, daemonul unei mașini administrate primește propria cheie API, emisă pe proprietarul mediului; distrugerea mediului o revocă.

PasLimită de timpLa depășire
Crearea serverului10 minse reîncearcă; după 3 eșecuri consecutive ale furnizorului, mediul este parcat în error
Înrolarea daemonului15 minerror, motiv enroll_timeout — o înrolare întârziată îl readuce totuși la running
Pornirea din stopped10 minerror

Worker-ul nu distruge niciodată o mașină pe o cale de eroare; decizia îți aparține.

Ciclul de viață

AcțiunePermisă dinTrece înRol
stoprunningstopping → stoppedmaintainer
startstoppedstarting → runningmaintainer
archivestoppedarchiving → archivedmaintainer
destroyorice stare în afară de destroying/destroyeddestroying → destroyedowner

Orice altceva răspunde 409 invalid_transition. Butoanele din hub, codaid env start|stop|destroy și POST /v1/environments/{id}/{action} trec toate prin același tabel de tranziții.

Ce fac oprirea și pornirea la fiecare furnizor:

OprirePornire
OpenStackShelve, apoi shelve-offload: id-ul serverului și IP-ul public se păstrează, resursele de calcul se eliberează.Unshelve pe același server.
HetznerSe face un snapshot, apoi serverul este șters.Se creează un server nou din snapshot. Snapshot-ul anterior se șterge după următoarea oprire.

archive parcurge aceeași cale de oprire și parchează mașina în archived; singura ieșire din archived este destroy. destroy șterge serverul (iar pe Hetzner și snapshot-ul lui) și revocă cheia daemonului.

Oprire automată la inactivitate

Fiecare mediu are idle_timeout_minutes (implicit 30, 5–1440; îl schimbi cu PATCH /v1/environments/{id} sau din hub). Worker-ul oprește un mediu administrat care rulează atunci când

now − max(last_activity_at, started_at) > idle_timeout_minutes

cu motivul idle. Se consideră activitate:

  • orice exec, terminal sau octet de flux de port de la un client atașat, prin relay;
  • heartbeat-urile daemonului care raportează activitate human sau agent — un heartbeat idle nu contează niciodată;
  • cererile pe care daemonul însuși le face către gateway cu cheia lui (de exemplu o buclă de agent care rulează în mașină);
  • propriile tale cereri de start/stop/archive/destroy.

Traficul de preview venit de la terți contează doar ca octeți de flux de port, deci un preview public cu vizitatori ține mașina trează. Activitatea se înregistrează cel mult o dată pe minut.

Mașina poate fi oprită și din motive de facturare — insufficient_funds, billing_error sau budget_exceeded; vezi facturarea. Motivul apare pe pagina mediului și este returnat ca stateReason.

În curând

Prebuild-urile (un pool pregătit per proiect), mediile cu GPU și alegerea regiunii din hub nu sunt încă disponibile.

Pe această pagină