# Instalare pe propriul server (/ro/docs/environments/byo-install)

Înrolează orice mașină Linux pe care o controlezi ca mediu gratuit, cu daemonul codaid — instalare, înrolare, rulare ca serviciu.

Un mediu **bring-your-own** (BYO) este o mașină pe care o ai deja — un VPS, un server de acasă, o stație de lucru liberă. Instalezi `codaid`, îl înrolezi cu un token de unică folosință, iar el se conectează spre relay prin conexiuni de ieșire. Mediile BYO sunt gratuite și disponibile oricărei chei.

## Platforme suportate [#platforme-suportate]

| Platformă | Binar | Installer | Serviciu |
| --- | --- | --- | --- |
| Linux x86_64 / aarch64 | `codaid-linux-x86_64`, `codaid-linux-aarch64` (musl static) | `install.sh` | systemd (`codaid.service`) |
| Windows x86_64 | `codaid.exe` (arhivă zip în release) | `install.ps1` — vezi [CLI-ul codaid](./codaid.mdx) | Niciunul — rulezi singur `codaid run` |
| macOS | Încă nepublicat | Installer-ul acceptă `darwin`, dar nu există încă un binar — în curând | Niciunul |

Conturile Linux per membru și izolarea în containere cer Linux cu root; vezi [medii de echipă](./team.mdx).

<Steps>
<Step>

### Creează mediul și obține un token [#creează-mediul-și-obține-un-token]

