---
title: "Окружење за извршавање и sandbox"
description: "Животни циклус sandbox-а, убризгано окружење, породице токена и слика из које се сесија покреће."
---

Свака сесија се покреће у сопственом изолованом окружењу. Ова страница је референтни водич за животни циклус окружења, окружење које Beeuni убацује при покретању, породице токена и саму слику окружења. Више о концепту сесија потражите у одељку [Сесије](/docs/sr/work/sessions).

<a id="sandbox-lifecycle"></a>

## Животни циклус окружења за извршавање

Ред сесије садржи `status`. Енумерација дефинише `queued`, `branching`, `provisioning`, `running`, `stopped`, `failed`, `completed`, али Beeuni уписује само 4 од њих.

| Статус | Када се поставља |
| --- | --- |
| `provisioning` | При креирању сесије. Beeuni креира грану сесије и захтева окружење за извршавање. |
| `running` | Када окружење постане активно и доступно. |
| `stopped` | При изричитом заустављању или током периодичног чишћења које хибернира неактивна окружења. |
| `failed` | Ако припрема не успе. |

`queued`, `branching` и `completed` постоје у енумерацији, али се не користе у току рада сесије. Немојте их сматрати активним стањима.

Само окружење за извршавање у свом реду има посебан `status`, са сопственом енумерацијом.

| Статус | Када се поставља |
| --- | --- |
| `provisioning` | Када добављач покрене окружење. |
| `active` | Када добављач потврди да је окружење активно. |
| `stopped` | При изричитом заустављању, аутоматском заустављању због неактивности или током поновног покретања. |
| `error` | Када добављач пријави грешку при покретању или током рада. |
| `archived` | Коначно стање. Избрисали сте сесију, а добављач је уништио окружење, уместо да га паузира. |

Beeuni не ограничава број сесија које се истовремено покрећу по налогу или пројекту. За активне сесије наплаћује се рачунарска снага; ако на налогу нема кредита, при креирању се добија `402`.

<a id="branch-model"></a>

### Модел грана

- Грана сесије добија име по ID-у сесије (UUID-у). `BEEUNI_SESSION_ID` и `BEEUNI_BRANCH_NAME` имају исту вредност.
- Beeuni прави грану од `base_ref`, која подразумевано означава подразумевану грану пројекта, у тренутку креирања сесије.
- Окидачи креирају грану сесије на исти начин као и интерактивна сесија.
- Ништа не уписује директно у подразумевану грану. То ради само спојени [захтев за измену](/docs/sr/work/change-requests).

<a id="reconcile-a-session-branch"></a>

### Усаглашавање гране сесије

Користите **Ask Agent: Sync Branch & Reload** у палети команди сесије када се основна грана промени. Агент прегледа грану сесије, чува локални рад, преузима најновији `base_ref`, разрешава сукобе, покреће одговарајуће тестове и потврђује усаглашавање комитом. Beeuni не бира једну страну сукоба нити ресетује радно стабло.

Агент завршава са `beeuni sessions reload "$BEEUNI_SESSION_ID" --project "$BEEUNI_PROJECT_ID" --no-repo --force --yes`. `--no-repo` је обавезно јер је агент већ усагласио грану. Поновно учитавање замењује стандардни harness окружење за извршавање када ново постане исправно. Тиме се завршава тренутни потез, па пошаљите `continue` након што се окружење поново покрене.

Заглавље сесије приказује сваку фазу поновног учитавања коју је сервер потврдио, у реалном времену. Поновно учитавање са веба проверава сесију, компајлира конфигурацију агента, примењује и проверава замену окружења за извршавање, а затим потврђује активну конфигурацију. Не освежава репозиторијум. CLI може да освежи репозиторијум, осим ако не проследите `--no-repo`.

<a id="config-convergence"></a>

### Усаглашавање конфигурације

<a id="where-a-box-gets-the-release"></a>

