# 🐳 Docker Guide — OmniRoute (Svenska) 🌐 **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) · đŸ‡±đŸ‡» [lv](../../../lv/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) · 🇰đŸ‡Ș [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) --- > FullstĂ€ndig referens för Docker-distribution. För en snabbstart, se [Docker-avsnittet i README](../README.md#-docker). ## InnehĂ„llsförteckning - [Snabbkörning](#quick-run) - [Med miljöfil](#with-environment-file) - [Docker Compose](#docker-compose) - [TillgĂ€ngliga profiler](#available-profiles) - [Konfigurera CLI-verktyg pĂ„ vĂ€rden nĂ€r OmniRoute körs i Docker](#configuring-host-cli-tools-when-omniroute-runs-in-docker) - [Redis-sidecar](#redis-sidecar) - [Compose för produktion](#production-compose) - [Dockerfile-steg](#dockerfile-stages) - [Kritiska miljövariabler](#critical-environment-variables) - [Docker Compose med Caddy (HTTPS)](#docker-compose-with-caddy-https-auto-tls) - [Snabb Cloudflare-tunnel](#cloudflare-quick-tunnel) - [Avbildningstaggar](#image-tags) - [Dashboard-uppdateringar i Docker](#dashboard-updates-in-docker) - [TillgĂ€nglighet: SQLite Ă€r som standard begrĂ€nsat till en replik](#availability-default-sqlite-is-single-replica) - [Regionala Gemini-fel i Docker](#gemini-regional-errors-inside-docker) - [Viktiga anmĂ€rkningar](#important-notes) --- ## Snabbkörning > **SjĂ€lvhosta med ett enda kommando?** Se > [guiden för sjĂ€lvhosting](../getting-started/SELF_HOST_GUIDE.md) — > `docker compose -f docker-compose.selfhost.yml up -d` (publicerad avbildning + > Redis, endast loopback, inget profilval). Snabbkörningen nedan Ă€r alternativet > med en enda container för anvĂ€ndare som redan kör Redis nĂ„gon annanstans. ```bash docker run -d \ --name omniroute \ --restart unless-stopped \ --stop-timeout 40 \ -p 20128:20128 \ -v omniroute-data:/app/data \ diegosouzapw/omniroute:latest ``` ## Med miljöfil ```bash # Kopiera och redigera .env först 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 # Basprofil (inga CLI-verktyg) docker compose --profile base up -d # CLI-profil (Claude Code, Codex och OpenClaw inbyggda) docker compose --profile cli up -d # VĂ€rdprofil (frĂ€mst för Linux; monterar vĂ€rdens CLI-binĂ€rfiler skrivskyddat) docker compose --profile host up -d # Webbprofil (Chromium/Playwright för leverantörer med webbsessioner) docker compose --profile web up -d # Kombinera CLI + CLIProxyAPI-sidecar docker compose --profile cli --profile cliproxyapi up -d ``` ## TillgĂ€ngliga profiler OmniRoute tillhandahĂ„ller Compose-profiler för de huvudsakliga distributionsvarianterna. VĂ€lj den som passar din miljö. | Profil | TjĂ€nst | NĂ€r den ska anvĂ€ndas | Kommando | | ----------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | | `base` (standard) | `omniroute-base` | Headless-server/minimal körmiljö, inga CLI-verktyg för leverantörer medföljer | `docker compose --profile base up -d` | | `cli` | `omniroute-cli` | Agentbaserade arbetsflöden som anropar `omniroute providers/setup/doctor` och medföljande CLI-verktyg (Codex, Claude Code, Droid, OpenClaw) | `docker compose --profile cli up -d` | | `host` | `omniroute-host` | Linux-vĂ€rdar som vill ha `network_mode`-liknande Ă„tkomst till vĂ€rdens CLI-verktyg genom att montera `~/.local/bin`, `~/.codex`, `~/.claude` osv. skrivskyddat | `docker compose --profile host up -d` | | `cliproxyapi` | `cliproxyapi` | Kör [CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI) som sidecar pĂ„ port `8317` för proxyhantering till uppströms CLI-verktyg | `docker compose --profile cliproxyapi up -d` | | `web` | `omniroute-web` | Leverantörer med webbsessioner som behöver en webblĂ€sare: `gemini-web`, `claude-web`, `claude-turnstile` (bygger `runner-web`, Chromium ingĂ„r) | `docker compose --profile web up -d` | > Flera profiler kan kombineras: `docker compose --profile cli --profile cliproxyapi up -d`. ## Konfigurera vĂ€rdens CLI-verktyg nĂ€r OmniRoute körs i Docker `omniroute setup-codex`, `setup-claude`, `config set ` och knappen **Spara konfiguration** pĂ„ kontrollpanelen skriver alla filer som `~/.codex/*.config.toml`. Dessa sökvĂ€gar har endast betydelse pĂ„ den dator dĂ€r CLI:t faktiskt körs. Om du kör dem inuti containern hamnar skrivningen i containerns egen hemkatalog (`/home/node` — avbildningen kör `USER node`), dĂ€r inget CLI pĂ„ vĂ€rden nĂ„gonsin kommer att lĂ€sa den och dĂ€r den försvinner sĂ„ fort containern Ă„terskapas. OmniRoute upptĂ€cker detta och nekar skrivningen med instruktioner i stĂ€llet för att rapportera en lyckad Ă„tgĂ€rd som du inte kan anvĂ€nda: CLI:t avslutas med `2` och API:t svarar `422` med `containerEphemeralTarget: true`. ### Rekommenderat: kör CLI:t pĂ„ vĂ€rden och OmniRoute i Docker Containern tillhandahĂ„ller API:t, medan CLI:t konfigurerar dina verktyg pĂ„ vĂ€rden. ```bash docker compose --profile base up -d npm install -g omniroute omniroute connect http://localhost:20128 # rikta CLI:t mot containern omniroute setup-codex # skriver till den faktiska ~/.codex pĂ„ din vĂ€rd ``` Det hĂ€r Ă€r rĂ€tt val nĂ€r Codex, Claude Code, Cursor eller liknande körs pĂ„ din bĂ€rbara dator — vilket Ă€r den vanligaste konfigurationen. ### Alternativ: bind-montera vĂ€rdens konfigurationskataloger (`host`-profilen) Om du vill att containern sjĂ€lv ska skriva vĂ€rdens konfiguration monterar du katalogerna och stĂ€ller in `CLI_CONFIG_HOME` pĂ„ monteringens rotkatalog. `host`-profilen gör redan detta: ```yaml environment: - CLI_CONFIG_HOME=/host-home - CLI_ALLOW_CONFIG_WRITES=true volumes: - ~/.codex:/host-home/.codex:rw - ~/.claude:/host-home/.claude:rw ``` Det Ă€r bind-monteringen som gör sökvĂ€gen tillförlitlig: OmniRoute lĂ€ser `/proc/self/mountinfo` och tillĂ„ter skrivningar till monterade sökvĂ€gar (och till kataloger vars underkataloger Ă€r monteringar, vilket Ă€r exakt strukturen för `/host-home` ovan), samtidigt som skrivningar till omonterade sökvĂ€gar fortfarande nekas. ### Nödlösning: konfigurera containerns egna CLI:er (anvĂ€nd sparsamt) NĂ€r CLI:erna faktiskt finns inuti containern (`cli`-profilen) Ă€r skrivningen avsiktlig. Ange `--allow-container-write` för valfritt `setup-*`-kommando eller stĂ€ll in `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE=true` för servern. Skrivningen genomförs med en varning om att den inte kommer att finnas kvar efter att containern har Ă„terskapats. > **SĂ€kerhetsvarning — `cli`-profilen + montering av `docker.sock`.** > `cli`-profilen bind-monterar `/var/run/docker.sock` sĂ„ att den automatiska > uppdateraren i containern kan Ă„terskapa stacken via vĂ€rdens demon > (`src/lib/system/autoUpdate.ts` söker efter denna socket och hoppar över > Docker-sökvĂ€gen nĂ€r den saknas). Denna socket Ă€r **en förtroendegrĂ€ns med > root-behörighet pĂ„ vĂ€rden**: allt som kan nĂ„ den styr vĂ€rdens Docker-demon som > root — det kan skapa, inspektera, stoppa och ta bort valfri container pĂ„ vĂ€rden. > Konsekvenser: > > 1. **Exponera aldrig `cli`-profilens port mot nĂ€tverket.** Publicera > den pĂ„ `127.0.0.1` (`ports: "127.0.0.1:${DASHBOARD_PORT:-20128}:..."`) > — en `cli`-profil som kan nĂ„s via LAN förvandlar all RCE pĂ„ kontrollpanelsnivĂ„ till > fullstĂ€ndig kompromettering av vĂ€rden. > 2. **Bind-montera inga ytterligare kataloger frĂ„n vĂ€rden i `cli`-profilen.** > Docker-socketen tillsammans med ytterligare en montering ger containern fullstĂ€ndig > lĂ€s- och skrivĂ„tkomst till ditt filsystem och vĂ€rdens konfiguration. Om ett verktyg behöver > komma Ă„t ett projekt ska du köra det lokalt med CLI-binĂ€rfilen — montera inte in det > i `cli`-containern. > > Om du inte behöver automatisk uppdatering inifrĂ„n containern ska du lĂ„ta `cli`-profilen vara avstĂ€ngd > (`COMPOSE_PROFILES=core,redis` eller kortare). De andra profilerna monterar inte > Docker-socketen. > > Se `docs/security/MITM-TPROXY-DECRYPT.md` (git; kompileras inte till `/docs`) för den relaterade hotmodellen > kring MITM och `docs/security/SUPPLY_CHAIN.md` för > ursprungskedjan för binĂ€rfilerna `codex`/`claude-code`/`droid`/`openclaw`. ## Redis-sidecar OmniRoute förlitar sig pĂ„ Redis för den distribuerade hastighetsbegrĂ€nsaren och den delade cachen. TjĂ€nsten `redis` Ă€r **alltid definierad** i `docker-compose.yml` (den Ă€r inte begrĂ€nsad till nĂ„gon profil) och startar tillsammans med alla andra profiler. | Detalj | VĂ€rde | | ---------------------------- | --------------------------------------------- | | Avbildning | `redis:7-alpine` | | BehĂ„llarnamn | `omniroute-redis` | | Intern port | `6379` | | VĂ€rdport (Ă„sidosĂ€ttning) | `REDIS_PORT` (standardvĂ€rde `6379`) | | VĂ€rdbindning (Ă„sidosĂ€ttning) | `REDIS_BIND_HOST` (standardvĂ€rde `127.0.0.1`) | | Volym | `omniroute-redis-data` → `/data` | | HĂ€lsokontroll | `redis-cli ping` (10 s intervall) | Relaterade miljövariabler: - `REDIS_URL` — anslutningsstrĂ€ng som injiceras i appen (`redis://redis:6379` som standard). - `REDIS_PORT` — portmappning pĂ„ vĂ€rdsidan för Redis-behĂ„llaren. - `REDIS_BIND_HOST` — vĂ€rdgrĂ€nssnittet som porten publiceras pĂ„. StandardvĂ€rdet Ă€r `127.0.0.1`. > **Varför loopback anvĂ€nds som standard:** sidecar-behĂ„llaren körs utan `requirepass`, och appens > behĂ„llare nĂ„r den via Compose-nĂ€tverket (`redis:6379`) — den publicerade porten finns > endast för verktyg pĂ„ vĂ€rdsidan (`redis-cli`, ett lokalt `npm run dev`). Publicering pĂ„ > `0.0.0.0` skulle exponera en Redis-instans utan autentisering för alla vĂ€rdar i ditt lokala nĂ€tverk. Om du anger > `REDIS_BIND_HOST=0.0.0.0` ska du Ă€ven lĂ€gga till `--requirepass` i tjĂ€nstens `command:`. **Att inaktivera Redis** rekommenderas inte (hastighetsbegrĂ€nsaren degraderas till en reservlösning i minnet). Om du mĂ„ste göra det kan du antingen ta bort eller kommentera tjĂ€nstblocket `redis:` i `docker-compose.yml` eller skala ned det till noll: ```bash docker compose up -d --scale redis=0 ``` ## Compose för produktion För en isolerad produktionsögonblicksbild som körs parallellt med utvecklingsmiljön anvĂ€nder du `docker-compose.prod.yml`. | Detalj | VĂ€rde | | -------------------------- | -------------------------------------------------------------------------------------- | | Fil | `docker-compose.prod.yml` | | Standardport för dashboard | `PROD_DASHBOARD_PORT=20130` (mappad till interna `${DASHBOARD_PORT:-20128}`) | | Standardport för API | `PROD_API_PORT=20131` | | Avbildning | `omniroute:prod` (byggd frĂ„n mĂ„let `runner-cli`) | | Redis-behĂ„llare | `omniroute-redis-prod` (`redis:8.6.2`, dedikerad volym `redis-prod-data`) | | Datavolym | `omniroute-prod-data` (namngiven, bevaras mellan ombyggnader) | | HĂ€lsokontroller | `node healthcheck.mjs` + `redis-cli ping`, dĂ€r `depends_on` styrs av Redis hĂ€lsostatus | SĂ„ hĂ€r anvĂ€nder du den: ```bash # Bygg och starta produktionsstacken docker compose -f docker-compose.prod.yml up -d --build # Strömma loggar docker compose -f docker-compose.prod.yml logs -f # StĂ€ng ned (behĂ„ll volymer) docker compose -f docker-compose.prod.yml down ``` Produktionsstacken körs parallellt med utvecklingsmiljöns Compose-stack (med andra behĂ„llarnamn, portar och volymer), sĂ„ att du kan fortsĂ€tta iterera lokalt medan produktionsmiljön Ă€r igĂ„ng. ## Dockerfile-steg Repositoriet levereras med en Dockerfile i flera steg (`Dockerfile`). Fyra steg exponeras; vĂ€lj rĂ€tt `target` för ditt anvĂ€ndningsfall. | Steg | Basavbildning | Syfte | | ------------- | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `builder` | `node:26-trixie-slim` | Installerar beroenden (`npm ci --legacy-peer-deps`) och kör `npm run build` (Turbopack som standard — se Byggresurser nedan) | | `runner-base` | `node:26-trixie-slim` | Produktionskörmiljö med fristĂ„ende utdata frĂ„n Next.js. **Inga leverantörs-CLI:er medföljer.** | | `runner-cli` | `runner-base` | LĂ€gger till `git`, `docker.io`, `docker-compose` och globala CLI:er: `@openai/codex`, `@anthropic-ai/claude-code`, `droid`, `openclaw`. **VĂ€lj detta för agentbaserade arbetsflöden.** | | `runner-web` | `runner-base` | LĂ€gger till Playwright och en Chromium-webblĂ€sare (`--with-deps`) för webbsessionsleverantörer: `gemini-web`, `claude-web`, `claude-turnstile`. **VĂ€lj detta nĂ€r du anvĂ€nder dessa leverantörer** — den vanliga avbildningen misslyckas vid begĂ€ran utan det (se anmĂ€rkningen om `-web` under Utgivningskanaler). | Bygg ett specifikt mĂ„l manuellt: ```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 . ``` ### Byggresurser Tre byggargument styr resursförbrukningen för steget `builder`. De gĂ€ller endast vid byggtid — `OMNIROUTE_MEMORY_MB` (nedan) Ă€r en separat instĂ€llning för körning. | Byggargument | StandardvĂ€rde | Effekt | | --------------------------- | ------------- | ------------------------------------------------------------------------------------------ | | `OMNIROUTE_USE_TURBOPACK` | `0` | `0` bygger med webpack: lĂ€gre minnestopp, lĂ„ngsammare. `1` aktiverar Turbopack. | | `OMNIROUTE_BUILD_MEMORY_MB` | `6144` | Övre grĂ€ns för V8-heapen (`--max-old-space-size`) för den startade `next build`-processen. | | `OMNIROUTE_BUILD_WORKERS` | `2` | Anger `CIRCLE_NODE_TOTAL`; Next hĂ€rleder `workers = N - 1` för insamling av siddata. | `OMNIROUTE_BUILD_WORKERS` Ă€r den instĂ€llning som ska höjas pĂ„ en kraftfull byggserver och den som bör misstĂ€nkas nĂ€r en resursbegrĂ€nsad byggprocess dör **efter** `✓ Compiled successfully`. Varje siddata-worker Ă€r en egen process, liksom den överordnade `next build`-processen; en reproduktion pĂ„ en aktiv VPS (Ă€rende #7518) uppmĂ€tte varje process maximala RSS till ~4,5 GB oberoende av heap-flaggan i `NODE_OPTIONS` (Turbopack kompilerar i inbyggt/Rust-minne utanför V8-heapen). StandardvĂ€rdet `2` (→ 1 worker, totalt 2 processer) Ă€r dimensionerat för de GitHub-hanterade körarna med 16 GB/4 vCPU som publiceringspipelinen anvĂ€nder. Med `8` (→ 7 workers) fick köraren slut pĂ„ minne och buildkit misslyckades med steget med `ResourceExhausted: ... cannot allocate memory`; `3` (→ 2 workers) fick fortfarande inte plats nĂ€r RSS per process mĂ€ttes direkt i stĂ€llet för att uppskattas. `tests/unit/docker-build-memory-budget.test.ts` utför berĂ€kningen utifrĂ„n det uppmĂ€tta vĂ€rdet och misslyckas om nĂ„gon av instĂ€llningarna överskrider körarens kapacitet. Turbopack kompilerar i inbyggt Rust-minne som ligger **utanför** V8-heapen, sĂ„ `OMNIROUTE_BUILD_MEMORY_MB` begrĂ€nsar det inte. PĂ„ en vĂ€rd med ett minnestak SIGKILL-avslutas bygget dĂ„ av OOM-avslutaren helt utan feltext — det stannar helt enkelt mitt under `Creating an optimized production build`, vilket ser ut som att processen har hĂ€ngt sig snarare Ă€n att minnet har tagit slut. DĂ€rför anvĂ€nder `Dockerfile` webpack som standard (`OMNIROUTE_USE_TURBOPACK=0`), till skillnad frĂ„n `npm run dev` / `npm run build`, dĂ€r Turbopack Ă€r kodens standardval: en ren `docker build .` utan byggargument (vilket Railway och andra vĂ€rdtjĂ€nster med ettklicksinstallation kör) fĂ„r inte dö tyst pĂ„ en minnesbegrĂ€nsad byggserver. De publicerade avbildningarna skickar redan uttryckligen `OMNIROUTE_USE_TURBOPACK=0` i `docker-publish.yml`. PĂ„ en byggserver med gott om RAM kan du aktivera Turbopack för ett snabbare bygge: ```bash docker build --target runner-base \ --build-arg OMNIROUTE_USE_TURBOPACK=1 \ -t omniroute:base . ``` `webpackBuildWorker` Ă€r aktiverat, sĂ„ `next build` kör en överordnad process **och** en worker- process, och bĂ„da följer `OMNIROUTE_BUILD_MEMORY_MB` separat. SĂ€tt containerns minnestak till ungefĂ€r det dubbla vĂ€rdet eller mer, inte samma vĂ€rde. UppmĂ€tt i detta trĂ€d (`--target runner-base`, `OMNIROUTE_BUILD_MEMORY_MB=6144`): | Paketerare | Containerns minnestak | Resultat | | ---------- | --------------------- | ----------------------------------------- | | Turbopack | 8 GiB / 16 GiB | OOM-avslutad vid bĂ„da, utan felmeddelande | | webpack | 8 GiB | bygg-workern SIGKILL-avslutades | | webpack | 12 GiB | lyckades, nĂ„dde en topp pĂ„ 11,1 GiB | ### StandardvĂ€rden vid körning StandardvĂ€rden som exporteras av `runner-base`: `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`. Minnesbeteende i Docker: - Avbildningen stĂ€ller in `OMNIROUTE_MEMORY_MB=1024` och hĂ€rleder `NODE_OPTIONS=--max-old-space-size=1024` frĂ„n den. - Den faktiska serverprocessen startas av den fristĂ„ende startaren, som lĂ€ser `OMNIROUTE_MEMORY_MB` och lĂ€gger till `--max-old-space-size=`. - Node anvĂ€nder det sista upprepade vĂ€rdet för `--max-old-space-size`, sĂ„ genom att stĂ€lla in `OMNIROUTE_MEMORY_MB` styr du den effektiva heapgrĂ€nsen i Docker. - Eftersom avbildningen alltid stĂ€ller in variabeln anvĂ€nds aldrig startarens egen RAM-kalibrerade reservlösning under Docker. Höj den uttryckligen för arbetsbelastningen (se tabellen nedan). `2048` Ă€r fortfarande för lite för kodningsagenters `/v1/responses`. ### RAM vid körning för kodningsagenter Dockers standardvĂ€rde pĂ„ 1 GiB Ă€r en miniminivĂ„ för instrumentpanel och enkel chatt, inte en storlek för produktionsbruk. LĂ„nga `POST /v1/responses`-kroppar (hundratals meddelanden, tiotals verktyg) behĂ„ller flera grafer i minnet under komprimering. TvĂ„ överlappande begĂ€randen pĂ„ ~3 MiB/~750k token har fĂ„tt V8 att avbryta vid ett old space pĂ„ **12 GiB** (`FATAL ERROR: Reached heap limit`) och har Ă€ven orsakat cgroup-OOM vid 16 GiB. Se [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849). Dimensionera **cgroup `--memory` högre Ă€n heapen** — interna buffertar, SQLite och mellanliggande komprimeringsdata ligger utanför V8. | Arbetsbelastning | `OMNIROUTE_MEMORY_MB` | BehĂ„llare/cgroup | AnmĂ€rkningar | | ---------------------------------------- | ------------------------------------ | ------------------- | ---------------------------------------------------------------------------------------------------------- | | Instrumentpanel, en enkel chatt | `1024` (avbildningens standardvĂ€rde) | ≄2 GiB | | | En kodningsagent (Claude/Codex/Grok) | `8192` | ≄10 GiB | Typisk `/v1/responses` för en enskild session | | TvĂ„ samtidiga lĂ„nga `/v1/responses` | `10240`–`12288` | ≄12–16 GiB | UppmĂ€tt V8-avbrott vid ~12 GiB heap | | Tre eller fler samtidiga lĂ„nga kontexter | kör inte i en enda process | serialisera/mer RAM | StandardgrĂ€nsen för resurskrĂ€vande begĂ€randen Ă€r 1 pĂ„gĂ„ende; att höja den utan mer RAM Ă„terinför avbrottet | `omniroute serve` pĂ„ fysisk maskin kalibrerar till ~35 % av RAM-minnet (begrĂ€nsat till `[512, 4096]`) nĂ€r `OMNIROUTE_MEMORY_MB` **inte Ă€r instĂ€lld**. Docker stĂ€ller alltid in den pĂ„ `1024`, sĂ„ den kalibreringen körs aldrig i den officiella avbildningen. ```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 ``` ## Kritiska miljövariabler Utöver standardvĂ€rdena som dokumenteras i [ENVIRONMENT.md](../reference/ENVIRONMENT.md) Ă€r följande variabler viktigast vid körning under Docker: | Variabel | Syfte | StandardvĂ€rde | | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | | `OMNIROUTE_WS_BRIDGE_SECRET` | Delad hemlighet för WebSocket-bryggan. **KrĂ€vs i produktion** — ange en stark slumpmĂ€ssig strĂ€ng. | ej angivet (mĂ„ste anges) | | `REDIS_URL` | AnslutningsstrĂ€ng för backend-tjĂ€nsten för hastighetsbegrĂ€nsning/cache | `redis://redis:6379` | | `REDIS_PORT` | Port pĂ„ vĂ€rddatorn för den medföljande Redis-containern | `6379` | | `REDIS_BIND_HOST` | VĂ€rdgrĂ€nssnittet som den medföljande Redis-porten publiceras pĂ„ (loopback om du inte lĂ€gger till AUTH) | `127.0.0.1` | | `AUTO_UPDATE_HOST_REPO_DIR` | SökvĂ€g pĂ„ vĂ€rddatorn som monteras i profilen `cli` vid `/workspace/omniroute` för arbetsflöden för sjĂ€lvuppdatering | `.` (aktuell katalog) | | `OMNIROUTE_MEMORY_MB` | Övre grĂ€ns för Nodes heap-minne vid körning av den fristĂ„ende Docker-servern; Ă„sidosĂ€tter avbildningens standardvĂ€rde ovan. Kodningsagenter: `8192`+ (se [RAM vid körning](#runtime-ram-for-coding-agents)). | `1024` | | `DASHBOARD_PORT` / `API_PORT` | ÅsidosĂ€tter exponerade portar för kontrollpanelen (20128) och API:t (20129) | `20128` / `20129` | | `APP_BIND_HOST` | VĂ€rdgrĂ€nssnittet som docker-compose publicerar portarna för kontrollpanelen/API:t/live-WS pĂ„. Med `REQUIRE_API_KEY=false` (standardvĂ€rdet) exponerar `0.0.0.0` den anonyma `/v1`-proxyn för LAN-nĂ€tverket — utöka endast med `REQUIRE_API_KEY=true` eller en omvĂ€nd proxy framför. | `127.0.0.1` | | `CLIPROXY_BIND_HOST` | VĂ€rdgrĂ€nssnittet som docker-compose publicerar sidovagnen `cliproxyapi` pĂ„ — dess datavolym innehĂ„ller leverantörsinloggningsuppgifter. | `127.0.0.1` | | `OMNIROUTE_PLUGINS_DIR` | Katalogen som insticksskannerfunktionen lĂ€ser frĂ„n och installerar i vid körning. Ange den nĂ€r insticksmoduler bind-monteras: standardvĂ€rdet följer `HOME`, som en avbildning inte nödvĂ€ndigtvis exporterar. | `~/.omniroute/plugins` | | `OMNIROUTE_BASE_PATH` | URL-undersökvĂ€g nĂ€r appen publiceras bakom en omvĂ€nd proxy (t.ex. `/omniroute`) | _(tomt = rot)_ | | `NEXT_PUBLIC_BASE_URL` | Publikt webblĂ€sarursprung inklusive undersökvĂ€gen (t.ex. `https://host/omniroute`) | ej angivet | | `PROD_DASHBOARD_PORT` | Port pĂ„ vĂ€rddatorn för kontrollpanelen i `docker-compose.prod.yml` | `20130` | | `CLIPROXYAPI_PORT` | Port pĂ„ vĂ€rddatorn för sidovagnen `cliproxyapi` | `8317` | ## OmvĂ€nd proxy pĂ„ en undersökvĂ€g (Traefik / nginx) Next.js `basePath` kompileras in i det fristĂ„ende paketet. OmniRoute registrerar det inbakade vĂ€rdet i en markörfil i appens rot (skrivs under `npm run build`; lĂ€ses av `scripts/docker/ensure-docker-base-path.mjs`) och jĂ€mför det med `OMNIROUTE_BASE_PATH` nĂ€r containern startar. NĂ€r de skiljer sig Ă„t och avbildningen byggdes för domĂ€nroten skriver startpunkten om de fristĂ„ende manifesten, de inbĂ€ddade literalerna för `basePath`/`assetPrefix` (Next 16 renderar SSR-resurs-URL:er enbart frĂ„n `assetPrefix` — patchverktyget speglar undersökvĂ€gen till det), de inbakade resurs-URL:erna för `/_next/static` (klientreferensmanifest, medieimporter, förrenderade felsidor) och klientens `process.env`-shim innan `node dev/run-standalone.mjs` körs. ### Bygg med Compose (rekommenderas) Ange bĂ„da variablerna i `.env` och bygg sedan om sĂ„ att avbildningen och körmiljön överensstĂ€mmer: ```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` vidarebefordrar `OMNIROUTE_BASE_PATH` som ett Docker-byggargument och som en miljövariabel vid körning. ### Förbyggd rotavbildning + undersökvĂ€g vid körning Publicerade `diegosouzapw/omniroute:*`-avbildningar Ă€r byggda för domĂ€nroten. Du kan fortfarande ange `OMNIROUTE_BASE_PATH` vid körning; containern patchar paketet en gĂ„ng vid start. Kombinera det med matchande publik origin: ```yaml services: omniroute: image: diegosouzapw/omniroute:latest environment: OMNIROUTE_BASE_PATH: /omniroute NEXT_PUBLIC_BASE_URL: https://myhostname.example.com/omniroute ``` Konfigurera den omvĂ€nda proxyn sĂ„ att den vidarebefordrar den **fullstĂ€ndiga** externa sökvĂ€gen (ta inte bort prefixet). Traefik ska dirigera `PathPrefix(`/omniroute`)` till containern utan `StripPrefix`, sĂ„ att Next.js tar emot `/omniroute/...` och levererar resurser frĂ„n `/omniroute/_next/...`. Dockers hĂ€lsokontroll sonderar den resurssnĂ„la livscykelslutpunkten `/healthz` med prefixet frĂ„n den aktiva `OMNIROUTE_BASE_PATH`. `/api/monitoring/health` Ă€r fortsatt tillgĂ€nglig för diagnostik avsedd för mĂ€nniskor och instrumentpaneler; för att lĂ„ta containerns HEALTHCHECK anvĂ€nda den igen (exempelvis för djup hĂ€lsokontroll), ange `OMNIROUTE_HEALTHCHECK_PATH=/api/monitoring/health`. Den sökvĂ€gen Ă€r en **djup** kontroll (databas + övervakningssammanfattning) — lĂ€mplig för Dockers sĂ€llan körda `HEALTHCHECK` om du vĂ€ljer att Ă„teraktivera den, men **inte** för intervallen i Kubernetes `livenessProbe`. För orkestrerare (Kubernetes, Nomad osv.): | Sond | Föredra | Undvik | | --------------- | --------------------------------------------------------------------- | ------------------------------------------------------------- | | Livstecken | HTTP `GET /livez` eller TCP pĂ„ huvudporten (`PORT`, standard `20128`) | `/api/monitoring/health` som livsteckenskontroll | | Redo | HTTP `GET /healthz` | Korta tidsgrĂ€nser som tolkar en upptagen hĂ€ndelseloop som död | | Djup / blackbox | `/api/monitoring/health` | — | `/healthz` rapporterar processens livscykel (`ok` / `starting` / `stopping`). `/livez` kontrollerar endast att processen lever (200 nĂ€r hanteraren kan köras; den vĂ€ntar inte pĂ„ att processen ska bli redo). BĂ„da körs fortfarande i samma Node-hĂ€ndelseloop som begĂ€ranhanteringen, sĂ„ CPU-bundet katalog- eller komprimeringsarbete kan fördröja dem — upptagen ≠ död. Föredra TCP-baserad livsteckenskontroll om HTTP-sonder nĂ„r sin tidsgrĂ€ns. FullstĂ€ndig vĂ€gledning för sonder: [Övervakningsguide — rekommendationer för Kubernetes-sonder](../ops/MONITORING_GUIDE.md#kubernetes-probe-recommendations). ## Docker Compose med Caddy (automatisk TLS för HTTPS) OmniRoute kan exponeras sĂ€kert med Caddys automatiska SSL-etablering. Se till att domĂ€nens DNS A-post pekar pĂ„ serverns IP-adress. ```yaml services: omniroute: image: diegosouzapw/omniroute:latest container_name: omniroute restart: unless-stopped volumes: - omniroute-data:/app/data environment: - PORT=20128 # Ursprung som webblĂ€saren anvĂ€nder för OAuth-Ă„teranrop, instrumentpanelslĂ€nkar och genererade offentliga URL:er. - NEXT_PUBLIC_BASE_URL=https://your-domain.com # Intern URL frĂ„n server till server för schemalagda jobb/egna anrop. - 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 anger standardrubrikerna för vidarebefordran till uppströmsbehĂ„llaren. OmniRoute anvĂ€nder `NEXT_PUBLIC_BASE_URL` som det kanoniska offentliga ursprunget för OAuth-Ă„teranrop och genererade offentliga lĂ€nkar. Autentiserade skrivningar frĂ„n instrumentpanelen anvĂ€nder förfrĂ„gningar med samma ursprung samt sessionsbunden CSRF- skydd. Aktivera endast `OMNIROUTE_TRUST_PROXY` för avancerade distributioner dĂ€r du avsiktligt vill att OmniRoute ska hĂ€rleda det offentliga ursprunget frĂ„n betrodda vidarebefordringsrubriker i stĂ€llet för explicit konfiguration. ## Cloudflare Quick Tunnel Stöd för Docker-distributioner i instrumentpanelen omfattar en **Cloudflare Quick Tunnel** med ett klick under `Dashboard → Endpoints`. Vid den första aktiveringen hĂ€mtas `cloudflared` endast nĂ€r det behövs, en tillfĂ€llig tunnel till din aktuella `/v1`-slutpunkt startas och den genererade URL:en `https://*.trycloudflare.com/v1` visas direkt under din vanliga offentliga URL. Tunnelpaneler för slutpunkter (Cloudflare, Tailscale, ngrok) kan visas eller döljas under `Settings → Appearance` utan att det aktiva tunneltillstĂ„ndet Ă€ndras. ### Information om tunnlar - URL:er för Quick Tunnel Ă€r tillfĂ€lliga och Ă€ndras efter varje omstart. - Quick Tunnels Ă„terstĂ€lls inte automatiskt efter en omstart av OmniRoute eller behĂ„llaren. Aktivera dem igen frĂ„n instrumentpanelen nĂ€r det behövs. - Hanterad installation stöder för nĂ€rvarande Linux, macOS och Windows pĂ„ `x64` / `arm64`. - Hanterade Quick Tunnels anvĂ€nder som standard HTTP/2-transport för att undvika störande varningar om QUIC UDP-buffertar i begrĂ€nsade behĂ„llarmiljöer. Ange `CLOUDFLARED_PROTOCOL=quic` eller `auto` om du vill anvĂ€nda en annan transport. - Docker-avbildningar inkluderar systemets CA-rotcertifikat och skickar dem till hanterade `cloudflared`, vilket förhindrar TLS-förtroendefel nĂ€r tunneln initieras inuti behĂ„llaren. - Ange `CLOUDFLARED_BIN=/absolute/path/to/cloudflared` om du vill att OmniRoute ska anvĂ€nda en befintlig binĂ€rfil i stĂ€llet för att hĂ€mta en. ## Avbildningstaggar | Avbildning | Tagg | Storlek | Beskrivning | | ------------------------ | -------- | ------- | ------------------------------------------------------- | | `diegosouzapw/omniroute` | `latest` | ~250MB | Högsta **publicerade** stabila SemVer (inte git `main`) | | `diegosouzapw/omniroute` | `3.8.0` | ~250MB | FĂ€st den hĂ€r taggtypen för GitOps | Manifest för flera plattformar: inbyggt stöd för `linux/amd64` + `linux/arm64` (Apple Silicon, AWS Graviton, Raspberry Pi). Docker vĂ€ljer automatiskt den matchande arkitekturen. Ange `--platform linux/amd64` om du behöver tvinga AMD64-emulering pĂ„ ARM-vĂ€rdar. ### Utgivningskanaler OmniRoute publicerar separata Docker-kanaler för stabila utgĂ„vor, aktiv testning av utgivningsgrenar och utvecklingsversioner. | Kanal | KĂ€lla | FörĂ€nderlighet | Rekommenderad anvĂ€ndning | | ------------------------------- | ------------------------------------- | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------- | | `:` / `:-web` | Signerad/versionsnumrerad utgĂ„va | OförĂ€nderlig | Produktionsdistributioner som Ă€r fĂ€sta vid en exakt utgĂ„va | | `:latest` / `:latest-web` | Högsta **publicerade** stabila SemVer | FörĂ€nderlig stabil pekare | Följer stabila utgĂ„vor **efter** ett SemVer-publiceringsjobb – följer **inte** `main` eller outgivna incheckningar i `release/v*` | | `:next` / `:next-web` | Aktuell standardgren `release/v*` | FörĂ€nderlig förhandsutgivningspekare | Testning av korrigeringar som har lagts till i den aktiva utgivningsgrenen men Ă€nnu inte ingĂ„r i en stabil utgĂ„va | | `:main` / `:main-web` | Grenen `main` | FörĂ€nderlig utvecklingspekare | Endast utvecklings- och integrationstestning | #### Leverantörer med webbsessioner: `-web`-avbildningarna Varje kanal ovan finns Ă€ven som en `-web`-tagg (`:latest-web`, `:-web`, `:next-web`, `:main-web`), byggd frĂ„n steget `runner-web` – samma avbildning plus Playwright och webblĂ€saren Chromium. Den vanliga avbildningen levereras **utan** Chromium. `gemini-web`, `claude-web` och `claude-turnstile` behöver den. Felet skjuts upp och intrĂ€ffar inte vid uppstart: dessa leverantörer listar sina modeller och visas som anslutna i instrumentpanelen, och det Ă€r först den första förfrĂ„gan som misslyckas med ``` [500]: Det gick inte att lĂ€sa in den externa modulen playwright: Fel: Modulen kan inte hittas '/app/node_modules/playwright/node_modules/playwright-core/browsers.json' ``` Om du anvĂ€nder dessa leverantörer hĂ€mtar du `-web`-taggen för den kanal som du redan anvĂ€nder – inget annat Ă€ndras. För en npm/CLI-installation (ingen Docker-avbildning) Ă€r motsvarande del som saknas webblĂ€sarens binĂ€rfil: kör `npx playwright install chromium` pĂ„ vĂ€rden. #### AnvĂ€nda förhandsutgivningskanalen Kanalen `next` byggs om vid varje push till den aktuella standardgrenen `release/v*` och publiceras för bĂ„de AMD64 och ARM64. Äldre underhĂ„llsgrenar kan inte skriva över den. Kanalen tillhandahĂ„ller en hĂ€mtningsbar avbildning med korrigeringar som har slagits samman med den aktiva versionsgrenen innan nĂ€sta stabila tagg skapas. ```bash docker pull diegosouzapw/omniroute:next docker pull diegosouzapw/omniroute:next-web ``` För Docker Compose Ă„sidosĂ€tter du avbildningstaggen som anvĂ€nds av den valda profilen och hĂ€mtar och Ă„terskapar sedan tjĂ€nsten: ```yaml services: omniroute: image: diegosouzapw/omniroute:next ``` ```bash docker compose pull docker compose up -d ``` #### SĂ€kerhet och Ă„terstĂ€llning `next` Ă€r en flytande förhandsversionskanal. Den kan Ă€ndras vid varje push till den aktiva versionsgrenen och **stöds inte för produktionsbruk**. FĂ€st avbildningens digest medan du utvĂ€rderar ett specifikt bygge: ```bash docker pull diegosouzapw/omniroute:next docker image inspect diegosouzapw/omniroute:next --format '{{index .RepoDigests 0}}' ``` SĂ€kerhetskopiera OmniRoutes datavolym eller bind-monterade datakatalog innan du testar. För att Ă„terstĂ€lla gĂ„r du tillbaka till den tidigare anvĂ€nda stabila versionen eller digesten och Ă„terskapar containern: ```bash docker pull diegosouzapw/omniroute: docker compose up -d ``` Ett bygge frĂ„n en versionsgren kan aldrig flytta `latest`; endast en kvalificerad stabil semantisk version fĂ„r uppdatera den stabila pekaren. `next`-avbildningarna behĂ„ller granskningen av versionsavbildningen och den blockerande kontrollen för CRITICAL-sĂ„rbarheter. **`latest` garanterar inte aktualitet i förhĂ„llande till git.** Sammanslagna korrigeringar i `main` eller i den aktiva grenen `release/v*` finns **inte** i `:latest` förrĂ€n en stabil SemVer-avbildning har publicerats och publiceringsjobbet uppdaterar `:latest` (samma digest som denna SemVer). Om `latest` verkar ha fastnat medan GitHub redan visar korrigeringen kan du hĂ€mta `:next` för att testa versionsgrenen eller vĂ€nta pĂ„ SemVer-taggen. | Du vill | AnvĂ€nd | | ----------------------------------------------------------------------------------- | ------------------------------------------ | | GitOps/produktion som inte fĂ„r avvika | FĂ€st `:X.Y.Z` (eller avbildningens digest) | | Följa publicerade stabila versioner och acceptera ett Ă„terskapande vid varje utgĂ„va | `:latest` | | Testa opublicerade commits i `release/v*` | `:next` (inte för produktion) | | Testa `main` | `:main` (inte för produktion) | ## Uppdateringar frĂ„n instrumentpanelen i Docker En container frĂ„n en publicerad avbildning kan inte ersĂ€tta sig sjĂ€lv. NĂ€r OmniRoute upptĂ€cker att det körs inuti en container (ingen `.git`-utcheckning, inte en npm-installation) visar uppdateringsbannern pĂ„ startsidans instrumentpanel vĂ€rdkommandot som ska köras i stĂ€llet för npm/git-instruktionerna, tillsammans med en kopieringsknapp: ```bash docker compose pull omniroute && docker compose up -d --force-recreate omniroute ``` TjĂ€nstnamnet kommer frĂ„n `AUTO_UPDATE_SERVICE` (standardvĂ€rdet Ă€r `omniroute`, tjĂ€nsten i `docker-compose.selfhost.yml`). `pull` flyttar endast en flytande tagg (`latest`, `next`); med en fixerad `:X.Y.Z`-tagg mĂ„ste du först Ă€ndra taggen. ### Uppdateringar med ett klick via en utlösningsfil pĂ„ vĂ€rden För att **Uppdatera nu** ska fortsĂ€tta fungera utan att `/var/run/docker.sock` monteras (vilket ger containern root-Ă„tkomst pĂ„ vĂ€rden — se varningen för `cli`-profilen ovan), anger du `DOCKER_UPDATE_TRIGGER_FILE` för OmniRoute-tjĂ€nsten och kör en bevakare pĂ„ vĂ€rden: ```yaml services: omniroute: environment: DOCKER_UPDATE_TRIGGER_FILE: /app/data/update/docker-update.request volumes: - ./data:/app/data ``` SökvĂ€gen mĂ„ste finnas inuti `DATA_DIR` (relativa vĂ€rden matchas mot den); allt annat avvisas. **Uppdatera nu** skriver sedan `{ "requestedAt": "...", "targetVersion": "X.Y.Z" }` till den filen, svarar med `202` och instrumentpanelen anropar regelbundet `/api/system/version` tills den nya versionen Ă€r aktiv och lĂ€ser sedan in sidan igen. OmniRoute kör aldrig ett skal- eller Docker-kommando i det hĂ€r lĂ€get. Precis som för alla uppdateringsĂ„tgĂ€rder godtas begĂ€ran endast frĂ„n loopback-/LAN-klienter. En bind-monterad datakatalog ger vĂ€rden en stabil sökvĂ€g att bevaka. Exempel pĂ„ `systemd`-enheter (anpassa `/srv/omniroute` till katalogen som innehĂ„ller din compose-fil och `data/`): ```ini # /etc/systemd/system/omniroute-update.path [Unit] Description=Bevaka uppdateringsbegĂ€randen frĂ„n OmniRoutes instrumentpanel [Path] PathExists=/srv/omniroute/data/update/docker-update.request [Install] WantedBy=multi-user.target ``` ```ini # /etc/systemd/system/omniroute-update.service [Unit] Description=HĂ€mta och Ă„terskapa OmniRoute-containern [Service] Type=oneshot WorkingDirectory=/srv/omniroute ExecStartPre=/usr/bin/rm -f /srv/omniroute/data/update/docker-update.request ExecStart=/bin/sh -c 'docker compose pull omniroute || (sleep 15 && docker compose pull omniroute)' ExecStart=/usr/bin/docker compose up -d --force-recreate omniroute ``` ```bash sudo systemctl daemon-reload sudo systemctl enable --now omniroute-update.path ``` TjĂ€nsten tar bort begĂ€ran före hĂ€mtningen sĂ„ att en misslyckad körning inte skapar en loop. Utan `DOCKER_UPDATE_TRIGGER_FILE` behĂ„ller instrumentpanelen det manuella kommandoflödet. ## TillgĂ€nglighet: standard SQLite Ă€r en kopia Lager Docker / Kubernetes OmniRoute Ă€r** en nodprocess + en SQLite skrivare** . Hög tillgĂ€nglighet Ă€r** stöds inte** pĂ„ den topologin. | TvĂ„ng | Följd | | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Ensam författare | Do** inte** kör flera repliker mot samma SQLite fil. Det korrumperar DB. | | Återskapa / starta om / HEALTHCHECK kill | **Fullt avbrott** av SSE under flygning, dashboardsessioner och minnestillstĂ„nd. Varje ansluten klient tappar. Nya förfrĂ„gningar under det tomma slutpunktsfönstret fĂ„r en omvĂ€nd proxy**`502 Bad Gateway: Unknown error`** , inte OmniRoute JSON — klienter kan inte skilja detta frĂ„n ett leverantörsfel (#11015). | | Samma hĂ€ndelseloop som `/healthz` | En upptagen katalog eller kompressionsbock kan fördröja sonder; en kort timeout startar sedan om** endast** kopia. | **Sondmatris** (se Ă€ven [Kubernetes sondrekommendationer](../ops/MONITORING_GUIDE.md#kubernetes-probe-recommendations) ): | Sond | MĂ„l | AnvĂ€nd inte | | ---------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | Livlighet | TCP pĂ„ `PORT` (standard `20128`), eller mjuk HTTP `/healthz` | `/api/monitoring/health` | | Beredskap | HTTP `GET /healthz` | SnĂ€va timeouts som behandlar hĂ€ndelseslinga upptagen som död | | Djup / mĂ€nniskor | `/api/monitoring/health` | Automatiserad kubelet livlighet | **Uppgraderingar:** förvĂ€nta dig att varje session minskar. DrĂ€nera kunder om du kan; det finns ingen rullande uppdatering pĂ„ standard SQLite. Compose `restart: unless-stopped` plus Docker `HEALTHCHECK` kommer ocksĂ„ att ersĂ€tta den enda processen nĂ€r behĂ„llaren Ă€r ohĂ€lsosam – samma sprĂ€ngradie. FĂ€rdiga manifest och ett Helm-diagram live i `deploy/kubernetes/` och `deploy/helm/omniroute/` — se [Kubernetes-distributionsguiden](../ops/KUBERNETES_DEPLOYMENT_GUIDE.md). Kubernetes-utdrag för en** enstaka replika** (Återskapa krĂ€vs; höj inte `replicas` mot en SQLite -fil): ```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` sleep lĂ„ter kube slĂ€ppa tjĂ€nstens slutpunkter före SIGTERM sĂ„** ny** trafiken slutar drabba den döende processen. In-flight `/v1/responses` SSE drĂ€neras upp till `SHUTDOWN_TIMEOUT_MS` (standard 30s) via tungviktsleasingavtal (#11015). Nya förfrĂ„gningar som fortfarande nĂ„r processen fĂ„r `503` + `Retry-After: 5`. Återskapa tomt slutpunktsgap tills ersĂ€ttningen Ă€r klar förblir ett hĂ„rt avbrott – det vill sĂ€ga SQLite topologin, inte en felkonfiguration av sond. Extern Postgres / multi-writer HA Ă€r** inte** en dokumenterad lagerbana. Om du behöver HA, behĂ„ll en enstaka replik eller kör en topologi som projektet har testat och dokumenterat separat. Postgres/MySQL verket bor i [#8075](https://github.com/diegosouzapw/OmniRoute/issues/8075). Tills det skickas, det enda stödda sĂ€ttet att föröka sig** stor** `/v1/responses` kapaciteten Ă€r N oberoende processer (nĂ€sta avsnitt), inte `replicas > 1` pĂ„ en volym. ## Skala ut: N oberoende processer ### Codex token rotation Ă€gande Kopior av ett Codex konto fĂ„r inte sjĂ€lvstĂ€ndigt konsumera dess engĂ„ngsuppdateringstoken. PĂ„ instanser som bara anvĂ€nder synkroniserade autentiseringsuppgifter, stĂ€ll in `OMNIROUTE_TOKEN_REFRESH_PASSIVE_PROVIDERS=codex` (alias `cx`). LĂ€mna den oinstĂ€lld pĂ„ Ă€garen av en rotation. Varje process behöver fortfarande sin egen `DATA_DIR`; det hĂ€r alternativet delar varken SQLite eller tillhandahĂ„ller tokensynkronisering eller ett distribuerat lĂ„s. Den passiva instansen lĂ€ser om anslutningen nĂ€r en uppdatering behövs och antar endast en annan, ej utgĂ„ngen Ă„tkomsttoken. Annars inaktiveras uppdateringen utan att upphöra eller inaktivera anslutningen eller rĂ€kna ett uppdateringsbrytarfel. Verkliga uppströms autentiseringsfel anvĂ€nder fortfarande normal felredovisning, exponentiell nedkylning och det normala klientfelet; avaktivering av kontot förblir permanent. Synkronisera Ă€garens roterade tokens innan Ă„tkomsttokens löper ut (standard proaktiv uppdateringsavledning Ă€r fem minuter), eller importera om Codex auth-filen. Passiv import lagrar de medföljande tokens utan att validera dem vid token-slutpunkten. Manuell dashboard/API refresh returnerar `409 refresh_disabled`; nya OAuth inloggningar Ă€r oförĂ€ndrade. Se [miljöreferens](../reference/ENVIRONMENT.md#passive-codex-token-refresh). En nodprocess Ă€r** en V8-hög** . TvĂ„ överlappande ~ 3 MiB / ~ 750k-token kodningsagent `POST /v1/responses` (RTK + Caveman) avbryter den högen vid ~ 12 Gi (`FATAL ERROR: Reached heap limit`) och kan OOM en 16 Gi cgrupp. Se [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849). Det mĂ„ttet Ă€r en** minnesbudget** varning, inte en produkt hĂ„rd-max av tvĂ„ samtidiga lĂ„nga `/v1/responses`. Tungviktschatt-tilltrĂ€de Ă€r gated av en automatiskt hĂ€rledd intag-byte-budget (`OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES`, `src/shared/middleware/admissionBudget.ts`) storleksmĂ€ssigt frĂ„n samma V8/cgroup tak — som Ă„sidosĂ€tter den uppĂ„t (eller stĂ€ller in den Ă€ldre `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` -begĂ€ranrĂ€kningsgrĂ€nsen) pĂ„ en process av redan storlek Ă„terinför avbrytningen. SmĂ„ chattar, `/healthz`, `/v1/models` och MCP Ă€r** inte** i den mössan. ### En process: mer Ă€n tvĂ„ lĂ„nga `/v1/responses` A** hĂ€lsosam** process (hög under `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO`, standard `0.75`)** maj** köra mer Ă€n tvĂ„ samtidiga lĂ„nga `POST /v1/responses` nĂ€r den processomfattande inflight-byte-budgeten (`OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110) fortfarande har utrymme. Organer pĂ„ eller över `OMNIROUTE_CHAT_LARGE_BODY_BYTES` (standard 256 KiB) tar samma tungviktsleasing som strukturtunga förfrĂ„gningar och anvĂ€nder samma [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) `tryAcquireHealthyHeadroom` escape (`OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`). Tiotals samtidiga lĂ„nga SSE klienter (operatörer behöver ofta 40–50) Ă€r en** minnesbudget** frĂ„ga — storlek heap + primary/headroom slots + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — inte en hĂ„rd "max 2" produktgrĂ€ns. En pressad hög fĂ€lls fortfarande med omprövningsbar `503` sĂ„ #7849 Ă„tervĂ€nder inte. Till** multiplicera högar** (oberoende V8 old-spaces)** i dag** : | Do | Gör inte det | | --------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | | Sikt** N containers/pods** , var och en med sin** egen** `DATA_DIR` / volym | StĂ€ll in `replicas > 1` mot en SQLite fil | | Storlek pĂ„ tung + -höghöjd under flygning frĂ„n hög-/bytebudget ombord; 1–2 Ă€r den konservativa #7849 standard, inte en hĂ„rd produkt max | Ge en process 8 × RAM och ett obegrĂ€nsat rĂ€knetak | | Valfritt: `QUOTA_STORE_DRIVER=redis` + `QUOTA_STORE_REDIS_URL` för** delade kvotrĂ€knare** | Behandla Redis som delad SQLite — Ă€r det inte | | Duplicera leverantörshemligheter i varje instans (eller acceptera partitionerade instrumentpaneler) | RĂ€kna med en instrumentpanel/en samtalslogg över instanser | | Fram med valfri lastbalanserare; sticky by API key eller session rĂ€cker | KrĂ€v en leverantörsspecifik storleksmedveten mellanprogramvara | Session-till-konto-affinitet kan ocksĂ„ delas via Redis: stĂ€ll in `OMNIROUTE_SESSION_AFFINITY_STORE=redis` och `REDIS_URL` pĂ„ varje process, med samma `REDIS_KEY_PREFIX` och en positiv `sessionAffinityTtlMs` instĂ€llning. Pins löser hashade anvĂ€ndningskontoidentiteter till varje processs kvalificerade lokala anslutning, sĂ„ OAuth konton med matchande identitetsmetadata behöver inte ha matchande anslutning IDs. KĂ€nda kontoidentiteter har företrĂ€de framför motsĂ€gelsefulla lokala IDs i pinupplösning och bevakad vrĂ€kning; poster utan identitet (eller vrĂ€kningsuppringare utan identitet) behĂ„ller den Ă€ldre ID vakten. Konton utan en stabil anvĂ€ndningsidentitet krĂ€ver fortfarande matchning av IDs. Redis fel eller samtal som överstiger 100 ms faller tillbaka till lokala SQLite. Varje Redis -affinitetsbutik begrĂ€nsar utestĂ„ende operationer till 8, förbigĂ„r Redis omedelbart nĂ€r den Ă€r full, och slĂ€pper platser endast nĂ€r det underliggande arbetet ordnar sig, inte vid deadline för uppringaren. Under ett Redis avbrott finns det ingen delad sanning: varje instans faller tillbaka till sin egen lokala affinitet, sessioner kan fĂ€sta igen en gĂ„ng per instans och instanser kan skilja sig Ă„t. Stickiness Ă„terkonvergerar genom Redis nĂ€r den Ă„terhĂ€mtar sig. TimeoutgrĂ€nsen vĂ€ntar, inte en sĂ€nd EVAL, som kan landa efter fallback. Routingskrivningar jĂ€mför det exakta vĂ€rdet som observerats av routingbeslutet, inte en ny lĂ€sning av mutationstid; en observerad miss eller en SQLite reservobservation jĂ€mförs med en frĂ„nvarande Redis nyckel. FörĂ„ldrade stift ersĂ€tts i en CAS, sĂ„ ett sent kommando kan inte ersĂ€tta eller ta bort ett nyare, annorlunda stift. Redis lĂ€ser atomiskt returnerar vĂ€rdet och Ă„terstĂ„ende server TTL; positiv PTTL (eller inget utgĂ„ngsdatum) bestĂ€mmer livlighet, inte skribentens JSON tidsstĂ€mpel eller lĂ€sarens klocka. Lokala ögonblicksbilder kartlĂ€gger den Ă„terstĂ„ende TTL till en lokal deadline; befintliga JSON nycklar förblir lĂ€sbara och deras rĂ„a byte behĂ„lls för CAS. Redis Ă€r den enda kĂ€llan till sanning medan den svarar. BekrĂ€ftade delade upserts, beröringar och raderingar tar bort den lokala posten, installera eller uppdatera den aldrig. SQLite pĂ„ Redis vĂ€gen innehĂ„ller endast den hĂ€r instansens egna reservbeslut frĂ„n Redis fel, timeouts eller tilltrĂ€desmĂ€ttnad, TTL-begrĂ€nsade som tidigare. En saknad lokal pin vid ett senare avbrott kostar ett nytt val (en prompt-cache miss), inte ett fel eller vrĂ€kt konto. Avvisade upserts returnerar den delade vinnaren och dess Ă„terstĂ„ende TTL atomĂ€rt: ordinarie urval kontrollerar igen den mappade lokala deadline och anvĂ€nder en fortfarande levande kvalificerad vinnare, rör anvĂ€ndning och loggning för det kontot utan en annan delad skrivning. Om den inte Ă€r tillgĂ€nglig behĂ„ller urvalet den lokala kandidaten, lĂ€mnar den delade pinkoden oförĂ€ndrad och skickar ett felsökningsmeddelande. Avvisad CAS skriver inte SQLite; Redis fel, timeouts eller antagningsmĂ€ttnad tillĂ€mpar den befintliga lokala operationen istĂ€llet. Om en sĂ€nd mutations svar kommer efter timeout (accepterat, avvisat eller fel), tar ett synkront exakt serialiserat vĂ€rde jĂ€mför-och-ta bort endast den byte-identiska timeout-fallback-raden. Det finns ingen vĂ€ntan mellan den jĂ€mförelsen och raderingen; en nyare avbrottsskrivning bevaras. Guarded eviction tar bort det misslyckade kontots egen lokala pin Ă€ven med Redis nere, och rensar den igen efter bekrĂ€ftad delad vrĂ€kning. VĂ€ntande tidigare delade svar kan inte Ă„terstĂ€lla en vrĂ€kt lokal pin eftersom delade framgĂ„ngar aldrig skriver SQLite. Ett senare avbrott kan Ă„terstĂ€lla ett konto; en senare accepterad delad skrivning finns endast i Redis. Redis missar konsulterar inte lokal reservtillstĂ„nd. Med föraren avstĂ€ngd behĂ„ller nyvalda stift den Ă€ldre fyrfĂ€ltsformen SQLite JSON ; endast Redis routing lĂ€gger till den hashade kontoidentiteten. FörhĂ€mtade stift kontrolleras igen vid deras utgĂ„ngsgrĂ€ns. Redis icke-lease-val lĂ€ser om butiken, men synkron hyresavtalsplanering kan fortfarande anvĂ€nda en pin som vrĂ€kts mellan förhĂ€mtning och planering (ett accepterat fönster för bĂ€sta anstrĂ€ngning). Ett leasingĂ„tagande kan inte byta konto efter ett varaktigt ansprĂ„k: vid avvisad uppsĂ€gning behĂ„ller den den ansprĂ„kade kandidaten endast för den begĂ€ran och lĂ€mnar den delade vinnaren oberörd, sĂ„ överenskommelsen mellan instanserna Ă€r begrĂ€nsad pĂ„ den vĂ€gen. Resten av tabellen gĂ€ller fortfarande: detta delar inte combo session stickiness, inbyggda Codex turn pins, kontosemaforer, lockouter, utgiftsgrĂ€nser, konfiguration eller samtalsloggar. HĂ„rdvara: per instans samtidig lĂ„ng `/v1/responses` Ă€r en** minnesbudget** frĂ„ga (heap + inflight-byte / #10110). `N` oberoende `DATA_DIR` multiplicerar fortfarande högar: vĂ€rd RAM mĂ„ste tĂ€cka `N × cgroup`, inte "en 16 Gi pod med N = 8." Aldrig `replicas > 1` pĂ„ en SQLite fil. Komponera skiss (tvĂ„ högar, tvĂ„ volymer — inte `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: ``` Densitet under processen (komprimering av HTTP isolatet) Ă€r [#11023](https://github.com/diegosouzapw/OmniRoute/issues/11023). Ett logiskt kluster i delat hĂ„llbart tillstĂ„nd Ă€r [#8075](https://github.com/diegosouzapw/OmniRoute/issues/8075). ## Regionala Gemini-fel i Docker Google AI Studio/Gemini API kan returnera HTTP 400 med FAILED_PRECONDITION och `User location is not supported for the API use.` En lyckad begĂ€ran pĂ„ vĂ€rden bevisar inte att containern anvĂ€nder samma utgĂ„ende rutt. DNS-ordning, IPv4/IPv6-anslutning, VPN-routning och konfigurerade proxyservrar kan skilja sig Ă„t. Kontrollera [Googles regioner som stöds](https://ai.google.dev/gemini-api/docs/available-regions) samt den faktiska anslutningsrutten. Enbart detta fel visar inte att API-nyckeln Ă€r felaktig. ### Föredra en anslutningsspecifik proxy AnvĂ€nd OmniRoutes [prox konfiguration per anslutning](../ops/PROXY_GUIDE.md#4-level-proxy-system) för den berörda Gemini-anslutningen och upprepa sedan **Test Connection** och en liten begĂ€ran med samma modell. PĂ„ sĂ„ sĂ€tt begrĂ€nsas routningsĂ€ndringen till den anslutningen. Kontrollera att proxyn kan nĂ„s frĂ„n containern och att anslutningen verkligen vĂ€ljer den. Att Ă€ndra rutten garanterar inte regional behörighet hos uppströmsleverantören. ### JĂ€mför nĂ€tverket pĂ„ vĂ€rden och i containern AnvĂ€nd samma nyckel, modell och begĂ€ran nĂ€r du jĂ€mför autentiserade resultat. Klistra aldrig in inloggningsuppgifter, proxylösenord eller fullstĂ€ndiga auktoriseringshuvuden i ett Ă€rende. Kontrollera först vilka adressfamiljer operativsystemets resolver erbjuder genom att anvĂ€nda samma kommando pĂ„ vĂ€rden och inuti containern: ```bash node -e 'require("node:dns").lookup("generativelanguage.googleapis.com", {all: true}, (error, addresses) => { if (error) { console.error(error.code); process.exitCode = 1; return; } console.log(addresses.map(({family}) => family)); })' docker compose exec omniroute node -e 'require("node:dns").lookup("generativelanguage.googleapis.com", {all: true}, (error, addresses) => { if (error) { console.error(error.code); process.exitCode = 1; return; } console.log(addresses.map(({family}) => family)); })' ``` ErsĂ€tt `omniroute` med tjĂ€nsten som du kör (till exempel `omniroute-web`). Dessa kommandon skriver ut adressfamiljer utan inloggningsuppgifter eller IP-adresser. Ett returnerat `6` visar bara ett IPv6-DNS-resultat: det bevisar **inte** att det finns en fungerande IPv6-rutt eller API-Ă„tkomst. DĂ€r `curl` Ă€r installerat jĂ€mför du `curl -4 -I https://generativelanguage.googleapis.com` med `curl -6 -I https://generativelanguage.googleapis.com` i bĂ„da miljöerna. Ett HTTP-svar bevisar anslutning för just den kontrollen, Ă€ven om det Ă€r ett oautentiserat fel. Endast den autentiserade modellbegĂ€ran testar behörigheten för Gemini. ### Alternativ pĂ„ vĂ€rdnivĂ„: fungerande IPv6 och resolverpolicy AnmĂ€laren av [#12762](https://github.com/diegosouzapw/OmniRoute/issues/12762) Ă„terstĂ€llde Ă„tkomsten i sin miljö genom att aktivera IPv6 för containrar och Ă€ndra glibc:s adressval. Behandla detta som ett miljöspecifikt alternativ. BekrĂ€fta att vĂ€rdens IPv6, containerns utgĂ„ende anslutning/routning och brandvĂ€ggsregler fungerar innan du justerar resolverinstĂ€llningarna. En privat ULA-adress i sig upprĂ€ttar inte offentlig IPv6-anslutning. För tjĂ€nster som redan Ă€r anslutna till Compose standardnĂ€tverk aktiverar detta fragment IPv6 i det nĂ€tverket. BehĂ„ll resten av tjĂ€nstens portar, volymer och konfiguration: ```yaml networks: default: enable_ipv6: true ``` För ett namngivet nĂ€tverk aktiverar du det i nĂ€tverket som tjĂ€nsten faktiskt ansluter till. Docker kan tilldela ett ULA-undernĂ€t. VĂ€lj endast ett uttryckligt undernĂ€t som inte överlappar nĂ€r ditt nĂ€tverk krĂ€ver det. Se [Docker IPv6 networking](https://docs.docker.com/engine/daemon/ipv6/) och [Compose network options](https://docs.docker.com/reference/compose-file/networks/#enable_ipv6). I en **glibc-baserad avbildning** kan `/etc/gai.conf` Ă€ndra adressvalet. Det aktuella Dockerfile i repositoriet anvĂ€nder Debian. Anpassade musl-baserade avbildningar anvĂ€nder inte samma mekanism. Den rapporterade justeringen Ă€ndrar ULA-etiketten frĂ„n `label fc00::/7 6` till `label fc00::/7 1`. UtgĂ„ frĂ„n avbildningens fullstĂ€ndiga policytabell och bevara dess övriga poster: om du lĂ€gger till en `label`- eller `precedence`-post ersĂ€tts standardtabellen, sĂ„ en fil som endast innehĂ„ller den Ă€ndrade raden Ă€r otillrĂ€cklig. [glibc configuration reference](https://github.com/bminor/glibc/blob/master/posix/gai.conf) dokumenterar denna semantik. Bind-montera den granskade filen skrivskyddad pĂ„ `/etc/gai.conf` och Ă„terskapa tjĂ€nsten för att tillĂ€mpa den. Detta Ă€ndrar operativsystemets adressval för **all utgĂ„ende trafik i den containern**. Det tvingar inte alla program att vĂ€lja IPv6: Nodes DNS-ordning och anslutningsval spelar ocksĂ„ roll. I synnerhet prioriterar `--dns-result-order=ipv4first` IPv4 och Ă€r inte en lösning pĂ„ ett fel som endast gĂ€ller IPv4. Se [Node DNS ordering](https://nodejs.org/api/dns.html#dnssetdefaultresultorderorder). Testa Gemini och dina andra leverantörer igen efter varje Ă€ndring pĂ„ vĂ€rdnivĂ„. För att Ă„terstĂ€lla tar du bort den anpassade `gai.conf`-monteringen, Ă„terstĂ€ller den tidigare nĂ€tverkskonfigurationen och Ă„terskapar den berörda tjĂ€nsten/det berörda nĂ€tverket under ett underhĂ„llsfönster. Att Ă„terskapa ett nĂ€tverk kan avbryta andra containrar som Ă€r anslutna till det. Ta inte bort den bestĂ€ndiga datavolymen. ## Viktiga anmĂ€rkningar - **SQLite WAL-lĂ€ge:** `docker stop` bör tillĂ„tas slutföras sĂ„ att OmniRoute kan skriva tillbaka de senaste Ă€ndringarna till `storage.sqlite` via en kontrollpunkt. De medföljande Compose-filerna anger redan en stopptidsfrist pĂ„ 40 sekunder. Om du kör avbildningen direkt ska du behĂ„lla `--stop-timeout 40`. - **`DISABLE_SQLITE_AUTO_BACKUP`:** Ange `true` om rutinmĂ€ssiga sĂ€kerhetskopior och sĂ€kerhetskopior före skrivning hanteras externt. Migreringar av befintliga databaser krĂ€ver fortfarande en egen bestĂ€ndig sĂ€kerhetsögonblicksbild och ett skydd för massmigrering. - **DatabestĂ€ndighet:** Montera alltid en volym till `/app/data` för att bevara databasen, nycklarna och konfigurationerna mellan omstarter av containern. - **Portkonfiguration:** ÅsidosĂ€tt miljövariabeln `PORT` för att Ă€ndra standardporten `20128`. ## Se Ă€ven - [Guide för VM-distribution](../ops/VM_DEPLOYMENT_GUIDE.md) — Konfiguration av VM + nginx + Cloudflare - [Distributionsguide för Fly.io](../ops/FLY_IO_DEPLOYMENT_GUIDE.md) — Distribuera till Fly.io - [Miljökonfiguration](../reference/ENVIRONMENT.md) — FullstĂ€ndig referens för `.env`