**Hub:** deschide [hub.codai.ro/projects](https://hub.codai.ro/projects), creează un proiect, apoi **Mediu nou → Propria mașină**. Pe pagina mediului alege **Generează token de înrolare**; tokenul e de unică folosință, valabil 30 de minute, iar pagina afișează comanda exactă de instalare.

**CLI:** cu `CODAI_API_KEY` setat (sau o cheie în `~/.codai/codaid.json`):

```bash
codaid env create --project my-app --name dev-box
# afișează mediul și:
#   curl -fsSL https://codai.ro/install-codaid.sh | CODAI_ENROLL_TOKEN=codai_env_… sh
```

**API:** `POST /v1/environments` cu `"provider": "byo"`, apoi `POST /v1/environments/{id}/enroll-token` — vezi [pagina de API](./api.mdx).

</Step>
<Step>

### Instalează și înrolează (Linux) [#instalează-și-înrolează-linux]

Rulează pe mașină, cu un utilizator care are `sudo`:

```bash
curl -fsSL https://github.com/codai-ro/codaid/releases/latest/download/install.sh \
  | CODAI_ENROLL_TOKEN=codai_env_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX sh
```

Installer-ul descarcă binarul pentru arhitectura ta în `/usr/local/bin/codaid` (îl verifică cu `SHA256SUMS` din release și refuză instalarea dacă suma lipsește sau diferă), rulează `codaid enroll` și — dacă systemd rulează — instalează și pornește `codaid.service` pentru utilizatorul care l-a lansat. Are nevoie de `curl` sau `wget`.

Pentru că un mediu BYO nu are o cheie API proprie, `codaid enroll` pornește apoi o **autentificare cu cod de dispozitiv**: afișează un URL și un cod, le aprobi în browser de pe orice dispozitiv, iar daemonul salvează cheia obținută. Transmite `CODAI_API_KEY=codai_…` ca să sari peste acest pas (util pentru flote).

| Variabilă a installer-ului | Efect |
| --- | --- |
| `CODAI_ENROLL_TOKEN` | Înrolează după instalare (omite-o ca doar să instalezi). |
| `CODAI_SERVICE_SCOPE=system` | Unitate deținută de root, cu home `/var/lib/codai`; activează conturile Linux per membru. |
| `CODAI_IDENTITY=shared` | Împreună cu scope-ul `system`: un singur cont de serviciu `codai` pentru toți, în loc de câte un utilizator Linux per membru. |
| `CODAI_API_KEY` | Folosește această cheie în locul autentificării cu cod de dispozitiv. |
| `VERSION` | Fixează o versiune, de ex. `VERSION=0.3.3`; implicit `latest`. |
| `INSTALL_DIR` | Locația binarului; implicit `/usr/local/bin`. |
| `CODAI_GATEWAY_URL`, `CODAI_AUTH_URL`, `CODAI_RELAY_URL`, `CODAID_WORKSPACE` | Transmise mai departe către `codaid enroll`. |

Același script este oglindit la `https://codai.ro/install-codaid.sh`; URL-ul release-ului de pe GitHub este mereu cel mai nou.

</Step>
<Step>

### Sau înrolează manual [#sau-înrolează-manual]

```bash
codaid enroll --token codai_env_… [--api-key codai_…] [--workspace /srv/app]
codaid run            # în prim-plan; Ctrl-C îl oprește
codaid status         # JSON: configurație (cheie ascunsă), workspace, git, porturi, identitate, lock-uri
```

`enroll` scrie `~/.codai/codaid.json` (director `0700`, fișier `0600`) cu id-ul dispozitivului, cheia API, id-ul mediului și URL-ul relay-ului. O reînrolare păstrează același id de dispozitiv. Cheia nu este afișată niciodată — `status` arată doar prefixul și lungimea ei.

Pe **Windows**, instalezi cu `irm https://codai.ro/install-codaid.ps1 | iex` ([CLI-ul codaid](./codaid.mdx)), apoi rulezi `codaid enroll --token …` și `codaid run` într-un terminal. Comenzile de shell se execută în PowerShell. Nu există încă un serviciu Windows.

</Step>
<Step>

### Rulează ca serviciu [#rulează-ca-serviciu]

```bash
# unitate pentru propriul utilizator (ce face installer-ul)
codaid install-service --user "$USER" | sudo tee /etc/systemd/system/codaid.service
sudo systemctl daemon-reload && sudo systemctl enable --now codaid

# unitate de sistem (root): conturi Linux per membru, repository-uri partajate, lock de build per repo
sudo codaid install-service --system [--identity per-user|shared] [--user codai] [--home /var/lib/codai]
```

`--system` trebuie rulat ca root, pe Linux cu systemd; creează utilizatorul serviciului și, în modul `per-user`, grupul `codai-dev` plus `/srv/codai/repos` și `/var/lib/codai/locks`. Dacă mașina nu e încă înrolată, afișează comanda `sudo CODAI_HOME=/var/lib/codai/.codai codaid enroll …` de rulat în continuare. Unitatea repornește la eșec, la fiecare 5 s.

</Step>
<Step>

### Verifică dacă e online [#verifică-dacă-e-online]

```bash
codaid env status dev-box      # online=true, versiunea daemonului, porturi, branch git
```

Hub-ul afișează **Daemon conectat**, iar vizualizarea Medii din desktop arată un punct verde. Daemonul trimite un heartbeat la fiecare 15 s și se reconectează cu back-off (1 s → 30 s) de câte ori cade socket-ul; relay-ul închide orice WebSocket după o oră, iar daemonul se reconectează imediat.

</Step>
</Steps>

## Ce poate face daemonul [#ce-poate-face-daemonul]

Totul trece prin relay; daemonul nu ascultă niciodată pe un port.

| Capabilitate | Observații |
| --- | --- |
| `shell` | `bash -lc` (PowerShell pe Windows). Timeout implicit 60 s, maximum 10 min; până la 64 KB per flux de ieșire; la timeout se oprește tot arborele de procese. |
| `fs_read`, `fs_write`, `fs_list`, `fs_roots` | Limitate la rădăcina workspace-ului (sau la worktree-ul membrului); ieșirile prin symlink sunt refuzate. |
| Terminale (`pty`) | Shell interactiv în workspace, redimensionabil. |
| Fluxuri de port (`tcp`, `http`) | Conectare la `127.0.0.1:<port>` în mașină — folosite de preview-uri și de `codaid env forward`. |
| Rapoarte | Porturile care ascultă la fiecare 15 s, starea git (branch, modificări, ahead/behind, worktree-uri) la fiecare 30 s, activitatea (`idle`, `human`, `agent`) și lock-urile deținute la fiecare heartbeat. |

<Callout type="warn">
`shell` nu este limitat la workspace — rulează cu privilegiile contului Linux sub care se execută. În modul de identitate `shared` toți membrii rulează sub același cont, așa că tratează mașina ca nesigură pentru secrete. Folosește `CODAI_SERVICE_SCOPE=system` cu identitatea implicită `per-user` când mai multe persoane împart o mașină.
</Callout>

## Fișiere și variabile [#fișiere-și-variabile]

| Element | Locație |
| --- | --- |
| Configurație | `~/.codai/codaid.json` (`$CODAI_HOME` înlocuiește `~/.codai`); în scope-ul system `/var/lib/codai/.codai/codaid.json` |
| Rădăcina workspace-ului | `workspace` din configurație → `$CODAID_WORKSPACE` → `/workspace` dacă există → directorul home |
| Lock-uri de build | `$CODAI_HOME/locks` (shared) sau `/var/lib/codai/locks` (per-user) |
| Nivel de log | `CODAID_LOG` (implicit `info`) |
