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
provider | Unde | region implicită |
|---|---|---|
openstack | codai cloud pe Cloudify (UE, România), Ubuntu 24.04 | eu-east-1 |
hetzner | Hetzner Cloud | nbg1 (tipurile de mai jos există în fsn1, hel1 și nbg1) |
Valoarea de furnizor local există în schemă, dar este rezervată; nu se provizionează.
Dimensiuni
size | vCPU | RAM (facturat) | Flavor OpenStack | Tip Hetzner | Tarif |
|---|---|---|---|---|---|
small (implicit) | 2 | 2 GB | b2i.2c-2g | cx23 | 0,03 € / h |
medium | 4 | 4 GB | b2i.4c-4g | cx33 | 0,06 € / h |
large | 8 | 8 GB | b2i.8c-8g | cx43 | 0,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ă.
| Pas | Limită de timp | La depășire |
|---|---|---|
| Crearea serverului | 10 min | se reîncearcă; după 3 eșecuri consecutive ale furnizorului, mediul este parcat în error |
| Înrolarea daemonului | 15 min | error, motiv enroll_timeout — o înrolare întârziată îl readuce totuși la running |
Pornirea din stopped | 10 min | error |
Worker-ul nu distruge niciodată o mașină pe o cale de eroare; decizia îți aparține.
Ciclul de viață
| Acțiune | Permisă din | Trece în | Rol |
|---|---|---|---|
stop | running | stopping → stopped | maintainer |
start | stopped | starting → running | maintainer |
archive | stopped | archiving → archived | maintainer |
destroy | orice stare în afară de destroying/destroyed | destroying → destroyed | owner |
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:
| Oprire | Pornire | |
|---|---|---|
| OpenStack | Shelve, apoi shelve-offload: id-ul serverului și IP-ul public se păstrează, resursele de calcul se eliberează. | Unshelve pe același server. |
| Hetzner | Se 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_minutescu 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
humansauagent— un heartbeatidlenu 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.
Instalare pe propriul server
Înrolează orice mașină Linux pe care o controlezi ca mediu gratuit, cu daemonul codaid — instalare, înrolare, rulare ca serviciu.
Porturi și preview-uri
Ajungi la un server de dezvoltare din mediu printr-un URL de preview sau o redirecționare locală de port și decizi cine îl poate deschide.