Свака сесија користи конфигурацију основне гране. Пошаљите измене у ту грану и поново учитајте сесију. Ажурирања чекају крај активног корака. Config Releases више нема посебну заставицу.

Користите **Reload config** или `beeuni sessions reload <session id>`. Ако учитавање не успе, проверите детаље грешке и исправите конфигурацију пројекта.

<a id="workspace-is-where-you-edit-the-base-branch-is-what-runs"></a>

#### `/workspace` је место за уређивање, а основна грана је оно што се покреће

Сесија УВЕК покреће тренутну конфигурацију основне гране. Не постоји режим конфигурације по сесији.

`/workspace` је ваша копија за уређивање. Конфигурацију читате тамо и тамо је мењате — а промена стиже до активне сесије када се **пошаље на основну грану**, након чега је преузима уобичајена конвергенција. Уређивање које се налази само у `/workspace` не мења начин рада сесије, а активни агенту се то саопштава: његова упутства наводе commit из ког потиче његова конфигурација и кажу да `/workspace` можда заостаје за њим.

Копија издања је само за читање, па уређивање погрешне копије не успева уз грешку дозволе, уместо да нечујно не уради ништа.

<a id="when-the-configuration-no-longer-declares-a-sessions-agent"></a>

#### Када конфигурација више не декларише агента сесије

Сесија се креира са агентом. Ако каснији commit уклони или преименује тог агента, сесија прелази на подразумеваног агента пројекта — једном, и само када власник сесије сме да користи тог агента. Beeuni бележи прелаз у дневнику ревизије и наводи га у упутствима активног агента, тако да сесија саопштава шта се догодило.

Ако власник не сме да користи подразумеваног агента или пројекат нема подразумеваног агента, сесија остаје без агента и без приступа агенту. И даље се покреће и пријављује разлог. Поново декларишите агента, поставите подразумеваног агента за пројекат или затражите од менаџера пројекта приступ подразумеваном агенту.

<a id="what-the-session-header-shows"></a>

#### Шта приказује заглавље сесије

| Стање | Услов | Заглавље |
| --- | --- | --- |
| Тренутно | Није застарело, нема резервне опције | Ништа |
| Доступно ажурирање | `stale: true` | Ознака ажурирања са **Reload config** |
| Резервна опција | Постављено је `fallback_reason` | Црвена ознака: **Config failed to load** |

Поновно учитавање које се заврши резервном опцијом пријављује грешку, а не успех.

#### Reload config

**Reload config** — и `beeuni sessions reload <session id>` — у једном кораку ради две ствари и наводи шта се догодило са сваком од њих:

1. Пребацује активну сесију на тренутне агенте, вештине и алате основне гране.
2. Врши fast-forward над копијом `/workspace`, тако да се датотеке које тамо читате подударају са конфигурацијом коју сесија покреће.

Преузимање копије је само fast-forward, на сопственој грани сесије, па се ништа не одбацује. Наведите `--no-repo` у CLI-ју да бисте га прескочили. Да бисте унели CODE из `base_ref` у грану сесије, користите **Ask agent to sync**.

<a id="turning-it-off"></a>

#### Искључивање

<a id="injected-environment"></a>

## Убачено окружење

Beeuni убацује ове променљиве при покретању. Само тајна пројекта која је изричито конфигурисана за достављање у `runtime` улази у sandbox. Акредитиви конектора и добављача модела остају на Beeuni серверу.

