# 🐳 Docker Guide — OmniRoute (LatvieÅ”u) 🌐 **Languages:** šŸ‡ŗšŸ‡ø [English](../../../../guides/DOCKER_GUIDE.md) Ā· šŸ‡ŖšŸ‡¹ [am](../../../am/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡øšŸ‡¦ [ar](../../../ar/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡¦šŸ‡æ [az](../../../az/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡§šŸ‡¬ [bg](../../../bg/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡§šŸ‡© [bn](../../../bn/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡§šŸ‡¦ [bs](../../../bs/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡ØšŸ‡æ [cs](../../../cs/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡©šŸ‡° [da](../../../da/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡©šŸ‡Ŗ [de](../../../de/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡¬šŸ‡· [el](../../../el/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡ŖšŸ‡ø [es](../../../es/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡ŖšŸ‡Ŗ [et](../../../et/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡®šŸ‡· [fa](../../../fa/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡«šŸ‡® [fi](../../../fi/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡«šŸ‡· [fr](../../../fr/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡®šŸ‡Ŗ [ga](../../../ga/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡®šŸ‡³ [gu](../../../gu/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡³šŸ‡¬ [ha](../../../ha/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡®šŸ‡± [he](../../../he/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡®šŸ‡³ [hi](../../../hi/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡­šŸ‡· [hr](../../../hr/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡­šŸ‡ŗ [hu](../../../hu/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡¦šŸ‡² [hy](../../../hy/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡®šŸ‡© [id](../../../id/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡³šŸ‡¬ [ig](../../../ig/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡®šŸ‡¹ [it](../../../it/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡ÆšŸ‡µ [ja](../../../ja/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡¬šŸ‡Ŗ [ka](../../../ka/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡°šŸ‡­ [km](../../../km/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡®šŸ‡³ [kn](../../../kn/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡°šŸ‡· [ko](../../../ko/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡±šŸ‡¹ [lt](../../../lt/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡®šŸ‡³ [ml](../../../ml/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡®šŸ‡³ [mr](../../../mr/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡²šŸ‡¾ [ms](../../../ms/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡²šŸ‡¹ [mt](../../../mt/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡²šŸ‡² [my](../../../my/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡³šŸ‡µ [ne](../../../ne/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡³šŸ‡± [nl](../../../nl/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡³šŸ‡“ [no](../../../no/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡®šŸ‡³ [or](../../../or/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡®šŸ‡³ [pa](../../../pa/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡µšŸ‡­ [phi](../../../phi/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡µšŸ‡± [pl](../../../pl/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡µšŸ‡¹ [pt](../../../pt/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡§šŸ‡· [pt-BR](../../../pt-BR/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡·šŸ‡“ [ro](../../../ro/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡·šŸ‡ŗ [ru](../../../ru/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡±šŸ‡° [si](../../../si/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡øšŸ‡° [sk](../../../sk/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡øšŸ‡® [sl](../../../sl/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡·šŸ‡ø [sr](../../../sr/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡øšŸ‡Ŗ [sv](../../../sv/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡°šŸ‡Ŗ [sw](../../../sw/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡®šŸ‡³ [ta](../../../ta/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡®šŸ‡³ [te](../../../te/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡¹šŸ‡­ [th](../../../th/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡¹šŸ‡· [tr](../../../tr/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡ŗšŸ‡¦ [uk-UA](../../../uk-UA/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡µšŸ‡° [ur](../../../ur/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡ŗšŸ‡æ [uz](../../../uz/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡»šŸ‡³ [vi](../../../vi/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡³šŸ‡¬ [yo](../../../yo/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡ØšŸ‡³ [zh-CN](../../../zh-CN/docs/guides/DOCKER_GUIDE.md) Ā· šŸ‡¹šŸ‡¼ [zh-TW](../../../zh-TW/docs/guides/DOCKER_GUIDE.md) --- > PilnÄ«ga Docker izvietoÅ”anas rokasgrāmata. Lai ātri sāktu darbu, skatiet [README Docker sadaļu](../README.md#-docker). ## Satura rādÄ«tājs - [Ātrā palaiÅ”ana](#quick-run) - [Ar vides failu](#with-environment-file) - [Docker Compose](#docker-compose) - [Pieejamie profili](#available-profiles) - [Resursdatora CLI rÄ«ku konfigurēŔana, kad OmniRoute darbojas Docker vidē](#configuring-host-cli-tools-when-omniroute-runs-in-docker) - [Redis blakusserviss](#redis-sidecar) - [Produkcijas Compose](#production-compose) - [Dockerfile posmi](#dockerfile-stages) - [Kritiskie vides mainÄ«gie](#critical-environment-variables) - [Docker Compose ar Caddy (HTTPS)](#docker-compose-with-caddy-https-auto-tls) - [Cloudflare ātrais tunelis](#cloudflare-quick-tunnel) - [Attēlu tagi](#image-tags) - [PieejamÄ«ba: noklusējuma SQLite atbalsta tikai vienu repliku](#availability-default-sqlite-is-single-replica) - [SvarÄ«gas piezÄ«mes](#important-notes) --- ## Ātrā palaiÅ”ana > **PaÅ”mitināŔana ar vienu komandu?** Skatiet > [paÅ”mitināŔanas ceļvedi](../getting-started/SELF_HOST_GUIDE.md) — > `docker compose -f docker-compose.selfhost.yml up -d` (publicēts attēls + > Redis, pieejams tikai no lokālās saskarnes, bez profila izvēles). Tālāk aprakstÄ«tā ātrā palaiÅ”ana ir > viena konteinera risinājums lietotājiem, kuri jau izmanto Redis citur. ```bash docker run -d \ --name omniroute \ --restart unless-stopped \ --stop-timeout 40 \ -p 20128:20128 \ -v omniroute-data:/app/data \ diegosouzapw/omniroute:latest ``` ## Ar vides failu ```bash # Vispirms nokopējiet un rediģējiet .env cp .env.example .env docker run -d \ --name omniroute \ --restart unless-stopped \ --stop-timeout 40 \ --env-file .env \ -p 20128:20128 \ -v omniroute-data:/app/data \ diegosouzapw/omniroute:latest ``` ## Docker Compose ```bash # Pamata profils (bez CLI rÄ«kiem) docker compose --profile base up -d # CLI profils (iebÅ«vēti Claude Code, Codex, OpenClaw) docker compose --profile cli up -d # Resursdatora profils (galvenokārt Linux; resursdatora CLI binārie faili tiek montēti tikai lasīŔanas režīmā) docker compose --profile host up -d # TÄ«mekļa profils (Chromium/Playwright tÄ«mekļa sesiju nodroÅ”inātājiem) docker compose --profile web up -d # CLI un CLIProxyAPI palÄ«gkonteinera apvienoÅ”ana docker compose --profile cli --profile cliproxyapi up -d ``` ## Pieejamie profili OmniRoute nodroÅ”ina Compose profilus galvenajiem izvietoÅ”anas veidiem. Izvēlieties savai videi atbilstoÅ”o profilu. | Profils | Pakalpojums | Kad izmantot | Komanda | | -------------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | | `base` (noklusējuma) | `omniroute-base` | Serveris bez grafiskās saskarnes / minimāla izpildvide bez iekļautiem pakalpojumu sniedzēju CLI | `docker compose --profile base up -d` | | `cli` | `omniroute-cli` | AÄ£entu darbplÅ«smas, kas izsauc `omniroute providers/setup/doctor` un iekļautos CLI (Codex, Claude Code, Droid, OpenClaw) | `docker compose --profile cli up -d` | | `host` | `omniroute-host` | Linux resursdatori, kuriem nepiecieÅ”ama `network_mode` tipa piekļuve resursdatora CLI, montējot `~/.local/bin`, `~/.codex`, `~/.claude` u.c. tikai lasīŔanas režīmā | `docker compose --profile host up -d` | | `cliproxyapi` | `cliproxyapi` | Palaidiet [CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI) blakusprocesu portā `8317`, lai starpniekotu pieprasÄ«jumus uz augÅ”upstraumes CLI | `docker compose --profile cliproxyapi up -d` | | `web` | `omniroute-web` | TÄ«mekļa sesiju pakalpojumu sniedzēji, kuriem nepiecieÅ”ama pārlÅ«kprogramma: `gemini-web`, `claude-web`, `claude-turnstile` (izveido `runner-web`; Chromium ir iekļauts) | `docker compose --profile web up -d` | > Var apvienot vairākus profilus: `docker compose --profile cli --profile cliproxyapi up -d`. ## Resursdatora CLI rÄ«ku konfigurēŔana, kad OmniRoute darbojas Docker vidē `omniroute setup-codex`, `setup-claude`, `config set ` un informācijas paneļa poga **Saglabāt konfigurāciju** raksta tādus failus kā `~/.codex/*.config.toml`. Å iem ceļiem ir nozÄ«me tikai tajā datorā, kurā faktiski darbojas CLI. Palaižot Ŕīs komandas konteinerā, ieraksts nonāk paÅ”a konteinera mājas direktorijā (`/home/node` — attēls darbojas ar `USER node`), kuru neviens resursdatora CLI nekad nelasÄ«s un kura tiek atmesta, tiklÄ«dz konteiners tiek izveidots no jauna. OmniRoute to nosaka un atsakās veikt ierakstu, tā vietā sniedzot norādÄ«jumus, nevis ziņojot par panākumu, kuru nevar izmantot: CLI beidz darbu ar kodu `2`, bet API atbild ar `422` un `containerEphemeralTarget: true`. ### Ieteicams: palaidiet CLI resursdatorā, bet OmniRoute — Docker vidē Konteiners nodroÅ”ina API; CLI konfigurē jÅ«su resursdatora rÄ«kus. ```bash docker compose --profile base up -d npm install -g omniroute omniroute connect http://localhost:20128 # norādiet CLI izmantot konteineru omniroute setup-codex # ieraksta Ä«stajā ~/.codex jÅ«su resursdatorā ``` Å Ä« ir pareizā izvēle, ja Codex, Claude Code, Cursor vai lÄ«dzÄ«gi rÄ«ki darbojas jÅ«su klēpjdatorā — un tas ir ierastais uzstādÄ«jums. ### AlternatÄ«va: piesaistiet resursdatora konfigurācijas direktorijus (`host` profils) Ja vēlaties, lai pats konteiners rakstÄ«tu jÅ«su resursdatora konfigurācijā, piesaistiet direktorijus un iestatiet `CLI_CONFIG_HOME` uz montējuma saknes direktoriju. `host` profils to jau nodroÅ”ina: ```yaml environment: - CLI_CONFIG_HOME=/host-home - CLI_ALLOW_CONFIG_WRITES=true volumes: - ~/.codex:/host-home/.codex:rw - ~/.claude:/host-home/.claude:rw ``` Piesaistes montējums padara ceļu uzticamu: OmniRoute nolasa `/proc/self/mountinfo` un atļauj rakstÄ«t montētajos ceļos (kā arÄ« direktorijos, kuru apakÅ”direktoriji ir montējumi — tieÅ”i tāda ir iepriekÅ” parādÄ«tā `/host-home` struktÅ«ra), vienlaikus joprojām atsakot rakstīŔanu nemontētos ceļos. ### ApieÅ”anas iespēja: konfigurējiet paÅ”a konteinera CLI (izmantojiet piesardzÄ«gi) Ja CLI patieŔām atrodas konteinerā (`cli` profils), rakstīŔana ir apzināta. Nododiet `--allow-container-write` jebkurai `setup-*` komandai vai serverim iestatiet `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE=true`. RakstīŔana tiks veikta, parādot brÄ«dinājumu, ka izmaiņas netiks saglabātas pēc konteinera darbÄ«bas beigām. > **DroŔības brÄ«dinājums — `cli` profils un `docker.sock` montējums.** > `cli` profils piesaista `/var/run/docker.sock`, lai konteinerā esoÅ”ais > automātiskais atjauninātājs varētu atkārtoti izveidot steku, izmantojot > resursdatora dēmonu (`src/lib/system/autoUpdate.ts` pārbauda Ŕīs ligzdas > esamÄ«bu un izlaiž Docker ceļu, ja tās nav). Å Ä« ligzda ir **resursdatora > root uzticamÄ«bas robeža**: viss, kas var tai piekļūt, pārvalda resursdatora > Docker dēmonu kā root — tas var izveidot, pārbaudÄ«t, apturēt un noņemt > jebkuru resursdatora konteineru. Sekas: > > 1. **Nekad nepadariet `cli` profila portu pieejamu tÄ«klā.** Publicējiet > to adresē `127.0.0.1` (`ports: "127.0.0.1:${DASHBOARD_PORT:-20128}:..."`) > — lokālajā tÄ«klā sasniedzams `cli` profils pārvērÅ” jebkuru informācijas > paneļa lÄ«meņa RCE par pilnÄ«gu resursdatora kompromitēŔanu. > 2. **Nepiesaistiet `cli` profilam nekādus papildu resursdatora direktorijus.** > Docker ligzda kopā ar jebkuru papildu montējumu pieŔķir konteineram pilnas > lasīŔanas un rakstīŔanas tiesÄ«bas jÅ«su failu sistēmā un resursdatora > konfigurācijā. Ja rÄ«kam nepiecieÅ”ama piekļuve projektam, palaidiet to > lokāli ar CLI bināro failu — nemontējiet projektu `cli` konteinerā. > > Ja automātiskā atjaunināŔana konteinerā nav nepiecieÅ”ama, neieslēdziet > `cli` profilu (`COMPOSE_PROFILES=core,redis` vai Ä«sāku variantu). Pārējie > profili nemontē Docker ligzdu. > > SaistÄ«to MITM apdraudējumu modeli skatiet failā > `docs/security/MITM-TPROXY-DECRYPT.md` (git; netiek kompilēts direktorijā > `/docs`), bet `codex`/`claude-code`/`droid`/`openclaw` bināro failu > izcelsmes ķēdi — failā `docs/security/SUPPLY_CHAIN.md`. ## Redis blakus konteiners OmniRoute izmanto Redis, lai nodroÅ”inātu izkliedētā pieprasÄ«jumu biežuma ierobežotāja un koplietotās keÅ”atmiņas darbÄ«bu. Pakalpojums `redis` ir **vienmēr definēts** failā `docker-compose.yml` (tam nav profila ierobežojuma), un tas tiek palaists kopā ar jebkuru citu profilu. | Informācija | VērtÄ«ba | | --------------------------------------- | ---------------------------------------------- | | Attēls | `redis:7-alpine` | | Konteinera nosaukums | `omniroute-redis` | | IekŔējais ports | `6379` | | Resursdatora ports (maiņa) | `REDIS_PORT` (noklusējums ir `6379`) | | Resursdatora saistīŔanas adrese (maiņa) | `REDIS_BIND_HOST` (noklusējums ir `127.0.0.1`) | | Sējums | `omniroute-redis-data` → `/data` | | VeselÄ«bas pārbaude | `redis-cli ping` (10 s intervāls) | SaistÄ«tie vides mainÄ«gie: - `REDIS_URL` — lietotnē ievadÄ«tā savienojuma virkne (pēc noklusējuma `redis://redis:6379`). - `REDIS_PORT` — resursdatora puses porta kartējums Redis konteineram. - `REDIS_BIND_HOST` — resursdatora saskarne, kurā ports tiek publicēts. Noklusējums ir `127.0.0.1`. > **Kāpēc pēc noklusējuma tiek izmantota atgriezeniskās cilpas adrese:** blakus konteiners darbojas bez `requirepass`, un lietotnes > konteineri tam piekļūst, izmantojot Compose tÄ«klu (`redis:6379`) — publicētais ports ir > paredzēts tikai resursdatora puses rÄ«kiem (`redis-cli`, lokālai `npm run dev` izpildei). PublicēŔana adresē > `0.0.0.0` padarÄ«tu Redis bez autentifikācijas pieejamu visiem resursdatoriem jÅ«su lokālajā tÄ«klā. Ja iestatāt > `REDIS_BIND_HOST=0.0.0.0`, pievienojiet pakalpojuma `command:` arÄ« `--requirepass`. **Redis atspējoÅ”ana** nav ieteicama (pieprasÄ«jumu biežuma ierobežotājs pārslēgsies uz ierobežotāku rezerves variantu atmiņā). Ja tas tomēr ir nepiecieÅ”ams, noņemiet vai aizkomentējiet pakalpojuma `redis:` bloku failā `docker-compose.yml`, vai mērogojiet to lÄ«dz nullei: ```bash docker compose up -d --scale redis=0 ``` ## Produkcijas Compose Lai paralēli izstrādes videi palaistu izolētu produkcijas momentuzņēmumu, izmantojiet `docker-compose.prod.yml`. | Informācija | VērtÄ«ba | | ------------------------------------- | ----------------------------------------------------------------------------------------------------- | | Fails | `docker-compose.prod.yml` | | Noklusējuma informācijas paneļa ports | `PROD_DASHBOARD_PORT=20130` (kartēts uz iekŔējo `${DASHBOARD_PORT:-20128}`) | | Noklusējuma API ports | `PROD_API_PORT=20131` | | Attēls | `omniroute:prod` (bÅ«vēts no `runner-cli` mērÄ·a) | | Redis konteiners | `omniroute-redis-prod` (`redis:8.6.2`, atseviŔķs `redis-prod-data` sējums) | | Datu sējums | `omniroute-prod-data` (nosaukts, tiek saglabāts starp atkārtotām bÅ«vēŔanām) | | VeselÄ«bas pārbaudes | `node healthcheck.mjs` + `redis-cli ping`, ar `depends_on`, kas piesaistÄ«ts Redis veselÄ«bas stāvoklim | LietoÅ”ana: ```bash # Izveidot un palaist produkcijas steku docker compose -f docker-compose.prod.yml up -d --build # Straumēt žurnālus docker compose -f docker-compose.prod.yml logs -f # Apturēt un noņemt steku (saglabāt sējumus) docker compose -f docker-compose.prod.yml down ``` Produkcijas steks darbojas paralēli izstrādes Compose videi (atŔķirÄ«gi konteineru nosaukumi, porti un sējumi), tāpēc varat turpināt lokālo izstrādi, kamēr produkcijas vide paliek aktÄ«va. ## Dockerfile posmi Repozitorijā ir iekļauts vairākposmu Dockerfile (`Dockerfile`). Ir pieejami četri posmi; izvēlieties savam lietojumam atbilstoÅ”o `target`. | Posms | Bāzes attēls | MērÄ·is | | ------------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `builder` | `node:26-trixie-slim` | Instalē atkarÄ«bas (`npm ci --legacy-peer-deps`) un izpilda `npm run build` (pēc noklusējuma Turbopack — skatiet tālāk sadaļu par bÅ«vēŔanas laika resursiem) | | `runner-base` | `node:26-trixie-slim` | Produkcijas izpildlaika vide ar Next.js savrupo izvadi. **Pakalpojumu sniedzēju CLI nav iekļautas.** | | `runner-cli` | `runner-base` | Pievieno `git`, `docker.io`, `docker-compose` un globālās CLI: `@openai/codex`, `@anthropic-ai/claude-code`, `droid`, `openclaw`. **Izvēlieties Å”o posmu aÄ£entu darbplÅ«smām.** | | `runner-web` | `runner-base` | Pievieno Playwright un Chromium pārlÅ«kprogrammu (`--with-deps`) tÄ«mekļa sesiju pakalpojumu sniedzējiem: `gemini-web`, `claude-web`, `claude-turnstile`. **Izvēlieties Å”o posmu, ja izmantojat Å”os pakalpojumu sniedzējus** — parastajā attēlā bez tā pieprasÄ«juma laikā rodas kļūme (skatiet piezÄ«mi par `-web` sadaļā par laidienu kanāliem). | Manuāli bÅ«vējiet konkrētu mērÄ·i: ```bash docker build --target runner-base -t omniroute:base . docker build --target runner-cli -t omniroute:cli . docker build --target runner-web -t omniroute:web . ``` ### BÅ«vēŔanas laika resursi TrÄ«s bÅ«vēŔanas argumenti nosaka `builder` posma resursu patēriņu. Tie attiecas tikai uz bÅ«vēŔanas laiku — `OMNIROUTE_MEMORY_MB` (tālāk) ir atseviŔķs izpildlaika parametrs. | BÅ«vēŔanas arguments | Noklusējums | Ietekme | | --------------------------- | ----------- | --------------------------------------------------------------------------------------------------- | | `OMNIROUTE_USE_TURBOPACK` | `1` | Ar `0` bÅ«vēŔanai tā vietā izmanto webpack. Mazāks maksimālais atmiņas patēriņŔ, bet lēnāka darbÄ«ba. | | `OMNIROUTE_BUILD_MEMORY_MB` | `6144` | V8 kaudzes ierobežojums (`--max-old-space-size`) palaistajam `next build` procesam. | | `OMNIROUTE_BUILD_WORKERS` | `2` | Iestata `CIRCLE_NODE_TOTAL`; Next lapu datu apkopoÅ”anai aprēķina `workers = N - 1`. | `OMNIROUTE_BUILD_WORKERS` ir parametrs, kas jāpalielina jaudÄ«gā bÅ«vēŔanas vidē un par kuru jādomā vispirms, ja bÅ«vēŔana ierobežotā vidē pārtrÅ«kst **pēc** `āœ“ Compiled successfully`. Katrs lapu datu darbinātājprocess ir atseviŔķs process, un arÄ« vecākprocess `next build` ir atseviŔķs; reālā VPS reprodukcijā (problēma #7518) katra procesa maksimālais RSS tika izmērÄ«ts kā ~4.5 GB neatkarÄ«gi no `NODE_OPTIONS` kaudzes karoga (Turbopack kompilēŔanai izmanto vietējo/Rust atmiņu ārpus V8 kaudzes). Noklusējuma vērtÄ«ba `2` (→ 1 darbinātājprocess, kopā 2 procesi) ir pielāgota 16 GB / 4 vCPU GitHub mitinātajiem izpildÄ«tājiem, kurus izmanto publicēŔanas konveijers. Ar `8` (→ 7 darbinātājprocesi) Å”im izpildÄ«tājam beidzās atmiņa un buildkit pārtrauca darbÄ«bu ar `ResourceExhausted: ... cannot allocate memory`; arÄ« `3` (→ 2 darbinātājprocesi) neietilpa pieejamajā atmiņā, kad katra procesa RSS tika mērÄ«ts tieÅ”i, nevis secināts. `tests/unit/docker-build-memory-budget.test.ts` veic aprēķinus, izmantojot izmērÄ«to vērtÄ«bu, un neizdodas, ja kāds no parametriem pārsniedz izpildÄ«tāja iespējas. Turbopack kompilēŔanai izmanto vietējo Rust atmiņu, kas atrodas **ārpus** V8 kaudzes, tādēļ `OMNIROUTE_BUILD_MEMORY_MB` to neierobežo. Resursdatorā ar atmiņas ierobežojumu OOM likvidētājs pārtrauc bÅ«vēŔanu ar SIGKILL, neizvadot nekādu kļūdas tekstu — tā vienkārÅ”i apstājas `Creating an optimized production build` procesa vidÅ«, kas izskatās pēc iestrēgÅ”anas, nevis atmiņas izbeigÅ”anās. Ja bÅ«vēŔanas resursdatora resursi ir ierobežoti, mainiet komplektētāju: ```bash docker build --target runner-base \ --build-arg OMNIROUTE_USE_TURBOPACK=0 \ -t omniroute:base . ``` `webpackBuildWorker` ir iespējots, tādēļ `next build` palaiž vecākprocesu **un** darbinātājprocesu, un katrs no tiem atseviŔķi ievēro `OMNIROUTE_BUILD_MEMORY_MB`. Iestatiet konteinera ierobežojumu aptuveni divreiz lielāku par Å”o vērtÄ«bu, nevis vienreiz. MērÄ«jumi Å”ajā kokā (`--target runner-base`, `OMNIROUTE_BUILD_MEMORY_MB=6144`): | Komplektētājs | Konteinera ierobežojums | Rezultāts | | ------------- | ----------------------- | ------------------------------------------------- | | Turbopack | 8 GiB / 16 GiB | Abos gadÄ«jumos OOM pārtraukums bez ziņojuma | | webpack | 8 GiB | BÅ«vēŔanas darbinātājprocess pārtraukts ar SIGKILL | | webpack | 12 GiB | Izdevās, maksimālais patēriņŔ bija 11.1 GiB | ### Izpildlaika noklusējumi `runner-base` eksportētās noklusējuma vērtÄ«bas: `PORT=20128`, `HOSTNAME=0.0.0.0`, `OMNIROUTE_MEMORY_MB=1024`, `NODE_OPTIONS=--max-old-space-size=1024`, `DATA_DIR=/app/data`, `OMNIROUTE_MIGRATIONS_DIR=/app/migrations`. Atmiņas darbÄ«ba Docker vidē: - Attēls iestata `OMNIROUTE_MEMORY_MB=1024` un no tā atvasina `NODE_OPTIONS=--max-old-space-size=1024`. - Faktisko servera procesu palaiž savrupais palaidējs, kas nolasa `OMNIROUTE_MEMORY_MB` un pievieno `--max-old-space-size=`. - Node izmanto pēdējo atkārtoto `--max-old-space-size` vērtÄ«bu, tāpēc `OMNIROUTE_MEMORY_MB` iestatīŔana nosaka faktisko Docker kaudzes ierobežojumu. - Tā kā attēls to vienmēr iestata, palaidēja paÅ”a operatÄ«vās atmiņas apjomam pielāgotā rezerves vērtÄ«ba Docker vidē nekad netiek izmantota. Palieliniet to atbilstoÅ”i darba slodzei (skatiet tabulu tālāk). `2048` joprojām ir par maz kodēŔanas aÄ£entu `/v1/responses` pieprasÄ«jumiem. ### Izpildlaika operatÄ«vā atmiņa kodēŔanas aÄ£entiem Docker noklusējuma 1 GiB ir minimālais apjoms informācijas panelim un vienkārÅ”ai tērzēŔanai, nevis produkcijas vides konfigurācija. Gari `POST /v1/responses` pieprasÄ«jumu Ä·ermeņi (simtiem ziņojumu, desmitiem rÄ«ku) saspieÅ”anas laikā atmiņā saglabā vairākus grafus. Divi pārklājoÅ”ies ~3 MiB / ~750k-token pieprasÄ«jumi ir izraisÄ«juÅ”i V8 avāriju ar **12 GiB** vecās paaudzes apgabalu (`FATAL ERROR: Reached heap limit`) un arÄ« sasnieguÅ”i 16 GiB cgroup OOM ierobežojumu. Skatiet [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849). Iestatiet **cgroup `--memory` lielāku par kaudzes apjomu** — vietējie buferi, SQLite un saspieÅ”anas starprezultāti atrodas ārpus V8. | Darba slodze | `OMNIROUTE_MEMORY_MB` | Konteiners / cgroup | PiezÄ«mes | | -------------------------------------------------- | --------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | | Informācijas panelis, viena vienkārÅ”a tērzēŔana | `1024` (attēla noklusējums) | ≄2 GiB | | | Viens kodēŔanas aÄ£ents (Claude/Codex/Grok) | `8192` | ≄10 GiB | Tipiska vienas sesijas `/v1/responses` darba slodze | | Divi vienlaicÄ«gi gari `/v1/responses` pieprasÄ«jumi | `10240`–`12288` | ≄12–16 GiB | Novērota V8 avārija ar ~12 GiB kaudzi | | TrÄ«s vai vairāk vienlaicÄ«gi gari konteksti | nedarbiniet vienā procesā | serializējiet / vairāk operatÄ«vās atmiņas | Pēc noklusējuma vienlaikus tiek apstrādāta 1 resursietilpÄ«ga darba slodze; Ŕī limita palielināŔana bez papildu operatÄ«vās atmiņas atkal izraisa avāriju | `omniroute serve` fiziskā serverÄ« pielāgo vērtÄ«bu lÄ«dz ~35% no operatÄ«vās atmiņas (ierobežojot diapazonā `[512, 4096]`), ja `OMNIROUTE_MEMORY_MB` **nav iestatÄ«ts**. Docker vienmēr iestata `1024`, tāpēc oficiālajā attēlā Ŕī pielāgoÅ”ana nekad netiek veikta. ```bash docker run -d --name omniroute --restart unless-stopped --stop-timeout 40 \ -e OMNIROUTE_MEMORY_MB=8192 --memory=10g \ -p 127.0.0.1:20128:20128 -v omniroute-data:/app/data diegosouzapw/omniroute:latest ``` ## Kritiskie vides mainÄ«gie Papildus noklusējuma iestatÄ«jumiem, kas dokumentēti failā [ENVIRONMENT.md](../reference/ENVIRONMENT.md), darbÄ«bā ar Docker vissvarÄ«gākie ir tālāk norādÄ«tie mainÄ«gie: | MainÄ«gais | MērÄ·is | Noklusējums | | ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------ | | `OMNIROUTE_WS_BRIDGE_SECRET` | WebSocket tilta koplietojamais noslēpums. **Obligāts produkcijas vidē** — iestatiet to kā droÅ”u nejauÅ”u virkni. | nav iestatÄ«ts (jānorāda) | | `REDIS_URL` | Savienojuma virkne pieprasÄ«jumu biežuma ierobežotāja/keÅ”atmiņas aizmugursistēmai | `redis://redis:6379` | | `REDIS_PORT` | Komplektā iekļautā Redis konteinera resursdatora puses ports | `6379` | | `REDIS_BIND_HOST` | Resursdatora saskarne, kurā tiek publicēts komplektā iekļautā Redis konteinera ports (atgriezeniskās cilpas saskarne, ja vien nepievienojat AUTH) | `127.0.0.1` | | `AUTO_UPDATE_HOST_REPO_DIR` | Resursdatora ceļŔ, kas `cli` profilā tiek montēts kā `/workspace/omniroute` paÅ”atjaunināŔanas darbplÅ«smām | `.` (paÅ”reizējais direktorijs) | | `OMNIROUTE_MEMORY_MB` | Node izpildlaika kaudzes maksimālais apjoms Docker savrupajam serverim; ignorē iepriekÅ” norādÄ«to attēla noklusējumu. ProgrammēŔanas aÄ£entiem: `8192`+ (skatiet [izpildlaika RAM](#runtime-ram-for-coding-agents)). | `1024` | | `DASHBOARD_PORT` / `API_PORT` | Pārraksta informācijas paneļa (20128) un API (20129) publiskotos portus | `20128` / `20129` | | `APP_BIND_HOST` | Resursdatora saskarne, kurā docker-compose publicē informācijas paneļa/API/reāllaika WS portus. Ja `REQUIRE_API_KEY=false` (noklusējums), `0.0.0.0` atklāj anonÄ«mo `/v1` starpniekserveri LAN tÄ«klam — paplaÅ”iniet piekļuvi tikai ar `REQUIRE_API_KEY=true` vai priekŔā novietotu reverso starpniekserveri. | `127.0.0.1` | | `CLIPROXY_BIND_HOST` | Resursdatora saskarne, kurā docker-compose publicē `cliproxyapi` blakuskonteineru — tā datu sējumā tiek glabāti pakalpojumu sniedzēju akreditācijas dati. | `127.0.0.1` | | `OMNIROUTE_PLUGINS_DIR` | Direktorijs, kuru izpildlaika spraudņu skeneris nolasa un kurā tas instalē spraudņus. Iestatiet to, ja spraudņi ir piesaistÄ«ti ar montēŔanu: noklusējums seko `HOME`, kuru attēls var neeksportēt. | `~/.omniroute/plugins` | | `OMNIROUTE_BASE_PATH` | URL apakÅ”ceļŔ, ja lietotne ir publicēta aiz reversā starpniekservera (piem., `/omniroute`) | _(tukÅ”s = sakne)_ | | `NEXT_PUBLIC_BASE_URL` | Publiskā pārlÅ«kprogrammas izcelsmes adrese, ietverot apakÅ”ceļu (piem., `https://host/omniroute`) | nav iestatÄ«ts | | `PROD_DASHBOARD_PORT` | Resursdatora puses informācijas paneļa ports failam `docker-compose.prod.yml` | `20130` | | `CLIPROXYAPI_PORT` | Resursdatora puses ports `cliproxyapi` blakuskonteineram | `8317` | ## Reversais starpniekserveris apakÅ”ceļā (Traefik / nginx) Next.js `basePath` tiek kompilēts savrupajā pakotnē. OmniRoute saglabā kompilēto vērtÄ«bu kontrollÄ«dzekļa failā lietotnes saknē (tas tiek ierakstÄ«ts `npm run build` laikā; to nolasa `scripts/docker/ensure-docker-base-path.mjs`) un konteinera palaiÅ”anas laikā salÄ«dzina to ar `OMNIROUTE_BASE_PATH`. Ja vērtÄ«bas atŔķiras un attēls tika izveidots domēna saknei, ieejas punkts pārraksta savrupās pakotnes manifestus, iegultās `basePath`/`assetPrefix` literāļu vērtÄ«bas (Next 16 atveido SSR resursu URL, izmantojot tikai `assetPrefix`, tādēļ laboÅ”anas rÄ«ks tajā atspoguļo apakÅ”ceļu), kompilētos `/_next/static` resursu URL (klienta atsauču manifestus, multivides importus, iepriekÅ” atveidotās kļūdu lapas) un klienta `process.env` aizstājēju, pirms tiek palaists `node dev/run-standalone.mjs`. ### Izveide ar Compose (ieteicams) Iestatiet abus mainÄ«gos failā `.env` un pēc tam izveidojiet attēlu no jauna, lai attēla un izpildlaika iestatÄ«jumi sakristu: ```bash # .env OMNIROUTE_BASE_PATH=/omniroute NEXT_PUBLIC_BASE_URL=https://myhostname.example.com/omniroute ``` ```bash docker compose --profile base up -d --build ``` `docker-compose.yml` nodod `OMNIROUTE_BASE_PATH` gan kā Docker izveides argumentu, gan kā izpildlaika vides mainÄ«go. ### IepriekÅ” izveidots saknes attēls + izpildlaika apakÅ”ceļŔ Publicētie `diegosouzapw/omniroute:*` attēli ir izveidoti domēna saknei. Joprojām varat iestatÄ«t `OMNIROUTE_BASE_PATH` izpildlaikā; konteiners palaiÅ”anas laikā vienreiz izlabo pakotni. Izmantojiet to kopā ar atbilstoÅ”o publisko izcelsmes adresi: ```yaml services: omniroute: image: diegosouzapw/omniroute:latest environment: OMNIROUTE_BASE_PATH: /omniroute NEXT_PUBLIC_BASE_URL: https://myhostname.example.com/omniroute ``` Konfigurējiet reverso starpniekserveri tā, lai tas pārsÅ«tÄ«tu **pilnu** ārējo ceļu (nenoņemiet prefiksu). Traefik ir jāmarÅ”rutē `PathPrefix(`/omniroute`)` uz konteineru bez `StripPrefix`, lai Next.js saņemtu `/omniroute/...` un apkalpotu resursus no `/omniroute/_next/...`. Docker darbspējas pārbaude pārbauda vieglo `/healthz` dzÄ«ves cikla galapunktu, kuram pievienots aktÄ«vais `OMNIROUTE_BASE_PATH` prefikss. `/api/monitoring/health` joprojām ir pieejams manuālai un informācijas paneļa diagnostikai; lai konteinera HEALTHCHECK atkal novirzÄ«tu uz to (piemēram, padziļinātai darbspējas kontrolei), iestatiet `OMNIROUTE_HEALTHCHECK_PATH=/api/monitoring/health`. Å is ceļŔ veic **padziļinātu** pārbaudi (DB + pārraudzÄ«bas kopsavilkums) — tā ir piemērota Docker retajām `HEALTHCHECK` pārbaudēm, ja izvēlaties to atkal iespējot, bet **nav** piemērota Kubernetes `livenessProbe` intervāliem. OrÄ·estratoriem (Kubernetes, Nomad u.c.): | Pārbaude | Ieteicams | Nav ieteicams | | ------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------- | | DzÄ«votspēja | HTTP `GET /livez` vai TCP galvenajā portā (`PORT`, pēc noklusējuma `20128`) | Izmantot `/api/monitoring/health` dzÄ«votspējas pārbaudei | | GatavÄ«ba | HTTP `GET /healthz` | ÄŖsi taimauti, kas noslogotu notikumu ciklu uzskata par neaktÄ«vu | | Padziļināta / ārēja | `/api/monitoring/health` | — | `/healthz` ziņo par procesa dzÄ«ves ciklu (`ok` / `starting` / `stopping`). `/livez` pārbauda tikai to, vai process darbojas (200 vienmēr, kad apdarinātāju var izpildÄ«t; tas negaida gatavÄ«bu). Abi joprojām darbojas tajā paŔā Node notikumu ciklā, kurā tiek apstrādāti pieprasÄ«jumi, tādēļ procesora noslogota kataloga vai saspieÅ”anas apstrāde var tos aizkavēt — aizņemts ≠ neaktÄ«vs. Ja HTTP pārbaudēm iestājas taimauts, dzÄ«votspējas pārbaudei dodiet priekÅ”roku TCP. PilnÄ«gi norādÄ«jumi par pārbaudēm: [PārraudzÄ«bas ceļvedis — ieteikumi Kubernetes pārbaudēm](../ops/MONITORING_GUIDE.md#kubernetes-probe-recommendations). ## Docker Compose ar Caddy (HTTPS Auto-TLS) OmniRoute var droÅ”i publiskot, izmantojot Caddy automātisko SSL nodroÅ”ināŔanu. Pārliecinieties, ka jÅ«su domēna DNS A ieraksts norāda uz jÅ«su servera IP adresi. ```yaml services: omniroute: image: diegosouzapw/omniroute:latest container_name: omniroute restart: unless-stopped volumes: - omniroute-data:/app/data environment: - PORT=20128 # PārlÅ«kprogrammai paredzētā izcelsme OAuth atzvaniem, informācijas paneļa saitēm un Ä£enerētajiem publiskajiem URL. - NEXT_PUBLIC_BASE_URL=https://your-domain.com # IekŔējais starpserveru URL ieplānotajiem uzdevumiem / paÅ”pieprasÄ«jumiem. - BASE_URL=http://omniroute:20128 - AUTH_COOKIE_SECURE=true caddy: image: caddy:latest container_name: caddy restart: unless-stopped ports: - "80:80" - "443:443" command: caddy reverse-proxy --from https://your-domain.com --to http://omniroute:20128 volumes: omniroute-data: ``` Caddy iestata standarta pārsÅ«tīŔanas galvenes augÅ”upstraumes konteineram. OmniRoute izmanto `NEXT_PUBLIC_BASE_URL` kā kanonisko publisko izcelsmi OAuth atzvaniem un Ä£enerētajām publiskajām saitēm; autentificēti informācijas paneļa rakstīŔanas pieprasÄ«jumi izmanto vienas izcelsmes pieprasÄ«jumus kopā ar sesijai piesaistÄ«tu CSRF aizsardzÄ«bu. Iespējojiet `OMNIROUTE_TRUST_PROXY` tikai sarežģītās izvietoÅ”anas konfigurācijās, kurās apzināti vēlaties, lai OmniRoute iegÅ«tu publisko izcelsmi no uzticamām pārsÅ«tÄ«tajām galvenēm, nevis no tieÅ”as konfigurācijas. ## Cloudflare ātrais tunelis Informācijas paneļa atbalsts Docker izvietojumiem ietver ar vienu klikŔķi aktivizējamu **Cloudflare ātro tuneli** sadaļā `Dashboard → Endpoints`. Pirmajā iespējoÅ”anas reizē `cloudflared` tiek lejupielādēts tikai tad, kad tas ir nepiecieÅ”ams, tiek palaists pagaidu tunelis uz jÅ«su paÅ”reizējo `/v1` galapunktu, un Ä£enerētais `https://*.trycloudflare.com/v1` URL tiek parādÄ«ts tieÅ”i zem jÅ«su parastā publiskā URL. Galapunktu tuneļu paneļus (Cloudflare, Tailscale, ngrok) var parādÄ«t vai paslēpt sadaļā `Settings → Appearance`, nemainot aktÄ«vā tuneļa stāvokli. ### PiezÄ«mes par tuneli - Ātro tuneļu URL ir pagaidu adreses, un tās mainās pēc katras restartēŔanas. - Ātrie tuneļi netiek automātiski atjaunoti pēc OmniRoute vai konteinera restartēŔanas. VajadzÄ«bas gadÄ«jumā iespējojiet tos atkārtoti informācijas panelÄ«. - PārvaldÄ«tā instalēŔana paÅ”laik atbalsta Linux, macOS un Windows platformās `x64` / `arm64`. - PārvaldÄ«tie ātrie tuneļi pēc noklusējuma izmanto HTTP/2 transportu, lai ierobežotās konteineru vidēs izvairÄ«tos no traucējoÅ”iem QUIC UDP bufera brÄ«dinājumiem. Iestatiet `CLOUDFLARED_PROTOCOL=quic` vai `auto`, ja vēlaties izmantot citu transportu. - Docker attēlos ir iekļauti sistēmas CA saknes sertifikāti, kas tiek nodoti pārvaldÄ«tajam `cloudflared`, tādējādi novērÅ”ot TLS uzticamÄ«bas kļūmes, kad tunelis tiek inicializēts konteinerā. - Iestatiet `CLOUDFLARED_BIN=/absolute/path/to/cloudflared`, ja vēlaties, lai OmniRoute izmantotu jau esoÅ”u bināro failu, nevis to lejupielādētu. ## Attēlu tagi | Attēls | Tags | Izmērs | Apraksts | | ------------------------ | -------- | ------ | ---------------------------------------------------------------- | | `diegosouzapw/omniroute` | `latest` | ~250MB | Augstākā **publicētā** stabilā SemVer versija (nevis git `main`) | | `diegosouzapw/omniroute` | `3.8.0` | ~250MB | GitOps vajadzÄ«bām piesaistiet Å”o tagu klasi | Vairāku platformu manifests: vietējais `linux/amd64` + `linux/arm64` (Apple Silicon, AWS Graviton, Raspberry Pi). Docker automātiski atlasa atbilstoÅ”o arhitektÅ«ru; norādiet `--platform linux/amd64`, ja ARM resursdatoros nepiecieÅ”ams piespiedu kārtā izmantot AMD64 emulāciju. ### Laidienu kanāli OmniRoute publicē atseviŔķus Docker kanālus stabilajiem laidieniem, aktÄ«vā laidiena zara testēŔanai un izstrādes bÅ«vējumiem. | Kanāls | Avots | MainÄ«gums | Ieteicamais lietojums | | ------------------------------- | --------------------------------------------- | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------- | | `:` / `:-web` | ParakstÄ«ts/versijots laidiens | NemainÄ«gs | Produkcijas izvietojumi, kas piesaistÄ«ti konkrētam laidienam | | `:latest` / `:latest-web` | Augstākā **publicētā** stabilā SemVer versija | MainÄ«ga stabilā norāde | Seko stabilajiem laidieniem **pēc** SemVer publicēŔanas uzdevuma — **neseko** `main` vai nepublicētām `release/v*` izmaiņām | | `:next` / `:next-web` | PaÅ”reizējais noklusējuma `release/v*` zars | MainÄ«ga pirmslaidiena norāde | Labojumu testēŔana, kuri ir iekļauti aktÄ«vajā laidiena zarā, bet vēl nav iekļauti stabilā laidienā | | `:main` / `:main-web` | `main` zars | MainÄ«ga izstrādes norāde | Tikai izstrādei un integrācijas testēŔanai | #### TÄ«mekļa sesiju nodroÅ”inātāji: `-web` attēli Katram iepriekÅ” minētajam kanālam ir arÄ« `-web` tags (`:latest-web`, `:-web`, `:next-web`, `:main-web`), kas izveidots no `runner-web` posma — tas ir tas pats attēls, kam papildus pievienots Playwright un pārlÅ«ks Chromium. Parastais attēls tiek piegādāts **bez** Chromium; tas ir nepiecieÅ”ams `gemini-web`, `claude-web` un `claude-turnstile`. Kļūme rodas nevis palaiÅ”anas laikā, bet vēlāk: Å”ie nodroÅ”inātāji uzskaita savus modeļus un informācijas panelÄ« tiek rādÄ«ti kā savienoti, taču pirmais pieprasÄ«jums neizdodas ar Ŕādu kļūdu: ``` [500]: Neizdevās ielādēt ārējo moduli playwright: Kļūda: Moduli nevar atrast '/app/node_modules/playwright/node_modules/playwright-core/browsers.json' ``` Ja izmantojat Å”os nodroÅ”inātājus, lejupielādējiet tā kanāla `-web` tagu, kuru jau izmantojat — nekas cits nemainās. npm/CLI instalācijā (bez Docker attēla) trÅ«kstoŔā daļa ir pārlÅ«ka binārais fails: resursdatorā izpildiet `npx playwright install chromium`. #### Pirmslaidiena kanāla izmantoÅ”ana Kanāls `next` tiek atkārtoti bÅ«vēts pēc katras izmaiņu nosÅ«tīŔanas uz paÅ”reizējo noklusējuma `release/v*` zaru un tiek publicēts gan AMD64, gan ARM64 arhitektÅ«rai. Vecāki uzturēŔanas zari to nevar pārrakstÄ«t. Å is kanāls nodroÅ”ina lejupielādējamu attēlu labojumiem, kas pirms nākamā stabilā taga izveides ir sapludināti aktÄ«vajā laidiena zarā. ```bash docker pull diegosouzapw/omniroute:next docker pull diegosouzapw/omniroute:next-web ``` Izmantojot Docker Compose, pārrakstiet atlasÄ«tā profila izmantoto attēla tagu, pēc tam lejupielādējiet attēlu un izveidojiet pakalpojumu no jauna: ```yaml services: omniroute: image: diegosouzapw/omniroute:next ``` ```bash docker compose pull docker compose up -d ``` #### DroŔība un atgrieÅ”anās pie iepriekŔējās versijas `next` ir mainÄ«gs pirmslaidiena kanāls. Tas var mainÄ«ties pēc jebkuras izmaiņu nosÅ«tīŔanas uz aktÄ«vo laidiena zaru un **nav atbalstÄ«ts lietoÅ”anai produkcijā**. Konkrēta bÅ«vējuma novērtēŔanas laikā piesaistiet attēla kontrolsummu: ```bash docker pull diegosouzapw/omniroute:next docker image inspect diegosouzapw/omniroute:next --format '{{index .RepoDigests 0}}' ``` Pirms testēŔanas dublējiet OmniRoute datu sējumu vai piesaistÄ«to datu direktoriju. Lai atgrieztos pie iepriekŔējās versijas, atjaunojiet iepriekÅ” izmantoto stabilo versiju vai kontrolsummu un izveidojiet konteineru no jauna: ```bash docker pull diegosouzapw/omniroute: docker compose up -d ``` Laidiena zara bÅ«vējums nekad nevar pārvietot `latest`; stabilo norādi drÄ«kst atjaunināt tikai atbilstoÅ”a stabila semantiskā versija. `next` attēli saglabā laidiena attēla pārbaudi un bloķējoÅ”o CRITICAL ievainojamÄ«bu pārbaudes vārteju. **`latest` negarantē git jaunāko stāvokli.** Labojumi, kas sapludināti `main` vai aktÄ«vajā `release/v*` zarā, **nav** iekļauti `:latest`, kamēr nav publicēts stabils SemVer attēls un publicēŔanas uzdevums nav atjauninājis `:latest` (tā pati kontrolsumma, kas attiecÄ«gajai SemVer versijai). Ja Ŕķiet, ka `latest` nav mainÄ«jies, lai gan GitHub jau ir redzams labojums, lejupielādējiet `:next`, lai testētu laidiena zaru, vai gaidiet SemVer tagu. | JÅ«su mērÄ·is | Izmantojiet | | ------------------------------------------------------------------------------------------ | ---------------------------------------------- | | GitOps / produkcija, kurā nedrÄ«kst rasties neparedzētas izmaiņas | Piesaistiet `:X.Y.Z` (vai attēla kontrolsummu) | | Sekot publicētajiem stabilajiem laidieniem un pieņemt atkārtotu izveidi pēc katra laidiena | `:latest` | | Testēt nepublicētas `release/v*` izmaiņas | `:next` (ne produkcijai) | | Testēt `main` | `:main` (ne produkcijai) | ## PieejamÄ«ba: noklusējuma SQLite darbojas ar vienu repliku Standarta Docker / Kubernetes OmniRoute ir **viens Node process + viens SQLite rakstÄ«tājs**. Šādā topoloÄ£ijā augsta pieejamÄ«ba **netiek atbalstÄ«ta**. | Ierobežojums | Sekas | | --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Viens rakstÄ«tājs | **Nedarbiniet** vairākas replikas ar vienu un to paÅ”u SQLite failu. Tas sabojā datubāzi. | | Atkārtota izveide / restartēŔana / HEALTHCHECK apturēŔana | **PilnÄ«gs darbÄ«bas pārtraukums**, kas ietekmē aktÄ«vos SSE savienojumus, informācijas paneļa sesijas un atmiņā glabāto stāvokli. Visi savienotie klienti tiek atvienoti. Jauni pieprasÄ«jumi laikā, kad nav neviena galapunkta, no reversā starpniekservera saņem **`502 Bad Gateway: Unknown error`**, nevis OmniRoute JSON — klienti to nevar atŔķirt no pakalpojumu sniedzēja kļūmes (#11015). | | Tā pati notikumu cilpa, ko izmanto `/healthz` | Noslogota kataloga vai saspieÅ”anas cikla izpilde var aizkavēt pārbaudes; Ä«ss taimauts pēc tam restartē **vienÄ«go** repliku. | **Pārbaužu matrica** (skatiet arÄ« [Kubernetes pārbaužu ieteikumus](../ops/MONITORING_GUIDE.md#kubernetes-probe-recommendations)): | Pārbaude | MērÄ·is | Neizmantojiet | | ----------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------------------- | | DzÄ«vÄ«guma | TCP portā `PORT` (noklusējums `20128`) vai saudzÄ«ga HTTP `/healthz` pārbaude | `/api/monitoring/health` | | GatavÄ«bas | HTTP `GET /healthz` | ÄŖsus taimautus, kas noslogotu notikumu cilpu uzskata par nestrādājoÅ”u | | Padziļināta / cilvēkiem | `/api/monitoring/health` | Automatizētai kubelet dzÄ«vÄ«guma pārbaudei | **JaunināŔana:** rēķinieties, ka katra sesija tiks pārtraukta. Ja iespējams, pakāpeniski atvienojiet klientus; ar noklusējuma SQLite nav iespējama pakāpeniska atjaunināŔana. Compose `restart: unless-stopped` kopā ar Docker `HEALTHCHECK` arÄ« aizstās vienÄ«go procesu, kad konteinera statuss bÅ«s Unhealthy — ar tādu paÅ”u ietekmes apmēru. Kubernetes fragments **vienai replikai** (Recreate ir obligāts; nepalieliniet `replicas`, ja tiek izmantots viens SQLite fails): ```yaml spec: replicas: 1 strategy: type: Recreate template: spec: terminationGracePeriodSeconds: 90 containers: - name: omniroute lifecycle: preStop: exec: command: ["/bin/sleep", "15"] readinessProbe: httpGet: path: /healthz port: 20128 periodSeconds: 5 livenessProbe: tcpSocket: port: 20128 periodSeconds: 20 ``` `preStop` aizture ļauj kube noņemt Service galapunktus pirms SIGTERM, lai **jauna** datplÅ«sma vairs netiktu novirzÄ«ta uz procesu, kura darbÄ«ba tiek pārtraukta. AktÄ«vie `/v1/responses` SSE savienojumi tiek apkalpoti lÄ«dz `SHUTDOWN_TIMEOUT_MS` robežai (pēc noklusējuma 30 s), izmantojot smagsvara uzņemÅ”anas nomas (#11015). Jauni pieprasÄ«jumi, kas tomēr sasniedz procesu, saņem `503` + `Retry-After: 5`. Recreate izraisÄ«tais periods bez galapunktiem lÄ«dz aizstājējinstances statusam Ready joprojām nozÄ«mē pilnÄ«gu darbÄ«bas pārtraukumu — tā ir SQLite topoloÄ£ijas Ä«paŔība, nevis nepareiza pārbaužu konfigurācija. Ārējs Postgres / vairāku rakstÄ«tāju HA **nav** dokumentēts standarta risinājums. Ja jums nepiecieÅ”ama HA, saglabājiet vienu repliku vai izmantojiet topoloÄ£iju, kuru projekts ir atseviŔķi pārbaudÄ«jis un dokumentējis. Darbs pie Postgres/MySQL tiek veikts [#8075](https://github.com/diegosouzapw/OmniRoute/issues/8075). LÄ«dz Ŕīs funkcionalitātes izlaiÅ”anai vienÄ«gais atbalstÄ«tais veids, kā palielināt **lielu** `/v1/responses` pieprasÄ«jumu apstrādes jaudu, ir N neatkarÄ«gi procesi (nākamā sadaļa), nevis `replicas > 1` vienā sējumā. ## Horizontālā mērogoÅ”ana: N neatkarÄ«gi procesi Viens Node process ir **viena V8 kaudze**. Divi pārklājoÅ”ies ~3 MiB / ~750k marÄ·ieru kodēŔanas aÄ£enta `POST /v1/responses` pieprasÄ«jumi (RTK + Caveman) pārtrauc Ŕīs kaudzes darbÄ«bu pie ~12 Gi (`FATAL ERROR: Reached heap limit`) un var izraisÄ«t atmiņas izsÄ«kumu 16 Gi cgroup. Skatiet [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849). Å is mērÄ«jums ir **atmiņas budžeta** brÄ«dinājums, nevis produkta stingrais maksimums — divi vienlaicÄ«gi ilgstoÅ”i `/v1/responses`. ResursietilpÄ«gas tērzēŔanas pieprasÄ«jumu pieņemÅ”anu ierobežo automātiski atvasināts ievades baitu budžets (`OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES`, `src/shared/middleware/admissionBudget.ts`), kura lielums noteikts pēc tā paÅ”a V8/cgroup ierobežojuma; tā palielināŔana (vai mantotā pieprasÄ«jumu skaita ierobežojuma `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` iestatīŔana) jau atbilstoÅ”i konfigurētā procesā no jauna rada avārijas pārtraukÅ”anas risku. Å is ierobežojums **neattiecas** uz nelielām tērzēŔanām, `/healthz`, `/v1/models` un MCP. ### Viens process: vairāk nekā divi ilgstoÅ”i `/v1/responses` **VeselÄ«gs** process (kaudzes lietojums zem `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO`, pēc noklusējuma `0.75`) **var** izpildÄ«t vairāk nekā divus vienlaicÄ«gus ilgstoÅ”us `POST /v1/responses`, ja procesa kopējā izpildē esoÅ”o baitu budžetā (`OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110) joprojām ir vieta. PieprasÄ«jumu Ä·ermeņi, kuru izmērs sasniedz vai pārsniedz `OMNIROUTE_CHAT_LARGE_BODY_BYTES` (pēc noklusējuma 256 KiB), saņem tādu paÅ”u resursietilpÄ«gā pieprasÄ«juma nomu kā strukturāli sarežģīti pieprasÄ«jumi un izmanto to paÅ”u [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) `tryAcquireHealthyHeadroom` atkāpi (`OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`). Desmitiem vienlaicÄ«gu ilgstoÅ”u SSE klientu (operatoriem bieži nepiecieÅ”ami 40–50) ir **atmiņas budžeta** jautājums — atbilstoÅ”i konfigurējiet kaudzi, primāros/rezerves slotus un `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` —, nevis stingrs produkta ierobežojums ā€œmaksimums 2ā€. Pārslogota kaudze joprojām noraida pieprasÄ«jumus ar atkārtojamu `503`, lai #7849 neatkārtotos. Lai **pavairotu kaudzes** (neatkarÄ«gas V8 vecās paaudzes atmiņas telpas) **jau Å”odien**: | Dariet | Nedariet | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | | Palaidiet **N konteinerus/podus**, katru ar **savu** `DATA_DIR` / sējumu | Neiestatiet `replicas > 1` vienam SQLite failam | | Nosakiet resursietilpÄ«go izpildē esoÅ”o pieprasÄ«jumu un veselÄ«gās rezerves apjomu pēc kaudzes / izpildē esoÅ”o baitu budžeta; 1–2 ir konservatÄ«vais #7849 noklusējums, nevis stingrs produkta maksimums | NepieŔķiriet vienam procesam 8Ɨ RAM un neierobežotu skaita limitu | | Pēc izvēles: `QUOTA_STORE_DRIVER=redis` + `QUOTA_STORE_REDIS_URL` **koplietojamiem kvotu skaitÄ«tājiem** | Neuzskatiet Redis par koplietojamu SQLite — tas tāds nav | | Dublējiet pakalpojumu sniedzēju noslēpumus katrā instancē (vai samierinieties ar nodalÄ«tiem informācijas paneļiem) | Negaidiet vienu informācijas paneli / vienu izsaukumu žurnālu visām instancēm | | Izvietojiet priekŔā jebkuru slodzes lÄ«dzsvarotāju; pietiek ar piesaisti pēc API atslēgas vai sesijas | Neprasiet piegādātājam specifisku, izmēru ņemoÅ”u vērā starpprogrammatÅ«ru | AparatÅ«ra: katras instances vienlaicÄ«go ilgstoÅ”o `/v1/responses` skaits ir **atmiņas budžeta** jautājums (kaudze + izpildē esoÅ”o baitu budžets / #10110). `N` neatkarÄ«gi `DATA_DIR` joprojām pavairo kaudzes: resursdatora RAM jāspēj nodroÅ”ināt `N Ɨ cgroup`, nevis ā€œviens 16 Gi pods ar N=8ā€. Nekad neizmantojiet `replicas > 1` vienam SQLite failam. Compose skice (divas kaudzes, divi sējumi — nevis `deploy.replicas: 2`): ```yaml services: omniroute-a: image: diegosouzapw/omniroute:3.8.49 environment: DATA_DIR: /app/data OMNIROUTE_MEMORY_MB: "12288" QUOTA_STORE_DRIVER: redis QUOTA_STORE_REDIS_URL: redis://redis:6379 volumes: [omniroute-a-data:/app/data] ports: ["20128:20128"] omniroute-b: image: diegosouzapw/omniroute:3.8.49 environment: DATA_DIR: /app/data OMNIROUTE_MEMORY_MB: "12288" QUOTA_STORE_DRIVER: redis QUOTA_STORE_REDIS_URL: redis://redis:6379 volumes: [omniroute-b-data:/app/data] ports: ["20138:20128"] volumes: omniroute-a-data: omniroute-b-data: ``` Procesa iekŔējais blÄ«vums (kompresija ārpus HTTP izolāta) ir aprakstÄ«ts [#11023](https://github.com/diegosouzapw/OmniRoute/issues/11023). Viens loÄ£isks klasteris ar koplietojamu pastāvÄ«go stāvokli ir aprakstÄ«ts [#8075](https://github.com/diegosouzapw/OmniRoute/issues/8075). ## SvarÄ«gas piezÄ«mes - **SQLite WAL režīms:** Komandai `docker stop` jāļauj pabeigt darbÄ«bu, lai OmniRoute varētu ierakstÄ«t jaunākās izmaiņas atpakaļ failā `storage.sqlite`, izveidojot kontrolpunktu. Komplektācijā iekļautajos Compose failos jau ir iestatÄ«ts 40 s apturēŔanas labvēlÄ«bas periods. Ja palaižat attēlu tieÅ”i, saglabājiet `--stop-timeout 40`. - **`DISABLE_SQLITE_AUTO_BACKUP`:** Iestatiet uz `true`, ja regulārās/pirmsieraksta dublējumkopijas tiek pārvaldÄ«tas ārēji. EsoÅ”as datubāzes migrācijām joprojām ir nepiecieÅ”ams atseviŔķs droÅ”s un noturÄ«gs momentuzņēmums, kā arÄ« masveida migrācijas aizsargmehānisms. - **Datu pastāvÄ«ga glabāŔana:** Vienmēr montējiet sējumu mapē `/app/data`, lai saglabātu datubāzi, atslēgas un konfigurācijas pēc konteineru restartēŔanas. - **Porta konfigurācija:** Pārrakstiet vides mainÄ«go `PORT`, lai mainÄ«tu noklusējuma portu `20128`. ## Skatiet arÄ« - [VM izvietoÅ”anas ceļvedis](../ops/VM_DEPLOYMENT_GUIDE.md) — VM + nginx + Cloudflare iestatīŔana - [Fly.io izvietoÅ”anas ceļvedis](../ops/FLY_IO_DEPLOYMENT_GUIDE.md) — IzvietoÅ”ana platformā Fly.io - [Vides konfigurācija](../reference/ENVIRONMENT.md) — PilnÄ«ga `.env` atsauce