# ๐Ÿณ Docker Guide โ€” OmniRoute (แžแŸ’แž˜แŸ‚แžš) ๐ŸŒ **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) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [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) ยท ๐Ÿ‡ธ๐Ÿ‡ช [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) --- > แžฏแž€แžŸแžถแžšแž™แŸ„แž„แž–แŸแž‰แž›แŸแž‰แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžŠแžถแž€แŸ‹แžฑแŸ’แž™แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‡แžถแž˜แžฝแž™ DockerแŸ” แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžšแž แŸแžŸ แžŸแžผแž˜แž˜แžพแž› [แž•แŸ’แž“แŸ‚แž€ Docker แž€แŸ’แž“แžปแž„ README](../README.md#-docker)แŸ” ## แžแžถแžšแžถแž„แž˜แžถแžแžทแž€แžถ - [แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžšแž แŸแžŸ](#quick-run) - [แž‡แžถแž˜แžฝแž™แžฏแž€แžŸแžถแžšแž”แžšแžทแžŸแŸ’แžแžถแž“](#with-environment-file) - [Docker Compose](#docker-compose) - [แž”แŸ’แžšแžผแž แŸ’แžœแžถแž›แŸ‹แžŠแŸ‚แž›แž˜แžถแž“](#available-profiles) - [แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžงแž”แž€แžšแžŽแŸ CLI แžšแž”แžŸแŸ‹แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ แž“แŸ…แž–แŸแž› OmniRoute แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แŸ’แž“แžปแž„ Docker](#configuring-host-cli-tools-when-omniroute-runs-in-docker) - [Redis Sidecar](#redis-sidecar) - [Compose แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž”แžšแžทแžŸแŸ’แžแžถแž“แž•แž›แžทแžแž€แž˜แŸ’แž˜](#production-compose) - [แžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž› Dockerfile](#dockerfile-stages) - [แžขแžแŸแžšแž”แžšแžทแžŸแŸ’แžแžถแž“แžŸแŸ†แžแžถแž“แŸ‹แŸ—](#critical-environment-variables) - [Docker Compose แž‡แžถแž˜แžฝแž™ Caddy (HTTPS)](#docker-compose-with-caddy-https-auto-tls) - [Cloudflare Quick Tunnel](#cloudflare-quick-tunnel) - [แžŸแŸ’แž›แžถแž€ Image](#image-tags) - [แž›แž‘แŸ’แž’แž—แžถแž–แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แŸ– SQLite แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แž‚แžถแŸ†แž‘แŸ’แžšแžแŸ‚ replica แž˜แžฝแž™](#availability-default-sqlite-is-single-replica) - [แž€แŸ†แžŽแžแŸ‹แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แžŸแŸ†แžแžถแž“แŸ‹แŸ—](#important-notes) --- ## แž€แžถแžšแžŠแŸ†แžŽแžพแžšแž€แžถแžšแžšแž แŸแžŸ > **แž”แž„แŸ’แž แŸ„แŸ‡แžŠแŸ„แž™แžแŸ’แž›แžฝแž“แžฏแž„แžŠแŸ„แž™แž”แŸ’แžšแžพแž–แžถแž€แŸ’แž™แž”แž‰แŸ’แž‡แžถแžแŸ‚แž˜แžฝแž™แž˜แŸ‚แž“แž‘แŸ?** แžŸแžผแž˜แž˜แžพแž› > [แž˜แž‚แŸ’แž‚แžปแž‘แŸ’แž‘แŸแžŸแž€แŸแž”แž„แŸ’แž แŸ„แŸ‡แžŠแŸ„แž™แžแŸ’แž›แžฝแž“แžฏแž„](../getting-started/SELF_HOST_GUIDE.md) โ€” > `docker compose -f docker-compose.selfhost.yml up -d` (image แžŠแŸ‚แž›แž”แžถแž“แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž•แŸ’แžŸแžถแž™ + > Redis, แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžแŸ‚ loopback, แž˜แžทแž“แž˜แžถแž“แž‡แž˜แŸ’แžšแžพแžŸ profile)แŸ” แž€แžถแžšแžŠแŸ†แžŽแžพแžšแž€แžถแžšแžšแž แŸแžŸแžแžถแž„แž€แŸ’แžšแŸ„แž˜แž‚แžบแž‡แžถ > แžœแžทแž’แžธแž”แŸ’แžšแžพ container แžแŸ‚แž˜แžฝแž™ แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพแžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžš Redis แž“แŸ…แž€แž“แŸ’แž›แŸ‚แž„แž•แŸ’แžŸแŸแž„แžšแžฝแž…แž แžพแž™แŸ” ```bash docker run -d \ --name omniroute \ --restart unless-stopped \ --stop-timeout 40 \ -p 20128:20128 \ -v omniroute-data:/app/data \ diegosouzapw/omniroute:latest ``` ## แž‡แžถแž˜แžฝแž™แžฏแž€แžŸแžถแžšแž”แžšแžทแžŸแŸ’แžแžถแž“ ```bash # แž‡แžถแžŠแŸ†แž”แžผแž„ แžŸแžผแž˜แž…แž˜แŸ’แž›แž„ แž“แžทแž„แž€แŸ‚แžŸแž˜แŸ’แžšแžฝแž› .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 # แž”แŸ’แžšแžผแž แŸ’แžœแžถแž›แŸ‹แž˜แžผแž›แžŠแŸ’แž‹แžถแž“ (แž‚แŸ’แž˜แžถแž“แžงแž”แž€แžšแžŽแŸ CLI) docker compose --profile base up -d # แž”แŸ’แžšแžผแž แŸ’แžœแžถแž›แŸ‹ CLI (แž—แŸ’แž‡แžถแž”แŸ‹แž˜แž€แž‡แžถแž˜แžฝแž™ Claude Code, Codex, OpenClaw) docker compose --profile cli up -d # แž”แŸ’แžšแžผแž แŸ’แžœแžถแž›แŸ‹แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ (แž•แŸ’แžแŸ„แžแž›แžพ Linux แž‡แžถแž…แž˜แŸ’แž”แž„; แž˜แŸ‰แŸ„แž“แžฏแž€แžŸแžถแžš binary แžšแž”แžŸแŸ‹ CLI แž–แžธแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแž‡แžถแž‘แž˜แŸ’แžšแž„แŸ‹แž”แžถแž“แžแŸ‚แžขแžถแž“) docker compose --profile host up -d # แž”แŸ’แžšแžผแž แŸ’แžœแžถแž›แŸ‹แž”แžŽแŸ’แžŠแžถแž‰ (Chromium/Playwright แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแŸ’แž“แž€แž•แŸ’แžŠแž›แŸ‹แžŸแŸแžœแžถแžŸแž˜แŸแž™แž”แžŽแŸ’แžŠแžถแž‰) docker compose --profile web up -d # แž”แž‰แŸ’แž…แžผแž› CLI + sidecar CLIProxyAPI แžšแžฝแž˜แž‚แŸ’แž“แžถ docker compose --profile cli --profile cliproxyapi up -d ``` ## แž”แŸ’แžšแžผแž แŸ’แžœแžถแž›แŸ‹แžŠแŸ‚แž›แž˜แžถแž“ OmniRoute แž•แŸ’แžแž›แŸ‹แž‡แžผแž“แž”แŸ’แžšแžผแž แŸ’แžœแžถแž›แŸ‹ Compose แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‘แž˜แŸ’แžšแž„แŸ‹แžŠแžถแž€แŸ‹แžฑแŸ’แž™แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŸแŸ†แžแžถแž“แŸ‹แŸ—แŸ” แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž˜แžฝแž™แžŠแŸ‚แž›แžŸแž˜แžŸแŸ’แžšแž”แž“แžนแž„แž”แžšแžทแžŸแŸ’แžแžถแž“แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แŸ” | แž”แŸ’แžšแžผแž แŸ’แžœแžถแž›แŸ‹ | แžŸแŸแžœแžถแž€แž˜แŸ’แž˜ | แž–แŸแž›แžŽแžถแžแŸ’แžšแžผแžœแž”แŸ’แžšแžพ | แž–แžถแž€แŸ’แž™แž”แž‰แŸ’แž‡แžถ | | ----------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | | `base` (แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜) | `omniroute-base` | แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž”แž˜แŸ’แžšแžพแž‚แŸ’แž˜แžถแž“แž…แŸ†แžŽแžปแž…แž”แŸ’แžšแž‘แžถแž€แŸ‹แž€แŸ’แžšแžถแž แŸ’แžœแžทแž€ / แž”แžšแžทแžŸแŸ’แžแžถแž“แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžขแž”แŸ’แž”แž”แžšแž˜แžถ แžŠแŸ„แž™แž˜แžทแž“แž˜แžถแž“ CLI แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถแž—แŸ’แž‡แžถแž”แŸ‹แž˜แž€แž‡แžถแž˜แžฝแž™ | `docker compose --profile base up -d` | | `cli` | `omniroute-cli` | แž›แŸ†แž แžผแžšแž€แžถแžšแž„แžถแžšแž”แŸ‚แž”แž—แŸ’แž“แžถแž€แŸ‹แž„แžถแžšแžŠแŸ‚แž›แž แŸ… `omniroute providers/setup/doctor` แž“แžทแž„ CLI แžŠแŸ‚แž›แž—แŸ’แž‡แžถแž”แŸ‹แž˜แž€แž‡แžถแž˜แžฝแž™ (Codex, Claude Code, Droid, OpenClaw) | `docker compose --profile cli up -d` | | `host` | `omniroute-host` | แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ Linux แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž€แžถแžšแžŸแžทแž‘แŸ’แž’แžทแž…แžผแž›แž”แŸ’แžšแžพ CLI แžšแž”แžŸแŸ‹แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ แžŸแŸ’แžšแžŠแŸ€แž„แž“แžนแž„ `network_mode` แžแžถแž˜แžšแž™แŸˆแž€แžถแžšแž˜แŸ‰แŸ„แž“ `~/.local/bin`, `~/.codex`, `~/.claude` แž‡แžถแžŠแžพแž˜ แž€แŸ’แž“แžปแž„แžšแž”แŸ€แž”แž”แžถแž“แžแŸ‚แžขแžถแž“ | `docker compose --profile host up -d` | | `cliproxyapi` | `cliproxyapi` | แžŠแŸ†แžŽแžพแžšแž€แžถแžš sidecar [CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI) แž“แŸ…แž›แžพแž…แŸ’แžšแž€ `8317` แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž”แž‰แŸ’แž‡แžผแž“แž”แŸ’แžšแžผแž€แžŸแŸŠแžธ CLI แž‘แŸ… upstream | `docker compose --profile cliproxyapi up -d` | | `web` | `omniroute-web` | แžขแŸ’แž“แž€แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถแžŸแž˜แŸแž™แžœแŸแž”แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž€แžถแžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžšแžปแž€แžšแž€แŸ– `gemini-web`, `claude-web`, `claude-turnstile` (แž”แž„แŸ’แž€แžพแž `runner-web` แžŠแŸ„แž™แžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž› Chromium) | `docker compose --profile web up -d` | > แžขแžถแž…แž”แž‰แŸ’แž…แžผแž›แž”แŸ’แžšแžผแž แŸ’แžœแžถแž›แŸ‹แž…แŸ’แžšแžพแž“แž‡แžถแž˜แžฝแž™แž‚แŸ’แž“แžถแž”แžถแž“แŸ– `docker compose --profile cli --profile cliproxyapi up -d`แŸ” ## แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžงแž”แž€แžšแžŽแŸ CLI แžšแž”แžŸแŸ‹แž˜แŸ‰แžถแžŸแŸŠแžธแž“ host แž“แŸ…แž–แŸแž› OmniRoute แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แŸ’แž“แžปแž„ Docker `omniroute setup-codex`, `setup-claude`, `config set ` แž“แžทแž„แž”แŸŠแžผแžแžปแž„ **แžšแž€แŸ’แžŸแžถแž‘แžปแž€แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’** แžšแž”แžŸแŸ‹ dashboard แžŸแžปแž‘แŸ’แž’แžแŸ‚แžŸแžšแžŸแŸแžšแžฏแž€แžŸแžถแžšแžŠแžผแž…แž‡แžถ `~/.codex/*.config.toml`แŸ” Path แž‘แžถแŸ†แž„แž“แŸ„แŸ‡ แž˜แžถแž“แž“แŸแž™แžแŸ‚แž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แžŠแŸ‚แž› CLI แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡แŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž–แžฝแž€แžœแžถแž“แŸ…แž€แŸ’แž“แžปแž„ container แž€แžถแžšแžŸแžšแžŸแŸแžšแž“แžนแž„แž…แžผแž›แž‘แŸ…แž€แŸ’แž“แžปแž„ home แž•แŸ’แž‘แžถแž›แŸ‹แžšแž”แžŸแŸ‹ container (`/home/node` โ€” image แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‡แžถ `USER node`) แžŠแŸ‚แž› CLI แž“แŸ…แž›แžพ host แž“แžนแž„แž˜แžทแž“แžขแžถแž“แžกแžพแž™ แž แžพแž™แžœแžถแž“แžนแž„แžแŸ’แžšแžผแžœ แž›แžปแž”แž…แŸ„แž›แž—แŸ’แž›แžถแž˜แŸ—แž“แŸ…แž–แŸแž› container แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแžกแžพแž„แžœแžทแž‰แŸ” OmniRoute แžšแž€แžƒแžพแž‰แžŸแŸ’แžแžถแž“แž—แžถแž–แž“แŸแŸ‡ แž แžพแž™แž”แžŠแžทแžŸแŸแž’แž€แžถแžšแžŸแžšแžŸแŸแžš แž–แŸ’แžšแž˜แž‘แžถแŸ†แž„แž”แž„แŸ’แž แžถแž‰แžŸแŸแž…แž€แŸ’แžแžธแžŽแŸ‚แž“แžถแŸ† แž‡แŸ†แž“แžฝแžŸแžฑแŸ’แž™ แž€แžถแžšแžšแžถแž™แž€แžถแžšแžŽแŸแž‡แŸ„แž‚แž‡แŸแž™แžŠแŸ‚แž›แžขแŸ’แž“แž€แž˜แžทแž“แžขแžถแž…แž”แŸ’แžšแžพแž”แžถแž“แŸ– CLI แž”แž‰แŸ’แž…แž”แŸ‹แž‡แžถแž˜แžฝแž™แž€แžผแžŠ `2` แž แžพแž™ API แž†แŸ’แž›แžพแž™แžแž” `422` แž‡แžถแž˜แžฝแž™ `containerEphemeralTarget: true`แŸ” ### แž”แžถแž“แžŽแŸ‚แž“แžถแŸ†แŸ– แžŠแŸ†แžŽแžพแžšแž€แžถแžš CLI แž›แžพ host แž“แžทแž„ OmniRoute แž€แŸ’แž“แžปแž„ Docker Container แž•แŸ’แžแž›แŸ‹แžŸแŸแžœแžถ API แžแžŽแŸˆ CLI แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžงแž”แž€แžšแžŽแŸแž“แŸ…แž›แžพ host แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แŸ” ```bash docker compose --profile base up -d npm install -g omniroute omniroute connect http://localhost:20128 # แžแž˜แŸ’แžšแž„แŸ‹ CLI แž‘แŸ…แž€แžถแž“แŸ‹ container omniroute setup-codex # แžŸแžšแžŸแŸแžšแž‘แŸ…แž€แžถแž“แŸ‹ ~/.codex แž–แžทแžแž”แŸ’แžšแžถแž€แžŠแž“แŸ…แž›แžพ host แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€ ``` แž“แŸแŸ‡แž‡แžถแž‡แž˜แŸ’แžšแžพแžŸแžแŸ’แžšแžนแž˜แžแŸ’แžšแžผแžœ แž“แŸ…แž–แŸแž› Codex, Claude Code, Cursor แžฌแžงแž”แž€แžšแžŽแŸแžŸแŸ’แžšแžŠแŸ€แž„แž‚แŸ’แž“แžถแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž›แžพ laptop แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€ โ€” แžŠแŸ‚แž›แž“แŸแŸ‡แž‡แžถแž€แžถแžšแžŠแŸ†แžกแžพแž„แž’แž˜แŸ’แž˜แžแžถแŸ” ### แž‡แž˜แŸ’แžšแžพแžŸแž•แŸ’แžŸแŸแž„แŸ– bind-mount แžแž config แžšแž”แžŸแŸ‹ host (profile `host`) แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž…แž„แŸ‹แžฑแŸ’แž™ container แžแŸ’แž›แžฝแž“แžฏแž„แžŸแžšแžŸแŸแžš config แžšแž”แžŸแŸ‹ host แžŸแžผแž˜ mount แžแžแž‘แžถแŸ†แž„แž“แŸ„แŸ‡แž…แžผแž› แž แžพแž™แžแž˜แŸ’แžšแž„แŸ‹ `CLI_CONFIG_HOME` แž‘แŸ…แž€แžถแž“แŸ‹ mount rootแŸ” Profile `host` แž”แžถแž“แž’แŸ’แžœแžพแžœแžถแžšแžฝแž…แž‡แžถแžŸแŸ’แžšแŸแž…แŸ– ```yaml environment: - CLI_CONFIG_HOME=/host-home - CLI_ALLOW_CONFIG_WRITES=true volumes: - ~/.codex:/host-home/.codex:rw - ~/.claude:/host-home/.claude:rw ``` Bind mount แž‚แžบแž‡แžถแžขแŸ’แžœแžธแžŠแŸ‚แž›แž’แŸ’แžœแžพแžฑแŸ’แž™ path แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แŸ– OmniRoute แžขแžถแž“ `/proc/self/mountinfo` แž แžพแž™แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แžŸแžšแžŸแŸแžšแž‘แŸ…แž€แžถแž“แŸ‹ path แžŠแŸ‚แž›แž”แžถแž“ mount (แž“แžทแž„แž‘แŸ…แž€แžถแž“แŸ‹แžแž แžŠแŸ‚แž›แžแžแž€แžผแž“แžšแž”แžŸแŸ‹แžœแžถแž‡แžถ mount แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž‚แŸ’แž“แžถแž–แžทแžแž”แŸ’แžšแžถแž€แžŠแž“แžนแž„แž‘แž˜แŸ’แžšแž„แŸ‹ `/host-home` แžแžถแž„แž›แžพ) แžแžŽแŸˆแžŠแŸ‚แž› แž“แŸ…แžแŸ‚แž”แžŠแžทแžŸแŸแž’แžแžแžŠแŸ‚แž›แž˜แžทแž“แž”แžถแž“ mountแŸ” ### แž…แŸ’แžšแž€แž”แž˜แŸ’แžšแžปแž„แŸ– แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ CLI แž•แŸ’แž‘แžถแž›แŸ‹แžšแž”แžŸแŸ‹ container (แž”แŸ’แžšแžพแžแŸ‚แž“แŸ…แž–แŸแž›แž…แžถแŸ†แž”แžถแž…แŸ‹) แž“แŸ…แž–แŸแž› CLI แž–แžทแžแž‡แžถแžŸแŸ’แžแžทแžแž“แŸ…แžแžถแž„แž€แŸ’แž“แžปแž„ container (profile `cli`) แž€แžถแžšแžŸแžšแžŸแŸแžšแž“แŸ„แŸ‡ แž‚แžบแž’แŸ’แžœแžพแžกแžพแž„แžŠแŸ„แž™แž…แŸแžแž“แžถแŸ” แž”แž‰แŸ’แž‡แžผแž“ `--allow-container-write` แž‘แŸ…แž€แžถแž“แŸ‹ command `setup-*` แžŽแžถแž˜แžฝแž™ แžฌแž€แŸ†แžŽแžแŸ‹ `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE=true` แžŸแž˜แŸ’แžšแžถแž”แŸ‹ serverแŸ” แž€แžถแžšแžŸแžšแžŸแŸแžšแž“แžนแž„แž”แž“แŸ’แž แž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แžถแžšแž–แŸ’แžšแž˜แžถแž“แžแžถ แžœแžถแž“แžนแž„แž˜แžทแž“แž“แŸ…แžŸแž›แŸ‹แž€แŸ’แžšแŸ„แž™แž–แŸแž› container แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแžกแžพแž„แžœแžทแž‰แž‘แŸแŸ” > **แž€แžถแžšแž–แŸ’แžšแž˜แžถแž“แž•แŸ’แž“แŸ‚แž€แžŸแžปแžœแžแŸ’แžแžทแž—แžถแž– โ€” profile `cli` + แž€แžถแžš mount `docker.sock`แŸ”** > Profile `cli` แž’แŸ’แžœแžพ bind-mount `/var/run/docker.sock` แžŠแžพแž˜แŸ’แž”แžธแžฑแŸ’แž™ > auto-updater แž“แŸ…แž€แŸ’แž“แžปแž„ container แžขแžถแž…แž”แž„แŸ’แž€แžพแž stack แžกแžพแž„แžœแžทแž‰แžแžถแž˜แžšแž™แŸˆ daemon แžšแž”แžŸแŸ‹ host > (`src/lib/system/autoUpdate.ts` แž–แžทแž“แžทแžแŸ’แž™แžšแž€ socket แž“แŸ„แŸ‡ แž แžพแž™แžšแŸ†แž›แž„ > Docker path แž“แŸ…แž–แŸแž›แžœแžถแž˜แžทแž“แž˜แžถแž“)แŸ” Socket แž“แŸ„แŸ‡แž‚แžบแž‡แžถ **แž–แŸ’แžšแŸ†แžŠแŸ‚แž“แž‘แŸ†แž“แžปแž€แž…แžทแžแŸ’แžแž€แž˜แŸ’แžšแžทแž root แžšแž”แžŸแŸ‹ host**แŸ– > แžขแŸ’แžœแžธแž€แŸแžŠแŸ„แž™แžŠแŸ‚แž›แžขแžถแž…แž…แžผแž›แž”แŸ’แžšแžพแžœแžถแž”แžถแž“ แžขแžถแž…แž”แž‰แŸ’แž‡แžถ Docker daemon แžšแž”แžŸแŸ‹ host แž‡แžถ > root โ€” แžœแžถแžขแžถแž…แž”แž„แŸ’แž€แžพแž แž–แžทแž“แžทแžแŸ’แž™ แž”แž‰แŸ’แžˆแž”แŸ‹ แž“แžทแž„แž›แžปแž” container แžŽแžถแž˜แžฝแž™แž“แŸ…แž›แžพ hostแŸ” > แž•แž›แž”แŸ‰แŸ‡แž–แžถแž›แŸ‹แŸ– > > 1. **แž€แžปแŸ†แž”แžพแž€ port แžšแž”แžŸแŸ‹ profile `cli` แž‘แŸ…แž€แžถแž“แŸ‹ network แž‡แžถแžŠแžถแž…แŸ‹แžแžถแžแŸ”** Publish > แžœแžถแž›แžพ `127.0.0.1` (`ports: "127.0.0.1:${DASHBOARD_PORT:-20128}:..."`) > โ€” profile `cli` แžŠแŸ‚แž›แžขแžถแž…แž…แžผแž›แž”แŸ’แžšแžพแž”แžถแž“แž–แžธ LAN แž“แžนแž„แž’แŸ’แžœแžพแžฑแŸ’แž™ RCE แž€แž˜แŸ’แžšแžทแž dashboard แžŽแžถแž˜แžฝแž™ > แž€แŸ’แž›แžถแž™แž‡แžถแž€แžถแžšแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„ host แž‘แžถแŸ†แž„แžŸแŸ’แžšแžปแž„แŸ” > 2. **แž€แžปแŸ† bind แžแžแž”แž“แŸ’แžแŸ‚แž˜แžŽแžถแž˜แžฝแž™แžšแž”แžŸแŸ‹ host แž…แžผแž›แž€แŸ’แž“แžปแž„ profile `cli`แŸ”** > Docker socket แžšแžฝแž˜แž‡แžถแž˜แžฝแž™ mount แž”แž“แŸ’แžแŸ‚แž˜แžŽแžถแž˜แžฝแž™ แž“แžนแž„แž•แŸ’แžแž›แŸ‹แžฑแŸ’แž™ container แž“แžผแžœแžŸแžทแž‘แŸ’แž’แžท > แžขแžถแž“/แžŸแžšแžŸแŸแžšแž–แŸแž‰แž›แŸแž‰แž‘แŸ…แž›แžพ filesystem แž“แžทแž„ config แžšแž”แžŸแŸ‹ hostแŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแž€แžถแžšแžฑแŸ’แž™แžงแž”แž€แžšแžŽแŸแž˜แžฝแž™ > แž˜แžพแž›แžƒแžพแž‰ project แžŸแžผแž˜แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžœแžถแž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž•แŸ’แž‘แžถแž›แŸ‹แž‡แžถแž˜แžฝแž™ CLI binary โ€” แž€แžปแŸ† mount แžœแžถ > แž…แžผแž›แž‘แŸ…แž€แŸ’แž“แžปแž„ container `cli`แŸ” > > แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž˜แžทแž“แžแŸ’แžšแžผแžœแž€แžถแžš auto-update แž€แŸ’แž“แžปแž„ container แž‘แŸ แžŸแžผแž˜แž€แžปแŸ†แž”แžพแž€ profile `cli` > (`COMPOSE_PROFILES=core,redis` แžฌแž‘แž˜แŸ’แžšแž„แŸ‹แžแŸ’แž›แžธแž‡แžถแž„แž“แŸแŸ‡)แŸ” Profile แž•แŸ’แžŸแŸแž„แž‘แŸ€แžแž˜แžทแž“ > mount Docker socket แž‘แŸแŸ” > > แžŸแžผแž˜แž˜แžพแž› `docs/security/MITM-TPROXY-DECRYPT.md` (git; แž˜แžทแž“แž”แžถแž“ compile แž…แžผแž›แž€แŸ’แž“แžปแž„ `/docs`) แžŸแž˜แŸ’แžšแžถแž”แŸ‹ threat model แžŠแŸ‚แž›แž–แžถแž€แŸ‹แž–แŸแž“แŸ’แž’ > แž‡แžปแŸ†แžœแžทแž‰ MITM แž“แžทแž„ `docs/security/SUPPLY_CHAIN.md` แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžแŸ’แžŸแŸ‚แžŸแž„แŸ’แžœแžถแž€แŸ‹แž”แŸ’แžšแž—แž–แžŠแžพแž˜แž“แŸƒ binary > `codex`/`claude-code`/`droid`/`openclaw`แŸ” ## Redis Sidecar OmniRoute แž–แžนแž„แž•แŸ’แžขแŸ‚แž€แž›แžพ Redis แžŠแžพแž˜แŸ’แž”แžธแž‚แžถแŸ†แž‘แŸ’แžšแž€แž˜แŸ’แž˜แžœแžทแž’แžธแž€แŸ†แžŽแžแŸ‹แžขแžแŸ’แžšแžถแž”แŸ‚แž”แž…แŸ‚แž€แž…แžถแž™ แž“แžทแž„แžƒแŸ’แž›แžถแŸ†แž„แžŸแž˜แŸ’แž„แžถแžแŸ‹แžšแžฝแž˜แŸ” แžŸแŸแžœแžถ `redis` แžแŸ’แžšแžผแžœแž”แžถแž“ **แž€แŸ†แžŽแžแŸ‹แž‡แžถแž“แžทแž…แŸ’แž…** แž€แŸ’แž“แžปแž„ `docker-compose.yml` (แžœแžถแž˜แžทแž“แž˜แžถแž“แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžŠแŸ„แž™ profile แž‘แŸ) แž แžพแž™แž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‡แžถแž˜แžฝแž™ profile แž•แŸ’แžŸแŸแž„แž‘แŸ€แžแžŽแžถแž˜แžฝแž™แŸ” | แž–แŸแžแŸŒแž˜แžถแž“แž›แž˜แŸ’แžขแžทแž | แžแž˜แŸ’แž›แŸƒ | | ----------------------------- | ------------------------------------------ | | Image | `redis:7-alpine` | | แžˆแŸ’แž˜แŸ„แŸ‡ container | `omniroute-redis` | | Port แžแžถแž„แž€แŸ’แž“แžปแž„ | `6379` | | Port แžšแž”แžŸแŸ‹ host (แž€แŸ†แžŽแžแŸ‹แž‡แŸ†แž“แžฝแžŸ) | `REDIS_PORT` (แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แž‚แžบ `6379`) | | แž€แžถแžšแž…แž„แž—แŸ’แž‡แžถแž”แŸ‹ host (แž€แŸ†แžŽแžแŸ‹แž‡แŸ†แž“แžฝแžŸ) | `REDIS_BIND_HOST` (แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แž‚แžบ `127.0.0.1`) | | Volume | `omniroute-redis-data` โ†’ `/data` | | แž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แžŸแžปแžแž—แžถแž– | `redis-cli ping` (แž…แž“แŸ’แž›แŸ„แŸ‡แž–แŸแž› 10 แžœแžทแž“แžถแž‘แžธ) | แžขแžแŸแžšแž”แžšแžทแžŸแŸ’แžแžถแž“แžŠแŸ‚แž›แž–แžถแž€แŸ‹แž–แŸแž“แŸ’แž’แŸ– - `REDIS_URL` โ€” แžแŸ’แžŸแŸ‚แžขแž€แŸ’แžŸแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž‰แŸ’แž…แžผแž›แž‘แŸ…แž€แŸ’แž“แžปแž„แž€แž˜แŸ’แž˜แžœแžทแž’แžธ (แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แž‚แžบ `redis://redis:6379`)แŸ” - `REDIS_PORT` โ€” แž€แžถแžšแž•แŸ’แž‚แžผแž•แŸ’แž‚แž„ port แž•แŸ’แž“แŸ‚แž€ host แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Redis containerแŸ” - `REDIS_BIND_HOST` โ€” interface แžšแž”แžŸแŸ‹ host แžŠแŸ‚แž› port แžแŸ’แžšแžผแžœแž”แžถแž“แž•แŸ’แžŸแž–แŸ’แžœแž•แŸ’แžŸแžถแž™แž“แŸ…แž›แžพแžœแžถแŸ” แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แž‚แžบ `127.0.0.1`แŸ” > **แž แŸแžแžปแžขแŸ’แžœแžธแž”แžถแž“แž‡แžถแž”แŸ’แžšแžพ loopback แž‡แžถแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แŸ–** sidecar แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“ `requirepass` แž แžพแž™ app > container แž—แŸ’แž‡แžถแž”แŸ‹แž‘แŸ…แžœแžถแžแžถแž˜แž”แžŽแŸ’แžŠแžถแž‰ compose (`redis:6379`) โ€” port แžŠแŸ‚แž›แž”แžถแž“แž•แŸ’แžŸแž–แŸ’แžœแž•แŸ’แžŸแžถแž™ > แž˜แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžแŸ‚แžงแž”แž€แžšแžŽแŸแž•แŸ’แž“แŸ‚แž€ host แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡ (`redis-cli`, `npm run dev` แž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แžผแž›แžŠแŸ’แž‹แžถแž“)แŸ” แž€แžถแžšแž•แŸ’แžŸแž–แŸ’แžœแž•แŸ’แžŸแžถแž™แž“แŸ…แž›แžพ > `0.0.0.0` แž“แžนแž„แž”แžพแž€แžฑแŸ’แž™แž‚แŸ’แžšแž”แŸ‹ host แž“แŸ…แž›แžพ LAN แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž…แžผแž›แž”แŸ’แžšแžพ Redis แžŠแŸ‚แž›แž˜แžทแž“แž˜แžถแž“แž€แžถแžšแž•แŸ’แž‘แŸ€แž„แž•แŸ’แž‘แžถแžแŸ‹แŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž€แŸ†แžŽแžแŸ‹ > `REDIS_BIND_HOST=0.0.0.0` แžŸแžผแž˜แž”แž“แŸ’แžแŸ‚แž˜ `--requirepass` แž‘แŸ…แž€แŸ’แž“แžปแž„ `command:` แžšแž”แžŸแŸ‹แžŸแŸแžœแžถแž•แž„แžŠแŸ‚แžšแŸ” **แž€แžถแžšแž”แžทแž‘ Redis** แž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แžŽแŸ‚แž“แžถแŸ†แž‘แŸ (แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž€แŸ†แžŽแžแŸ‹แžขแžแŸ’แžšแžถแž“แžนแž„แž”แž“แŸ’แžแž™แž‘แŸ…แž”แŸ’แžšแžพแž‡แž˜แŸ’แžšแžพแžŸแž”แž˜แŸ’แžšแžปแž„แž€แŸ’แž“แžปแž„แžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ†)แŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแž…แžถแŸ†แž”แžถแž…แŸ‹ แžขแŸ’แž“แž€แžขแžถแž…แžŠแž€แž…แŸแž‰/แžŠแžถแž€แŸ‹แž‡แžถ comment แž“แžผแžœแž”แŸ’แž›แžปแž€แžŸแŸแžœแžถ `redis:` แž€แŸ’แž“แžปแž„ `docker-compose.yml` แžฌแž€แŸ†แžŽแžแŸ‹แž‘แŸ†แž แŸ†แžœแžถแž‘แŸ…แžŸแžผแž“แŸ’แž™แŸ– ```bash docker compose up -d --scale redis=0 ``` ## Compose แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Production แžŸแž˜แŸ’แžšแžถแž”แŸ‹ snapshot แž“แŸƒ production แžŠแŸ‚แž›แžŠแžถแž…แŸ‹แžŠแŸ„แž™แžกแŸ‚แž€ แž“แžทแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‡แžถแž˜แžฝแž™แž”แžšแžทแžŸแŸ’แžแžถแž“แžขแž—แžทแžœแžŒแŸ’แžแž“แŸ แžŸแžผแž˜แž”แŸ’แžšแžพ `docker-compose.prod.yml`แŸ” | แž–แŸแžแŸŒแž˜แžถแž“แž›แž˜แŸ’แžขแžทแž | แžแž˜แŸ’แž›แŸƒ | | ----------------------- | --------------------------------------------------------------------------------------------- | | แžฏแž€แžŸแžถแžš | `docker-compose.prod.yml` | | Port dashboard แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ | `PROD_DASHBOARD_PORT=20130` (แž•แŸ’แž‚แžผแž•แŸ’แž‚แž„แž‘แŸ… port แžแžถแž„แž€แŸ’แž“แžปแž„ `${DASHBOARD_PORT:-20128}`) | | Port API แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ | `PROD_API_PORT=20131` | | Image | `omniroute:prod` (แž”แžถแž“ build แž–แžธ target `runner-cli`) | | Redis container | `omniroute-redis-prod` (`redis:8.6.2`, volume `redis-prod-data` แžŠแžถแž…แŸ‹แžŠแŸ„แž™แžกแŸ‚แž€) | | Volume แž‘แžทแž“แŸ’แž“แž“แŸแž™ | `omniroute-prod-data` (แž˜แžถแž“แžˆแŸ’แž˜แŸ„แŸ‡ แž“แžทแž„แžแŸ’แžšแžผแžœแž”แžถแž“แžšแž€แŸ’แžŸแžถแž‘แžปแž€แž†แŸ’แž›แž„แž€แžถแžแŸ‹แž€แžถแžšแžŸแžถแž„แžŸแž„แŸ‹แžกแžพแž„แžœแžทแž‰) | | แž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แžŸแžปแžแž—แžถแž– | `node healthcheck.mjs` + `redis-cli ping` แžŠแŸ„แž™ `depends_on` แžแŸ’แžšแžผแžœแž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžขแžถแžŸแŸ’แžšแŸแž™แž›แžพแžŸแžปแžแž—แžถแž– Redis | แžšแž”แŸ€แž”แž”แŸ’แžšแžพแŸ– ```bash # Build แž“แžทแž„แž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜ production stack docker compose -f docker-compose.prod.yml up -d --build # แž”แž„แŸ’แž แžถแž‰ log แž‡แžถแž”แž“แŸ’แžแž”แž“แŸ’แž‘แžถแž”แŸ‹ docker compose -f docker-compose.prod.yml logs -f # แž”แž‰แŸ’แžˆแž”แŸ‹ แž“แžทแž„แžŠแž€แž…แŸแž‰ (แžšแž€แŸ’แžŸแžถแž‘แžปแž€ volume) docker compose -f docker-compose.prod.yml down ``` Prod stack แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŸแŸ’แžšแž”แž‚แŸ’แž“แžถแž‡แžถแž˜แžฝแž™ dev compose (แžˆแŸ’แž˜แŸ„แŸ‡ container, port แž“แžทแž„ volume แžแžปแžŸแž‚แŸ’แž“แžถ) แžŠแžผแž…แŸ’แž“แŸแŸ‡แžขแŸ’แž“แž€แžขแžถแž…แž”แž“แŸ’แžแžขแž—แžทแžœแžŒแŸ’แžแž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แžผแž›แžŠแŸ’แž‹แžถแž“ แžแžŽแŸˆแžŠแŸ‚แž› production แž“แŸ…แžแŸ‚แžŠแŸ†แžŽแžพแžšแž€แžถแžšแŸ” ## แžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž› Dockerfile แžƒแŸ’แž›แžถแŸ†แž„แž€แžผแžŠแž“แŸแŸ‡แž•แŸ’แžŠแž›แŸ‹แž‡แžผแž“ Dockerfile แž–แž แžปแžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž› (`Dockerfile`)แŸ” แž˜แžถแž“แžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž›แž…แŸ†แž“แžฝแž“แž”แžฝแž“แžŠแŸ‚แž›แžขแžถแž…แž”แŸ’แžšแžพแž”แžถแž“ แžŸแžผแž˜แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ `target` แžฑแŸ’แž™แžŸแž˜แžŸแŸ’แžšแž”แž“แžนแž„แž€แžšแžŽแžธแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แŸ” | แžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž› | แžขแŸŠแžธแž˜แŸเธˆแž˜แžผแž›แžŠแŸ’แž‹แžถแž“ | แž‚แŸ„แž›แž”แŸ†แžŽแž„ | | ------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `builder` | `node:26-trixie-slim` | แžŠแŸ†แžกแžพแž„ dependencies (`npm ci --legacy-peer-deps`) แž“แžทแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžš `npm run build` (แž”แŸ’แžšแžพ Turbopack แžแžถแž˜แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ โ€” แžŸแžผแž˜แž˜แžพแž›แž’แž“แž’แžถแž“แž–แŸแž› build แžแžถแž„แž€แŸ’แžšแŸ„แž˜) | | `runner-base` | `node:26-trixie-slim` | แž”แžšแžทแžŸแŸ’แžแžถแž“แžŠแŸ†แžŽแžพแžšแž€แžถแžš production แž‡แžถแž˜แžฝแž™แž›แž‘แŸ’แž’แž•แž› standalone แžšแž”แžŸแŸ‹ Next.jsแŸ” **แž˜แžทแž“แž˜แžถแž“แž—แŸ’แž‡แžถแž”แŸ‹ CLI แžšแž”แžŸแŸ‹ provider แž‘แŸแŸ”** | | `runner-cli` | `runner-base` | แž”แž“แŸ’แžแŸ‚แž˜ `git`, `docker.io`, `docker-compose` แž“แžทแž„ CLI แžŸแž€แž›แŸ– `@openai/codex`, `@anthropic-ai/claude-code`, `droid`, `openclaw`แŸ” **แžŸแžผแž˜แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž›แž“แŸแŸ‡แžŸแž˜แŸ’แžšแžถแž”แŸ‹ workflow แž”แŸ‚แž” agenticแŸ”** | | `runner-web` | `runner-base` | แž”แž“แŸ’แžแŸ‚แž˜ Playwright + แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžšแžปแž€แžšแž€ Chromium (`--with-deps`) แžŸแž˜แŸ’แžšแžถแž”แŸ‹ provider แžŠแŸ‚แž›แž”แŸ’แžšแžพ web sessionแŸ– `gemini-web`, `claude-web`, `claude-turnstile`แŸ” **แžŸแžผแž˜แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž›แž“แŸแŸ‡แž“แŸ…แž–แŸแž›แžขแŸ’แž“แž€แž”แŸ’แžšแžพ provider แž‘แžถแŸ†แž„แž“แŸ„แŸ‡** โ€” แžขแŸŠแžธแž˜แŸเธˆแž’แž˜แŸ’แž˜แžแžถแž“แžนแž„แž”แžšแžถแž‡แŸแž™แž“แŸ…แž–แŸแž›แžŸแŸ’แž“แžพแžŸแžปแŸ† แž”แŸ’แžšแžŸแžทแž“แž”แžพแž‚แŸ’แž˜แžถแž“แžœแžถ (แžŸแžผแž˜แž˜แžพแž›แž€แŸ†แžŽแžแŸ‹แžŸแž˜แŸ’แž‚แžถแž›แŸ‹ `-web` แž“แŸ…แž€แŸ’แžšแŸ„แž˜แž”แŸ‰แžปแžŸแŸ’แžแžทแŸแž…แŸแž‰แž•แŸ’แžŸแžถแž™)แŸ” | Build target แž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แž˜แžฝแž™แžŠแŸ„แž™แžŠแŸƒแŸ– ```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 . ``` ### แž’แž“แž’แžถแž“แž–แŸแž› build build arg แž…แŸ†แž“แžฝแž“แž”แžธแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž’แž“แž’แžถแž“แžšแž”แžŸแŸ‹แžŠแŸ†แžŽแžถแž€แŸ‹แž€แžถแž› `builder`แŸ” แž–แžฝแž€แžœแžถแž”แŸ’แžšแžพแžแŸ‚แž“แŸ…แž–แŸแž› build แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡ โ€” `OMNIROUTE_MEMORY_MB` (แžแžถแž„แž€แŸ’แžšแŸ„แž˜) แž‚แžบแž‡แžถแž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹ runtime แžŠแžถแž…แŸ‹แžŠแŸ„แž™แžกแŸ‚แž€แž˜แžฝแž™แž‘แŸ€แžแŸ” | Build arg | แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ | แžฅแž‘แŸ’แž’แžทแž–แž› | | --------------------------- | -------- | ---------------------------------------------------------------------------------------------- | | `OMNIROUTE_USE_TURBOPACK` | `1` | `0` แž“แžนแž„ build แžŠแŸ„แž™แž”แŸ’แžšแžพ webpack แž‡แŸ†แž“แžฝแžŸแžœแžทแž‰แŸ” แž”แŸ’แžšแžพแžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ†แž“แŸ…แž€แž˜แŸ’แžšแžทแžแž€แŸ†แž–แžผแž›แžแžทแž…แž‡แžถแž„ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž™แžบแžแž‡แžถแž„แŸ” | | `OMNIROUTE_BUILD_MEMORY_MB` | `6144` | แž€แž˜แŸ’แžšแžทแžแžขแžแžทแž”แžšแž˜แžถแž“แŸƒ heap แžšแž”แžŸแŸ‹ V8 (`--max-old-space-size`) แžŸแž˜แŸ’แžšแžถแž”แŸ‹ `next build` แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแŸ” | | `OMNIROUTE_BUILD_WORKERS` | `2` | แž”แž‰แŸ’แž‡แžผแž“แžแž˜แŸ’แž›แŸƒแž‘แŸ… `CIRCLE_NODE_TOTAL`; Next แž€แŸ†แžŽแžแŸ‹ `workers = N - 1` แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž”แŸ’แžšแž˜แžผแž›แž‘แžทแž“แŸ’แž“แž“แŸแž™แž‘แŸ†แž–แŸแžšแŸ” | `OMNIROUTE_BUILD_WORKERS` แž‚แžบแž‡แžถแžแž˜แŸ’แž›แŸƒแžŠแŸ‚แž›แž‚แžฝแžšแž”แž„แŸ’แž€แžพแž“แž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“ build แž’แŸ† แž แžพแž™แž€แŸแž‡แžถแžแž˜แŸ’แž›แŸƒแžŠแŸ‚แž›แž‚แžฝแžš แžŸแž„แŸ’แžŸแŸแž™แž“แŸ…แž–แŸแž› build แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แžŠแŸ‚แž›แž˜แžถแž“แž’แž“แž’แžถแž“แž€แž˜แŸ’แžšแž”แžšแžถแž‡แŸแž™ **แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธ** `โœ“ Compiled successfully`แŸ” worker แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‘แžทแž“แŸ’แž“แž“แŸแž™แž‘แŸ†แž–แŸแžšแž“แžธแž˜แžฝแž™แŸ—แž‚แžบแž‡แžถ process แžŠแžถแž…แŸ‹แžŠแŸ„แž™แžกแŸ‚แž€ แž แžพแž™ process แž˜แŸ `next build` แž€แŸแžŠแžผแž…แž‚แŸ’แž“แžถ; แž€แžถแžšแž’แŸ’แžœแžพแžแŸแžŸแŸ’แžแžกแžพแž„แžœแžทแž‰แž›แžพ VPS แžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‡แžถแž€แŸ‹แžŸแŸ’แžŠแŸ‚แž„ (issue #7518) แž”แžถแž“แžœแžถแžŸแŸ‹แžƒแžพแž‰แžแžถ RSS แž€แž˜แŸ’แžšแžทแžแž€แŸ†แž–แžผแž›แžšแž”แžŸแŸ‹ process แž“แžธแž˜แžฝแž™แŸ— แž˜แžถแž“แžแž˜แŸ’แž›แŸƒ ~4.5 GB แžŠแŸ„แž™แžฏแž€แžšแžถแž‡แŸ’แž™แž–แžธ flag heap แžšแž”แžŸแŸ‹ `NODE_OPTIONS` (Turbopack compile แž“แŸ…แž€แŸ’แž“แžปแž„ แžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ† native/Rust แžŠแŸ‚แž›แž“แŸ…แž€แŸ’แžšแŸ… heap แžšแž”แžŸแŸ‹ V8)แŸ” แžแž˜แŸ’แž›แŸƒแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ `2` (โ†’ worker 1, แžŸแžšแžปแž” 2 process) แžแŸ’แžšแžผแžœแž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹ runner แžŠแŸ‚แž› host แžŠแŸ„แž™ GitHub แž‘แŸ†แž แŸ† 16 GB / 4 vCPU แžŠแŸ‚แž› pipeline แžŸแž˜แŸ’แžšแžถแž”แŸ‹ publish แž”แŸ’แžšแžพแŸ” แž“แŸ…แžแž˜แŸ’แž›แŸƒ `8` (โ†’ worker 7) runner แž“แŸ„แŸ‡แžขแžŸแŸ‹แžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ† แž แžพแž™ buildkit แž”แžถแž“แž’แŸ’แžœแžพแžฑแŸ’แž™แž‡แŸ†แž แžถแž“แž“แŸ„แŸ‡แž”แžšแžถแž‡แŸแž™แž‡แžถแž˜แžฝแž™ `ResourceExhausted: ... cannot allocate memory`; แžแž˜แŸ’แž›แŸƒ `3` (โ†’ worker 2) แž“แŸ…แžแŸ‚แž˜แžทแž“แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแžถแž“แŸ‹ แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธ RSS แž€แŸ’แž“แžปแž„แž˜แžฝแž™ process แžแŸ’แžšแžผแžœแž”แžถแž“แžœแžถแžŸแŸ‹ แžŠแŸ„แž™แž•แŸ’แž‘แžถแž›แŸ‹ แž‡แŸ†แž“แžฝแžŸแžฑแŸ’แž™แž€แžถแžšแž”แŸ‰แžถแž“แŸ‹แžŸแŸ’แž˜แžถแž“แŸ” `tests/unit/docker-build-memory-budget.test.ts` แž’แŸ’แžœแžพแž€แžถแžšแž‚แžŽแž“แžถแžŠแŸ„แž™แž•แŸ’แžขแŸ‚แž€แž›แžพแžแžฝแž›แŸแžแžŠแŸ‚แž›แž”แžถแž“แžœแžถแžŸแŸ‹ แž แžพแž™แž“แžนแž„แž”แžšแžถแž‡แŸแž™ แž”แŸ’แžšแžŸแžทแž“แž”แžพแž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžŽแžถแž˜แžฝแž™แž€แŸ’แž“แžปแž„แž…แŸ†แžŽแŸ„แž˜แž‘แžถแŸ†แž„แž–แžธแžš แž›แžพแžŸแžŸแž˜แžแŸ’แžแž—แžถแž–แžšแž”แžŸแŸ‹ runnerแŸ” Turbopack compile แž“แŸ…แž€แŸ’แž“แžปแž„แžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ† native Rust แžŠแŸ‚แž›แžŸแŸ’แžแžทแžแž“แŸ… **แž€แŸ’แžšแŸ…** heap แžšแž”แžŸแŸ‹ V8 แžŠแžผแž…แŸ’แž“แŸแŸ‡ `OMNIROUTE_BUILD_MEMORY_MB` แž˜แžทแž“แžขแžถแž…แž€แŸ†แžŽแžแŸ‹แž–แŸ’แžšแŸ†แžŠแŸ‚แž“แžœแžถแž”แžถแž“แž‘แŸแŸ” แž“แŸ…แž›แžพ host แžŠแŸ‚แž›แž˜แžถแž“แž€แž˜แŸ’แžšแžทแžแžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ† build แž“แžนแž„แžแŸ’แžšแžผแžœแž”แžถแž“ OOM killer แž”แž‰แŸ’แžˆแž”แŸ‹แžŠแŸ„แž™ SIGKILL แžŠแŸ„แž™แž˜แžทแž“แž˜แžถแž“แžŸแžถแžšแž€แŸ†แž แžปแžŸแžขแŸ’แžœแžธแž‘แžถแŸ†แž„แžขแžŸแŸ‹ โ€” แžœแžถแž‚แŸ’แžšแžถแž“แŸ‹แžแŸ‚ แžˆแž”แŸ‹แž“แŸ…แž–แžถแž€แŸ‹แž€แžŽแŸ’แžŠแžถแž› `Creating an optimized production build` แžŠแŸ‚แž›แž˜แžพแž›แž‘แŸ…แžŠแžผแž…แž‡แžถแž‚แžถแŸ†แž„ แž‡แžถแž‡แžถแž„ แžขแžŸแŸ‹แžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ†แŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพ build host แž˜แžถแž“แž’แž“แž’แžถแž“แž€แž˜แŸ’แžšแžทแžแž‘แžถแž” แžŸแžผแž˜แž”แŸ’แžŠแžผแžš bundlerแŸ– ```bash docker build --target runner-base \ --build-arg OMNIROUTE_USE_TURBOPACK=0 \ -t omniroute:base . ``` `webpackBuildWorker` แžแŸ’แžšแžผแžœแž”แžถแž“แž”แžพแž€ แžŠแžผแž…แŸ’แž“แŸแŸ‡ `next build` แžŠแŸ†แžŽแžพแžšแž€แžถแžš process แž˜แŸ **แž“แžทแž„** process worker แž แžพแž™ process แž“แžธแž˜แžฝแž™แŸ—แž‚แŸ„แžšแž–แžแžถแž˜ `OMNIROUTE_BUILD_MEMORY_MB` แžŠแŸ„แž™แžกแŸ‚แž€แž–แžธแž‚แŸ’แž“แžถแŸ” แž€แŸ†แžŽแžแŸ‹แž€แž˜แŸ’แžšแžทแžแžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ†แžšแž”แžŸแŸ‹ container แžฑแŸ’แž™แž›แžพแžŸแž”แŸ’แžšแž แŸ‚แž›แž–แžธแžšแžŠแž„แž“แŸƒแžแž˜แŸ’แž›แŸƒแž“แŸ„แŸ‡ แž˜แžทแž“แž˜แŸ‚แž“แžแŸ’แžšแžนแž˜แž˜แžฝแž™แžŠแž„แž‘แŸแŸ” แž”แžถแž“แžœแžถแžŸแŸ‹แž“แŸ…แž›แžพแž˜แŸ‚แž€แž’แžถแž„แž“แŸแŸ‡ (`--target runner-base`, `OMNIROUTE_BUILD_MEMORY_MB=6144`)แŸ– | Bundler | แž€แž˜แŸ’แžšแžทแžแžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ†แžšแž”แžŸแŸ‹ container | แž›แž‘แŸ’แž’แž•แž› | | --------- | ----------------------------- | -------------------------------------------------- | | Turbopack | 8 GiB / 16 GiB | แžแŸ’แžšแžผแžœแž”แžถแž“ OOM-killed แž“แŸ…แž€แž˜แŸ’แžšแžทแžแž‘แžถแŸ†แž„แž–แžธแžš แžŠแŸ„แž™แžŸแŸ’แž„แžถแžแŸ‹แžŸแŸ’แž„แŸ€แž˜ | | webpack | 8 GiB | build worker แžแŸ’แžšแžผแžœแž”แžถแž“ SIGKILL | | webpack | 12 GiB | แž‡แŸ„แž‚แž‡แŸแž™ แžŠแŸ„แž™แžกแžพแž„แžŠแž›แŸ‹แž€แž˜แŸ’แžšแžทแžแž€แŸ†แž–แžผแž› 11.1 GiB | ### แžแž˜แŸ’แž›แŸƒแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แž–แŸแž› runtime แžแž˜แŸ’แž›แŸƒแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แžŠแŸ‚แž› export แžŠแŸ„แž™ `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`แŸ” แžฅแžšแžทแž™แžถแž”แžแžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ†แž“แŸ…แž€แŸ’แž“แžปแž„ DockerแŸ– - Image แž€แŸ†แžŽแžแŸ‹ `OMNIROUTE_MEMORY_MB=1024` แž แžพแž™แž‘แžถแž‰แž™แž€ `NODE_OPTIONS=--max-old-space-size=1024` แž–แžธแžœแžถแŸ” - แžŠแŸ†แžŽแžพแžšแž€แžถแžš server แž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„แžแŸ’แžšแžผแžœแž”แžถแž“แž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜แžŠแŸ„แž™ standalone launcher แžŠแŸ‚แž›แžขแžถแž“ `OMNIROUTE_MEMORY_MB` แž แžพแž™แž”แž“แŸ’แžแŸ‚แž˜ `--max-old-space-size=`แŸ” - Node แž”แŸ’แžšแžพแžแž˜แŸ’แž›แŸƒ `--max-old-space-size` แžŠแŸ‚แž›แž”แžถแž“แž”แž‰แŸ’แž‡แžถแž€แŸ‹แž˜แŸ’แžแž„แž‘แŸ€แžแž…แžปแž„แž€แŸ’แžšแŸ„แž™ แžŠแžผแž…แŸ’แž“แŸแŸ‡แž€แžถแžšแž€แŸ†แžŽแžแŸ‹ `OMNIROUTE_MEMORY_MB` แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แžŠแŸ‚แž“แž€แŸ†แžŽแžแŸ‹ heap แž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„แžšแž”แžŸแŸ‹ DockerแŸ” - แžŠแŸ„แž™แžŸแžถแžš image แžแŸ‚แž„แžแŸ‚แž€แŸ†แžŽแžแŸ‹แžœแžถ fallback แžŠแŸ‚แž›แž€แŸ‚แžแž˜แŸ’แžšแžผแžœแžแžถแž˜ RAM แžšแž”แžŸแŸ‹ launcher แž“แžนแž„แž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ’แžšแžพแž€แŸ’แžšแŸ„แž˜ Docker แž‘แŸแŸ” แžŸแžผแž˜แž”แž„แŸ’แž€แžพแž“แžœแžถแžŠแŸ„แž™แž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹ workload (แžแžถแžšแžถแž„แžแžถแž„แž€แŸ’แžšแŸ„แž˜)แŸ” `2048` แž“แŸ…แžแŸ‚แžแžผแž…แž–แŸแž€แžŸแž˜แŸ’แžšแžถแž”แŸ‹ `/v1/responses` แžšแž”แžŸแŸ‹ coding agentแŸ” ### RAM แž–แŸแž›แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŸแž˜แŸ’แžšแžถแž”แŸ‹ coding agent แžแž˜แŸ’แž›แŸƒแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ 1โ€ฏGiB แžšแž”แžŸแŸ‹ Docker แž‚แžบแž‡แžถแž€แž˜แŸ’แžšแžทแžแžขแž”แŸ’แž”แž”แžšแž˜แžถแžŸแž˜แŸ’แžšแžถแž”แŸ‹ dashboard/light chat แž˜แžทแž“แž˜แŸ‚แž“แž‡แžถแž‘แŸ†แž แŸ†แžŸแž˜แŸ’แžšแžถแž”แŸ‹ production แž‘แŸแŸ” Body แžœแŸ‚แž„แŸ—แžšแž”แžŸแŸ‹ `POST /v1/responses` (แž˜แžถแž“แžŸแžถแžšแžšแžถแž”แŸ‹แžšแž™ แž“แžทแž„ tools แžšแžถแž”แŸ‹แžŸแžทแž”) แžšแž€แŸ’แžŸแžถแž‘แžปแž€แž€แŸ’แžšแžถแž แŸ’แžœแž‡แžถแž…แŸ’แžšแžพแž“แž€แŸ’แž“แžปแž„ memory แžขแŸ†แžกแžปแž„แž–แŸแž› compressionแŸ” Request แž–แžธแžšแžŠแŸ‚แž›แžแŸ’แžšแžฝแžแž‚แŸ’แž“แžถ แžŠแŸ‚แž›แž“แžธแž˜แžฝแž™แŸ—แž˜แžถแž“แž‘แŸ†แž แŸ†แž”แŸ’แžšแž แŸ‚แž› ~3โ€ฏMiB / ~750k-token แž”แžถแž“แž’แŸ’แžœแžพแžฑแŸ’แž™ V8 แž”แž‰แŸ’แžˆแž”แŸ‹แž“แŸ… old-space แž‘แŸ†แž แŸ† **12โ€ฏGiB** (`FATAL ERROR: Reached heap limit`) แž แžพแž™แž€แŸแž”แžถแž“แž”แŸ‰แŸ‡ cgroup OOM แž‘แŸ†แž แŸ† 16โ€ฏGiB แž•แž„แžŠแŸ‚แžšแŸ” แžŸแžผแž˜แž˜แžพแž› [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849)แŸ” แž€แŸ†แžŽแžแŸ‹แž‘แŸ†แž แŸ† **cgroup `--memory` แžฑแŸ’แž™แž’แŸ†แž‡แžถแž„ heap** โ€” native buffers, SQLite แž“แžทแž„แž‘แžทแž“แŸ’แž“แž“แŸแž™แž”แžŽแŸ’แžŠแŸ„แŸ‡แžขแžถแžŸแž“แŸ’แž“แžšแž”แžŸแŸ‹ compression แžŸแŸ’แžแžทแžแž“แŸ…แž€แŸ’แžšแŸ… V8แŸ” | Workload | `OMNIROUTE_MEMORY_MB` | Container / cgroup | แž€แŸ†แžŽแžแŸ‹แžŸแž˜แŸ’แž‚แžถแž›แŸ‹ | | ------------------------------------------ | -------------------------------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------- | | Dashboard แž“แžทแž„ light chat แž˜แžฝแž™ | `1024` (แžแž˜แŸ’แž›แŸƒแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แžšแž”แžŸแŸ‹ image) | โ‰ฅ2โ€ฏGiB | | | Coding agent แž˜แžฝแž™ (Claude/Codex/Grok) | `8192` | โ‰ฅ10โ€ฏGiB | แž‡แžถแž‘แžผแž‘แŸ…แžŸแž˜แŸ’แžšแžถแž”แŸ‹ `/v1/responses` แž€แŸ’แž“แžปแž„ session แžแŸ‚แž˜แžฝแž™ | | `/v1/responses` แžœแŸ‚แž„แž–แžธแžšแžŠแŸ‚แž›แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแŸ†แžŽแžถแž›แž‚แŸ’แž“แžถ | `10240`โ€“`12288` | โ‰ฅ12โ€“16โ€ฏGiB | แž”แžถแž“แžœแžถแžŸแŸ‹แžƒแžพแž‰แžแžถ V8 แž”แž‰แŸ’แžˆแž”แŸ‹แž“แŸ… heap แž‘แŸ†แž แŸ†แž”แŸ’แžšแž แŸ‚แž› ~12โ€ฏGiB | | Context แžœแŸ‚แž„แŸ—แž…แŸ†แž“แžฝแž“แž”แžธ แžฌแž…แŸ’แžšแžพแž“แž‡แžถแž„แž“แŸแŸ‡ | แž€แžปแŸ†แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž›แžพ process แžแŸ‚แž˜แžฝแž™ | แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžแžถแž˜แž›แŸ†แžŠแžถแž”แŸ‹ / RAM แž”แž“แŸ’แžแŸ‚แž˜ | แžแžถแž˜แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ แž€แžถแžšแž‘แž‘แžฝแž›แž™แž€ workload แž’แŸ’แž„แž“แŸ‹แŸ—แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แž˜แžถแž“ 1 in-flight; แž€แžถแžšแž”แž„แŸ’แž€แžพแž“แžœแžถแžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“ RAM แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแžถแž“แŸ‹แž“แžนแž„แž’แŸ’แžœแžพแžฑแŸ’แž™แž€แžถแžšแž”แž‰แŸ’แžˆแž”แŸ‹แž“แŸแŸ‡แž€แžพแžแžกแžพแž„แžœแžทแž‰ | `omniroute serve` แž“แŸ…แž›แžพ bare metal แž€แŸ‚แžแž˜แŸ’แžšแžผแžœแž‘แŸ…แž”แŸ’แžšแž แŸ‚แž› ~35% แž“แŸƒ RAM (แž€แŸ†แžŽแžแŸ‹แž€แŸ’แž“แžปแž„แž…แž“แŸ’แž›แŸ„แŸ‡ `[512, 4096]`) แž“แŸ…แž–แŸแž› `OMNIROUTE_MEMORY_MB` **แž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž€แŸ†แžŽแžแŸ‹**แŸ” Docker แžแŸ‚แž„แžแŸ‚แž€แŸ†แžŽแžแŸ‹แžœแžถแž‡แžถ `1024` แžŠแžผแž…แŸ’แž“แŸแŸ‡แž€แžถแžšแž€แŸ‚แžแž˜แŸ’แžšแžผแžœแž“แŸ„แŸ‡แž˜แžทแž“แžŠแŸ‚แž›แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž“แŸ…แž€แŸ’แž“แžปแž„ official image แž‘แŸแŸ” ```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 ``` ## แžขแžแŸแžšแž”แžšแžทแžŸแŸ’แžแžถแž“แžŸแŸ†แžแžถแž“แŸ‹แŸ— แž€แŸ’แžšแŸ…แž–แžธแžแž˜แŸ’แž›แŸƒแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แžŠแŸ‚แž›แž”แžถแž“แž…แž„แž€แŸ’แžšแž„แž‡แžถแžฏแž€แžŸแžถแžšแž“แŸ…แž€แŸ’แž“แžปแž„ [ENVIRONMENT.md](../reference/ENVIRONMENT.md) แžขแžแŸแžšแžแžถแž„แž€แŸ’แžšแŸ„แž˜แž˜แžถแž“แžŸแžถแžšแŸˆแžŸแŸ†แžแžถแž“แŸ‹แž”แŸ†แž•แžปแžแž“แŸ…แž–แŸแž›แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แŸ’แžšแŸ„แž˜ DockerแŸ– | แžขแžแŸแžš | แž‚แŸ„แž›แž”แŸ†แžŽแž„ | แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ | | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | `OMNIROUTE_WS_BRIDGE_SECRET` | แž–แžถแž€แŸ’แž™แžŸแž˜แŸ’แž„แžถแžแŸ‹แžšแžฝแž˜แžŸแž˜แŸ’แžšแžถแž”แŸ‹ WebSocket bridgeแŸ” **แžแž˜แŸ’แžšแžผแžœแžฑแŸ’แž™แž˜แžถแž“แž€แŸ’แž“แžปแž„แž”แžšแžทแžŸแŸ’แžแžถแž“ production** โ€” แž€แŸ†แžŽแžแŸ‹แžœแžถแž‡แžถแžแŸ’แžŸแŸ‚แžขแž€แŸ’แžŸแžšแž…แŸƒแžŠแž“แŸ’แž™แžŠแŸ‚แž›แžšแžนแž„แž˜แžถแŸ†แŸ” | แž˜แžทแž“แž”แžถแž“แž€แŸ†แžŽแžแŸ‹ (แžแŸ’แžšแžผแžœแžแŸ‚แž•แŸ’แžแž›แŸ‹แž‡แžผแž“) | | `REDIS_URL` | แžแŸ’แžŸแŸ‚แžขแž€แŸ’แžŸแžšแžแž—แŸ’แž‡แžถแž”แŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แž˜แŸ’แž˜แžœแžทแž’แžธแž€แŸ†แžŽแžแŸ‹แžขแžแŸ’แžšแžถ / cache backend | `redis://redis:6379` | | `REDIS_PORT` | แž…แŸ’แžšแž€แž“แŸ…แžแžถแž„ host แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Redis container แžŠแŸ‚แž›แž—แŸ’แž‡แžถแž”แŸ‹แž˜แž€แž‡แžถแž˜แžฝแž™ | `6379` | | `REDIS_BIND_HOST` | host interface แžŠแŸ‚แž›แž…แŸ’แžšแž€ Redis แžŠแŸ‚แž›แž—แŸ’แž‡แžถแž”แŸ‹แž˜แž€แž‡แžถแž˜แžฝแž™แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž•แŸ’แžŸแžถแž™แž“แŸ…แž›แžพแžœแžถ (loopback แž›แžปแŸ‡แžแŸ’แžšแžถแžแŸ‚แžขแŸ’แž“แž€แž”แž“แŸ’แžแŸ‚แž˜ AUTH) | `127.0.0.1` | | `AUTO_UPDATE_HOST_REPO_DIR` | path แž“แŸ…แž›แžพ host แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“ mount แž…แžผแž›แž‘แŸ…แž€แŸ’แž“แžปแž„ profile `cli` แž“แŸ… `/workspace/omniroute` แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžŠแŸ†แžŽแžพแžšแž€แžถแžš self-update | `.` (แžแžแž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“) | | `OMNIROUTE_MEMORY_MB` | แž€แž˜แŸ’แžšแžทแžแžขแžแžทแž”แžšแž˜แžถ Node heap แž–แŸแž›แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŸแž˜แŸ’แžšแžถแž”แŸ‹ Docker standalone server; แž‡แŸ†แž“แžฝแžŸแžแž˜แŸ’แž›แŸƒแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แžšแž”แžŸแŸ‹ image แžแžถแž„แž›แžพแŸ” แž—แŸ’แž“แžถแž€แŸ‹แž„แžถแžšแžŸแžšแžŸแŸแžšแž€แžผแžŠแŸ– `8192`+ (แžŸแžผแž˜แž˜แžพแž› [RAM แž–แŸแž›แžŠแŸ†แžŽแžพแžšแž€แžถแžš](#runtime-ram-for-coding-agents))แŸ” | `1024` | | `DASHBOARD_PORT` / `API_PORT` | แž‡แŸ†แž“แžฝแžŸแž…แŸ’แžšแž€แžŠแŸ‚แž›แž”แžพแž€แž”แž„แŸ’แž แžถแž‰แžŸแž˜แŸ’แžšแžถแž”แŸ‹ dashboard (20128) แž“แžทแž„ API (20129) | `20128` / `20129` | | `APP_BIND_HOST` | host interface แžŠแŸ‚แž› docker-compose แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž•แŸ’แžŸแžถแž™แž…แŸ’แžšแž€ dashboard/API/live-WS แž“แŸ…แž›แžพแžœแžถแŸ” แž‡แžถแž˜แžฝแž™ `REQUIRE_API_KEY=false` (แžแž˜แŸ’แž›แŸƒแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜) `0.0.0.0` แž”แžพแž€แž”แž„แŸ’แž แžถแž‰ proxy `/v1` แžขแž“แžถแž˜แžทแž€แž‘แŸ…แž€แžถแž“แŸ‹ LAN โ€” แž–แž„แŸ’แžšแžธแž€แž€แžถแžšแž…แžผแž›แž”แŸ’แžšแžพแžแŸ‚แž‡แžถแž˜แžฝแž™ `REQUIRE_API_KEY=true` แžฌ reverse proxy แž“แŸ…แžแžถแž„แž˜แžปแžแž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡แŸ” | `127.0.0.1` | | `CLIPROXY_BIND_HOST` | host interface แžŠแŸ‚แž› docker-compose แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž•แŸ’แžŸแžถแž™ sidecar `cliproxyapi` แž“แŸ…แž›แžพแžœแžถ โ€” data volume แžšแž”แžŸแŸ‹แžœแžถแž•แŸ’แž‘แžปแž€แž–แŸแžแŸŒแž˜แžถแž“แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แžขแžแŸ’แžแžŸแž‰แŸ’แž‰แžถแžŽแžšแž”แžŸแŸ‹ providerแŸ” | `127.0.0.1` | | `OMNIROUTE_PLUGINS_DIR` | แžแžแžŠแŸ‚แž› runtime plugin scanner แžขแžถแž“ แž“แžทแž„แžŠแŸ†แžกแžพแž„แž…แžผแž›แŸ” แž€แŸ†แžŽแžแŸ‹แžœแžถแž“แŸ…แž–แŸแž› plugins แžแŸ’แžšแžผแžœแž”แžถแž“ bind-mountแŸ– แžแž˜แŸ’แž›แŸƒแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แžขแž“แžปแžœแžแŸ’แžแžแžถแž˜ `HOME` แžŠแŸ‚แž› image แž˜แžทแž“แž…แžถแŸ†แž”แžถแž…แŸ‹ export แž‘แŸแŸ” | `~/.omniroute/plugins` | | `OMNIROUTE_BASE_PATH` | URL subpath แž“แŸ…แž–แŸแž› app แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž•แŸ’แžŸแžถแž™แž“แŸ…แž–แžธแž€แŸ’แžšแŸ„แž™ reverse proxy (แžง. `/omniroute`) | _(แž‘แž‘แŸ = root)_ | | `NEXT_PUBLIC_BASE_URL` | browser origin แžŸแžถแž’แžถแžšแžŽแŸˆแžŠแŸ‚แž›แžšแžฝแž˜แž”แž‰แŸ’แž…แžผแž› subpath (แžง. `https://host/omniroute`) | แž˜แžทแž“แž”แžถแž“แž€แŸ†แžŽแžแŸ‹ | | `PROD_DASHBOARD_PORT` | แž…แŸ’แžšแž€ dashboard แž“แŸ…แžแžถแž„ host แžŸแž˜แŸ’แžšแžถแž”แŸ‹ `docker-compose.prod.yml` | `20130` | | `CLIPROXYAPI_PORT` | แž…แŸ’แžšแž€แž“แŸ…แžแžถแž„ host แžŸแž˜แŸ’แžšแžถแž”แŸ‹ sidecar `cliproxyapi` | `8317` | ## แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž”แž‰แŸ’แž…แŸ’แžšแžถแžŸแž›แžพแž•แŸ’แž›แžผแžœแžšแž„ (Traefik / nginx) `basePath` แžšแž”แžŸแŸ‹ Next.js แžแŸ’แžšแžผแžœแž”แžถแž“แž…แž„แž€แŸ’แžšแž„แž”แž‰แŸ’แž…แžผแž›แž€แŸ’แž“แžปแž„แž”แžŽแŸ’แžŽแžปแŸ† standaloneแŸ” OmniRoute แž€แžแŸ‹แžแŸ’แžšแžถแžแž˜แŸ’แž›แŸƒแžŠแŸ‚แž›แž”แžถแž“แž”แž„แŸ’แž€แž”แŸ‹แž“แŸแŸ‡แž€แŸ’แž“แžปแž„แžฏแž€แžŸแžถแžš sentinel แž“แŸ…แžซแžŸแžšแž”แžŸแŸ‹แž€แž˜แŸ’แž˜แžœแžทแž’แžธ (แžŸแžšแžŸแŸแžšแž€แŸ†แžกแžปแž„แž–แŸแž› `npm run build`; แžขแžถแž“แžŠแŸ„แž™ `scripts/docker/ensure-docker-base-path.mjs`) แž แžพแž™แž”แŸ’แžšแŸ€แž”แž’แŸ€แž”แžœแžถแž‡แžถแž˜แžฝแž™ `OMNIROUTE_BASE_PATH` แž“แŸ…แž–แŸแž› container แž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜แŸ” แž“แŸ…แž–แŸแž›แžแž˜แŸ’แž›แŸƒแž‘แžถแŸ†แž„แž–แžธแžšแžแžปแžŸแž‚แŸ’แž“แžถ แž แžพแž™ image แžแŸ’แžšแžผแžœแž”แžถแž“ build แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžซแžŸแžŠแžผแž˜แŸ‚แž“ entrypoint แž“แžนแž„แžŸแžšแžŸแŸแžš standalone manifests แžกแžพแž„แžœแžทแž‰ แž–แŸ’แžšแž˜แž‘แžถแŸ†แž„ literal `basePath`/`assetPrefix` แžŠแŸ‚แž›แž”แžถแž“แž”แž„แŸ’แž€แž”แŸ‹ (Next 16 แž”แž„แŸ’แž€แžพแž URL แž’แž“แž’แžถแž“ SSR แž–แžธ `assetPrefix` แžแŸ‚แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡ โ€” patcher แž“แžนแž„แž…แž˜แŸ’แž›แž„แž•แŸ’แž›แžผแžœแžšแž„แž‘แŸ…แž€แŸ’แž“แžปแž„แžœแžถแž•แž„แžŠแŸ‚แžš), URL แž’แž“แž’แžถแž“ `/_next/static` แžŠแŸ‚แž›แž”แžถแž“แž”แž„แŸ’แž€แž”แŸ‹ (client-reference manifests, media imports, แž‘แŸ†แž–แŸแžšแž€แŸ†แž แžปแžŸแžŠแŸ‚แž›แž”แžถแž“ prerender) แž“แžทแž„ shim `process.env` แžšแž”แžŸแŸ‹ client แž˜แžปแž“แž–แŸแž› `node dev/run-standalone.mjs` แžŠแŸ†แžŽแžพแžšแž€แžถแžšแŸ” ### แž€แžถแžš build แž‡แžถแž˜แžฝแž™ Compose (แž”แžถแž“แžŽแŸ‚แž“แžถแŸ†) แž€แŸ†แžŽแžแŸ‹แžขแžแŸแžšแž‘แžถแŸ†แž„แž–แžธแžšแž€แŸ’แž“แžปแž„ `.env` แžšแžฝแž… build แžกแžพแž„แžœแžทแž‰ แžŠแžพแž˜แŸ’แž”แžธแžฑแŸ’แž™ image แž“แžทแž„ runtime แž˜แžถแž“แžแž˜แŸ’แž›แŸƒแžŠแžผแž…แž‚แŸ’แž“แžถแŸ– ```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` แž”แž‰แŸ’แž‡แžผแž“แž”แž“แŸ’แž `OMNIROUTE_BASE_PATH` แž‡แžถ Docker build-arg แž“แžทแž„แž‡แžถแžขแžแŸแžšแž”แžšแžทแžŸแŸ’แžแžถแž“แž–แŸแž› runtimeแŸ” ### Root image แžŠแŸ‚แž›แž”แžถแž“ build แž‡แžถแž˜แžปแž“ + แž•แŸ’แž›แžผแžœแžšแž„แž–แŸแž› runtime Image `diegosouzapw/omniroute:*` แžŠแŸ‚แž›แž”แžถแž“แž…แŸแž‰แž•แŸ’แžŸแžถแž™ แžแŸ’แžšแžผแžœแž”แžถแž“ build แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžซแžŸแžŠแžผแž˜แŸ‚แž“แŸ” แžขแŸ’แž“แž€แž“แŸ…แžแŸ‚แžขแžถแž…แž€แŸ†แžŽแžแŸ‹ `OMNIROUTE_BASE_PATH` แž“แŸ…แž–แŸแž› runtime แž”แžถแž“; container แž“แžนแž„ patch แž”แžŽแŸ’แžŽแžปแŸ†แž˜แžฝแž™แžŠแž„แž“แŸ…แž–แŸแž›แž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜แŸ” แž”แŸ’แžšแžพแžœแžถแž‡แžถแž˜แžฝแž™ public origin แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž‚แŸ’แž“แžถแŸ– ```yaml services: omniroute: image: diegosouzapw/omniroute:latest environment: OMNIROUTE_BASE_PATH: /omniroute NEXT_PUBLIC_BASE_URL: https://myhostname.example.com/omniroute ``` แž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แž”แŸ’แžšแžผแž€แžŸแŸŠแžธแž”แž‰แŸ’แž…แŸ’แžšแžถแžŸแžฑแŸ’แž™แž”แž‰แŸ’แž‡แžผแž“แž”แž“แŸ’แžแž•แŸ’แž›แžผแžœแžแžถแž„แž€แŸ’แžšแŸ… **แž‘แžถแŸ†แž„แž˜แžผแž›** (แž€แžปแŸ†แžŠแž€ prefix แž…แŸแž‰)แŸ” Traefik แž‚แžฝแžšแžแŸ‚แž”แž‰แŸ’แž‡แžผแž“ `PathPrefix(`/omniroute`)` แž‘แŸ… container แžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“ `StripPrefix` แžŠแžพแž˜แŸ’แž”แžธแžฑแŸ’แž™ Next.js แž‘แž‘แžฝแž›แž”แžถแž“ `/omniroute/...` แž“แžทแž„แž”แž˜แŸ’แžšแžพแž’แž“แž’แžถแž“แž–แžธ `/omniroute/_next/...`แŸ” Docker healthcheck แž–แžทแž“แžทแžแŸ’แž™ lifecycle endpoint แž‘แž˜แŸ’แž„แž“แŸ‹แžŸแŸ’แžšแžถแž› `/healthz` แžŠแŸ‚แž›แžŠแžถแž€แŸ‹ prefix แžŠแŸ„แž™ `OMNIROUTE_BASE_PATH` แž€แŸ†แž–แžปแž„แžŸแž€แž˜แŸ’แž˜แŸ” `/api/monitoring/health` แž“แŸ…แžแŸ‚แžขแžถแž…แž”แŸ’แžšแžพแž”แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž’แŸ’แžœแžพแžšแŸ„แž‚แžœแžทแž“แžทแž…แŸ’แž†แŸแž™แžŠแŸ„แž™แž˜แž“แžปแžŸแŸ’แžŸ/dashboard; แžŠแžพแž˜แŸ’แž”แžธแžฑแŸ’แž™ HEALTHCHECK แžšแž”แžŸแŸ‹ container แž”แŸ’แžšแžพ endpoint แž“แŸแŸ‡แžœแžทแž‰ (แžงแž‘แžถแž แžšแžŽแŸ แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžขแž“แžปแžœแžแŸ’แž deep health แž™แŸ‰แžถแž„แžแžนแž„แžšแŸ‰แžนแž„) แžŸแžผแž˜แž€แŸ†แžŽแžแŸ‹ `OMNIROUTE_HEALTHCHECK_PATH=/api/monitoring/health`แŸ” แž•แŸ’แž›แžผแžœแž“แŸ„แŸ‡แž‚แžบแž‡แžถแž€แžถแžšแž–แžทแž“แžทแžแŸ’แž™ **แž‡แŸ’แžšแŸ…** (DB + แžŸแŸแž…แž€แŸ’แžŠแžธแžŸแž„แŸ’แžแŸแž”แž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™) โ€” แžŸแž˜แžŸแŸ’แžšแž”แžŸแž˜แŸ’แžšแžถแž”แŸ‹ `HEALTHCHECK` แžŠแŸ‚แž› Docker แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž˜แžทแž“แž‰แžนแž€แž‰แžถแž”แŸ‹ แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž”แŸ’แžšแžพแžœแžถแžœแžทแž‰ แž”แŸ‰แžปแž“แŸ’แžแŸ‚ **แž˜แžทแž“แžŸแž˜แžŸแŸ’แžšแž”** แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž…แž“แŸ’แž›แŸ„แŸ‡แž–แŸแž› `livenessProbe` แžšแž”แžŸแŸ‹ Kubernetes แž‘แŸแŸ” แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž”แŸ’แžšแž–แŸแž“แŸ’แž’ orchestration (Kubernetes, Nomad แž‡แžถแžŠแžพแž˜)แŸ– | Probe | แž‚แžฝแžšแž”แŸ’แžšแžพ | แž‚แžฝแžšแž‡แŸ€แžŸแžœแžถแž„ | | --------------- | ------------------------------------------------------------- | -------------------------------------------------- | | Liveness | HTTP `GET /livez` แžฌ TCP แž›แžพ port แž˜แŸ (`PORT`, แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ `20128`) | แž”แŸ’แžšแžพ `/api/monitoring/health` แž‡แžถ liveness | | Readiness | HTTP `GET /healthz` | timeout แžแŸ’แž›แžธแž–แŸแž€แžŠแŸ‚แž›แž…แžถแžแŸ‹แž‘แžปแž€ event-loop แžšแžœแž›แŸ‹แžแžถแž”แžถแž“แžŠแžถแž…แŸ‹ | | Deep / blackbox | `/api/monitoring/health` | โ€” | `/healthz` แžšแžถแž™แž€แžถแžšแžŽแŸแžขแŸ†แž–แžธ lifecycle แžšแž”แžŸแŸ‹ process (`ok` / `starting` / `stopping`)แŸ” `/livez` แž–แžทแž“แžทแžแŸ’แž™แžแŸ‚แžแžถ process แž“แŸ…แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡ (แžแŸ’แžšแžกแž”แŸ‹ 200 แž‚แŸ’แžšแž”แŸ‹แž–แŸแž›แžŠแŸ‚แž› handler แžขแžถแž…แžŠแŸ†แžŽแžพแžšแž€แžถแžš; แžœแžถแž˜แžทแž“แžšแž„แŸ‹แž…แžถแŸ† readiness แž‘แŸ)แŸ” แž‘แžถแŸ†แž„แž–แžธแžšแž“แŸ…แžแŸ‚แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž›แžพ Node event loop แžŠแžผแž…แž‚แŸ’แž“แžถแž“แžนแž„แž€แžถแžšแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„ request แžŠแžผแž…แŸ’แž“แŸแŸ‡แž€แžถแžšแž„แžถแžš catalog แžฌ compression แžŠแŸ‚แž›แž”แŸ’แžšแžพ CPU แž…แŸ’แžšแžพแž“แžขแžถแž…แž’แŸ’แžœแžพแžฑแŸ’แž™แž–แžฝแž€แžœแžถแž™แžบแž โ€” แžšแžœแž›แŸ‹ โ‰  แžŠแžถแž…แŸ‹แŸ” แž‚แžฝแžšแž”แŸ’แžšแžพ TCP liveness แž”แŸ’แžšแžŸแžทแž“แž”แžพ HTTP probe แžขแžŸแŸ‹แž–แŸแž›แŸ” แžŸแŸแž…แž€แŸ’แžŠแžธแžŽแŸ‚แž“แžถแŸ†แž–แŸแž‰แž›แŸแž‰แžขแŸ†แž–แžธ probeแŸ– [แž˜แž‚แŸ’แž‚แžปแž‘แŸ’แž‘แŸแžŸแž€แŸแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™ โ€” แžขแž“แžปแžŸแžถแžŸแž“แŸแžขแŸ†แž–แžธ probe แžšแž”แžŸแŸ‹ Kubernetes](../ops/MONITORING_GUIDE.md#kubernetes-probe-recommendations)แŸ” ## Docker Compose แž‡แžถแž˜แžฝแž™ Caddy (HTTPS Auto-TLS) OmniRoute แžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แž”แžพแž€แžฑแŸ’แž™แž…แžผแž›แž”แŸ’แžšแžพแžŠแŸ„แž™แžŸแžปแžœแžแŸ’แžแžทแž—แžถแž– แžŠแŸ„แž™แž”แŸ’แžšแžพแž€แžถแžšแž•แŸ’แžŠแž›แŸ‹ SSL แžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžทแžšแž”แžŸแŸ‹ CaddyแŸ” แžŸแžผแž˜แž”แŸ’แžšแžถแž€แžŠแžแžถ DNS A record แžšแž”แžŸแŸ‹แžŠแžผแž˜แŸ‚แž“แžขแŸ’แž“แž€แž…แž„แŸ’แžขแžปแž›แž‘แŸ…แž€แžถแž“แŸ‹ IP แžšแž”แžŸแŸ‹แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแžขแŸ’แž“แž€แŸ” ```yaml services: omniroute: image: diegosouzapw/omniroute:latest container_name: omniroute restart: unless-stopped volumes: - omniroute-data:/app/data environment: - PORT=20128 # Origin แžŠแŸ‚แž›แž”แž„แŸ’แž แžถแž‰แž‘แŸ…แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžšแžปแž€แžšแž€ แžŸแž˜แŸ’แžšแžถแž”แŸ‹ OAuth callbacks แžแŸ†แžŽแž•แŸ’แž‘แžถแŸ†แž„แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„ แž“แžทแž„ URL แžŸแžถแž’แžถแžšแžŽแŸˆแžŠแŸ‚แž›แž”แžถแž“แž”แž„แŸ’แž€แžพแžแŸ” - NEXT_PUBLIC_BASE_URL=https://your-domain.com # URL แžแžถแž„แž€แŸ’แž“แžปแž„แž–แžธแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแž‘แŸ…แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž„แžถแžšแžŠแŸ‚แž›แž”แžถแž“แž€แŸ†แžŽแžแŸ‹แž–แŸแž› / แž€แžถแžšแž‘แžถแž‰แž™แž€แžแŸ’แž›แžฝแž“แžฏแž„แŸ” - 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 แž€แŸ†แžŽแžแŸ‹แž”แž‹แž˜แž€แžแžถแž”แž‰แŸ’แž‡แžผแž“แž”แž“แŸ’แžแžŸแŸ’แžแž„แŸ‹แžŠแžถแžšแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžปแž„แžแžบแž“แŸแžš upstreamแŸ” OmniRoute แž”แŸ’แžšแžพ `NEXT_PUBLIC_BASE_URL` แž‡แžถ origin แžŸแžถแž’แžถแžšแžŽแŸˆแžŸแŸ’แžแž„แŸ‹แžŠแžถแžš แžŸแž˜แŸ’แžšแžถแž”แŸ‹ OAuth callbacks แž“แžทแž„แžแŸ†แžŽแžŸแžถแž’แžถแžšแžŽแŸˆ แžŠแŸ‚แž›แž”แžถแž“แž”แž„แŸ’แž€แžพแžแŸ” แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžšแžŸแžšแžŸแŸแžšแžŠแŸ‚แž›แž”แžถแž“แž•แŸ’แž‘แŸ€แž„แž•แŸ’แž‘แžถแžแŸ‹แž“แŸ…แž›แžพแž•แŸ’แž‘แžถแŸ†แž„แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„ แž”แŸ’แžšแžพแžŸแŸ†แžŽแžพ same-origin แžšแžฝแž˜แž‡แžถแž˜แžฝแž™แž€แžถแžšแž€แžถแžšแž–แžถแžš CSRF แžŠแŸ‚แž›แž—แŸ’แž‡แžถแž”แŸ‹แž“แžนแž„ sessionแŸ” แž”แžพแž€ `OMNIROUTE_TRUST_PROXY` แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžแŸ‚แž€แžถแžšแžŠแžถแž€แŸ‹แžฑแŸ’แž™แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž€แž˜แŸ’แžšแžทแžแžแŸ’แž–แžŸแŸ‹ แžŠแŸ‚แž›แžขแŸ’แž“แž€แž˜แžถแž“แž”แŸ†แžŽแž„ แžฑแŸ’แž™ OmniRoute แž€แŸ†แžŽแžแŸ‹ origin แžŸแžถแž’แžถแžšแžŽแŸˆแž–แžธแž”แž‹แž˜แž€แžแžถแž”แž‰แŸ’แž‡แžผแž“แž”แž“แŸ’แžแžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“ แž‡แŸ†แž“แžฝแžŸแžฑแŸ’แž™แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ แž…แŸ’แž”แžถแžŸแŸ‹แž›แžถแžŸแŸ‹แŸ” ## Cloudflare Quick Tunnel แž€แžถแžšแž‚แžถแŸ†แž‘แŸ’แžšแž•แŸ’แž‘แžถแŸ†แž„แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžŠแžถแž€แŸ‹แžฑแŸ’แž™แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžแžถแž˜ Docker แžšแžฝแž˜แž˜แžถแž“ **Cloudflare Quick Tunnel** แžŠแŸ‚แž›แžขแžถแž…แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแŸ„แž™แž…แžปแž…แžแŸ‚แž˜แŸ’แžแž„ แž“แŸ…แž›แžพ `Dashboard โ†’ Endpoints`แŸ” แž€แžถแžšแž”แžพแž€แž‡แžถแž›แžพแž€แžŠแŸ†แž”แžผแž„แž‘แžถแž‰แž™แž€ `cloudflared` แžแŸ‚แž“แŸ…แž–แŸแž›แžแŸ’แžšแžผแžœแž€แžถแžš แž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜ tunnel แž”แžŽแŸ’แžŠแŸ„แŸ‡แžขแžถแžŸแž“แŸ’แž“แž‘แŸ…แž€แžถแž“แŸ‹ endpoint `/v1` แž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€ แž แžพแž™แž”แž„แŸ’แž แžถแž‰ URL `https://*.trycloudflare.com/v1` แžŠแŸ‚แž›แž”แžถแž“แž”แž„แŸ’แž€แžพแž แžŠแŸ„แž™แž•แŸ’แž‘แžถแž›แŸ‹แž“แŸ…แžแžถแž„แž€แŸ’แžšแŸ„แž˜ URL แžŸแžถแž’แžถแžšแžŽแŸˆแž’แž˜แŸ’แž˜แžแžถแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แŸ” แž•แŸ’แž‘แžถแŸ†แž„ tunnel แžšแž”แžŸแŸ‹ endpoint (Cloudflare, Tailscale, ngrok) แžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž แžถแž‰ แžฌแž›แžถแž€แŸ‹แž–แžธ `Settings โ†’ Appearance` แžŠแŸ„แž™แž˜แžทแž“แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžŠแžผแžšแžŸแŸ’แžแžถแž“แž—แžถแž– tunnel แžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แžŸแž€แž˜แŸ’แž˜แŸ” ### แž€แŸ†แžŽแžแŸ‹แžŸแž˜แŸ’แž‚แžถแž›แŸ‹แžขแŸ†แž–แžธ Tunnel - URL แžšแž”แžŸแŸ‹ Quick Tunnel แž‚แžบแž”แžŽแŸ’แžŠแŸ„แŸ‡แžขแžถแžŸแž“แŸ’แž“ แž“แžทแž„แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžŠแžผแžšแž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธแž€แžถแžšแž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜แžกแžพแž„แžœแžทแž‰แž“แžธแž˜แžฝแž™แŸ—แŸ” - Quick Tunnels แž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แžŸแŸ’แžŠแžถแžšแžกแžพแž„แžœแžทแž‰แžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžท แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธ OmniRoute แžฌแž€แžปแž„แžแžบแž“แŸแžšแž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜แžกแžพแž„แžœแžทแž‰แž‘แŸแŸ” แžŸแžผแž˜แž”แžพแž€แžœแžถแžกแžพแž„แžœแžทแž‰แž–แžธแž•แŸ’แž‘แžถแŸ†แž„แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž“แŸ…แž–แŸแž›แžแŸ’แžšแžผแžœแž€แžถแžšแŸ” - แž€แžถแžšแžŠแŸ†แžกแžพแž„แžŠแŸ‚แž›แž”แžถแž“แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„ แž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“แž‚แžถแŸ†แž‘แŸ’แžš Linux, macOS แž“แžทแž„ Windows แž“แŸ…แž›แžพ `x64` / `arm64`แŸ” - Managed Quick Tunnels แž”แŸ’แžšแžพ HTTP/2 transport แž‡แžถแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ แžŠแžพแž˜แŸ’แž”แžธแž‡แŸ€แžŸแžœแžถแž„แž€แžถแžšแž–แŸ’แžšแž˜แžถแž“แžขแŸ†แž–แžธ QUIC UDP buffer แžŠแŸ‚แž›แžšแŸ†แžแžถแž“ แž“แŸ…แž€แŸ’แž“แžปแž„แž”แžšแžทแžŸแŸ’แžแžถแž“แž€แžปแž„แžแžบแž“แŸแžšแžŠแŸ‚แž›แž˜แžถแž“แž’แž“แž’แžถแž“แž€แž˜แŸ’แžšแžทแžแŸ” แž€แŸ†แžŽแžแŸ‹ `CLOUDFLARED_PROTOCOL=quic` แžฌ `auto` แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž…แž„แŸ‹แž”แŸ’แžšแžพ transport แž•แŸ’แžŸแŸแž„แŸ” - Docker images แž˜แžถแž“แž”แž‰แŸ’แž…แžผแž› system CA roots แž“แžทแž„แž”แž‰แŸ’แž‡แžผแž“แžœแžถแž‘แŸ…แž€แžถแž“แŸ‹ `cloudflared` แžŠแŸ‚แž›แž”แžถแž“แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„ แžŠแžพแž˜แŸ’แž”แžธแž‡แŸ€แžŸแžœแžถแž„แž”แž‰แŸ’แž แžถแž”แžšแžถแž‡แŸแž™แž“แŸƒแž€แžถแžšแž‘แžปแž€แž…แžทแžแŸ’แž TLS แž“แŸ…แž–แŸแž› tunnel แž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜แž“แŸ…แžแžถแž„แž€แŸ’แž“แžปแž„แž€แžปแž„แžแžบแž“แŸแžšแŸ” - แž€แŸ†แžŽแžแŸ‹ `CLOUDFLARED_BIN=/absolute/path/to/cloudflared` แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž…แž„แŸ‹แžฑแŸ’แž™ OmniRoute แž”แŸ’แžšแžพ binary แžŠแŸ‚แž›แž˜แžถแž“แžŸแŸ’แžšแžถแž”แŸ‹ แž‡แŸ†แž“แžฝแžŸแžฑแŸ’แž™แž€แžถแžšแž‘แžถแž‰แž™แž€แžแŸ’แž˜แžธแŸ” ## แžŸแŸ’แž›แžถแž€ Image | Image | แžŸแŸ’แž›แžถแž€ | แž‘แŸ†แž แŸ† | แžŸแŸแž…แž€แŸ’แžŠแžธแž–แžทแž–แžŽแŸŒแž“แžถ | | ------------------------ | -------- | ------ | --------------------------------------------------------------------------- | | `diegosouzapw/omniroute` | `latest` | ~250MB | แž€แŸ†แžŽแŸ‚ SemVer แžŸแŸ’แžแžทแžšแž—แžถแž–แžŠแŸ‚แž›แž”แžถแž“ **แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž•แŸ’แžŸแžถแž™** แžแŸ’แž–แžŸแŸ‹แž”แŸ†แž•แžปแž (แž˜แžทแž“แž˜แŸ‚แž“ git `main`) | | `diegosouzapw/omniroute` | `3.8.0` | ~250MB | แž…แž„แž—แŸ’แž‡แžถแž”แŸ‹แžŸแŸ’แž›แžถแž€แž”แŸ’แžšแž—แŸแž‘แž“แŸแŸ‡แžŸแž˜แŸ’แžšแžถแž”แŸ‹ GitOps | Manifest แž–แž แžปแžœแŸแž‘แžทแž€แžถแŸ– `linux/amd64` + `linux/arm64` แžŠแžพแž˜ (Apple Silicon, AWS Graviton, Raspberry Pi)แŸ” Docker แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแžŸแŸ’แžแžถแž”แžแŸ’แž™แž€แž˜แŸ’แž˜แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž‚แŸ’แž“แžถแžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžท; แž”แž‰แŸ’แž‡แžผแž“ `--platform linux/amd64` แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแž€แžถแžšแž”แž„แŸ’แžแŸ†แž€แžถแžšแžแŸ’แžšแžถแž”แŸ‹แžแžถแž˜ AMD64 แž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ ARMแŸ” ### แž†แžถแž“แŸ‚แž›แž…แŸแž‰แž•แŸ’แžŸแžถแž™ OmniRoute แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž•แŸ’แžŸแžถแž™แž†แžถแž“แŸ‚แž› Docker แžŠแžถแž…แŸ‹แžŠแŸ„แž™แžกแŸ‚แž€แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž…แŸแž‰แž•แŸ’แžŸแžถแž™แžŸแŸ’แžแžทแžšแž—แžถแž– แž€แžถแžšแžŸแžถแž€แž›แŸ’แž”แž„ release branch แžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แžŸแž€แž˜แŸ’แž˜ แž“แžทแž„ build แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แžแŸ” | แž†แžถแž“แŸ‚แž› | แž”แŸ’แžšแž—แž– | แž—แžถแž–แžขแžถแž…แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžŠแžผแžšแž”แžถแž“ | แž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžŠแŸ‚แž›แž”แžถแž“แžŽแŸ‚แž“แžถแŸ† | | ------------------------------- | ------------------------------------------------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | | `:` / `:-web` | แž€แžถแžšแž…แŸแž‰แž•แŸ’แžŸแžถแž™แžŠแŸ‚แž›แž”แžถแž“แž…แžปแŸ‡แž แžแŸ’แžแž›แŸแžแžถ/แž€แŸ†แžŽแžแŸ‹แž€แŸ†แžŽแŸ‚ | แž˜แžทแž“แžขแžถแž…แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžŠแžผแžšแž”แžถแž“ | แž€แžถแžšแžŠแžถแž€แŸ‹แžฑแŸ’แž™แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž€แŸ’แž“แžปแž„ production แžŠแŸ‚แž›แž…แž„แž—แŸ’แž‡แžถแž”แŸ‹แž‘แŸ…แž“แžนแž„แž€แŸ†แžŽแŸ‚แž…แŸแž‰แž•แŸ’แžŸแžถแž™แž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แž˜แžฝแž™ | | `:latest` / `:latest-web` | แž€แŸ†แžŽแŸ‚ SemVer แžŸแŸ’แžแžทแžšแž—แžถแž–แžŠแŸ‚แž›แž”แžถแž“ **แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž•แŸ’แžŸแžถแž™** แžแŸ’แž–แžŸแŸ‹แž”แŸ†แž•แžปแž | แž‘แŸ’แžšแž“แžทแž…แžŸแŸ’แžแžทแžšแž—แžถแž–แžŠแŸ‚แž›แžขแžถแž…แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžŠแžผแžšแž”แžถแž“ | แžแžถแž˜แžŠแžถแž“แž€แžถแžšแž…แŸแž‰แž•แŸ’แžŸแžถแž™แžŸแŸ’แžแžทแžšแž—แžถแž– **แž”แž“แŸ’แž‘แžถแž”แŸ‹แž–แžธ** job แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž•แŸ’แžŸแžถแž™ SemVer โ€” **แž˜แžทแž“** แžแžถแž˜แžŠแžถแž“ `main` แžฌ commit `release/v*` แžŠแŸ‚แž›แž˜แžทแž“แž‘แžถแž“แŸ‹แž”แžถแž“แž…แŸแž‰แž•แŸ’แžŸแžถแž™ | | `:next` / `:next-web` | branch `release/v*` แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“ | แž‘แŸ’แžšแž“แžทแž…แž˜แžปแž“แž…แŸแž‰แž•แŸ’แžŸแžถแž™แžŠแŸ‚แž›แžขแžถแž…แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžŠแžผแžšแž”แžถแž“ | แžŸแžถแž€แž›แŸ’แž”แž„แž€แžถแžšแž€แŸ‚แžแž˜แŸ’แžšแžผแžœแžŠแŸ‚แž›แž”แžถแž“แž”แž‰แŸ’แž…แžผแž›แž‘แŸ…แž€แŸ’แž“แžปแž„ release branch แžŸแž€แž˜แŸ’แž˜ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž˜แžทแž“แž‘แžถแž“แŸ‹แž˜แžถแž“แž€แŸ’แž“แžปแž„แž€แžถแžšแž…แŸแž‰แž•แŸ’แžŸแžถแž™แžŸแŸ’แžแžทแžšแž—แžถแž– | | `:main` / `:main-web` | branch `main` | แž‘แŸ’แžšแž“แžทแž…แžขแž—แžทแžœแžŒแŸ’แžแž“แŸแžŠแŸ‚แž›แžขแžถแž…แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžŠแžผแžšแž”แžถแž“ | แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžแŸ‚แž€แžถแžšแžขแž—แžทแžœแžŒแŸ’แž แž“แžทแž„แž€แžถแžšแžŸแžถแž€แž›แŸ’แž”แž„แžŸแž˜แžถแž แžšแžŽแž€แž˜แŸ’แž˜แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡ | #### แžขแŸ’แž“แž€แž•แŸ’แžŠแž›แŸ‹แžŸแŸแžœแžถ web-sessionแŸ– image `-web` แž†แžถแž“แŸ‚แž›แž“แžธแž˜แžฝแž™แŸ—แžแžถแž„แž›แžพแž˜แžถแž“แžŸแŸ’แž›แžถแž€ `-web` แž•แž„แžŠแŸ‚แžš (`:latest-web`, `:-web`, `:next-web`, `:main-web`) แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“ build แž–แžธ stage `runner-web` โ€” แž‡แžถ image แžŠแžผแž…แž‚แŸ’แž“แžถ แž”แžผแž€แž”แž“แŸ’แžแŸ‚แž˜ Playwright แž“แžทแž„ browser ChromiumแŸ” image แž’แž˜แŸ’แž˜แžแžถแžแŸ’แžšแžผแžœแž”แžถแž“แž…แŸ‚แž€แž…แžถแž™ **แžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“** Chromium; `gemini-web`, `claude-web` แž“แžทแž„ `claude-turnstile` แžแŸ’แžšแžผแžœแž€แžถแžšแžœแžถแŸ” แž€แžถแžšแž”แžšแžถแž‡แŸแž™แžแŸ’แžšแžผแžœแž”แžถแž“แž–แž“แŸ’แž™แžถแžšแž–แŸแž› แž˜แžทแž“แž˜แŸ‚แž“แž€แžพแžแžกแžพแž„แž“แŸ…แž–แŸแž›แž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜แž‘แŸแŸ– แžขแŸ’แž“แž€แž•แŸ’แžŠแž›แŸ‹แžŸแŸแžœแžถแž‘แžถแŸ†แž„แž“แŸ„แŸ‡แžšแžถแž™แž”แž‰แŸ’แž‡แžธ model แžšแž”แžŸแŸ‹แž–แžฝแž€แž‚แŸ แž“แžทแž„แž”แž„แŸ’แž แžถแž‰แžแžถแž”แžถแž“แžแž—แŸ’แž‡แžถแž”แŸ‹แž“แŸ…แž€แŸ’แž“แžปแž„ dashboard แž แžพแž™แž˜แžถแž“แžแŸ‚ request แžŠแŸ†แž”แžผแž„แž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡แžŠแŸ‚แž›แž”แžšแžถแž‡แŸแž™แž‡แžถแž˜แžฝแž™ ``` [500]: Failed to load external module playwright: Error: Cannot find module '/app/node_modules/playwright/node_modules/playwright-core/browsers.json' ``` แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž”แŸ’แžšแžพแžขแŸ’แž“แž€แž•แŸ’แžŠแž›แŸ‹แžŸแŸแžœแžถแž‘แžถแŸ†แž„แž“แŸ„แŸ‡ แžŸแžผแž˜ pull แžŸแŸ’แž›แžถแž€ `-web` แž“แŸƒแž†แžถแž“แŸ‚แž›แžŠแŸ‚แž›แžขแŸ’แž“แž€แž€แŸ†แž–แžปแž„แž”แŸ’แžšแžพ โ€” แž˜แžทแž“แž˜แžถแž“แžขแŸ’แžœแžธแž•แŸ’แžŸแŸแž„แž‘แŸ€แžแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžŠแžผแžšแž‘แŸแŸ” แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแžŠแŸ†แžกแžพแž„แžแžถแž˜ npm/CLI (แž‚แŸ’แž˜แžถแž“ Docker image) แžŸแž˜แžถแžŸแž—แžถแž‚แžŠแŸ‚แž›แžแŸ’แžœแŸ‡แžŸแŸ’แž˜แžพแž‚แŸ’แž“แžถแž‚แžบ browser binaryแŸ– แžŠแŸ†แžŽแžพแžšแž€แžถแžš `npx playwright install chromium` แž“แŸ…แž›แžพแž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸแŸ” #### แž€แžถแžšแž”แŸ’แžšแžพแž†แžถแž“แŸ‚แž›แž˜แžปแž“แž…แŸแž‰แž•แŸ’แžŸแžถแž™ แž†แžถแž“แŸ‚แž› `next` แžแŸ’แžšแžผแžœแž”แžถแž“ build แžกแžพแž„แžœแžทแž‰แžšแžถแž›แŸ‹แž–แŸแž› push แž‘แŸ… branch `release/v*` แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“ แž แžพแž™แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž•แŸ’แžŸแžถแž™แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‘แžถแŸ†แž„ AMD64 แž“แžทแž„ ARM64แŸ” maintenance branch แž…แžถแžŸแŸ‹แŸ—แž˜แžทแž“แžขแžถแž…แžŸแžšแžŸแŸแžšแž‡แžถแž“แŸ‹แž›แžพแžœแžถแž”แžถแž“แž‘แŸแŸ” แž†แžถแž“แŸ‚แž›แž“แŸแŸ‡แž•แŸ’แžŠแž›แŸ‹ image แžŠแŸ‚แž›แžขแžถแž… pull แž”แžถแž“ แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž€แŸ‚แžแž˜แŸ’แžšแžผแžœแžŠแŸ‚แž›แž”แžถแž“ merge แž…แžผแž›แž‘แŸ…แž€แŸ’แž“แžปแž„ release branch แžŸแž€แž˜แŸ’แž˜ แž˜แžปแž“แž–แŸแž›แžŸแŸ’แž›แžถแž€แžŸแŸ’แžแžทแžšแž—แžถแž–แž”แž“แŸ’แž‘แžถแž”แŸ‹แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแŸ” ```bash docker pull diegosouzapw/omniroute:next docker pull diegosouzapw/omniroute:next-web ``` แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Docker Compose แžŸแžผแž˜แž€แŸ†แžŽแžแŸ‹แž‡แŸ†แž“แžฝแžŸแžŸแŸ’แž›แžถแž€ image แžŠแŸ‚แž›แž”แžถแž“แž”แŸ’แžšแžพแžŠแŸ„แž™ profile แžŠแŸ‚แž›แž”แžถแž“แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€ pull แž“แžทแž„แž”แž„แŸ’แž€แžพแž service แžกแžพแž„แžœแžทแž‰แŸ– ```yaml services: omniroute: image: diegosouzapw/omniroute:next ``` ```bash docker compose pull docker compose up -d ``` #### แžŸแžปแžœแžแŸ’แžแžทแž—แžถแž– แž“แžทแž„แž€แžถแžšแžแŸ’แžšแžกแž”แŸ‹แž€แŸ’แžšแŸ„แž™ `next` แž‚แžบแž‡แžถแž†แžถแž“แŸ‚แž›แž˜แžปแž“แž…แŸแž‰แž•แŸ’แžŸแžถแž™แžŠแŸ‚แž›แžขแžŽแŸ’แžŠแŸ‚แžแŸ” แžœแžถแžขแžถแž…แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžŠแžผแžšแž“แŸ…แž–แŸแž› push แžŽแžถแž˜แžฝแž™แž‘แŸ… release branch แžŸแž€แž˜แŸ’แž˜ แž แžพแž™ **แž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž‚แžถแŸ†แž‘แŸ’แžšแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž€แŸ’แž“แžปแž„ production แž‘แŸ**แŸ” แž…แž„แž—แŸ’แž‡แžถแž”แŸ‹ image digest แžแžŽแŸˆแž–แŸแž›แžœแžถแž™แžแž˜แŸ’แž›แŸƒ build แž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แž˜แžฝแž™แŸ– ```bash docker pull diegosouzapw/omniroute:next docker image inspect diegosouzapw/omniroute:next --format '{{index .RepoDigests 0}}' ``` แž˜แžปแž“แž–แŸแž›แžŸแžถแž€แž›แŸ’แž”แž„ แžŸแžผแž˜แž”แž˜แŸ’แžšแžปแž„แž‘แžปแž€ OmniRoute data volume แžฌ data directory แžŠแŸ‚แž›แž”แžถแž“ bind-mountแŸ” แžŠแžพแž˜แŸ’แž”แžธแžแŸ’แžšแžกแž”แŸ‹แž€แŸ’แžšแŸ„แž™ แžŸแžผแž˜แžŸแŸ’แžŠแžถแžšแž€แŸ†แžŽแŸ‚แžŸแŸ’แžแžทแžšแž—แžถแž– แžฌ digest แžŠแŸ‚แž›แž”แžถแž“แž”แŸ’แžšแžพแž–แžธแž˜แžปแž“ แž แžพแž™แž”แž„แŸ’แž€แžพแž container แžกแžพแž„แžœแžทแž‰แŸ– ```bash docker pull diegosouzapw/omniroute: docker compose up -d ``` build แž–แžธ release branch แž˜แžทแž“แžขแžถแž…แž•แŸ’แž›แžถแžŸแŸ‹แž‘แžธ `latest` แž”แžถแž“แžกแžพแž™; แž˜แžถแž“แžแŸ‚แž€แŸ†แžŽแŸ‚ semantic แžŸแŸ’แžแžทแžšแž—แžถแž–แžŠแŸ‚แž›แž˜แžถแž“แžŸแžทแž‘แŸ’แž’แžทแž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡ แžขแžถแž…แž›แžพแž€แž€แž˜แŸ’แž–แžŸแŸ‹แž‘แŸ’แžšแž“แžทแž…แžŸแŸ’แžแžทแžšแž—แžถแž–แž”แžถแž“แŸ” image `next` แžšแž€แŸ’แžŸแžถแž‘แžปแž€แž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™ image แž…แŸแž‰แž•แŸ’แžŸแžถแž™ แž“แžทแž„แž…แŸ’แžšแž€แž‘แž”แŸ‹แžŸแŸ’แž€แžถแžแŸ‹แž—แžถแž–แž„แžถแž™แžšแž„แž‚แŸ’แžšแŸ„แŸ‡แž€แž˜แŸ’แžšแžทแž CRITICALแŸ” **`latest` แž˜แžทแž“แž˜แŸ‚แž“แž‡แžถแž€แžถแžšแž’แžถแž“แžถแžแžถแž‘แžถแž“แŸ‹แžŸแž˜แŸแž™แž‡แžถแž˜แžฝแž™ git แž‘แŸแŸ”** แž€แžถแžšแž€แŸ‚แžแž˜แŸ’แžšแžผแžœแžŠแŸ‚แž›แž”แžถแž“ merge แž“แŸ…แž›แžพ `main` แžฌแž“แŸ…แž›แžพ branch `release/v*` แžŸแž€แž˜แŸ’แž˜ **แž˜แžทแž“** แž˜แžถแž“แž“แŸ…แž€แŸ’แž“แžปแž„ `:latest` แž‘แŸ แžšแž แžผแžแžŠแž›แŸ‹ image SemVer แžŸแŸ’แžแžทแžšแž—แžถแž–แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž•แŸ’แžŸแžถแž™ แž แžพแž™ job แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž•แŸ’แžŸแžถแž™แž›แžพแž€แž€แž˜แŸ’แž–แžŸแŸ‹ `:latest` (แž˜แžถแž“ digest แžŠแžผแž…แž‚แŸ’แž“แžถแž“แžนแž„ SemVer แž“แŸ„แŸ‡)แŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพ `latest` แž˜แžพแž›แž‘แŸ…แžŠแžผแž…แž‡แžถแž˜แžทแž“แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžŠแžผแžš แžแžŽแŸˆ GitHub แž”แž„แŸ’แž แžถแž‰แž€แžถแžšแž€แŸ‚แžแž˜แŸ’แžšแžผแžœแžšแžฝแž…แž แžพแž™ แžŸแžผแž˜ pull `:next` แžŠแžพแž˜แŸ’แž”แžธแžŸแžถแž€แž›แŸ’แž”แž„ release branch แžฌแžšแž„แŸ‹แž…แžถแŸ†แžŸแŸ’แž›แžถแž€ SemVerแŸ” | แžขแŸ’แžœแžธแžŠแŸ‚แž›แžขแŸ’แž“แž€แž…แž„แŸ‹แž”แžถแž“ | แž”แŸ’แžšแžพ | | ------------------------------------------------------------------------------- | ---------------------------------- | | GitOps / production แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแžแŸ‚แž˜แžทแž“แž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžŠแžผแžšแžŠแŸ„แž™แžแŸ’แž›แžฝแž“แžฏแž„ | แž…แž„แž—แŸ’แž‡แžถแž”แŸ‹ `:X.Y.Z` (แžฌ image digest) | | แžแžถแž˜แžŠแžถแž“แž€แŸ†แžŽแŸ‚แžŸแŸ’แžแžทแžšแž—แžถแž–แžŠแŸ‚แž›แž”แžถแž“แž”แŸ„แŸ‡แž–แžปแž˜แŸ’แž–แž•แŸ’แžŸแžถแž™ แž“แžทแž„แž‘แž‘แžฝแž›แž™แž€แž€แžถแžšแž”แž„แŸ’แž€แžพแžแžกแžพแž„แžœแžทแž‰แž“แŸ…แžšแžถแž›แŸ‹แž€แžถแžšแž…แŸแž‰แž•แŸ’แžŸแžถแž™ | `:latest` | | แžŸแžถแž€แž›แŸ’แž”แž„ commit `release/v*` แžŠแŸ‚แž›แž˜แžทแž“แž‘แžถแž“แŸ‹แž…แŸแž‰แž•แŸ’แžŸแžถแž™ | `:next` (แž˜แžทแž“แž˜แŸ‚แž“ production) | | แžŸแžถแž€แž›แŸ’แž”แž„ `main` | `:main` (แž˜แžทแž“แž˜แŸ‚แž“ production) | ## แž—แžถแž–แžขแžถแž…แž”แŸ’แžšแžพแž”แžถแž“แŸ– SQLite แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แž‚แžถแŸ†แž‘แŸ’แžšแžแŸ‚ replica แž˜แžฝแž™ OmniRoute แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แž›แžพ Docker / Kubernetes แž‚แžบ **แžŠแŸ†แžŽแžพแžšแž€แžถแžš Node แž˜แžฝแž™ + แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŸแžšแžŸแŸแžš SQLite แž˜แžฝแž™**แŸ” แž—แžถแž–แžขแžถแž…แž”แŸ’แžšแžพแž”แžถแž“แžแŸ’แž–แžŸแŸ‹ **แž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž‚แžถแŸ†แž‘แŸ’แžš** แž›แžพ topology แž“แŸแŸ‡แž‘แŸแŸ” | แž€แŸ†แž แžทแž | แž•แž›แžœแžทแž”แžถแž€ | | ------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | แž€แž˜แŸ’แž˜แžœแžทแž’แžธแžŸแžšแžŸแŸแžšแžแŸ‚แž˜แžฝแž™ | **แž€แžปแŸ†** แžŠแŸ†แžŽแžพแžšแž€แžถแžš replica แž…แŸ’แžšแžพแž“แžŠแŸ„แž™แž”แŸ’แžšแžพแžฏแž€แžŸแžถแžš SQLite แžแŸ‚แž˜แžฝแž™แŸ” แžœแžถแž“แžนแž„แž’แŸ’แžœแžพแžฑแŸ’แž™ DB แžแžผแž…แŸ” | | แž€แžถแžšแž”แž„แŸ’แž€แžพแžแžกแžพแž„แžœแžทแž‰ / แž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜แžกแžพแž„แžœแžทแž‰ / แž€แžถแžšแž”แž‰แŸ’แžˆแž”แŸ‹แžŠแŸ„แž™ HEALTHCHECK | **แž€แžถแžšแžŠแžถแž…แŸ‹แžŸแŸแžœแžถแž‘แžถแŸ†แž„แžŸแŸ’แžšแžปแž„** แž…แŸ†แž–แŸ„แŸ‡ SSE แžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžš, session แžšแž”แžŸแŸ‹ dashboard แž“แžทแž„ state แž€แŸ’แž“แžปแž„แžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ†แŸ” Client แžŠแŸ‚แž›แž”แžถแž“แž—แŸ’แž‡แžถแž”แŸ‹แž‘แžถแŸ†แž„แžขแžŸแŸ‹แž“แžนแž„แžแŸ’แžšแžผแžœแž•แŸ’แžŠแžถแž…แŸ‹แŸ” Request แžแŸ’แž˜แžธแž€แŸ’แž“แžปแž„แžขแŸ†แžกแžปแž„แž–แŸแž›แžŠแŸ‚แž›แž‚แŸ’แž˜แžถแž“ endpoint แž“แžนแž„แž‘แž‘แžฝแž›แž”แžถแž“ reverse-proxy **`502 Bad Gateway: Unknown error`** แž˜แžทแž“แž˜แŸ‚แž“ OmniRoute JSON แž‘แŸ โ€” client แž˜แžทแž“แžขแžถแž…แž”แŸ‚แž„แž…แŸ‚แž€แžœแžถแž–แžธแž”แž‰แŸ’แž แžถแžšแž”แžŸแŸ‹ provider แž”แžถแž“แž‘แŸ (#11015)แŸ” | | Event loop แžŠแžผแž…แž‚แŸ’แž“แžถแž“แžนแž„ `/healthz` | แž€แžถแžšแž„แžถแžš catalog แžฌ compression tick แžŠแŸ‚แž›แž˜แž˜แžถแž‰แžนแž€แžขแžถแž…แž–แž“แŸ’แž™แžถแžšแž–แŸแž› probe แž”แžถแž“; แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€ timeout แžแŸ’แž›แžธแž“แžนแž„แž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜ replica **แžแŸ‚แž˜แžฝแž™แž‚แžแŸ‹** แžกแžพแž„แžœแžทแž‰แŸ” | **แžแžถแžšแžถแž„ probe** (แžŸแžผแž˜แž˜แžพแž›แž•แž„แžŠแŸ‚แžš [แžขแž“แžปแžŸแžถแžŸแž“แŸแžขแŸ†แž–แžธ probe แžšแž”แžŸแŸ‹ Kubernetes](../ops/MONITORING_GUIDE.md#kubernetes-probe-recommendations))แŸ– | Probe | แž‚แŸ„แž›แžŠแŸ… | แž€แžปแŸ†แž”แŸ’แžšแžพ | | ---------------------------- | ----------------------------------------------------------- | -------------------------------------------------------------- | | Liveness | TCP แž“แŸ…แž›แžพ `PORT` (แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ `20128`) แžฌ HTTP `/healthz` แž”แŸ‚แž”แž‘แž“แŸ‹ | `/api/monitoring/health` | | Readiness | HTTP `GET /healthz` | Timeout แžแŸ’แž›แžธแž–แŸแž€แžŠแŸ‚แž›แž…แžถแžแŸ‹แž‘แžปแž€ event-loop แžŠแŸ‚แž›แž˜แž˜แžถแž‰แžนแž€แžแžถแž”แžถแž“แžˆแž”แŸ‹แžŠแŸ†แžŽแžพแžšแž€แžถแžš | | แž€แžถแžšแžแŸ’แžšแžฝแžแž–แžทแž“แžทแžแŸ’แž™แž‡แŸ’แžšแŸ… / แž˜แž“แžปแžŸแŸ’แžŸ | `/api/monitoring/health` | Liveness แžšแž”แžŸแŸ‹ kubelet แžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžท | **แž€แžถแžšแžŠแŸ†แžกแžพแž„แž€แŸ†แžŽแŸ‚แžแŸ’แž˜แžธแŸ–** แžšแŸ†แž–แžนแž„แžแžถ session แž‘แžถแŸ†แž„แžขแžŸแŸ‹แž“แžนแž„แžแŸ’แžšแžผแžœแž•แŸ’แžŠแžถแž…แŸ‹แŸ” แž•แŸ’แž‘แŸแžš client แž…แŸแž‰แžŸแžทแž“ แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแžถแž…แž’แŸ’แžœแžพแž”แžถแž“; แž˜แžทแž“แž˜แžถแž“ rolling update แžŸแž˜แŸ’แžšแžถแž”แŸ‹ SQLite แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แž‘แŸแŸ” Compose `restart: unless-stopped` แžšแžฝแž˜แž‡แžถแž˜แžฝแž™ Docker `HEALTHCHECK` แž€แŸแž“แžนแž„แž‡แŸ†แž“แžฝแžŸแžŠแŸ†แžŽแžพแžšแž€แžถแžšแžแŸ‚แž˜แžฝแž™แž‚แžแŸ‹ แž“แŸ…แž–แŸแž› container แžŸแŸ’แžแžทแžแž€แŸ’แž“แžปแž„แžŸแŸ’แžแžถแž“แž—แžถแž– Unhealthy แž•แž„แžŠแŸ‚แžš โ€” แž˜แžถแž“แžœแžทแžŸแžถแž›แž—แžถแž–แž•แž›แž”แŸ‰แŸ‡แž–แžถแž›แŸ‹แžŠแžผแž…แž‚แŸ’แž“แžถแŸ” แž”แŸ†แžŽแŸ‚แž€แž€แžผแžŠ Kubernetes แžŸแž˜แŸ’แžšแžถแž”แŸ‹ **replica แžแŸ‚แž˜แžฝแž™** (แžแž˜แŸ’แžšแžผแžœแžฑแŸ’แž™แž”แŸ’แžšแžพ Recreate; แž€แžปแŸ†แž”แž„แŸ’แž€แžพแž“ `replicas` แžŠแŸ„แž™แž”แŸ’แžšแžพแžฏแž€แžŸแžถแžš SQLite แžแŸ‚แž˜แžฝแž™)แŸ– ```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` แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™ kube แžŠแž€ Service endpoint แž…แŸแž‰แž˜แžปแž“แž–แŸแž› SIGTERM แžŠแžผแž…แŸ’แž“แŸแŸ‡ traffic **แžแŸ’แž˜แžธ** แžˆแž”แŸ‹แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž‰แŸ’แž‡แžผแž“แž‘แŸ…แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แž”แžทแž‘แŸ” SSE `/v1/responses` แžŠแŸ‚แž›แž€แŸ†แž–แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž แžผแžšแžšแž แžผแžแžŠแž›แŸ‹ `SHUTDOWN_TIMEOUT_MS` (แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ 30 แžœแžทแž“แžถแž‘แžธ) แžแžถแž˜แžšแž™แŸˆ heavyweight admission leases (#11015)แŸ” Request แžแŸ’แž˜แžธแžŠแŸ‚แž›แž“แŸ…แžแŸ‚แž‘แŸ…แžŠแž›แŸ‹แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž“แžนแž„แž‘แž‘แžฝแž›แž”แžถแž“ `503` + `Retry-After: 5`แŸ” แž…แž“แŸ’แž›แŸ„แŸ‡แž–แŸแž›แžŠแŸ‚แž›แž‚แŸ’แž˜แžถแž“ endpoint แžšแž”แžŸแŸ‹ Recreate แžšแž แžผแžแžŠแž›แŸ‹แž€แžถแžšแž‡แŸ†แž“แžฝแžŸแžŸแŸ’แžแžทแžแž€แŸ’แž“แžปแž„แžŸแŸ’แžแžถแž“แž—แžถแž– Ready แž“แŸ…แžแŸ‚แž‡แžถแž€แžถแžšแžŠแžถแž…แŸ‹แžŸแŸแžœแžถแž‘แžถแŸ†แž„แžŸแŸ’แžšแžปแž„ โ€” แž“แŸ„แŸ‡แž‚แžบแž‡แžถแž›แž€แŸ’แžแžŽแŸˆแžšแž”แžŸแŸ‹ topology SQLite แž˜แžทแž“แž˜แŸ‚แž“แž‡แžถแž€แžถแžšแž€แŸ†แžŽแžแŸ‹ probe แžแžปแžŸแž‘แŸแŸ” Postgres แžแžถแž„แž€แŸ’แžšแŸ… / multi-writer HA **แž˜แžทแž“แž˜แŸ‚แž“** แž‡แžถแžœแžทแž’แžธแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แžŠแŸ‚แž›แž˜แžถแž“แžฏแž€แžŸแžถแžšแžŽแŸ‚แž“แžถแŸ†แž‘แŸแŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแž€แžถแžš HA แžŸแžผแž˜แžšแž€แŸ’แžŸแžถ replica แžแŸ‚แž˜แžฝแž™ แžฌแžŠแŸ†แžŽแžพแžšแž€แžถแžš topology แžŠแŸ‚แž›แž‚แž˜แŸ’แžšแŸ„แž„แž”แžถแž“แžŸแžถแž€แž›แŸ’แž”แž„ แž“แžทแž„แž…แž„แž€แŸ’แžšแž„แž‡แžถแžฏแž€แžŸแžถแžšแžŠแŸ„แž™แžกแŸ‚แž€แŸ” แž€แžถแžšแž„แžถแžš Postgres/MySQL แž˜แžถแž“แž“แŸ…แž€แŸ’แž“แžปแž„ [#8075](https://github.com/diegosouzapw/OmniRoute/issues/8075)แŸ” แžšแž แžผแžแžŠแž›แŸ‹แž˜แžปแžแž„แžถแžšแž“แŸ„แŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แž…แŸแž‰แž•แŸ’แžŸแžถแž™ แžœแžทแž’แžธแžแŸ‚แž˜แžฝแž™แž‚แžแŸ‹แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แžถแž“แž‚แžถแŸ†แž‘แŸ’แžšแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž”แž„แŸ’แž€แžพแž“แžŸแž˜แžแŸ’แžแž—แžถแž– `/v1/responses` **แž’แŸ†แŸ—** แž‚แžบแžŠแŸ†แžŽแžพแžšแž€แžถแžšแžฏแž€แžšแžถแž‡แŸ’แž™ N (แž•แŸ’แž“แŸ‚แž€แž”แž“แŸ’แž‘แžถแž”แŸ‹) แž˜แžทแž“แž˜แŸ‚แž“ `replicas > 1` แž“แŸ…แž›แžพ volume แžแŸ‚แž˜แžฝแž™แž‘แŸแŸ” ## แž€แžถแžšแž–แž„แŸ’แžšแžธแž€แž…แŸแž‰แŸ– แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžฏแž€แžšแžถแž‡แŸ’แž™ N แžŠแŸ†แžŽแžพแžšแž€แžถแžš Node แž˜แžฝแž™แž‚แžบแž‡แžถ **V8 heap แž˜แžฝแž™**แŸ” coding-agent `POST /v1/responses` แž–แžธแžš (RTK + Caveman) แžŠแŸ‚แž›แžแŸ’แžšแžฝแžแž‚แŸ’แž“แžถ แž“แžทแž„แž˜แžถแž“แž‘แŸ†แž แŸ†แž”แŸ’แžšแž แŸ‚แž› ~3โ€ฏMiB / ~750k-token แž“แžนแž„แž’แŸ’แžœแžพแžฑแŸ’แž™ heap แž“แŸ„แŸ‡แž”แž‰แŸ’แžˆแž”แŸ‹แž“แŸ…แž”แŸ’แžšแž แŸ‚แž› ~12โ€ฏGi (`FATAL ERROR: Reached heap limit`) แž แžพแž™แžขแžถแž…แž”แž„แŸ’แž€ OOM แžŠแž›แŸ‹ cgroup แž‘แŸ†แž แŸ† 16โ€ฏGiแŸ” แžŸแžผแž˜แž˜แžพแž› [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849)แŸ” แž€แžถแžšแžœแžถแžŸแŸ‹แžœแŸ‚แž„แž“แŸ„แŸ‡แž‚แžบแž‡แžถแž€แžถแžšแž–แŸ’แžšแž˜แžถแž“แžขแŸ†แž–แžธ **แž€แž‰แŸ’แž…แž”แŸ‹แžแžœแžทแž€แžถแžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ†** แž˜แžทแž“แž˜แŸ‚แž“แž‡แžถแž€แž˜แŸ’แžšแžทแžแžขแžแžทแž”แžšแž˜แžถแžŠแžถแž…แŸ‹แžแžถแžแžšแž”แžŸแŸ‹แž•แž›แžทแžแž•แž› แžŠแŸ‚แž›แžขแž“แžปแž‰แŸ’แž‰แžถแžแžแŸ‚ `/v1/responses` แžšแž™แŸˆแž–แŸแž›แžœแŸ‚แž„แž–แžธแžšแžŠแŸ†แžŽแžพแžšแž€แžถแžšแž–แŸ’แžšแž˜แž‚แŸ’แž“แžถแž“แŸ„แŸ‡แž‘แŸแŸ” แž€แžถแžšแž‘แž‘แžฝแž›แž™แž€ chat แžŠแŸ‚แž›แž”แŸ’แžšแžพแž’แž“แž’แžถแž“แžแŸ’แž–แžŸแŸ‹แžแŸ’แžšแžผแžœแž”แžถแž“แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แžŠแŸ„แž™แž€แž‰แŸ’แž…แž”แŸ‹แžแžœแžทแž€แžถแž”แŸƒแžŸแž˜แŸ’แžšแžถแž”แŸ‹ ingest แžŠแŸ‚แž›แž‚แžŽแž“แžถแžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžท (`OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES`, `src/shared/middleware/admissionBudget.ts`) แžŠแŸ„แž™แž€แŸ†แžŽแžแŸ‹แž‘แŸ†แž แŸ†แž•แŸ’แžขแŸ‚แž€แž›แžพแž–แžทแžŠแžถแž“ V8/cgroup แžŠแžŠแŸ‚แž›แž“แŸ„แŸ‡ โ€” แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžœแžถแžกแžพแž„แžแŸ’แž–แžŸแŸ‹แž‡แžถแž„แž˜แžปแž“ (แžฌแž€แŸ†แžŽแžแŸ‹แž€แž˜แŸ’แžšแžทแžแž…แŸ†แž“แžฝแž“แžŸแŸ†แžŽแžพแž…แžถแžŸแŸ‹ `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT`) แž›แžพแžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแŸ‚แž›แž”แžถแž“แž€แŸ†แžŽแžแŸ‹แž‘แŸ†แž แŸ†แžšแžฝแž… แž“แžนแž„แž“แžถแŸ†แžฑแŸ’แž™แž˜แžถแž“แž€แžถแžšแž”แž‰แŸ’แžˆแž”แŸ‹แžกแžพแž„แžœแžทแž‰แŸ” chat แžแžผแž…แŸ—, `/healthz`, `/v1/models` แž“แžทแž„ MCP **แž˜แžทแž“** แžŸแŸ’แžแžทแžแž€แŸ’แžšแŸ„แž˜แž€แž˜แŸ’แžšแžทแžแž“แŸ„แŸ‡แž‘แŸแŸ” ### แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžแŸ‚แž˜แžฝแž™แŸ– `/v1/responses` แžšแž™แŸˆแž–แŸแž›แžœแŸ‚แž„แž…แŸ’แžšแžพแž“แž‡แžถแž„แž–แžธแžš แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแŸ‚แž›แž˜แžถแž“ **แžŸแžปแžแž—แžถแž–แž›แŸ’แžข** (heap แž‘แžถแž”แž‡แžถแž„ `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` แžŠแŸ‚แž›แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แž‚แžบ `0.75`) **แžขแžถแž…** แžŠแŸ†แžŽแžพแžšแž€แžถแžš `POST /v1/responses` แžšแž™แŸˆแž–แŸแž›แžœแŸ‚แž„แž…แŸ’แžšแžพแž“แž‡แžถแž„แž–แžธแžšแž€แŸ’แž“แžปแž„แž–แŸแž›แžŠแŸ†แžŽแžถแž›แž‚แŸ’แž“แžถ แž“แŸ…แž–แŸแž›แž€แž‰แŸ’แž…แž”แŸ‹แžแžœแžทแž€แžถแž”แŸƒแž€แŸ†แž–แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž‘แžผแž‘แžถแŸ†แž„แžŠแŸ†แžŽแžพแžšแž€แžถแžš (`OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110) แž“แŸ…แž˜แžถแž“แž…แž“แŸ’แž›แŸ„แŸ‡แž‘แŸ†แž“แŸแžšแŸ” body แžŠแŸ‚แž›แž˜แžถแž“แž‘แŸ†แž แŸ†แžŸแŸ’แž˜แžพ แžฌแž’แŸ†แž‡แžถแž„ `OMNIROUTE_CHAT_LARGE_BODY_BYTES` (แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ 256โ€ฏKiB) แž”แŸ’แžšแžพ lease แžŠแŸ‚แž›แž”แŸ’แžšแžพแž’แž“แž’แžถแž“แžแŸ’แž–แžŸแŸ‹แžŠแžผแž…แž‚แŸ’แž“แžถแž“แžนแž„แžŸแŸ†แžŽแžพแžŠแŸ‚แž›แž˜แžถแž“แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžŸแŸ’แž˜แžปแž‚แžŸแŸ’แž˜แžถแž‰ แž แžพแž™แž”แŸ’แžšแžพแž•แŸ’แž›แžผแžœแž”แž“แŸ’แž’แžผแžš `tryAcquireHealthyHeadroom` แžŠแžผแž…แž‚แŸ’แž“แžถแž–แžธ [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) (`OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`)แŸ” client SSE แžšแž™แŸˆแž–แŸแž›แžœแŸ‚แž„แž‡แžถแž…แŸ’แžšแžพแž“แžŠแž”แŸ‹แžŠแŸ‚แž›แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž–แŸ’แžšแž˜แž‚แŸ’แž“แžถ (แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžšแž‡แžถแž‰แžนแž€แž‰แžถแž”แŸ‹แžแŸ’แžšแžผแžœแž€แžถแžš 40โ€“50) แž‚แžบแž‡แžถแž”แž‰แŸ’แž แžถ **แž€แž‰แŸ’แž…แž”แŸ‹แžแžœแžทแž€แžถแžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ†** โ€” แžแŸ’แžšแžผแžœแž€แŸ†แžŽแžแŸ‹แž‘แŸ†แž แŸ† heap + slot แž…แž˜แŸ’แž”แž„/headroom + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` โ€” แž˜แžทแž“แž˜แŸ‚แž“แž‡แžถแž€แž˜แŸ’แžšแžทแžแž•แž›แžทแžแž•แž›แžŠแžถแž…แŸ‹แžแžถแž โ€œแžขแžแžทแž”แžšแž˜แžถ 2โ€ แž‘แŸแŸ” heap แžŠแŸ‚แž›แžŸแŸ’แžแžทแžแž€แŸ’แžšแŸ„แž˜แžŸแž˜แŸ’แž–แžถแž’แž“แŸ…แžแŸ‚แž€แžถแžแŸ‹แž”แž“แŸ’แžแž™แž”แž“แŸ’แž‘แžปแž€แžŠแŸ„แž™แž”แŸ’แžšแžพ `503` แžŠแŸ‚แž›แžขแžถแž…แž–แŸ’แž™แžถแž™แžถแž˜แžกแžพแž„แžœแžทแž‰แž”แžถแž“ แžŠแžพแž˜แŸ’แž”แžธแž€แžปแŸ†แžฑแŸ’แž™แž”แž‰แŸ’แž แžถ #7849 แžแŸ’แžšแžกแž”แŸ‹แž˜แž€แžœแžทแž‰แŸ” แžŠแžพแž˜แŸ’แž”แžธ **แž”แž„แŸ’แž€แžพแž“แž…แŸ†แž“แžฝแž“ heap** (V8 old-space แžฏแž€แžšแžถแž‡แŸ’แž™) **แž“แŸ…แž–แŸแž›แž“แŸแŸ‡**แŸ– | แžแŸ’แžšแžผแžœแž’แŸ’แžœแžพ | แž€แžปแŸ†แž’แŸ’แžœแžพ | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------ | | แžŠแŸ†แžŽแžพแžšแž€แžถแžš **container/pod แž…แŸ†แž“แžฝแž“ N** แžŠแŸ„แž™แž“แžธแž˜แžฝแž™แŸ—แž˜แžถแž“ `DATA_DIR` / volume **แž•แŸ’แž‘แžถแž›แŸ‹แžแŸ’แž›แžฝแž“** | แž€แŸ†แžŽแžแŸ‹ `replicas > 1` แžฑแŸ’แž™แž”แŸ’แžšแžพแžฏแž€แžŸแžถแžš SQLite แžแŸ‚แž˜แžฝแž™ | | แž€แŸ†แžŽแžแŸ‹แž‘แŸ†แž แŸ† heavy in-flight + healthy-headroom แž•แŸ’แžขแŸ‚แž€แž›แžพ heap / แž€แž‰แŸ’แž…แž”แŸ‹แžแžœแžทแž€แžถแž”แŸƒแž€แŸ†แž–แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžš; 1โ€“2 แž‚แžบแž‡แžถแž›แŸ†แž“แžถแŸ†แžŠแžพแž˜แž”แŸ‚แž”แž”แŸ’แžšแžปแž„แž”แŸ’แžšแž™แŸแžแŸ’แž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹ #7849 แž˜แžทแž“แž˜แŸ‚แž“แž‡แžถแž€แž˜แŸ’แžšแžทแžแžขแžแžทแž”แžšแž˜แžถแžŠแžถแž…แŸ‹แžแžถแžแžšแž”แžŸแŸ‹แž•แž›แžทแžแž•แž›แž‘แŸ | แž•แŸ’แžŠแž›แŸ‹ RAM 8ร— แžฑแŸ’แž™แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžแŸ‚แž˜แžฝแž™ แž“แžทแž„แž€แž˜แŸ’แžšแžทแžแž…แŸ†แž“แžฝแž“แžŠแŸ‚แž›แž‚แŸ’แž˜แžถแž“แž–แŸ’แžšแŸ†แžŠแŸ‚แž“ | | แž‡แžถแž‡แž˜แŸ’แžšแžพแžŸแŸ– `QUOTA_STORE_DRIVER=redis` + `QUOTA_STORE_REDIS_URL` แžŸแž˜แŸ’แžšแžถแž”แŸ‹ **แž”แž‰แŸ’แž‡แžšแž”แžšแžทแž˜แžถแžŽแž€แŸ†แžŽแžแŸ‹แžšแžฝแž˜** | แž…แžถแžแŸ‹แž‘แžปแž€ Redis แž‡แžถ SQLite แžšแžฝแž˜ โ€” แžœแžถแž˜แžทแž“แž˜แŸ‚แž“แžŠแžผแž…แŸ’แž“แŸ„แŸ‡แž‘แŸ | | แž…แž˜แŸ’แž›แž„ secret แžšแž”แžŸแŸ‹ provider แž‘แŸ…แž€แŸ’แž“แžปแž„ instance แž“แžธแž˜แžฝแž™แŸ— (แžฌแž‘แž‘แžฝแž›แž™แž€ dashboard แžŠแŸ‚แž›แž”แŸ‚แž„แž…แŸ‚แž€แžŠแžถแž…แŸ‹แž–แžธแž‚แŸ’แž“แžถ) | แžšแŸ†แž–แžนแž„แžแžถแž˜แžถแž“ dashboard แžแŸ‚แž˜แžฝแž™ / call-log แžแŸ‚แž˜แžฝแž™แž“แŸ…แž‘แžผแž‘แžถแŸ†แž„ instance | | แžŠแžถแž€แŸ‹ load balancer แžŽแžถแž˜แžฝแž™แž“แŸ…แžแžถแž„แž˜แžปแž; sticky แžแžถแž˜ API key แžฌ session แž‚แžบแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแžถแž“แŸ‹ | แžแž˜แŸ’แžšแžผแžœแžฑแŸ’แž™แž˜แžถแž“ middleware แžŠแŸ‚แž›แž‚แžทแžแž–แžธแž‘แŸ†แž แŸ† แž“แžทแž„แž‡แžถแž€แŸ‹แž›แžถแž€แŸ‹แž…แŸ†แž–แŸ„แŸ‡ vendor | แž•แŸ’แž“แŸ‚แž€ hardwareแŸ– แž…แŸ†แž“แžฝแž“ `/v1/responses` แžšแž™แŸˆแž–แŸแž›แžœแŸ‚แž„แžŠแŸ‚แž›แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž–แŸ’แžšแž˜แž‚แŸ’แž“แžถแž€แŸ’แž“แžปแž„แž˜แžฝแž™ instance แž‚แžบแž‡แžถแž”แž‰แŸ’แž แžถ **แž€แž‰แŸ’แž…แž”แŸ‹แžแžœแžทแž€แžถแžขแž„แŸ’แž‚แž…แž„แž…แžถแŸ†** (heap + inflight-byte / #10110)แŸ” `DATA_DIR` แžฏแž€แžšแžถแž‡แŸ’แž™แž…แŸ†แž“แžฝแž“ `N` แž“แŸ…แžแŸ‚แž”แž„แŸ’แž€แžพแž“แž…แŸ†แž“แžฝแž“ heapแŸ– RAM แžšแž”แžŸแŸ‹ host แžแŸ’แžšแžผแžœแžแŸ‚แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแžถแž“แŸ‹แžŸแž˜แŸ’แžšแžถแž”แŸ‹ `N ร— cgroup` แž˜แžทแž“แž˜แŸ‚แž“ โ€œpod 16โ€ฏGi แž˜แžฝแž™แžŠแŸ‚แž›แž˜แžถแž“ N=8โ€ แž‘แŸแŸ” แž€แžปแŸ†แž€แŸ†แžŽแžแŸ‹ `replicas > 1` แž›แžพแžฏแž€แžŸแžถแžš SQLite แžแŸ‚แž˜แžฝแž™แž‡แžถแžŠแžถแž…แŸ‹แžแžถแžแŸ” แž‚แŸ†แžšแžผ Compose (heap แž–แžธแžš, volume แž–แžธแžš โ€” แž˜แžทแž“แž˜แŸ‚แž“ `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: ``` แžŠแž„แŸ‹แžŸแŸŠแžธแžแŸแž€แŸ’แž“แžปแž„แžŠแŸ†แžŽแžพแžšแž€แžถแžš (แž€แžถแžšแž”แž„แŸ’แž แžถแž”แŸ‹แž“แŸ…แž€แŸ’แžšแŸ… HTTP isolate) แž˜แžถแž“แž“แŸ… [#11023](https://github.com/diegosouzapw/OmniRoute/issues/11023)แŸ” cluster แžกแžผแž‡แžธแžแž›แžแŸ‚แž˜แžฝแž™แž›แžพแžŸแŸ’แžแžถแž“แž—แžถแž–แžขแž…แžทแž“แŸ’แžแŸ’แžšแŸƒแž™แŸแžšแžฝแž˜ แž˜แžถแž“แž“แŸ… [#8075](https://github.com/diegosouzapw/OmniRoute/issues/8075)แŸ” ## แž€แŸ†แžŽแžแŸ‹แž…แŸ†แžŽแžถแŸ†แžŸแŸ†แžแžถแž“แŸ‹แŸ— - **แžšแž”แŸ€แž” SQLite WAL:** แž‚แžฝแžšแžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™ `docker stop` แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžšแž แžผแžแžŠแž›แŸ‹แž…แž”แŸ‹ แžŠแžพแž˜แŸ’แž”แžธแžฑแŸ’แž™ OmniRoute แžขแžถแž…แž’แŸ’แžœแžพ checkpoint แž“แŸƒแž€แžถแžšแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžแžผแžšแž…แžปแž„แž€แŸ’แžšแŸ„แž™แžแŸ’แžšแžกแž”แŸ‹แž‘แŸ…แž€แŸ’แž“แžปแž„ `storage.sqlite`แŸ” แžฏแž€แžŸแžถแžš Compose แžŠแŸ‚แž›แž—แŸ’แž‡แžถแž”แŸ‹แž˜แž€แž‡แžถแž˜แžฝแž™แž”แžถแž“แž€แŸ†แžŽแžแŸ‹แžšแž™แŸˆแž–แŸแž›แžขแž“แžปแž‚แŸ’แžšแŸ„แŸ‡แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž”แž‰แŸ’แžˆแž”แŸ‹แž…แŸ†แž“แžฝแž“ 40 แžœแžทแž“แžถแž‘แžธแžšแžฝแž…แž แžพแž™แŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แžŠแŸ†แžŽแžพแžšแž€แžถแžš image แžŠแŸ„แž™แž•แŸ’แž‘แžถแž›แŸ‹ แžŸแžผแž˜แžšแž€แŸ’แžŸแžถแž‘แžปแž€ `--stop-timeout 40`แŸ” - **`DISABLE_SQLITE_AUTO_BACKUP`:** แž€แŸ†แžŽแžแŸ‹แž‡แžถ `true` แž”แŸ’แžšแžŸแžทแž“แž”แžพแž€แžถแžšแž”แž˜แŸ’แžšแžปแž„แž‘แžปแž€แžแžถแž˜แž‘แž˜แŸ’แž›แžถแž”แŸ‹/แž˜แžปแž“แž–แŸแž›แžŸแžšแžŸแŸแžšแžแŸ’แžšแžผแžœแž”แžถแž“แž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แžšแž„แž–แžธแžแžถแž„แž€แŸ’แžšแŸ…แŸ” แž€แžถแžšแž’แŸ’แžœแžพ migration แž›แžพแž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™แžŠแŸ‚แž›แž˜แžถแž“แžŸแŸ’แžšแžถแž”แŸ‹ แž“แŸ…แžแŸ‚แž‘แžถแž˜แž‘แžถแžš snapshot แžŸแžปแžœแžแŸ’แžแžทแž—แžถแž–แžŠแŸแžšแžนแž„แž˜แžถแŸ†แž•แŸ’แž‘แžถแž›แŸ‹แžแŸ’แž›แžฝแž“ แž“แžทแž„แžœแžทแž’แžถแž“แž€แžถแžšแž€แžถแžšแž–แžถแžšแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž€แžถแžšแž’แŸ’แžœแžพ migration แž‘แŸ’แžšแž„แŸ‹แž‘แŸ’แžšแžถแž™แž’แŸ†แŸ” - **แž€แžถแžšแžšแž€แŸ’แžŸแžถแž‘แžปแž€แž‘แžทแž“แŸ’แž“แž“แŸแž™แž‡แžถแžขแž…แžทแž“แŸ’แžแŸ’แžšแŸƒแž™แŸ:** แžแŸ’แžšแžผแžœ mount volume แž‘แŸ…แž€แžถแž“แŸ‹ `/app/data` แž‡แžถแž“แžทแž…แŸ’แž… แžŠแžพแž˜แŸ’แž”แžธแžšแž€แŸ’แžŸแžถแž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™ keys แž“แžทแž„แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€ แž†แŸ’แž›แž„แž€แžถแžแŸ‹แž€แžถแžšแž…แžถแž”แŸ‹แž•แŸ’แžŠแžพแž˜ container แžกแžพแž„แžœแžทแž‰แŸ” - **แž€แžถแžšแž€แŸ†แžŽแžแŸ‹ Port:** แž€แŸ†แžŽแžแŸ‹แž‡แŸ†แž“แžฝแžŸ environment variable `PORT` แžŠแžพแž˜แŸ’แž”แžธแž•แŸ’แž›แžถแžŸแŸ‹แž”แŸ’แžŠแžผแžš port แž›แŸ†แž“แžถแŸ†แžŠแžพแž˜ `20128`แŸ” ## แžŸแžผแž˜แž˜แžพแž›แž•แž„แžŠแŸ‚แžš - [แž˜แž‚แŸ’แž‚แžปแž‘แŸ’แž‘แŸแžŸแž€แŸแžŠแžถแž€แŸ‹แžฑแŸ’แž™แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž›แžพ VM](../ops/VM_DEPLOYMENT_GUIDE.md) โ€” แž€แžถแžšแžšแŸ€แž”แž…แŸ† VM + nginx + Cloudflare - [แž˜แž‚แŸ’แž‚แžปแž‘แŸ’แž‘แŸแžŸแž€แŸแžŠแžถแž€แŸ‹แžฑแŸ’แž™แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž›แžพ Fly.io](../ops/FLY_IO_DEPLOYMENT_GUIDE.md) โ€” แžŠแžถแž€แŸ‹แžฑแŸ’แž™แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž›แžพ Fly.io - [แž€แžถแžšแž€แŸ†แžŽแžแŸ‹แžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’ Environment](../reference/ENVIRONMENT.md) โ€” แžฏแž€แžŸแžถแžšแž™แŸ„แž„ `.env` แž–แŸแž‰แž›แŸแž‰