| Променљива | Опис |
| --- | --- |
| `BEEUNI_PROJECT_ID` | UUID овог пројекта. |
| `BEEUNI_SESSION_ID` | UUID ове сесије. Уједно и назив гране. |
| `BEEUNI_BRANCH_NAME` | Иста вредност као `BEEUNI_SESSION_ID`. |
| `BEEUNI_REPO_URL` | URL за клонирање репозиторијума пројекта. |
| `BEEUNI_DEFAULT_BRANCH` | Подразумевана грана пројекта. |
| `BEEUNI_BASE_REF` | Референца од које је ова сесија разграната. |
| `BEEUNI_API_URL` | Основни URL API-ја платформе (`.../v1`). |
| `BEEUNI_AGENT_NAME` | Агент са којим је сесија креирана. |
| `BEEUNI_MODEL` | Модел који треба покренути, ако је подешен. `BEEUNI_OPENCODE_MODEL` има исту вредност за демоне направљене пре него што је овај назив уведен. |
| `BEEUNI_LLM_BASE_URL` | Основни URL Beeuni LLM мрежног пролаза. Мрежни пролаз разрешава акредитиве добављача на страни сервера. |
| `BEEUNI_TOKEN` | Beeuni акредитив везан за сесију. Погледајте испод. |

Beeuni не убацује `BEEUNI_WORKSPACE`. Слика садржи `/workspace`, а ниједан корак за појединачну сесију га не подешава. Beeuni не убацује ни Git токен — демон преузима краткотрајни акредитив за клонирање када му затреба; погледајте одељак [Слање измена из сесије](#pushing-from-a-session) испод. Beeuni одбија корисничку тајну са префиксом `BEEUNI_*`, јер тај префикс чува за променљиве платформе.

<a id="session-credential"></a>

## Акредитив сесије

Beeuni има спољне токене које сами креирате и један акредитив унутар сваког изолованог окружења.

<a id="external-tokens"></a>

### Спољни токени

Лични приступни токен (PAT, са префиксом `beeuni_pat_`) или налог услуге (са префиксом `beeuni_sa_`) потврђује идентитет при позивању Beeuni API-ја, SDK-а и CLI-ја изван изолованог окружења. Погледајте одељак Аутентификација за опсег PAT-а, подешавање налога услуге и избор између њих.

<a id="in-sandbox-token"></a>

### Токен у изолованом окружењу

`BEEUNI_TOKEN` се генерише када Beeuni покрене окружење сесије. Везан је за корисника који га покреће, пројекат, сесију и одобрење за агента. Свака API рута и даље спроводи сопствену проверу могућности.

Идентификатори почетног упита и евиденције потеза нису променљиве окружења. Демон их преузима од API-ја помоћу `BEEUNI_TOKEN` након покретања.

<a id="pushing-from-a-session"></a>

## Слање измена из сесије

Ниједан узводни Git токен не улази у изоловано окружење. `git push origin HEAD` шаље комите у грану сесије. Спајање у подразумевану грану захтева спојен [захтев за измене](/docs/sr/work/change-requests).

<a id="the-sandbox-image"></a>

## Слика изолованог окружења

Ваш Dockerfile дефинише основно окружење. Beeuni обезбеђује алате сесије и везу са контролном таблом.

<a id="declare-a-template"></a>

### Дефинисање предлошка

Наведите свој Dockerfile као именовани предложак под `sandbox.templates` у `beeuni.yaml`.

```yaml
sandbox:
  templates:
    - slug: dev
      name: Dev box
      dockerfile: Dockerfile.dev
  default: dev
```

Поставите тачно један од `dockerfile` или `image` на сваки унос. Путање до Dockerfile датотека морају остати унутар репозиторијума. Подесите `default` на ознаку шаблона који ваше сесије треба да користе; изоставите га да бисте користили подразумевану слику платформе. Старији пројекти на `beeuni.toml` користе иста поља — погледајте [застарели `beeuni.toml`](/docs/sr/project/legacy-toml). Комплетан списак поља: [референца манифеста](/docs/sr/project/manifest).

<a id="constraints"></a>

### Ограничења

| Правило | Зашто |
| --- | --- |
| Немојте постављати `ENTRYPOINT` или `CMD`. | Beeuni замењује оба да би покренуо демон. |
| Немојте заузимати порт `8000`. | Резервисан је за обрнути прокси демона. Покрећите развојне сервере на другим портовима. |
| `FROM` Debian или Ubuntu као основну слику. | Слој окружења за извршавање покреће `apt-get`. Alpine, Fedora и Arch не могу да се изграде. |
| Немојте покретати `apt-get clean` без `rm -rf /var/lib/apt/lists/*`. | Слој окружења за извршавање поново покреће `apt-get update`; неисправна кеш меморија онемогућава изградњу. |
| Немојте уграђивати акредитиве у слику. | Наведите име у `env:` и подесите вредност као тајну пројекта. Beeuni је убацује на почетку сесије. |

<a id="hardware-spec"></a>

### Спецификације хардвера

`cpu`, `memory` и `disk` у уносу шаблона одређују величину изолованог окружења. Сва три су опциона; ако је поље изостављено, користи се подразумевана вредност платформе: 2 vCPU, 4 GiB меморије, 20 GiB диска.

```yaml
sandbox:
  templates:
    - slug: big
      image: ubuntu:24.04
      cpu: 4
      memory: 8
      disk: 50
```

`cpu` прихвата вредности од 1 до 32 језгра, `memory` од 1 до 128 GiB, а `disk` од 1 до 500 GiB. Beeuni све вредности изнад ових ограничења своди на највећу дозвољену вредност. Beeuni не подржава GPU-ове; кључ `gpu` у шаблону изазива упозорење, а не грешку.

Спецификација је део снимка шаблона, а не поставка појединачне сесије. Променом спецификације поново се прави снимак и она се примењује на следећу сесију. Тренутна сесија задржава већ покренуту спецификацију.

<a id="docker-in-the-sandbox"></a>

### Docker у изолованом окружењу

Подесите `container_runtime: true` у шаблону да бисте покренули Docker у његовим изолованим окружењима: мреже у режиму bridge и мреже које дефинише корисник, управљачки програм за складиштење `overlayfs` и излазни саобраћај преко NAT-а. Локални стекови као што су `supabase start` и `docker compose` раде као на лаптопу.

```yaml
sandbox:
  templates:
    - slug: dev
      dockerfile: .beeuni/Dockerfile.dev
      container_runtime: true
```

<a id="ports-and-preview-urls"></a>

### Портови и URL-ови за преглед

Демон слуша на порту `8000` и проксира било који други порт који ваша апликација користи у изолованом окружењу. Сам порт `8000` блокиран је за проксирање.

Контролна табла приступа порту изолованог окружења на два начина:

- **Путем путање**: `https://<api-host>/v1/p/<sandbox-id>/<port>/...`. Ово је подразумевани облик и једини који подржава WebSocket надоградње.
- **Путем поддомена**: `https://p<port>-<sandbox-id>.<api-host>/...`. Користите овај облик за апликације којима су потребне путање релативне у односу на корен или колачићи, као што су развојни сервери Next.js или Vite. WebSocket надоградње још увек не раде у овом облику.

Прокси за преглед уклања `X-Frame-Options` и све смернице `frame-ancestors`. Сесија може да угради преглед ваше апликације у iframe без икаквог подешавања са ваше стране.

Преглед сесије може се делити и путем јавне везе, у режиму само за преглед или интерактивном режиму. Јавне везе за дељење блокирају портове `22`, `4096`, `8000` и порт за дељење статичких датотека.

<a id="snapshot-rebuilds"></a>

### Поновна изградња снимака

Промене слике или подешавања окружења поново граде окружење за наредне сесије. Непромењена подешавања користе постојећу слику. Прва сесија којој је потребна поновна изградња приказује „припрема слике“, а наредне користе ту изграђену слику.

Измена Dockerfile-а унутар сесије ступа на снагу у следећој сесији, а не у тренутној. Измена стиже до `main` тек када се [захтев за измену](/docs/sr/work/change-requests) споји.
