# ๐Ÿณ 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) ยท ๐Ÿ‡ณ๐Ÿ‡ฌ [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) ยท ๐Ÿ‡ธ๐Ÿ‡ช [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 เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸเชจเซ‹ เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเช‚เชฆเชฐเซเชญ. เชเชกเชชเชฅเซ€ เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, [README Docker เชตเชฟเชญเชพเช—](../README.md#-docker) เชœเซเช“. ## เชตเชฟเชทเชฏเชธเซ‚เชšเชฟ - [เชเชกเชชเซ€ เชšเชฒเชพเชตเชŸ](#quick-run) - [เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชซเชพเช‡เชฒ เชธเชพเชฅเซ‡](#with-environment-file) - [Docker Compose](#docker-compose) - [เช‰เชชเชฒเชฌเซเชง เชชเซเชฐเซ‹เชซเชพเช‡เชฒเซเชธ](#available-profiles) - [OmniRoute Dockerเชฎเชพเช‚ เชšเชพเชฒเชคเซเช‚ เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เชนเซ‹เชธเซเชŸ CLI เชธเชพเชงเชจเซ‹เชจเซเช‚ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ](#configuring-host-cli-tools-when-omniroute-runs-in-docker) - [Redis เชธเชพเช‡เชกเช•เชพเชฐ](#redis-sidecar) - [เชชเซเชฐเซ‹เชกเช•เซเชถเชจ Compose](#production-compose) - [Dockerfile เชธเซเชŸเซ‡เชœ](#dockerfile-stages) - [เชฎเชนเชคเซเชคเซเชตเชชเซ‚เชฐเซเชฃ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชตเซ‡เชฐเชฟเชเชฌเชฒเซเชธ](#critical-environment-variables) - [Caddy (HTTPS) เชธเชพเชฅเซ‡ Docker Compose](#docker-compose-with-caddy-https-auto-tls) - [Cloudflare เชเชกเชชเซ€ เชŸเชจเชฒ](#cloudflare-quick-tunnel) - [เช‡เชฎเซ‡เชœ เชŸเซ…เช—เซเชธ](#image-tags) - [Dockerเชฎเชพเช‚ เชกเซ…เชถเชฌเซ‹เชฐเซเชก เช…เชชเชกเซ‡เชŸเซเชธ](#dashboard-updates-in-docker) - [เช‰เชชเชฒเชฌเซเชงเชคเชพ: เชกเชฟเชซเซ‰เชฒเซเชŸ SQLite เชฎเชพเชคเซเชฐ เชเช• เชฐเซ‡เชชเซเชฒเชฟเช•เชพ เชฎเชพเชŸเซ‡ เช›เซ‡](#availability-default-sqlite-is-single-replica) - [Dockerเชจเซ€ เช…เช‚เชฆเชฐ Gemini เชชเซเชฐเชพเชฆเซ‡เชถเชฟเช• เชญเซ‚เชฒเซ‹](#gemini-regional-errors-inside-docker) - [เชฎเชนเชคเซเชคเซเชตเชชเซ‚เชฐเซเชฃ เชจเซ‹เช‚เชงเซ‹](#important-notes) --- ## เชเชกเชชเซ€ เชšเชฒเชพเชตเชŸ > **เชเช• เชœ เช•เชฎเชพเชจเซเชกเชฅเซ€ เชธเซเชต-เชนเซ‹เชธเซเชŸ เช•เชฐเชตเซเช‚ เช›เซ‡?** > [เชธเซเชต-เชนเซ‹เชธเซเชŸ เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชฟเช•เชพ](../getting-started/SELF_HOST_GUIDE.md) เชœเซเช“ โ€” > `docker compose -f docker-compose.selfhost.yml up -d` (เชชเซเชฐเช•เชพเชถเชฟเชค เช‡เชฎเซ‡เชœ + > Redis, เชฎเชพเชคเซเชฐ เชฒเซ‚เชชเชฌเซ…เช•, เชชเซเชฐเซ‹เชซเชพเช‡เชฒเชจเซ€ เชชเชธเช‚เชฆเช—เซ€ เชจเชนเซ€เช‚). เชจเซ€เชšเซ‡ เช†เชชเซ‡เชฒเซ€ เชเชกเชชเซ€ เชšเชฒเชพเชตเชŸ เชเชตเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡เชจเซ‹ > เชธเชฟเช‚เช—เชฒ-เช•เชจเซเชŸเซ‡เชจเชฐ เชฎเชพเชฐเซเช— เช›เซ‡, เชœเซ‡เช“ 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 เชฎเชพเชŸเซ‡; เชนเซ‹เชธเซเชŸ CLI เชฌเชพเช‡เชจเชฐเซ€เชเชจเซ‡ เชซเช•เซเชค-เชตเชพเช‚เชšเชจ เชคเชฐเซ€เช•เซ‡ เชฎเชพเช‰เชจเซเชŸ เช•เชฐเซ‡ เช›เซ‡) docker compose --profile host up -d # เชตเซ‡เชฌ เชชเซเชฐเซ‹เชซเชพเช‡เชฒ (เชตเซ‡เชฌ-เชธเซ‡เชถเชจ เชชเซเชฐเชฆเชพเชคเชพเช“ เชฎเชพเชŸเซ‡ Chromium/Playwright) docker compose --profile web up -d # CLI + 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 เชนเซ‹เชธเซเชŸเซเชธ เช•เซ‡ เชœเซ‡เช“ `~/.local/bin`, `~/.codex`, `~/.claude` เชตเช—เซ‡เชฐเซ‡เชจเซ‡ เชซเช•เซเชค-เชตเชพเช‚เชšเชจ เชคเชฐเซ€เช•เซ‡ เชฎเชพเช‰เชจเซเชŸ เช•เชฐเซ€เชจเซ‡ เชนเซ‹เชธเซเชŸ CLIเชจเซ€ `network_mode` เชœเซ‡เชตเซ€ เชเช•เซเชธเซ‡เชธ เช‡เชšเซเช›เซ‡ เช›เซ‡ | `docker compose --profile host up -d` | | `cliproxyapi` | `cliproxyapi` | เช…เชชเชธเซเชŸเซเชฐเซ€เชฎ CLI เชชเซเชฐเซ‰เช•เซเชธเซ€ เชฎเชพเชŸเซ‡ เชชเซ‹เชฐเซเชŸ `8317` เชชเชฐ [CLIProxyAPI](https://github.com/router-for-me/CLIProxyAPI) เชธเชพเช‡เชกเช•เชพเชฐ เชšเชฒเชพเชตเซ‹ | `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`. ## เชœเซเชฏเชพเชฐเซ‡ OmniRoute Docker เชฎเชพเช‚ เชšเชพเชฒเซ‡ เชคเซเชฏเชพเชฐเซ‡ เชนเซ‹เชธเซเชŸ CLI เชŸเซ‚เชฒเซเชธเชจเซ‡ เช•เซ‰เชจเซเชซเชฟเช—เชฐ เช•เชฐเชตเซเช‚ `omniroute setup-codex`, `setup-claude`, `config set ` เช…เชจเซ‡ เชกเซ…เชถเชฌเซ‹เชฐเซเชกเชจเซเช‚ **เช•เซ‰เชจเซเชซเชฟเช— เชธเชพเชšเชตเซ‹** เชฌเชŸเชจ, เชฌเชงเชพเช‚ `~/.codex/*.config.toml` เชœเซ‡เชตเซ€ เชซเชพเช‡เชฒเซ‹ เชฒเช–เซ‡ เช›เซ‡. เช† เชชเชพเชฅเชจเซ‹ เช…เชฐเซเชฅ เชซเช•เซเชค เช เชœ เชฎเชถเซ€เชจ เชชเชฐ เชนเซ‹เชฏ เช›เซ‡ เชœเซเชฏเชพเช‚ CLI เช–เชฐเซ‡เช–เชฐ เชšเชพเชฒเซ‡ เช›เซ‡. เชคเซ‡เชฎเชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เช…เช‚เชฆเชฐ เชšเชฒเชพเชตเชตเชพเชฅเซ€ เชซเชพเช‡เชฒ เช•เชจเซเชŸเซ‡เชจเชฐเชจเชพ เชชเซ‹เชคเชพเชจเชพ เชนเซ‹เชฎ (`/home/node` โ€” เช‡เชฎเซ‡เชœ `USER node` เชคเชฐเซ€เช•เซ‡ เชšเชพเชฒเซ‡ เช›เซ‡)เชฎเชพเช‚ เชฒเช–เชพเชฏ เช›เซ‡, เชœเซเชฏเชพเช‚ เช•เซ‹เชˆ เชนเซ‹เชธเซเชŸ CLI เชคเซ‡เชจเซ‡ เช•เซเชฏเชพเชฐเซ‡เชฏ เชตเชพเช‚เชšเชถเซ‡ เชจเชนเซ€เช‚ เช…เชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เชซเชฐเซ€ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซ‡ เช•เซเชทเชฃเซ‡ เชคเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. OmniRoute เช† เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟ เชถเซ‹เชงเซ€ เช•เชพเชขเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเชฎเซ‡ เช‰เชชเชฏเซ‹เช— เชจ เช•เชฐเซ€ เชถเช•เซ‹ เชคเซ‡เชตเซ€ เชธเชซเชณเชคเชพ เชฆเชฐเซเชถเชพเชตเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡ เชธเซ‚เชšเชจเชพเช“ เชธเชพเชฅเซ‡ เชฒเช–เชตเชพเชจเซ‹ เช‡เชจเช•เชพเชฐ เช•เชฐเซ‡ เช›เซ‡: CLI `2` เชธเชพเชฅเซ‡ เชฌเชนเชพเชฐ เชจเซ€เช•เชณเซ‡ เช›เซ‡ เช…เชจเซ‡ API `containerEphemeralTarget: true` เชธเชพเชฅเซ‡ `422` เชœเชตเชพเชฌ เช†เชชเซ‡ เช›เซ‡. ### เชญเชฒเชพเชฎเชฃ เช•เชฐเซ‡เชฒ: CLI เชจเซ‡ เชนเซ‹เชธเซเชŸ เชชเชฐ เช…เชจเซ‡ OmniRoute เชจเซ‡ Docker เชฎเชพเช‚ เชšเชฒเชพเชตเซ‹ เช•เชจเซเชŸเซ‡เชจเชฐ API เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡; CLI เชคเชฎเชพเชฐเชพ เชนเซ‹เชธเซเชŸ เชŸเซ‚เชฒเซเชธเชจเซ‡ เช•เซ‰เชจเซเชซเชฟเช—เชฐ เช•เชฐเซ‡ เช›เซ‡. ```bash docker compose --profile base up -d npm install -g omniroute omniroute connect http://localhost:20128 # CLI เชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เชคเชฐเชซ เชจเชฟเชฐเซเชฆเซ‡เชถเชฟเชค เช•เชฐเซ‹ omniroute setup-codex # เชคเชฎเชพเชฐเชพ เชนเซ‹เชธเซเชŸ เชชเชฐเชจเชพ เชตเชพเชธเซเชคเชตเชฟเช• ~/.codex เชฎเชพเช‚ เชฒเช–เซ‡ เช›เซ‡ ``` เชœเซเชฏเชพเชฐเซ‡ Codex, Claude Code, Cursor เช…เชฅเชตเชพ เชธเชฎเชพเชจ เชŸเซ‚เชฒเซเชธ เชคเชฎเชพเชฐเชพ เชฒเซ‡เชชเชŸเซ‹เชช เชชเชฐ เชšเชพเชฒเซ‡ เชคเซเชฏเชพเชฐเซ‡ เช† เชฏเซ‹เช—เซเชฏ เชชเชธเช‚เชฆเช—เซ€ เช›เซ‡ โ€” เชœเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชธเซ‡เชŸเช…เชช เช›เซ‡. ### เชตเซˆเช•เชฒเซเชชเชฟเช•: เชนเซ‹เชธเซเชŸ เช•เซ‰เชจเซเชซเชฟเช— เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เช“เชจเซ‡ เชฌเชพเช‡เชจเซเชก-เชฎเชพเช‰เชจเซเชŸ เช•เชฐเซ‹ (`host` เชชเซเชฐเซ‹เชซเชพเช‡เชฒ) เชœเซ‹ เชคเชฎเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เชชเซ‹เชคเซ‡ เชœ เชคเชฎเชพเชฐเชพ เชนเซ‹เชธเซเชŸ เช•เซ‰เชจเซเชซเชฟเช—เชฎเชพเช‚ เชฒเช–เซ‡ เชเชตเซเช‚ เช‡เชšเซเช›เชคเชพ เชนเซ‹, เชคเซ‹ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เช“เชจเซ‡ เช…เช‚เชฆเชฐ เชฎเชพเช‰เชจเซเชŸ เช•เชฐเซ‹ เช…เชจเซ‡ `CLI_CONFIG_HOME` เชจเซ‡ เชฎเชพเช‰เชจเซเชŸ เชฐเซ‚เชŸ เชคเชฐเชซ เชจเชฟเชฐเซเชฆเซ‡เชถเชฟเชค เช•เชฐเซ‹. `host` เชชเซเชฐเซ‹เชซเชพเช‡เชฒ เช† เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช•เชฐเซ‡ เช›เซ‡: ```yaml environment: - CLI_CONFIG_HOME=/host-home - CLI_ALLOW_CONFIG_WRITES=true volumes: - ~/.codex:/host-home/.codex:rw - ~/.claude:/host-home/.claude:rw ``` เชฌเชพเช‡เชจเซเชก เชฎเชพเช‰เชจเซเชŸ เชœ เชชเชพเชฅเชจเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เชฌเชจเชพเชตเซ‡ เช›เซ‡: OmniRoute `/proc/self/mountinfo` เชตเชพเช‚เชšเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฎเชพเช‰เชจเซเชŸ เช•เชฐเซ‡เชฒเชพ เชชเชพเชฅเชฎเชพเช‚ (เชคเซ‡เชฎเชœ เชเชตเซ€ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เช“เชฎเชพเช‚ เช•เซ‡ เชœเซ‡เชฎเชจเชพเช‚ เชšเชพเช‡เชฒเซเชก เชชเชพเชฅ เชฎเชพเช‰เชจเซเชŸ เชฅเชฏเซ‡เชฒเชพ เชนเซ‹เชฏ, เชœเซ‡ เช‰เชชเชฐเชจเชพ `/host-home` เชจเชพ เชฌเช‚เชงเชพเชฐเชฃเชจเซ‡ เชฌเชฐเชพเชฌเชฐ เช…เชจเซเชฐเซ‚เชช เช›เซ‡) เชฒเช–เชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡, เชœเซเชฏเชพเชฐเซ‡ เชฎเชพเช‰เชจเซเชŸ เชจ เช•เชฐเซ‡เชฒเชพ เชชเชพเชฅเชฎเชพเช‚ เชฒเช–เชตเชพเชจเซ‹ เช‡เชจเช•เชพเชฐ เช•เชฐเชตเชพเชจเซเช‚ เชšเชพเชฒเซ เชฐเชพเช–เซ‡ เช›เซ‡. ### เชตเซˆเช•เชฒเซเชชเชฟเช• เชฎเชพเชฐเซเช—: เช•เชจเซเชŸเซ‡เชจเชฐเชจเชพ เชชเซ‹เชคเชพเชจเชพ CLI เชจเซ‡ เช•เซ‰เชจเซเชซเชฟเช—เชฐ เช•เชฐเซ‹ (เชธเช‚เชฏเชฎเชชเซ‚เชฐเซเชตเช• เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹) เชœเซเชฏเชพเชฐเซ‡ CLI เช–เชฐเซ‡เช–เชฐ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เช…เช‚เชฆเชฐ เชœ เชนเซ‹เชฏ (`cli` เชชเซเชฐเซ‹เชซเชพเช‡เชฒ), เชคเซเชฏเชพเชฐเซ‡ เชฒเช–เชตเชพเชจเซ€ เช•เซเชฐเชฟเชฏเชพ เช‡เชฐเชพเชฆเชพเชชเซ‚เชฐเซเชตเช•เชจเซ€ เชนเซ‹เชฏ เช›เซ‡. เช•เซ‹เชˆเชชเชฃ `setup-*` เช•เชฎเชพเชจเซเชกเชจเซ‡ `--allow-container-write` เช†เชชเซ‹ เช…เชฅเชตเชพ เชธเชฐเซเชตเชฐ เชฎเชพเชŸเซ‡ `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE=true` เชธเซ‡เชŸ เช•เชฐเซ‹. เชฒเช–เชตเชพเชจเซ€ เช•เซเชฐเชฟเชฏเชพ เช†เช—เชณ เชตเชงเชถเซ‡, เชชเชฃ เชธเชพเชฅเซ‡ เชšเซ‡เชคเชตเชฃเซ€ เชฎเชณเชถเซ‡ เช•เซ‡ เชคเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชธเชฎเชฏ เชŸเช•เชถเซ‡ เชจเชนเซ€เช‚. > **เชธเซเชฐเช•เซเชทเชพ เชšเซ‡เชคเชตเชฃเซ€ โ€” `cli` เชชเซเชฐเซ‹เชซเชพเช‡เชฒ + `docker.sock` เชฎเชพเช‰เชจเซเชŸ.** > เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เช…เช‚เชฆเชฐเชจเซเช‚ เช‘เชŸเซ‹-เช…เชชเชกเซ‡เชŸเชฐ เชนเซ‹เชธเซเชŸ เชกเชฟเชฎเชจ เชฆเซเชตเชพเชฐเชพ เชธเซเชŸเซ…เช• เชซเชฐเซ€ เชฌเชจเชพเชตเซ€ เชถเช•เซ‡ เชคเซ‡ เชฎเชพเชŸเซ‡ > `cli` เชชเซเชฐเซ‹เชซเชพเช‡เชฒ `/var/run/docker.sock` เชจเซ‡ เชฌเชพเช‡เชจเซเชก-เชฎเชพเช‰เชจเซเชŸ เช•เชฐเซ‡ เช›เซ‡ > (`src/lib/system/autoUpdate.ts` เชคเซ‡ เชธเซ‰เช•เซ‡เชŸ เชฎเชพเชŸเซ‡ เชคเชชเชพเชธ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เช—เซ‡เชฐเชนเชพเชœเชฐ เชนเซ‹เชฏ > เชคเซเชฏเชพเชฐเซ‡ Docker เชชเชพเชฅเชจเซ‡ เช›เซ‹เชกเซ€ เชฆเซ‡ เช›เซ‡). เชคเซ‡ เชธเซ‰เช•เซ‡เชŸ **เชนเซ‹เชธเซเชŸ-เชฐเซ‚เชŸ เชตเชฟเชถเซเชตเชพเชธเชจเซ€ > เชธเซ€เชฎเชพ** เช›เซ‡: เชœเซ‡ เช•เช‚เชˆเชชเชฃ เชคเซเชฏเชพเช‚ เชชเชนเซ‹เช‚เชšเซ€ เชถเช•เซ‡ เช›เซ‡ เชคเซ‡ เชนเซ‹เชธเซเชŸ Docker เชกเชฟเชฎเชจเชจเซ‡ > เชฐเซ‚เชŸ เชคเชฐเซ€เช•เซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ โ€” เชคเซ‡ เชนเซ‹เชธเซเชŸ เชชเชฐเชจเชพ เช•เซ‹เชˆเชชเชฃ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ‡ เชฌเชจเชพเชตเซ€, > เชจเชฟเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ€, เช…เชŸเช•เชพเชตเซ€ เช…เชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. > เชชเชฐเชฟเชฃเชพเชฎเซ‹: > > 1. **`cli` เชชเซเชฐเซ‹เชซเชพเช‡เชฒเชจเซ‹ เชชเซ‹เชฐเซเชŸ เช•เซเชฏเชพเชฐเซ‡เชฏ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ เช–เซเชฒเซเชฒเซ‹ เชฎเซ‚เช•เชถเซ‹ เชจเชนเซ€เช‚.** เชคเซ‡เชจเซ‡ > `127.0.0.1` เชชเชฐ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ‹ > (`ports: "127.0.0.1:${DASHBOARD_PORT:-20128}:..."`) โ€” > LAN เชชเชฐเชฅเซ€ เชชเชนเซ‹เช‚เชšเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเซ€ `cli` เชชเซเชฐเซ‹เชซเชพเช‡เชฒ เชกเซ…เชถเชฌเซ‹เชฐเซเชก-เชธเซเชคเชฐเชจเชพ เช•เซ‹เชˆเชชเชฃ RCE เชจเซ‡ > เชธเช‚เชชเซ‚เชฐเซเชฃ เชนเซ‹เชธเซเชŸ เช•เชฌเชœเชพเชฎเชพเช‚ เชซเซ‡เชฐเชตเซ€ เชฆเซ‡ เช›เซ‡. > 2. **`cli` เชชเซเชฐเซ‹เชซเชพเช‡เชฒเชฎเชพเช‚ เช•เซ‹เชˆ เชตเชงเชพเชฐเชพเชจเซ€ เชนเซ‹เชธเซเชŸ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชฌเชพเช‡เชจเซเชก เช•เชฐเชถเซ‹ เชจเชนเซ€เช‚.** > Docker เชธเซ‰เช•เซ‡เชŸ เชธเชพเชฅเซ‡เชจเซ‹ เช•เซ‹เชˆเชชเชฃ เชตเชงเชพเชฐเชพเชจเซ‹ เชฎเชพเช‰เชจเซเชŸ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ‡ เชคเชฎเชพเชฐเซ€ เชซเชพเช‡เชฒเชธเชฟเชธเซเชŸเชฎ เช…เชจเซ‡ > เชนเซ‹เชธเซเชŸ เช•เซ‰เชจเซเชซเชฟเช— เชชเชฐ เชธเช‚เชชเซ‚เชฐเซเชฃ เชตเชพเช‚เชšเชตเชพ/เชฒเช–เชตเชพเชจเซ€ เชเช•เซเชธเซ‡เชธ เช†เชชเซ‡ เช›เซ‡. เชœเซ‹ เช•เซ‹เชˆ เชŸเซ‚เชฒเชจเซ‡ > เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชœเซ‹เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เชคเซ‹ เชคเซ‡เชจเซ‡ CLI เชฌเชพเช‡เชจเชฐเซ€ เชธเชพเชฅเซ‡ เชธเซเชฅเชพเชจเชฟเช• เชฐเซ€เชคเซ‡ เชšเชฒเชพเชตเซ‹ โ€” > เชคเซ‡เชจเซ‡ `cli` เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ เชฎเชพเช‰เชจเซเชŸ เช•เชฐเชถเซ‹ เชจเชนเซ€เช‚. > > เชœเซ‹ เชคเชฎเชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เช…เช‚เชฆเชฐ เช‘เชŸเซ‹-เช…เชชเชกเซ‡เชŸเชจเซ€ เชœเชฐเซ‚เชฐ เชจ เชนเซ‹เชฏ, เชคเซ‹ `cli` เชชเซเชฐเซ‹เชซเชพเช‡เชฒเชจเซ‡ เชฌเช‚เชง เชฐเชพเช–เซ‹ > (`COMPOSE_PROFILES=core,redis` เช…เชฅเชตเชพ เชคเซ‡เชจเชพเชฅเซ€ เชŸเซ‚เช‚เช•เซเช‚). เช…เชจเซเชฏ เชชเซเชฐเซ‹เชซเชพเช‡เชฒเซเชธ > Docker เชธเซ‰เช•เซ‡เชŸ เชฎเชพเช‰เชจเซเชŸ เช•เชฐเชคเซ€ เชจเชฅเซ€. > > MITM เชธเช‚เชฌเช‚เชงเชฟเชค เชฅเซเชฐเซ‡เชŸ เชฎเซ‹เชกเซ‡เชฒ เชฎเชพเชŸเซ‡ `docs/security/MITM-TPROXY-DECRYPT.md` > (git; `/docs` เชฎเชพเช‚ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเซ‡เชฒ เชจเชฅเซ€) เช…เชจเซ‡ > `codex`/`claude-code`/`droid`/`openclaw` เชฌเชพเช‡เชจเชฐเซ€เชจเซ€ เช‰เชคเซเชชเชคเซเชคเชฟ เชถเซƒเช‚เช–เชฒเชพ เชฎเชพเชŸเซ‡ > `docs/security/SUPPLY_CHAIN.md` เชœเซเช“. ## Redis เชธเชพเช‡เชกเช•เชพเชฐ OmniRoute เชตเชฟเชคเชฐเชฟเชค เชฐเซ‡เชŸ เชฒเชฟเชฎเชฟเชŸเชฐ เช…เชจเซ‡ เชถเซ‡เชฐ เช•เชฐเซ‡เชฒเซ€ เช•เซ…เชถ เชฎเชพเชŸเซ‡ Redis เชชเชฐ เช†เชงเชพเชฐ เชฐเชพเช–เซ‡ เช›เซ‡. `redis` เชธเซ‡เชตเชพ `docker-compose.yml` เชฎเชพเช‚ **เชนเช‚เชฎเซ‡เชถเชพเช‚ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค** เชนเซ‹เชฏ เช›เซ‡ (เชคเซ‡เชฎเชพเช‚ เช•เซ‹เชˆ เชชเซเชฐเซ‹เชซเชพเช‡เชฒ เช—เซ‡เชŸ เชจเชฅเซ€) เช…เชจเซ‡ เช…เชจเซเชฏ เช•เซ‹เชˆเชชเชฃ เชชเซเชฐเซ‹เชซเชพเช‡เชฒเชจเซ€ เชธเชพเชฅเซ‡ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡. | เชตเชฟเช—เชค | เชฎเซ‚เชฒเซเชฏ | | ---------------------- | --------------------------------------- | | เช‡เชฎเซ‡เชœ | `redis:7-alpine` | | เช•เชจเซเชŸเซ‡เชจเชฐเชจเซเช‚ เชจเชพเชฎ | `omniroute-redis` | | เช†เช‚เชคเชฐเชฟเช• เชชเซ‹เชฐเซเชŸ | `6379` | | เชนเซ‹เชธเซเชŸ เชชเซ‹เชฐเซเชŸ (เช“เชตเชฐเชฐเชพเช‡เชก) | `REDIS_PORT` (เชกเชฟเชซเซ‰เชฒเซเชŸ `6379`) | | เชนเซ‹เชธเซเชŸ เชฌเชพเช‡เชจเซเชก (เช“เชตเชฐเชฐเชพเช‡เชก) | `REDIS_BIND_HOST` (เชกเชฟเชซเซ‰เชฒเซเชŸ `127.0.0.1`) | | เชตเซ‰เชฒเซเชฏเซเชฎ | `omniroute-redis-data` โ†’ `/data` | | เชนเซ‡เชฒเซเชฅเชšเซ‡เช• | `redis-cli ping` (10 เชธเซ‡เช•เชจเซเชกเชจเซเช‚ เช…เช‚เชคเชฐเชพเชฒ) | เชธเช‚เชฌเช‚เชงเชฟเชค เชเชจเซเชตเชพเชฏเชฐเชฎเซ‡เชจเซเชŸ เชตเซ‡เชฐเชฟเชเชฌเชฒเซเชธ: - `REDIS_URL` โ€” เชเชชเชฎเชพเช‚ เช‡เชจเซเชœเซ‡เช•เซเชŸ เช•เชฐเชพเชคเซ€ เช•เชจเซ‡เช•เซเชถเชจ เชธเซเชŸเซเชฐเชฟเช‚เช— (เชกเชฟเชซเซ‰เชฒเซเชŸ เชฐเซ‚เชชเซ‡ `redis://redis:6379`). - `REDIS_PORT` โ€” Redis เช•เชจเซเชŸเซ‡เชจเชฐ เชฎเชพเชŸเซ‡ เชนเซ‹เชธเซเชŸ-เชธเชพเช‡เชก เชชเซ‹เชฐเซเชŸ เชฎเซ…เชชเชฟเช‚เช—. - `REDIS_BIND_HOST` โ€” เชœเซ‡ เชนเซ‹เชธเซเชŸ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฐ เชชเซ‹เชฐเซเชŸ เชชเซเชฐเช•เชพเชถเชฟเชค เชฅเชพเชฏ เช›เซ‡. เชกเชฟเชซเซ‰เชฒเซเชŸ `127.0.0.1` เช›เซ‡. > **เชกเชฟเชซเซ‰เชฒเซเชŸ เชฐเซ‚เชชเซ‡ เชฒเซ‚เชชเชฌเซ…เช• เชถเชพ เชฎเชพเชŸเซ‡:** เชธเชพเช‡เชกเช•เชพเชฐ `requirepass` เชตเชฟเชจเชพ เชšเชพเชฒเซ‡ เช›เซ‡ เช…เชจเซ‡ เชเชช > เช•เชจเซเชŸเซ‡เชจเชฐเซเชธ compose เชจเซ‡เชŸเชตเชฐเซเช• (`redis:6379`) เชฎเชพเชฐเชซเชคเซ‡ เชคเซ‡เชจเชพ เชธเซเชงเซ€ เชชเชนเซ‹เช‚เชšเซ‡ เช›เซ‡ โ€” เชชเซเชฐเช•เชพเชถเชฟเชค เชชเซ‹เชฐเซเชŸ > เชซเช•เซเชค เชนเซ‹เชธเซเชŸ-เชธเชพเช‡เชก เชŸเซ‚เชฒเชฟเช‚เช— (`redis-cli`, เชธเซเชฅเชพเชจเชฟเช• `npm run dev`) เชฎเชพเชŸเซ‡ เชœ เช›เซ‡. เชคเซ‡เชจเซ‡ > `0.0.0.0` เชชเชฐ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชตเชพเชฅเซ€ เชคเชฎเชพเชฐเชพ LAN เชชเชฐเชจเชพ เชฆเชฐเซ‡เช• เชนเซ‹เชธเซเชŸ เชฎเชพเชŸเซ‡ เชชเซเชฐเชฎเชพเชฃเซ€เช•เชฐเชฃ เชตเชฟเชจเชพเชจเซเช‚ Redis เช–เซเชฒเซเชฒเซเช‚ เชฅเชˆ เชœเชถเซ‡. เชœเซ‹ เชคเชฎเซ‡ > `REDIS_BIND_HOST=0.0.0.0` เชธเซ‡เชŸ เช•เชฐเซ‹, เชคเซ‹ เชธเซ‡เชตเชพ `command:` เชฎเชพเช‚ `--requirepass` เชชเชฃ เช‰เชฎเซ‡เชฐเซ‹. **Redis เช…เช•เซเชทเชฎ เช•เชฐเชตเชพเชจเซ€** เชญเชฒเชพเชฎเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชคเซ€ เชจเชฅเซ€ (เชฐเซ‡เชŸ เชฒเชฟเชฎเชฟเชŸเชฐ เช‡เชจ-เชฎเซ‡เชฎเชฐเซ€ เชซเซ‰เชฒเชฌเซ…เช• เชชเชฐ เช…เชตเช•เซเชฐเชฎเชฟเชค เชฅเชถเซ‡). เชœเซ‹ เชคเชฎเชพเชฐเซ‡ เชคเซ‡เชฎ เช•เชฐเชตเซเช‚ เชœ เชนเซ‹เชฏ, เชคเซ‹ `docker-compose.yml` เชฎเชพเช‚เชจเซ‹ `redis:` เชธเชฐเซเชตเชฟเชธ เชฌเซเชฒเซ‰เช• เชฆเซ‚เชฐ เช•เชฐเซ‹/เช•เชฎเซ‡เชจเซเชŸ เช•เชฐเซ‹ เช…เชฅเชตเชพ เชคเซ‡เชจเซ‡ เชถเซ‚เชจเซเชฏ เชธเซเชงเซ€ เชธเซเช•เซ‡เชฒ เช•เชฐเซ‹: ```bash docker compose up -d --scale redis=0 ``` ## เชชเซเชฐเซ‹เชกเช•เซเชถเชจ Compose เชกเซ‡เชตเชจเซ€ เชธเชพเชฅเซ‡ เชšเชพเชฒเชคเชพ เช…เชฒเช— เชชเซเชฐเซ‹เชกเช•เซเชถเชจ เชธเซเชจเซ…เชชเชถเซ‰เชŸ เชฎเชพเชŸเซ‡ `docker-compose.prod.yml` เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹. | เชตเชฟเช—เชค | เชฎเซ‚เชฒเซเชฏ | | ---------------------- | --------------------------------------------------------------------------------------------- | | เชซเชพเช‡เชฒ | `docker-compose.prod.yml` | | เชกเชฟเชซเซ‰เชฒเซเชŸ เชกเซ…เชถเชฌเซ‹เชฐเซเชก เชชเซ‹เชฐเซเชŸ | `PROD_DASHBOARD_PORT=20130` (เช†เช‚เชคเชฐเชฟเช• `${DASHBOARD_PORT:-20128}` เชธเชพเชฅเซ‡ เชฎเซ…เชช เช•เชฐเซ‡เชฒเซ‹) | | เชกเชฟเชซเซ‰เชฒเซเชŸ API เชชเซ‹เชฐเซเชŸ | `PROD_API_PORT=20131` | | เช‡เชฎเซ‡เชœ | `omniroute:prod` (`runner-cli` เชŸเชพเชฐเซเช—เซ‡เชŸเชฎเชพเช‚เชฅเซ€ เชฌเชฟเชฒเซเชก เช•เชฐเซ‡เชฒเซ€) | | Redis เช•เชจเซเชŸเซ‡เชจเชฐ | `omniroute-redis-prod` (`redis:8.6.2`, เชธเชฎเชฐเซเชชเชฟเชค `redis-prod-data` เชตเซ‰เชฒเซเชฏเซเชฎ) | | เชกเซ‡เชŸเชพ เชตเซ‰เชฒเซเชฏเซเชฎ | `omniroute-prod-data` (เชจเชพเชฎเชฟเชค, เชฐเชฟเชฌเชฟเชฒเซเชก เชฆเชฐเชฎเชฟเชฏเชพเชจ เชœเชณเชตเชพเชฏเซ‡เชฒเซเช‚) | | เชนเซ‡เชฒเซเชฅเชšเซ‡เช• | `node healthcheck.mjs` + `redis-cli ping`, เชœเซ‡เชฎเชพเช‚ `depends_on` Redis เชจเซ€ เชคเช‚เชฆเซเชฐเชธเซเชคเซ€ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡ | เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชฐเซ€เชค: ```bash # เชชเซเชฐเซ‹เชกเช•เซเชถเชจ เชธเซเชŸเซ…เช• เชฌเชฟเชฒเซเชก เช•เชฐเซ€เชจเซ‡ เชถเชฐเซ‚ เช•เชฐเซ‹ docker compose -f docker-compose.prod.yml up -d --build # เชฒเซ‰เช—เซเชธเชจเซเช‚ เชฒเชพเช‡เชต เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช— เช•เชฐเซ‹ docker compose -f docker-compose.prod.yml logs -f # เชฌเช‚เชง เช•เชฐเซ‹ (เชตเซ‰เชฒเซเชฏเซเชฎเซเชธ เชฐเชพเช–เซ‹) docker compose -f docker-compose.prod.yml down ``` เชชเซเชฐเซ‹เชก เชธเซเชŸเซ…เช• เชกเซ‡เชต compose เชจเซ€ เชธเชฎเชพเช‚เชคเชฐ เชšเชพเชฒเซ‡ เช›เซ‡ (เช•เชจเซเชŸเซ‡เชจเชฐเชจเชพเช‚ เชจเชพเชฎ, เชชเซ‹เชฐเซเชŸ เช…เชจเซ‡ เชตเซ‰เชฒเซเชฏเซเชฎ เช…เชฒเช— เช›เซ‡), เชคเซ‡เชฅเซ€ เชชเซเชฐเซ‹เชกเช•เซเชถเชจ เชšเชพเชฒเซ เชฐเชนเซ‡ เชคเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชธเซเชฅเชพเชจเชฟเช• เชฐเซ€เชคเซ‡ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชตเชฟเช•เชพเชธ เชšเชพเชฒเซ เชฐเชพเช–เซ€ เชถเช•เซ‹ เช›เซ‹. ## Dockerfile เชธเซเชŸเซ‡เชœ เชฐเชฟเชชเซ‹เชเชฟเชŸเชฐเซ€ เชธเชพเชฅเซ‡ เชฎเชฒเซเชŸเชฟ-เชธเซเชŸเซ‡เชœ Dockerfile (`Dockerfile`) เชฎเชณเซ‡ เช›เซ‡. เชšเชพเชฐ เชธเซเชŸเซ‡เชœ เช‰เชชเชฒเชฌเซเชง เช›เซ‡; เชคเชฎเชพเชฐเชพ เช‰เชชเชฏเซ‹เช— เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ `target` เชชเชธเช‚เชฆ เช•เชฐเซ‹. | เชธเซเชŸเซ‡เชœ | เชฌเซ‡เช เช‡เชฎเซ‡เชœ | เชนเซ‡เชคเซ | | ------------- | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `builder` | `node:26-trixie-slim` | เชกเชฟเชชเซ‡เชจเซเชกเชจเซเชธเซ€เช“ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‡ เช›เซ‡ (`npm ci --legacy-peer-deps`) เช…เชจเซ‡ `npm run build` เชšเชฒเชพเชตเซ‡ เช›เซ‡ (เชกเชฟเชซเซ‰เชฒเซเชŸ เชฐเซ‚เชชเซ‡ Turbopack โ€” เชจเซ€เชšเซ‡ เชฌเชฟเชฒเซเชก-เชธเชฎเชฏเชจเชพเช‚ เชธเช‚เชธเชพเชงเชจเซ‹ เชœเซเช“) | | `runner-base` | `node:26-trixie-slim` | Next.jsเชจเชพ เชธเซเชŸเซ…เชจเซเชกเช…เชฒเซ‹เชจ เช†เช‰เชŸเชชเซเชŸ เชธเชพเชฅเซ‡เชจเซ‹ เชชเซเชฐเซ‹เชกเช•เซเชถเชจ เชฐเชจเชŸเชพเช‡เชฎ. **เช•เซ‹เชˆ เชชเซเชฐเซ‹เชตเชพเช‡เชกเชฐ CLI เชธเชฎเชพเชตเชฟเชทเซเชŸ เชจเชฅเซ€.** | | `runner-cli` | `runner-base` | `git`, `docker.io`, `docker-compose` เช…เชจเซ‡ เช—เซเชฒเซ‹เชฌเชฒ CLI เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡: `@openai/codex`, `@anthropic-ai/claude-code`, `droid`, `openclaw`. **เชเชœเชจเซเชŸเชฟเช• เชตเชฐเซเช•เชซเซเชฒเซ‹ เชฎเชพเชŸเซ‡ เช† เชชเชธเช‚เชฆ เช•เชฐเซ‹.** | | `runner-web` | `runner-base` | เชตเซ‡เชฌ-เชธเซ‡เชถเชจ เชชเซเชฐเซ‹เชตเชพเช‡เชกเชฐ เชฎเชพเชŸเซ‡ Playwright + Chromium เชฌเซเชฐเชพเช‰เชเชฐ (`--with-deps`) เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡: `gemini-web`, `claude-web`, `claude-turnstile`. **เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เช† เชชเซเชฐเซ‹เชตเชพเช‡เชกเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹ เชคเซเชฏเชพเชฐเซ‡ เช† เชชเชธเช‚เชฆ เช•เชฐเซ‹** โ€” เชคเซ‡เชจเชพ เชตเชฟเชจเชพ เชธเชพเชฆเซ€ เช‡เชฎเซ‡เชœ เชฐเชฟเช•เซเชตเซ‡เชธเซเชŸ เชธเชฎเชฏเซ‡ เชจเชฟเชทเซเชซเชณ เชœเชพเชฏ เช›เซ‡ (Release Channels เชนเซ‡เช เชณเชจเซ€ `-web` เชจเซ‹เช‚เชง เชœเซเช“). | เชšเซ‹เช•เซเช•เชธ เชŸเชพเชฐเซเช—เซ‡เชŸ เชฎเซ‡เชจเซเชฏเซเช…เชฒเซ€ เชฌเชฟเชฒเซเชก เช•เชฐเซ‹: ```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 . ``` ### เชฌเชฟเชฒเซเชก-เชธเชฎเชฏเชจเชพเช‚ เชธเช‚เชธเชพเชงเชจเซ‹ เชคเซเชฐเชฃ เชฌเชฟเชฒเซเชก เช†เชฐเซเช—เซเชฏเซเชฎเซ‡เชจเซเชŸ `builder` เชธเซเชŸเซ‡เชœเชจเชพ เชธเช‚เชธเชพเชงเชจ เช–เชฐเซเชšเชจเซ‡ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡เช“ เชฎเชพเชคเซเชฐ เชฌเชฟเชฒเซเชก-เชธเชฎเชฏ เชฎเชพเชŸเซ‡ เช›เซ‡ โ€” `OMNIROUTE_MEMORY_MB` (เชจเซ€เชšเซ‡) เชเช• เช…เชฒเช— เชฐเชจเชŸเชพเช‡เชฎ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เช›เซ‡. | เชฌเชฟเชฒเซเชก เช†เชฐเซเช—เซเชฏเซเชฎเซ‡เชจเซเชŸ | เชกเชฟเชซเซ‰เชฒเซเชŸ | เช…เชธเชฐ | | --------------------------- | ------- | --------------------------------------------------------------------------------------------- | | `OMNIROUTE_USE_TURBOPACK` | `0` | `0` webpack เชตเชกเซ‡ เชฌเชฟเชฒเซเชก เช•เชฐเซ‡ เช›เซ‡: เช“เช›เซ€ เชชเซ€เช• เชฎเซ‡เชฎเชฐเซ€, เชงเซ€เชฎเซเช‚. `1` Turbopack เชชเชธเช‚เชฆ เช•เชฐเซ‡ เช›เซ‡. | | `OMNIROUTE_BUILD_MEMORY_MB` | `6144` | เชถเชฐเซ‚ เช•เชฐเชพเชฏเซ‡เชฒเชพ `next build` เชฎเชพเชŸเซ‡ V8 เชนเซ€เชช เชฎเชฐเซเชฏเชพเชฆเชพ (`--max-old-space-size`). | | `OMNIROUTE_BUILD_WORKERS` | `2` | `CIRCLE_NODE_TOTAL`เชจเซ‡ เชฎเซ‚เชฒเซเชฏ เช†เชชเซ‡ เช›เซ‡; Next เชชเซ‡เชœ-เชกเซ‡เชŸเชพ เชธเช‚เช—เซเชฐเชน เชฎเชพเชŸเซ‡ `workers = N - 1` เชจเช•เซเช•เซ€ เช•เชฐเซ‡ เช›เซ‡. | เชฎเซ‹เชŸเชพ เชฌเชฟเชฒเซเชกเชฐ เชชเชฐ `OMNIROUTE_BUILD_WORKERS`เชจเซเช‚ เชฎเซ‚เชฒเซเชฏ เชตเชงเชพเชฐเชตเซเช‚ เชœเซ‹เชˆเช เช…เชจเซ‡ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชธเช‚เชธเชพเชงเชจเซ‹เชตเชพเชณเซเช‚ เชฌเชฟเชฒเซเชก **`โœ“ Compiled successfully` เชชเช›เซ€** เชฌเช‚เชง เชฅเชˆ เชœเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ เชธเซŒเชชเซเชฐเชฅเชฎ เชคเซ‡เชจเซ€ เชถเช‚เช•เชพ เช•เชฐเชตเซ€ เชœเซ‹เชˆเช. เชฆเชฐเซ‡เช• เชชเซ‡เชœ-เชกเซ‡เชŸเชพ เชตเชฐเซเช•เชฐ เชคเซ‡เชจเซ€ เชชเซ‹เชคเชพเชจเซ€ เชชเซเชฐเซ‹เชธเซ‡เชธ เช›เซ‡, เช…เชจเซ‡ เชชเซ‡เชฐเชจเซเชŸ `next build` เชชเชฃ เช…เชฒเช— เชชเซเชฐเซ‹เชธเซ‡เชธ เช›เซ‡; เชฒเชพเช‡เชต VPS เชชเซเชจเชฐเซเชคเซเชชเชพเชฆเชจ (issue #7518)เชฎเชพเช‚ เชฆเชฐเซ‡เช• เชชเซเชฐเซ‹เชธเซ‡เชธเชจเซ‹ เชชเซ€เช• RSS ~4.5 GB เชฎเชพเชชเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเชคเซ‹, เชœเซ‡ `NODE_OPTIONS` เชนเซ€เชช เชซเซเชฒเซ…เช—เชฅเซ€ เชธเซเชตเชคเช‚เชคเซเชฐ เชนเชคเซ‹ (Turbopack, V8 เชนเซ€เชชเชจเซ€ เชฌเชนเชพเชฐเชจเซ€ เชจเซ‡เชŸเชฟเชต/Rust เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเซ‡ เช›เซ‡). `2`เชจเซเช‚ เชกเชฟเชซเซ‰เชฒเซเชŸ เชฎเซ‚เชฒเซเชฏ (โ†’ 1 เชตเชฐเซเช•เชฐ, เช•เซเชฒ 2 เชชเซเชฐเซ‹เชธเซ‡เชธ) เชชเชฌเซเชฒเชฟเชถ เชชเชพเช‡เชชเชฒเชพเช‡เชจ เชฆเซเชตเชพเชฐเชพ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเชพ 16 GB / 4 vCPU GitHub-เชนเซ‹เชธเซเชŸเซ‡เชก เชฐเชจเชฐ เชฎเชพเชŸเซ‡ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เช›เซ‡. `8` เชชเชฐ (โ†’ 7 เชตเชฐเซเช•เชฐ) เชคเซ‡ เชฐเชจเชฐเชจเซ€ เชฎเซ‡เชฎเชฐเซ€ เชธเชฎเชพเชชเซเชค เชฅเชˆ เช—เชˆ เช…เชจเซ‡ buildkitเช `ResourceExhausted: ... cannot allocate memory` เชธเชพเชฅเซ‡ เชธเซเชŸเซ‡เชช เชจเชฟเชทเซเชซเชณ เช•เชฐเซเชฏเซ‹; เชฆเชฐเซ‡เช• เชชเซเชฐเซ‹เชธเซ‡เชธเชจเซ‹ RSS เช…เชจเซเชฎเชพเชจเชฟเชค เช•เชฐเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡ เชธเซ€เชงเซ‹ เชฎเชพเชชเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชคเซเชฏเชพเชฐเซ‡ `3` (โ†’ 2 เชตเชฐเซเช•เชฐ) เชชเชฃ เชชเซ‚เชฐเชคเซเช‚ เชจเชนเซ‹เชคเซเช‚. `tests/unit/docker-build-memory-budget.test.ts` เชฎเชพเชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเชพ เช†เช‚เช•เชกเชพ เชธเชพเชฎเซ‡ เช—เชฃเชคเชฐเซ€ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช•เซ‹เชˆเชชเชฃ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เชฐเชจเชฐเชจเซ€ เช•เซเชทเชฎเชคเชพเชฅเซ€ เชตเชงเซ€ เชœเชพเชฏ เชคเซ‹ เชจเชฟเชทเซเชซเชณ เชฅเชพเชฏ เช›เซ‡. Turbopack เชเชตเซ€ เชจเซ‡เชŸเชฟเชต Rust เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡ V8 เชนเซ€เชชเชจเซ€ **เชฌเชนเชพเชฐ** เชฐเชนเซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ `OMNIROUTE_BUILD_MEMORY_MB` เชคเซ‡เชจเซ‡ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช•เชฐเชคเซเช‚ เชจเชฅเซ€. เชฎเซ‡เชฎเชฐเซ€ เชฎเชฐเซเชฏเชพเชฆเชพเชตเชพเชณเชพ เชนเซ‹เชธเซเชŸ เชชเชฐ เชฌเชฟเชฒเซเชกเชจเซ‡ OOM เช•เชฟเชฒเชฐ เชฆเซเชตเชพเชฐเชพ เช•เซ‹เชˆเชชเชฃ เชญเซ‚เชฒเชจเชพ เชฒเช–เชพเชฃ เชตเชฟเชจเชพ SIGKILL เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ โ€” เชคเซ‡ เชซเช•เซเชค `Creating an optimized production build`เชจเซ€ เชตเชšเซเชšเซ‡ เช…เชŸเช•เซ€ เชœเชพเชฏ เช›เซ‡, เชœเซ‡ เชฎเซ‡เชฎเชฐเซ€ เชธเชฎเชพเชชเซเชค เชฅเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡ เช…เชŸเช•เซ€ เช—เชฏเซเช‚ เชนเซ‹เชฏ เชเชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡. เชคเซ‡เชฅเซ€ เชœ `Dockerfile`เชฎเชพเช‚ เชกเชฟเชซเซ‰เชฒเซเชŸ เชฐเซ‚เชชเซ‡ webpack (`OMNIROUTE_USE_TURBOPACK=0`) เช›เซ‡, เชœเซเชฏเชพเชฐเซ‡ `npm run dev` / `npm run build`เชฎเชพเช‚ เช•เซ‹เชกเชจเซเช‚ เชกเชฟเชซเซ‰เชฒเซเชŸ Turbopack เช›เซ‡: เช•เซ‹เชˆเชชเชฃ เชฌเชฟเชฒเซเชก เช†เชฐเซเช—เซเชฏเซเชฎเซ‡เชจเซเชŸ เชตเชฟเชจเชพเชจเซเช‚ เชธเชพเชฆเซเช‚ `docker build .` (เชœเซ‡ Railway เช…เชจเซ‡ เช…เชจเซเชฏ เชตเชจ-เช•เซเชฒเชฟเช• เชนเซ‹เชธเซเชŸ เชšเชฒเชพเชตเซ‡ เช›เซ‡) เชฎเซ‡เชฎเชฐเซ€-เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชฌเชฟเชฒเซเชกเชฐ เชชเชฐ เช•เซ‹เชˆ เชธเช‚เชฆเซ‡เชถ เชตเชฟเชจเชพ เชฌเช‚เชง เชจ เชฅเชตเซเช‚ เชœเซ‹เชˆเช. เชชเซเชฐเช•เชพเชถเชฟเชค เช‡เชฎเซ‡เชœ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ `docker-publish.yml`เชฎเชพเช‚ `OMNIROUTE_USE_TURBOPACK=0` เชธเซเชชเชทเซเชŸ เชฐเซ€เชคเซ‡ เชชเชพเชธ เช•เชฐเซ‡ เช›เซ‡. เชชเซ‚เชฐเชคเซ€ RAM เชงเชฐเชพเชตเชคเชพ เชฌเชฟเชฒเซเชกเชฐ เชชเชฐ, เชตเชงเซ เชเชกเชชเซ€ เชฌเชฟเชฒเซเชก เชฎเชพเชŸเซ‡ Turbopack เชชเชธเช‚เชฆ เช•เชฐเซ‹: ```bash docker build --target runner-base \ --build-arg OMNIROUTE_USE_TURBOPACK=1 \ -t omniroute:base . ``` `webpackBuildWorker` เชธเช•เซเชทเชฎ เช›เซ‡, เชคเซ‡เชฅเซ€ `next build` เชเช• เชชเซ‡เชฐเชจเซเชŸ **เช…เชจเซ‡** เชเช• เชตเชฐเซเช•เชฐ เชชเซเชฐเซ‹เชธเซ‡เชธ เชšเชฒเชพเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฆเชฐเซ‡เช• เช…เชฒเช—เชฅเซ€ `OMNIROUTE_BUILD_MEMORY_MB`เชจเซเช‚ เชชเชพเชฒเชจ เช•เชฐเซ‡ เช›เซ‡. เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เชฎเชฐเซเชฏเชพเชฆเชพ เช† เชฎเซ‚เชฒเซเชฏเชจเชพ เช†เชถเชฐเซ‡ เชเช• เช—เชฃเชพเชจเซ‡ เชฌเชฆเชฒเซ‡ เชฌเซ‡ เช—เชฃเชพเชฅเซ€ เชตเชงเซ เชฐเชพเช–เซ‹. เช† เชŸเซเชฐเซ€ เชชเชฐ เชฎเชพเชชเซ‡เชฒเซเช‚ (`--target runner-base`, `OMNIROUTE_BUILD_MEMORY_MB=6144`): | เชฌเช‚เชกเชฒเชฐ | เช•เชจเซเชŸเซ‡เชจเชฐ เชฎเชฐเซเชฏเชพเชฆเชพ | เชชเชฐเชฟเชฃเชพเชฎ | | --------- | --------------- | ----------------------------------- | | Turbopack | 8 GiB / 16 GiB | เชฌเช‚เชจเซ‡ เชชเชฐ เช•เซ‹เชˆ เชธเช‚เชฆเซ‡เชถ เชตเชฟเชจเชพ OOM-killed | | webpack | 8 GiB | เชฌเชฟเชฒเซเชก เชตเชฐเซเช•เชฐเชจเซ‡ SIGKILL เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ | | webpack | 12 GiB | เชธเชซเชณ, เชชเซ€เช• 11.1 GiB เชธเซเชงเซ€ เชชเชนเซ‹เช‚เชšเซเชฏเซ‹ | ### เชฐเชจเชŸเชพเช‡เชฎ เชกเชฟเชซเซ‰เชฒเซเชŸ `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เชฎเชพเช‚ เชฎเซ‡เชฎเชฐเซ€เชจเซเช‚ เชตเชฐเซเชคเชจ: - เช‡เชฎเซ‡เชœ `OMNIROUTE_MEMORY_MB=1024` เชธเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชชเชฐเชฅเซ€ `NODE_OPTIONS=--max-old-space-size=1024` เชฌเชจเชพเชตเซ‡ เช›เซ‡. - เชตเชพเชธเซเชคเชตเชฟเช• เชธเชฐเซเชตเชฐ เชชเซเชฐเซ‹เชธเซ‡เชธ standalone launcher เชฆเซเชตเชพเชฐเชพ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡, เชœเซ‡ `OMNIROUTE_MEMORY_MB` เชตเชพเช‚เชšเซ‡ เช›เซ‡ เช…เชจเซ‡ `--max-old-space-size=` เช‰เชฎเซ‡เชฐเซ‡ เช›เซ‡. - Node เชตเชพเชฐเช‚เชตเชพเชฐ เช†เชชเซ‡เชฒเชพ `--max-old-space-size`เชจเซเช‚ เช›เซ‡เชฒเซเชฒเซเช‚ เชฎเซ‚เชฒเซเชฏ เชตเชพเชชเชฐเซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ `OMNIROUTE_MEMORY_MB` เชธเซ‡เชŸ เช•เชฐเชตเชพเชฅเซ€ เช…เชธเชฐเช•เชพเชฐเช• Docker heap เชฎเชฐเซเชฏเชพเชฆเชพ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡. - เช‡เชฎเซ‡เชœ เชนเช‚เชฎเซ‡เชถเชพเช‚ เชคเซ‡เชจเซ‡ เชธเซ‡เชŸ เช•เชฐเชคเซ€ เชนเซ‹เชตเชพเชฅเซ€, Docker เชนเซ‡เช เชณ launcher's เชชเซ‹เชคเชพเชจเซ€ RAM-calibrated fallback เช•เซเชฏเชพเชฐเซ‡เชฏ เชฒเชพเช—เซ เชชเชกเชคเซ€ เชจเชฅเซ€. workload เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ‡ เชธเซเชชเชทเซเชŸเชชเชฃเซ‡ เชตเชงเชพเชฐเซ‹ (เชจเซ€เชšเซ‡เชจเซเช‚ เช•เซ‹เชทเซเชŸเช• เชœเซเช“). coding-agent `/v1/responses` เชฎเชพเชŸเซ‡ `2048` เชนเชœเซ€ เชชเชฃ เชฌเชนเซ เช“เช›เซเช‚ เช›เซ‡. ### coding agents เชฎเชพเชŸเซ‡ Runtime RAM 1โ€ฏGiBเชจเซ€ Docker เชกเชฟเชซเซ‰เชฒเซเชŸ เชฎเชฐเซเชฏเชพเชฆเชพ dashboard/light-chat เชฎเชพเชŸเซ‡เชจเซ€ เชฒเช˜เซเชคเชฎ เชฎเชฐเซเชฏเชพเชฆเชพ เช›เซ‡, production เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เช•เชฆ เชจเชฅเซ€. เชฒเชพเช‚เชฌเซ€ `POST /v1/responses` bodies (เชธเซ‡เช‚เช•เชกเซ‹ messages, เชฆเชธเซ€เช“ tools) compression เชฆเชฐเชฎเชฟเชฏเชพเชจ เช…เชจเซ‡เช• in-memory graphs เชœเชพเชณเชตเซ€ เชฐเชพเช–เซ‡ เช›เซ‡. เชเช•เชธเชพเชฅเซ‡ เชšเชพเชฒเชคเซ€ ~3โ€ฏMiB / ~750k-tokenเชจเซ€ เชฌเซ‡ requestsเช **12โ€ฏGiB** old-space เชชเชฐ V8เชจเซ‡ เชฌเช‚เชง เช•เชฐเชพเชตเซ€ เชฆเซ€เชงเซเช‚ เช›เซ‡ (`FATAL ERROR: Reached heap limit`) เช…เชจเซ‡ 16โ€ฏGiB cgroup OOM เชฎเชฐเซเชฏเชพเชฆเชพ เชชเชฃ เชตเชŸเชพเชตเซ€ เช›เซ‡. [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) เชœเซเช“. **cgroup `--memory`เชจเซเช‚ เช•เชฆ heap เช•เชฐเชคเชพเช‚ เชตเชงเชพเชฐเซ‡ เชฐเชพเช–เซ‹** โ€” native buffers, SQLite เช…เชจเซ‡ compression intermediates V8เชจเซ€ เชฌเชนเชพเชฐ เชฐเชนเซ‡ เช›เซ‡. | Workload | `OMNIROUTE_MEMORY_MB` | Container / cgroup | เชจเซ‹เช‚เชงเซ‹ | | ----------------------------------- | --------------------- | ------------------- | ------------------------------------------------------------------------------------------------ | | Dashboard, เชเช• เชนเชณเชตเซ€ chat | `1024` (เช‡เชฎเซ‡เชœ เชกเชฟเชซเซ‰เชฒเซเชŸ) | โ‰ฅ2โ€ฏGiB | | | เชเช• coding agent (Claude/Codex/Grok) | `8192` | โ‰ฅ10โ€ฏGiB | เชธเชพเชฎเชพเชจเซเชฏ single-session `/v1/responses` | | เชเช•เชธเชพเชฅเซ‡ เชฌเซ‡ เชฒเชพเช‚เชฌเซ€ `/v1/responses` | `10240`โ€“`12288` | โ‰ฅ12โ€“16โ€ฏGiB | ~12โ€ฏGiB heap เชชเชฐ เชฎเชพเชชเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ V8 abort | | เชเช•เชธเชพเชฅเซ‡ เชคเซเชฐเชฃเชฅเซ€ เชตเชงเซ เชฒเชพเช‚เชฌเชพ contexts | เชเช• process เชชเชฐ เชจ เชšเชฒเชพเชตเซ‹ | serialize / เชตเชงเซ RAM | เชกเชฟเชซเซ‰เชฒเซเชŸ heavyweight admissionเชฎเชพเช‚ 1 in-flight เช›เซ‡; RAM เชตเชงเชพเชฐเซเชฏเชพ เชตเชฟเชจเชพ เชคเซ‡เชจเซ‡ เชตเชงเชพเชฐเชตเชพเชฅเซ€ abort เชซเชฐเซ€ เชฅเชพเชฏ เช›เซ‡ | bare metal เชชเชฐ `omniroute serve`, `OMNIROUTE_MEMORY_MB` **เชธเซ‡เชŸ เชจ เชนเซ‹เชฏ** เชคเซเชฏเชพเชฐเซ‡ RAMเชจเชพ ~35% เชชเซเชฐเชฎเชพเชฃเซ‡ calibrate เช•เชฐเซ‡ เช›เซ‡ (`[512, 4096]` เชธเซเชงเซ€ เชฎเชฐเซเชฏเชพเชฆเชฟเชค). Docker เชนเช‚เชฎเซ‡เชถเชพเช‚ `1024` เชธเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ official imageเชฎเชพเช‚ เช† calibration เช•เซเชฏเชพเชฐเซ‡เชฏ เชšเชพเชฒเชคเซเช‚ เชจเชฅเซ€. ```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 เชฌเซเชฐเชฟเชœ เชฎเชพเชŸเซ‡เชจเซเช‚ เชธเชนเชฟเชฏเชพเชฐเซเช‚ เชธเชฟเช•เซเชฐเซ‡เชŸ. **เชชเซเชฐเซ‹เชกเช•เซเชถเชจเชฎเชพเช‚ เช†เชตเชถเซเชฏเช•** โ€” เชคเซ‡เชจเซ‡ เชฎเชœเชฌเซ‚เชค เชฐเซ‡เชจเซเชกเชฎ เชธเซเชŸเซเชฐเชฟเช‚เช— เชชเชฐ เชธเซ‡เชŸ เช•เชฐเซ‹. | เชธเซ‡เชŸ เช•เชฐเซ‡เชฒเซเช‚ เชจเชฅเซ€ (เช†เชชเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡) | | `REDIS_URL` | เชฐเซ‡เชŸ เชฒเชฟเชฎเชฟเชŸเชฐ / เช•เซ…เชถ เชฌเซ…เช•เชเชจเซเชก เชฎเชพเชŸเซ‡เชจเซ€ เช•เชจเซ‡เช•เซเชถเชจ เชธเซเชŸเซเชฐเชฟเช‚เช— | `redis://redis:6379` | | `REDIS_PORT` | เชฌเช‚เชกเชฒ เช•เชฐเซ‡เชฒเชพ Redis เช•เชจเซเชŸเซ‡เชจเชฐ เชฎเชพเชŸเซ‡เชจเซ‹ เชนเซ‹เชธเซเชŸ-เชธเชพเช‡เชก เชชเซ‹เชฐเซเชŸ | `6379` | | `REDIS_BIND_HOST` | เชนเซ‹เชธเซเชŸ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เช•เซ‡ เชœเซ‡เชจเชพ เชชเชฐ เชฌเช‚เชกเชฒ เช•เชฐเซ‡เชฒเซ‹ Redis เชชเซ‹เชฐเซเชŸ เชชเซเชฐเช•เชพเชถเชฟเชค เชฅเชพเชฏ เช›เซ‡ (เชคเชฎเซ‡ AUTH เช‰เชฎเซ‡เชฐเซ‹ เชจเชนเซ€เช‚ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เชฒเซ‚เชชเชฌเซ…เช•) | `127.0.0.1` | | `AUTO_UPDATE_HOST_REPO_DIR` | เชธเซเชตเชฏเช‚-เช…เชชเชกเซ‡เชŸ เชตเชฐเซเช•เชซเซเชฒเซ‹ เชฎเชพเชŸเซ‡ `cli` เชชเซเชฐเซ‹เชซเชพเช‡เชฒเชฎเชพเช‚ `/workspace/omniroute` เชชเชฐ เชฎเชพเช‰เชจเซเชŸ เช•เชฐเซ‡เชฒเซ‹ เชนเซ‹เชธเซเชŸ เชชเชพเชฅ | `.` (เชตเชฐเซเชคเชฎเชพเชจ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€) | | `OMNIROUTE_MEMORY_MB` | Docker เชธเซเชŸเซ…เชจเซเชกเช…เชฒเซ‹เชจ เชธเชฐเซเชตเชฐ เชฎเชพเชŸเซ‡ เชฐเชจเชŸเชพเช‡เชฎ Node เชนเซ€เชชเชจเซ€ เชฎเชนเชคเซเชคเชฎ เชฎเชฐเซเชฏเชพเชฆเชพ; เช‰เชชเชฐ เช†เชชเซ‡เชฒเชพ เช‡เชฎเซ‡เชœ เชกเชฟเชซเซ‰เชฒเซเชŸเชจเซ‡ เช“เชตเชฐเชฐเชพเช‡เชก เช•เชฐเซ‡ เช›เซ‡. เช•เซ‹เชกเชฟเช‚เช— เชเชœเชจเซเชŸเซเชธ: `8192`+ ([เชฐเชจเชŸเชพเช‡เชฎ RAM](#runtime-ram-for-coding-agents) เชœเซเช“). | `1024` | | `DASHBOARD_PORT` / `API_PORT` | เชกเซ…เชถเชฌเซ‹เชฐเซเชก (20128) เช…เชจเซ‡ API (20129) เชฎเชพเชŸเซ‡ เชเช•เซเชธเชชเซ‹เช เช•เชฐเซ‡เชฒเชพ เชชเซ‹เชฐเซเชŸเซเชธเชจเซ‡ เช“เชตเชฐเชฐเชพเช‡เชก เช•เชฐเซ‹ | `20128` / `20129` | | `APP_BIND_HOST` | เชนเซ‹เชธเซเชŸ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เช•เซ‡ เชœเซ‡เชจเชพ เชชเชฐ docker-compose เชกเซ…เชถเชฌเซ‹เชฐเซเชก/API/live-WS เชชเซ‹เชฐเซเชŸเซเชธ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ‡ เช›เซ‡. `REQUIRE_API_KEY=false` (เชกเชฟเชซเซ‰เชฒเซเชŸ) เชธเชพเชฅเซ‡, `0.0.0.0` เช…เชจเชพเชฎเซ€ `/v1` เชชเซเชฐเซ‰เช•เซเชธเซ€เชจเซ‡ LAN เชธเชฎเช•เซเชท เชเช•เซเชธเชชเซ‹เช เช•เชฐเซ‡ เช›เซ‡ โ€” เชซเช•เซเชค `REQUIRE_API_KEY=true` เชนเซ‹เชฏ เช…เชฅเชตเชพ เช†เช—เชณ เชฐเชฟเชตเชฐเซเชธ เชชเซเชฐเซ‰เช•เซเชธเซ€ เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เชœ เชตเซเชฏเชพเชช เชตเชงเชพเชฐเซ‹. | `127.0.0.1` | | `CLIPROXY_BIND_HOST` | เชนเซ‹เชธเซเชŸ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เช•เซ‡ เชœเซ‡เชจเชพ เชชเชฐ docker-compose `cliproxyapi` เชธเชพเช‡เชกเช•เชพเชฐ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ‡ เช›เซ‡ โ€” เชคเซ‡เชจเชพ เชกเซ‡เชŸเชพ เชตเซ‰เชฒเซเชฏเซเชฎเชฎเชพเช‚ เชชเซเชฐเซ‹เชตเชพเช‡เชกเชฐ เช•เซเชฐเซ‡เชกเซ‡เชจเซเชถเชฟเชฏเชฒเซเชธ เชธเช‚เช—เซเชฐเชนเชฟเชค เชนเซ‹เชฏ เช›เซ‡. | `127.0.0.1` | | `OMNIROUTE_PLUGINS_DIR` | เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชœเซ‡เชฎเชพเช‚เชฅเซ€ เชฐเชจเชŸเชพเช‡เชฎ เชชเซเชฒเช—เช‡เชจ เชธเซเช•เซ…เชจเชฐ เชตเชพเช‚เชšเซ‡ เช›เซ‡ เช…เชจเซ‡ เชœเซ‡เชฎเชพเช‚ เช‡เชจเซเชธเซเชŸเซ‰เชฒ เช•เชฐเซ‡ เช›เซ‡. เชชเซเชฒเช—เช‡เชจเซเชธ bind-mount เช•เชฐเซ‡เชฒเชพ เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡เชจเซ‡ เชธเซ‡เชŸ เช•เชฐเซ‹: เชกเชฟเชซเซ‰เชฒเซเชŸ `HOME`เชจเซ‡ เช…เชจเซเชธเชฐเซ‡ เช›เซ‡, เชœเซ‡เชจเซ‡ เช‡เชฎเซ‡เชœเซ‡ export เช•เชฐเซเชฏเซเช‚ เชนเซ‹เชฏ เชคเซ‡ เชœเชฐเซ‚เชฐเซ€ เชจเชฅเซ€. | `~/.omniroute/plugins` | | `OMNIROUTE_BASE_PATH` | เชเชชเชจเซ‡ เชฐเชฟเชตเชฐเซเชธ เชชเซเชฐเซ‰เช•เซเชธเซ€เชจเซ€ เชชเชพเช›เชณ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซเชฏเชพเชฐเซ‡ URL เชธเชฌเชชเชพเชฅ (เชฆเชพ.เชค. `/omniroute`) | _(เช–เชพเชฒเซ€ = เชฐเซ‚เชŸ)_ | | `NEXT_PUBLIC_BASE_URL` | เชธเชฌเชชเชพเชฅ เชธเชนเชฟเชค เชธเชพเชฐเซเชตเชœเชจเชฟเช• เชฌเซเชฐเชพเช‰เชเชฐ เช‘เชฐเชฟเชœเชฟเชจ (เชฆเชพ.เชค. `https://host/omniroute`) | เชธเซ‡เชŸ เช•เชฐเซ‡เชฒเซเช‚ เชจเชฅเซ€ | | `PROD_DASHBOARD_PORT` | `docker-compose.prod.yml` เชฎเชพเชŸเซ‡เชจเซ‹ เชนเซ‹เชธเซเชŸ-เชธเชพเช‡เชก เชกเซ…เชถเชฌเซ‹เชฐเซเชก เชชเซ‹เชฐเซเชŸ | `20130` | | `CLIPROXYAPI_PORT` | `cliproxyapi` เชธเชพเช‡เชกเช•เชพเชฐ เชฎเชพเชŸเซ‡เชจเซ‹ เชนเซ‹เชธเซเชŸ-เชธเชพเช‡เชก เชชเซ‹เชฐเซเชŸ | `8317` | ## เชธเชฌเชชเชพเชฅ เชชเชฐ เชฐเชฟเชตเชฐเซเชธ เชชเซเชฐเซ‹เช•เซเชธเซ€ (Traefik / nginx) Next.js `basePath` เชธเซเชŸเซ…เชจเซเชกเช…เชฒเซ‹เชจ เชฌเช‚เชกเชฒเชฎเชพเช‚ เช•เชฎเซเชชเชพเช‡เชฒ เชฅเชพเชฏ เช›เซ‡. OmniRoute เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฐเซ‚เชŸ เชชเชฐเชจเซ€ sentinel เชซเชพเช‡เชฒเชฎเชพเช‚ เชฌเชฟเชฒเซเชก เชธเชฎเชฏเซ‡ เชธเชฎเชพเชตเชพเชฏเซ‡เชฒ เชฎเซ‚เชฒเซเชฏ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชฐเซ‡ เช›เซ‡ (`npm run build` เชฆเชฐเชฎเชฟเชฏเชพเชจ เชฒเช–เชพเชฏ เช›เซ‡; `scripts/docker/ensure-docker-base-path.mjs` เชฆเซเชตเชพเชฐเชพ เชตเชพเช‚เชšเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡) เช…เชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เชถเชฐเซ‚ เชฅเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡เชจเซ€ เชคเซเชฒเชจเชพ `OMNIROUTE_BASE_PATH` เชธเชพเชฅเซ‡ เช•เชฐเซ‡ เช›เซ‡. เชœเซเชฏเชพเชฐเซ‡ เชฌเช‚เชจเซ‡ เช…เชฒเช— เชนเซ‹เชฏ เช…เชจเซ‡ เช‡เชฎเซ‡เชœ เชกเซ‹เชฎเซ‡เชจ เชฐเซ‚เชŸ เชฎเชพเชŸเซ‡ เชฌเชฟเชฒเซเชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเซ‹เชฏ, เชคเซเชฏเชพเชฐเซ‡ `node dev/run-standalone.mjs` เชšเชพเชฒเซ‡ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚ เชเชจเซเชŸเซเชฐเซ€เชชเซ‹เช‡เชจเซเชŸ เชธเซเชŸเซ…เชจเซเชกเช…เชฒเซ‹เชจ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ, เชเชฎเซเชฌเซ‡เชก เช•เชฐเซ‡เชฒเชพ `basePath`/`assetPrefix` เชฒเชฟเชŸเชฐเชฒเซเชธ (Next 16 เชฎเชพเชคเซเชฐ `assetPrefix` เชชเชฐเชฅเซ€ SSR เชเชธเซ‡เชŸ URL เชฐเซ‡เชจเซเชกเชฐ เช•เชฐเซ‡ เช›เซ‡ โ€” เชชเซ‡เชšเชฐ เชคเซ‡เชฎเชพเช‚ เชชเชฃ เชธเชฌเชชเชพเชฅเชจเซ‡ เชชเซเชฐเชคเชฟเชฌเชฟเช‚เชฌเชฟเชค เช•เชฐเซ‡ เช›เซ‡), เชฌเชฟเชฒเซเชกเชฎเชพเช‚ เชธเชฎเชพเชตเชพเชฏเซ‡เชฒเชพ `/_next/static` เชเชธเซ‡เชŸ URL (เช•เซเชฒเชพเชฏเชจเซเชŸ-เชฐเซ‡เชซเชฐเชจเซเชธ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ, เชฎเซ€เชกเชฟเชฏเชพ เช‡เชฎเซเชชเซ‹เชฐเซเชŸเซเชธ, เชชเซเชฐเซ€เชฐเซ‡เชจเซเชกเชฐ เช•เชฐเซ‡เชฒเชพ เชเชฐเชฐ เชชเซ‡เชœ) เช…เชจเซ‡ เช•เซเชฒเชพเชฏเชจเซเชŸ `process.env` shim เชซเชฐเซ€เชฅเซ€ เชฒเช–เซ‡ เช›เซ‡. ### Compose เชฌเชฟเชฒเซเชก (เชญเชฒเชพเชฎเชฃ เช•เชฐเซ‡เชฒ) เชฌเช‚เชจเซ‡ เชตเซ‡เชฐเชฟเชเชฌเชฒเซเชธ `.env`เชฎเชพเช‚ เชธเซ‡เชŸ เช•เชฐเซ‹, เชชเช›เซ€ เช‡เชฎเซ‡เชœ เช…เชจเซ‡ เชฐเชจเชŸเชพเช‡เชฎ เชธเซเชธเช‚เช—เชค เชฐเชนเซ‡ เชคเซ‡ เชฎเชพเชŸเซ‡ เชซเชฐเซ€เชฅเซ€ เชฌเชฟเชฒเซเชก เช•เชฐเซ‹: ```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 เชคเชฐเซ€เช•เซ‡ เช…เชจเซ‡ เชฐเชจเชŸเชพเช‡เชฎ เชเชจเซเชตเชพเชฏเชฐเซเชจเชฎเซ‡เชจเซเชŸ เชตเซ‡เชฐเชฟเชเชฌเชฒ เชคเชฐเซ€เช•เซ‡ เชซเซ‹เชฐเชตเชฐเซเชก เช•เชฐเซ‡ เช›เซ‡. ### เชชเซ‚เชฐเซเชต-เชฌเชฟเชฒเซเชก เช•เชฐเซ‡เชฒเซ€ เชฐเซ‚เชŸ เช‡เชฎเซ‡เชœ + เชฐเชจเชŸเชพเช‡เชฎ เชธเชฌเชชเชพเชฅ เชชเซเชฐเช•เชพเชถเชฟเชค `diegosouzapw/omniroute:*` เช‡เชฎเซ‡เชœเซ‹ เชกเซ‹เชฎเซ‡เชจ เชฐเซ‚เชŸ เชฎเชพเชŸเซ‡ เชฌเชฟเชฒเซเชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซ‡เชฎ เช›เชคเชพเช‚ เชคเชฎเซ‡ เชฐเชจเชŸเชพเช‡เชฎ เชชเชฐ `OMNIROUTE_BASE_PATH` เชธเซ‡เชŸ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹; เช•เชจเซเชŸเซ‡เชจเชฐ เชธเซเชŸเชพเชฐเซเชŸเช…เชช เชตเช–เชคเซ‡ เชฌเช‚เชกเชฒเชจเซ‡ เชเช• เชตเชพเชฐ เชชเซ‡เชš เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡เชจเซ‡ เชฎเซ‡เชณ เช–เชพเชคเชพ เชœเชพเชนเซ‡เชฐ เช“เชฐเชฟเชœเชฟเชจ เชธเชพเชฅเซ‡ เชœเซ‹เชกเซ‹: ```yaml services: omniroute: image: diegosouzapw/omniroute:latest environment: OMNIROUTE_BASE_PATH: /omniroute NEXT_PUBLIC_BASE_URL: https://myhostname.example.com/omniroute ``` เชฐเชฟเชตเชฐเซเชธ เชชเซเชฐเซ‹เช•เซเชธเซ€เชจเซ‡ **เชธเช‚เชชเซ‚เชฐเซเชฃ** เชฌเชพเชนเซเชฏ เชชเชพเชฅ เชซเซ‹เชฐเชตเชฐเซเชก เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‰เชจเซเชซเชฟเช—เชฐ เช•เชฐเซ‹ (เชชเซเชฐเชฟเชซเชฟเช•เซเชธ เชฆเซ‚เชฐ เช•เชฐเชถเซ‹ เชจเชนเซ€เช‚). Traefikเช `StripPrefix` เชตเชฟเชจเชพ `PathPrefix(`/omniroute`)`เชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เชคเชฐเชซ เชฐเซ‚เชŸ เช•เชฐเชตเซเช‚ เชœเซ‹เชˆเช, เชœเซ‡เชฅเซ€ Next.jsเชจเซ‡ `/omniroute/...` เชฎเชณเซ‡ เช…เชจเซ‡ เชคเซ‡ `/omniroute/_next/...` เชชเชฐเชฅเซ€ เชเชธเซ‡เชŸเซเชธ เชธเชฐเซเชต เช•เชฐเซ‡. Docker healthcheck, เชธเช•เซเชฐเชฟเชฏ `OMNIROUTE_BASE_PATH`เชฅเซ€ เชชเซเชฐเชฟเชซเชฟเช•เซเชธ เช•เชฐเซ‡เชฒเชพ เชนเชณเชตเชพ `/healthz` เชฒเชพเช‡เชซเชธเชพเช‡เช•เชฒ เชเชจเซเชกเชชเซ‹เช‡เชจเซเชŸเชจเซ‡ เชชเซเชฐเซ‹เชฌ เช•เชฐเซ‡ เช›เซ‡. เชฎเชพเชจเชต/เชกเซ…เชถเชฌเซ‹เชฐเซเชก เชกเชพเชฏเช—เซเชจเซ‹เชธเซเชŸเชฟเช•เซเชธ เชฎเชพเชŸเซ‡ `/api/monitoring/health` เช‰เชชเชฒเชฌเซเชง เชฐเชนเซ‡ เช›เซ‡; เช•เชจเซเชŸเซ‡เชจเชฐ HEALTHCHECKเชจเซ‡ เชซเชฐเซ€ เชคเซ‡เชจเชพ เชคเชฐเชซ เชจเชฟเชฐเซเชฆเซ‡เชถเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชกเซ€เชช เชนเซ‡เชฒเซเชฅ เชเชจเซเชซเซ‹เชฐเซเชธเชฎเซ‡เชจเซเชŸ เชฎเชพเชŸเซ‡), `OMNIROUTE_HEALTHCHECK_PATH=/api/monitoring/health` เชธเซ‡เชŸ เช•เชฐเซ‹. เช† เชชเชพเชฅ เชเช• **เชกเซ€เชช** เชšเซ‡เช• (DB + เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช— เชธเชพเชฐเชพเช‚เชถ) เช›เซ‡ โ€” เชœเซ‹ เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เชซเชฐเซ€ เชชเชธเช‚เชฆ เช•เชฐเซ‹ เชคเซ‹ Dockerเชจเชพ เช“เช›เซ€ เช†เชตเชฐเซเชคเชจเชตเชพเชณเชพ `HEALTHCHECK` เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ Kubernetesเชจเชพ `livenessProbe` เช…เช‚เชคเชฐเชพเชฒเซ‹ เชฎเชพเชŸเซ‡ **เชจเชฅเซ€**. เช“เชฐเซเช•เซ‡เชธเซเชŸเซเชฐเซ‡เชŸเชฐเซเชธ (Kubernetes, Nomad เชตเช—เซ‡เชฐเซ‡) เชฎเชพเชŸเซ‡: | เชชเซเชฐเซ‹เชฌ | เชชเซเชฐเชพเชงเชพเชจเซเชฏ เช†เชชเซ‹ | เชŸเชพเชณเซ‹ | | ---------------- | -------------------------------------------------------------------- | -------------------------------------------------- | | เชฒเชพเช‡เชตเชจเซ‡เชธ | HTTP `GET /livez`, เช…เชฅเชตเชพ เชฎเซเช–เซเชฏ เชชเซ‹เชฐเซเชŸ เชชเชฐ TCP (`PORT`, เชกเชฟเชซเซ‰เชฒเซเชŸ `20128`) | เชฒเชพเช‡เชตเชจเซ‡เชธ เชคเชฐเซ€เช•เซ‡ `/api/monitoring/health` | | เชฐเซ‡เชกเซ€เชจเซ‡เชธ | HTTP `GET /healthz` | เชŸเซ‚เช‚เช•เชพ เชŸเชพเช‡เชฎเช†เช‰เชŸเซเชธ, เชœเซ‡ เชตเซเชฏเชธเซเชค event-loopเชจเซ‡ เชฎเซƒเชค เช—เชฃเซ‡ เช›เซ‡ | | เชกเซ€เชช / เชฌเซเชฒเซ…เช•เชฌเซ‰เช•เซเชธ | `/api/monitoring/health` | โ€” | `/healthz` เชชเซเชฐเซ‹เชธเซ‡เชธ เชฒเชพเช‡เชซเชธเชพเช‡เช•เชฒ (`ok` / `starting` / `stopping`) เชฐเชฟเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡. `/livez` เชฎเชพเชคเซเชฐ เชชเซเชฐเซ‹เชธเซ‡เชธ เชœเซ€เชตเช‚เชค เช›เซ‡ เช•เซ‡ เชจเชนเซ€เช‚ เชคเซ‡ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡ (เชนเซ…เชจเซเชกเชฒเชฐ เชšเชพเชฒเซ€ เชถเช•เซ‡ เชคเซเชฏเชพเชฐเซ‡ เชนเช‚เชฎเซ‡เชถเชพเช‚ 200; เชคเซ‡ เชฐเซ‡เชกเซ€เชจเซ‡เชธเชจเซ€ เชฐเชพเชน เชœเซ‹เชคเซเช‚ เชจเชฅเซ€). เชฌเช‚เชจเซ‡ เชนเชœเซ€ เชชเชฃ เชฐเชฟเช•เซเชตเซ‡เชธเซเชŸ เชนเซ…เชจเซเชกเชฒเชฟเช‚เช—เชจเชพ เชธเชฎเชพเชจ Node event loop เชชเชฐ เชšเชพเชฒเซ‡ เช›เซ‡, เชคเซ‡เชฅเซ€ CPU-เชฌเชพเช‰เชจเซเชก เช•เซ…เชŸเชฒเซ‰เช— เช…เชฅเชตเชพ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจเชจเซเช‚ เช•เชพเชฐเซเชฏ เชคเซ‡เชฎเชจเซ‡ เชตเชฟเชฒเช‚เชฌเชฟเชค เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ โ€” เชตเซเชฏเชธเซเชค โ‰  เชฎเซƒเชค. เชœเซ‹ HTTP เชชเซเชฐเซ‹เชฌเซเชธ เชŸเชพเช‡เชฎเช†เช‰เชŸ เชฅเชพเชฏ เชคเซ‹ TCP เชฒเชพเช‡เชตเชจเซ‡เชธเชจเซ‡ เชชเซเชฐเชพเชงเชพเชจเซเชฏ เช†เชชเซ‹. เชชเซเชฐเซ‹เชฌ เช…เช‚เช—เซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชจ: [เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช— เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชฟเช•เชพ โ€” Kubernetes เชชเซเชฐเซ‹เชฌ เชฎเชพเชŸเซ‡เชจเซ€ เชญเชฒเชพเชฎเชฃเซ‹](../ops/MONITORING_GUIDE.md#kubernetes-probe-recommendations). ## Caddy เชธเชพเชฅเซ‡ Docker Compose (HTTPS Auto-TLS) Caddyเชจเซ€ เชธเซเชตเชšเชพเชฒเชฟเชค SSL เชœเซ‹เช—เชตเชพเชˆเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ OmniRouteเชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เชฐเซ€เชคเซ‡ เชœเชพเชนเซ‡เชฐ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เช–เชพเชคเชฐเซ€ เช•เชฐเซ‹ เช•เซ‡ เชคเชฎเชพเชฐเชพ เชกเซ‹เชฎเซ‡เชจเชจเซ‹ DNS A เชฐเซ‡เช•เซ‹เชฐเซเชก เชคเชฎเชพเชฐเชพ เชธเชฐเซเชตเชฐเชจเชพ IP เชคเชฐเชซ เชจเชฟเชฐเซเชฆเซ‡เชถ เช•เชฐเซ‡ เช›เซ‡. ```yaml services: omniroute: image: diegosouzapw/omniroute:latest container_name: omniroute restart: unless-stopped volumes: - omniroute-data:/app/data environment: - PORT=20128 # OAuth เช•เซ‰เชฒเชฌเซ…เช•เซเชธ, เชกเซ…เชถเชฌเซ‹เชฐเซเชก เชฒเชฟเช‚เช•เซเชธ เช…เชจเซ‡ เชœเชจเชฐเซ‡เชŸ เชฅเชฏเซ‡เชฒเชพ เชธเชพเชฐเซเชตเชœเชจเชฟเช• URLs เชฎเชพเชŸเซ‡ เชฌเซเชฐเชพเช‰เชเชฐ-เชซเซ‡เชธเชฟเช‚เช— เช‘เชฐเชฟเชœเชฟเชจ. - 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 เช…เชชเชธเซเชŸเซเชฐเซ€เชฎ เช•เชจเซเชŸเซ‡เชจเชฐ เชฎเชพเชŸเซ‡ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชซเซ‰เชฐเซเชตเชฐเซเชกเชฟเช‚เช— เชนเซ‡เชกเชฐเซเชธ เชธเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡. OmniRoute OAuth เช•เซ‰เชฒเชฌเซ…เช•เซเชธ เช…เชจเซ‡ เชœเชจเชฐเซ‡เชŸ เชฅเชฏเซ‡เชฒเซ€ เชธเชพเชฐเซเชตเชœเชจเชฟเช• เชฒเชฟเช‚เช•เซเชธ เชฎเชพเชŸเซ‡ `NEXT_PUBLIC_BASE_URL`เชจเซ‹ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชธเชพเชฐเซเชตเชœเชจเชฟเช• เช‘เชฐเชฟเชœเชฟเชจ เชคเชฐเซ€เช•เซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡; เชชเซเชฐเชฎเชพเชฃเชฟเชค เชกเซ…เชถเชฌเซ‹เชฐเซเชก เชฐเชพเช‡เชŸเซเชธ เชธเชฎเชพเชจ-เช‘เชฐเชฟเชœเชฟเชจ เชฐเชฟเช•เซเชตเซ‡เชธเซเชŸเซเชธเชจเซ€ เชธเชพเชฅเซ‡ เชธเซ‡เชถเชจ-เชฌเชพเช‰เชจเซเชก CSRF เชธเซเชฐเช•เซเชทเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡. `OMNIROUTE_TRUST_PROXY`เชจเซ‡ เชฎเชพเชคเซเชฐ เชเชตเชพ เช…เชฆเซเชฏเชคเชจ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸเซเชธ เชฎเชพเชŸเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเซ‹ เชœเซเชฏเชพเช‚ เชคเชฎเซ‡ เชธเซเชชเชทเซเชŸ เช•เชจเซเชซเชฟเช—เชฐเซ‡เชถเชจเชจเซ‡ เชฌเชฆเชฒเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เชซเซ‰เชฐเซเชตเชฐเซเชกเซ‡เชก เชนเซ‡เชกเชฐเซเชธเชฎเชพเช‚เชฅเซ€ เชธเชพเชฐเซเชตเชœเชจเชฟเช• เช‘เชฐเชฟเชœเชฟเชจ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช‡เชฐเชพเชฆเชพเชชเซ‚เชฐเซเชตเช• OmniRouteเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชนเซ‹. ## Cloudflare Quick Tunnel Docker เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸเซเชธ เชฎเชพเชŸเซ‡เชจเชพ เชกเซ…เชถเชฌเซ‹เชฐเซเชก เชธเชชเซ‹เชฐเซเชŸเชฎเชพเช‚ `Dashboard โ†’ Endpoints` เชชเชฐ เชเช•-เช•เซเชฒเชฟเช• **Cloudflare Quick Tunnel** เชธเชพเชฎเซ‡เชฒ เช›เซ‡. เชชเซเชฐเชฅเชฎ เชตเช–เชค เชธเช•เซเชทเชฎ เช•เชฐเชตเชพเชฅเซ€ เชฎเชพเชคเซเชฐ เชœเชฐเซ‚เชฐ เชชเชกเซ‡ เชคเซเชฏเชพเชฐเซ‡ เชœ `cloudflared` เชกเชพเช‰เชจเชฒเซ‹เชก เชฅเชพเชฏ เช›เซ‡, เชคเชฎเชพเชฐเชพ เชตเชฐเซเชคเชฎเชพเชจ `/v1` เชเชจเซเชกเชชเซ‹เช‡เชจเซเชŸ เชฎเชพเชŸเซ‡ เช…เชธเซเชฅเชพเชฏเซ€ เชŸเชจเชฒ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชœเชจเชฐเซ‡เชŸ เชฅเชฏเซ‡เชฒ `https://*.trycloudflare.com/v1` URL เชคเชฎเชพเชฐเชพ เชธเชพเชฎเชพเชจเซเชฏ เชธเชพเชฐเซเชตเชœเชจเชฟเช• URLเชจเซ€ เชธเซ€เชงเซ€ เชจเซ€เชšเซ‡ เชฆเซ‡เช–เชพเชฏ เช›เซ‡. เชธเช•เซเชฐเชฟเชฏ เชŸเชจเชฒเชจเซ€ เชธเซเชฅเชฟเชคเชฟ เชฌเชฆเชฒเซเชฏเชพ เชตเชฟเชจเชพ เชเชจเซเชกเชชเซ‹เช‡เชจเซเชŸ เชŸเชจเชฒ เชชเซ…เชจเชฒเซเชธ (Cloudflare, Tailscale, ngrok)เชจเซ‡ `Settings โ†’ Appearance`เชฎเชพเช‚เชฅเซ€ เชฌเชคเชพเชตเซ€ เช…เชฅเชตเชพ เช›เซเชชเชพเชตเซ€ เชถเช•เชพเชฏ เช›เซ‡. ### เชŸเชจเชฒ เชจเซ‹เช‚เชงเซ‹ - Quick Tunnel URLs เช…เชธเซเชฅเชพเชฏเซ€ เชนเซ‹เชฏ เช›เซ‡ เช…เชจเซ‡ เชฆเชฐเซ‡เช• เชฐเซ€เชธเซเชŸเชพเชฐเซเชŸ เชชเช›เซ€ เชฌเชฆเชฒเชพเชฏ เช›เซ‡. - OmniRoute เช…เชฅเชตเชพ เช•เชจเซเชŸเซ‡เชจเชฐ เชฐเซ€เชธเซเชŸเชพเชฐเซเชŸ เชฅเชฏเชพ เชชเช›เซ€ Quick Tunnels เช†เชชเชฎเซ‡เชณเซ‡ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เชฅเชคเชพ เชจเชฅเซ€. เชœเชฐเซ‚เชฐ เชชเชกเซ‡ เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡เชฎเชจเซ‡ เชกเซ…เชถเชฌเซ‹เชฐเซเชกเชฎเชพเช‚เชฅเซ€ เชซเชฐเซ€ เชธเช•เซเชทเชฎ เช•เชฐเซ‹. - เชฎเซ‡เชจเซ‡เชœเซเชก เช‡เชจเซเชธเซเชŸเซ‹เชฒ เชนเชพเชฒเชฎเชพเช‚ `x64` / `arm64` เชชเชฐ Linux, macOS เช…เชจเซ‡ Windowsเชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡. - เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช•เชจเซเชŸเซ‡เชจเชฐ เชชเชฐเซเชฏเชพเชตเชฐเชฃเซ‹เชฎเชพเช‚ เชตเชงเซ เชชเชกเชคเซ€ QUIC UDP เชฌเชซเชฐ เชšเซ‡เชคเชตเชฃเซ€เช“ เชŸเชพเชณเชตเชพ เชฎเชพเชŸเซ‡ เชฎเซ‡เชจเซ‡เชœเซเชก Quick Tunnels เชกเชฟเชซเซ‰เชฒเซเชŸ เชฐเซ‚เชชเซ‡ HTTP/2 เชŸเซเชฐเชพเชจเซเชธเชชเซ‹เชฐเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡. เชœเซ‹ เชคเชฎเซ‡ เช…เชฒเช— เชŸเซเชฐเชพเชจเซเชธเชชเซ‹เชฐเซเชŸ เช‡เชšเซเช›เชคเชพ เชนเซ‹, เชคเซ‹ `CLOUDFLARED_PROTOCOL=quic` เช…เชฅเชตเชพ `auto` เชธเซ‡เชŸ เช•เชฐเซ‹. - Docker เช‡เชฎเซ‡เชœเชฟเชธ เชธเชฟเชธเซเชŸเชฎ CA เชฐเซ‚เชŸเซเชธเชจเซ‡ เชธเชพเชฎเซ‡เชฒ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เชฎเซ‡เชจเซ‡เชœเซเชก `cloudflared`เชจเซ‡ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡, เชœเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เช…เช‚เชฆเชฐ เชŸเชจเชฒ เชฌเซเชŸเชธเซเชŸเซเชฐเซ…เชช เชฅเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ TLS เชŸเซเชฐเชธเซเชŸ เชจเชฟเชทเซเชซเชณเชคเชพเช“ เชŸเชพเชณเซ‡ เช›เซ‡. - เชœเซ‹ เชคเชฎเซ‡ เช‡เชšเซเช›เชคเชพ เชนเซ‹ เช•เซ‡ OmniRoute เชจเชตเซเช‚ เชฌเชพเช‡เชจเชฐเซ€ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡ เชนเชพเชฒเชจเชพ เชฌเชพเช‡เชจเชฐเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡, เชคเซ‹ `CLOUDFLARED_BIN=/absolute/path/to/cloudflared` เชธเซ‡เชŸ เช•เชฐเซ‹. ## เช‡เชฎเซ‡เชœ เชŸเซ…เช—เซเชธ | เช‡เชฎเซ‡เชœ | เชŸเซ…เช— | เช•เชฆ | เชตเชฐเซเชฃเชจ | | ------------------------ | -------- | ------ | ---------------------------------------------------- | | `diegosouzapw/omniroute` | `latest` | ~250MB | เชธเชฐเซเชตเซ‹เชšเซเชš **เชชเซเชฐเช•เชพเชถเชฟเชค** เชธเซเชฅเชฟเชฐ SemVer (git `main` เชจเชนเซ€เช‚) | | `diegosouzapw/omniroute` | `3.8.0` | ~250MB | GitOps เชฎเชพเชŸเซ‡ เช† เชชเซเชฐเช•เชพเชฐเชจเชพ เชŸเซ…เช—เชจเซ‡ เชชเชฟเชจ เช•เชฐเซ‹ | เชฎเชฒเซเชŸเชฟ-เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ: `linux/amd64` + `linux/arm64` เชจเซ‡เชŸเชฟเชต (Apple Silicon, AWS Graviton, Raspberry Pi). Docker เช†เชชเชฎเซ‡เชณเซ‡ เชฎเซ‡เชณ เช–เชพเชคเซเช‚ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชชเชธเช‚เชฆ เช•เชฐเซ‡ เช›เซ‡; เชœเซ‹ เชคเชฎเชพเชฐเซ‡ ARM เชนเซ‹เชธเซเชŸเซเชธ เชชเชฐ AMD64 เช‡เชฎเซเชฏเซเชฒเซ‡เชถเชจ เชซเชฐเชœเชฟเชฏเชพเชค เช•เชฐเชตเซเช‚ เชนเซ‹เชฏ, เชคเซ‹ `--platform linux/amd64` เช†เชชเซ‹. ### เชฐเชฟเชฒเซ€เช เชšเซ…เชจเชฒเซเชธ OmniRoute เชธเซเชฅเชฟเชฐ เชฐเชฟเชฒเซ€เชเชฟเชธ, เชธเช•เซเชฐเชฟเชฏ เชฐเชฟเชฒเซ€เช-เชฌเซเชฐเชพเชจเซเชš เชชเชฐเซ€เช•เซเชทเชฃ เช…เชจเซ‡ เชกเซ‡เชตเชฒเชชเชฎเซ‡เชจเซเชŸ เชฌเชฟเชฒเซเชกเซเชธ เชฎเชพเชŸเซ‡ เช…เชฒเช— Docker เชšเซ…เชจเชฒเซเชธ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเซ‡ เช›เซ‡. | เชšเซ…เชจเชฒ | เชธเซเชฐเซ‹เชค | เชชเชฐเชฟเชตเชฐเซเชคเชจเช•เซเชทเชฎเชคเชพ | เชญเชฒเชพเชฎเชฃ เช•เชฐเซ‡เชฒ เช‰เชชเชฏเซ‹เช— | | ------------------------------- | ------------------------------------ | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | `:` / `:-web` | เชธเชนเซ€ เช•เชฐเซ‡เชฒ/เชตเชฐเซเชเชจ เช•เชฐเซ‡เชฒ เชฐเชฟเชฒเซ€เช | เช…เชชเชฐเชฟเชตเชฐเซเชคเชจเซ€เชฏ | เชšเซ‹เช•เซเช•เชธ เชฐเชฟเชฒเซ€เชเชจเซ‡ เชชเชฟเชจ เช•เชฐเชคเชพเช‚ เชชเซเชฐเซ‹เชกเช•เซเชถเชจ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸเซเชธ | | `:latest` / `:latest-web` | เชธเชฐเซเชตเซ‹เชšเซเชš **เชชเซเชฐเช•เชพเชถเชฟเชค** เชธเซเชฅเชฟเชฐ SemVer | เชชเชฐเชฟเชตเชฐเซเชคเชจเช•เซเชทเชฎ เชธเซเชฅเชฟเชฐ เชชเซ‹เช‡เชจเซเชŸเชฐ | SemVer เชชเซเชฐเช•เชพเชถเชจ เชœเซ‰เชฌ **เชชเช›เซ€** เชธเซเชฅเชฟเชฐ เชฐเชฟเชฒเซ€เชเชฟเชธเชจเซ‡ เช…เชจเซเชธเชฐเซ‡ เช›เซ‡ โ€” `main` เช…เชฅเชตเชพ เช…เชชเซเชฐเช•เชพเชถเชฟเชค `release/v*` เช•เชฎเชฟเชŸเซเชธเชจเซ‡ เชŸเซเชฐเซ…เช• **เช•เชฐเชคเซเช‚ เชจเชฅเซ€** | | `:next` / `:next-web` | เชตเชฐเซเชคเชฎเชพเชจ เชกเชฟเชซเซ‰เชฒเซเชŸ `release/v*` เชฌเซเชฐเชพเชจเซเชš | เชชเชฐเชฟเชตเชฐเซเชคเชจเช•เซเชทเชฎ เชชเซเชฐเซ€-เชฐเชฟเชฒเซ€เช เชชเซ‹เช‡เชจเซเชŸเชฐ | เชธเช•เซเชฐเชฟเชฏ เชฐเชฟเชฒเซ€เช เชฌเซเชฐเชพเชจเซเชšเชฎเชพเช‚ เชธเชพเชฎเซ‡เชฒ เชฅเชฏเซ‡เชฒเชพ เชชเชฐเช‚เชคเซ เชนเชœเซ เชธเซเชฅเชฟเชฐ เชฐเชฟเชฒเซ€เชเชฎเชพเช‚ เชจ เช†เชตเซ‡เชฒเชพ เชธเซเชงเชพเชฐเชพเช“เชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ | | `:main` / `:main-web` | `main` เชฌเซเชฐเชพเชจเซเชš | เชชเชฐเชฟเชตเชฐเซเชคเชจเช•เซเชทเชฎ เชกเซ‡เชตเชฒเชชเชฎเซ‡เชจเซเชŸ เชชเซ‹เช‡เชจเซเชŸเชฐ | เชฎเชพเชคเซเชฐ เชกเซ‡เชตเชฒเชชเชฎเซ‡เชจเซเชŸ เช…เชจเซ‡ เช‡เชจเซเชŸเชฟเช—เซเชฐเซ‡เชถเชจ เชชเชฐเซ€เช•เซเชทเชฃ เชฎเชพเชŸเซ‡ | #### เชตเซ‡เชฌ-เชธเซ‡เชถเชจ เชชเซเชฐเซ‹เชตเชพเช‡เชกเชฐเซเชธ: `-web` เช‡เชฎเซ‡เชœเชฟเชธ เช‰เชชเชฐเชจเซ€ เชฆเชฐเซ‡เช• เชšเซ…เชจเชฒ `-web` เชŸเซ…เช— (`:latest-web`, `:-web`, `:next-web`, `:main-web`) เชคเชฐเซ€เช•เซ‡ เชชเชฃ เช‰เชชเชฒเชฌเซเชง เช›เซ‡, เชœเซ‡ `runner-web` เชธเซเชŸเซ‡เชœเชฎเชพเช‚เชฅเซ€ เชฌเชฟเชฒเซเชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ โ€” เชธเชฎเชพเชจ เช‡เชฎเซ‡เชœ เช‰เชชเชฐเชพเช‚เชค Playwright เช…เชจเซ‡ Chromium เชฌเซเชฐเชพเช‰เชเชฐ. เชธเชพเชฆเซ€ เช‡เชฎเซ‡เชœ Chromium **เชตเชฟเชจเชพ** เช†เชตเซ‡ เช›เซ‡; `gemini-web`, `claude-web` เช…เชจเซ‡ `claude-turnstile`เชจเซ‡ เชคเซ‡เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเซ‡ เช›เซ‡. เชจเชฟเชทเซเชซเชณเชคเชพ เชธเซเชŸเชพเชฐเซเชŸเช…เชช เชธเชฎเชฏเซ‡ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เชชเชพเช›เชณเชฅเซ€ เชฅเชพเชฏ เช›เซ‡: เชคเซ‡ เชชเซเชฐเซ‹เชตเชพเช‡เชกเชฐเซเชธ เชคเซ‡เชฎเชจเชพ เชฎเซ‰เชกเชฒเซเชธเชจเซ€ เชฏเชพเชฆเซ€ เช†เชชเซ‡ เช›เซ‡ เช…เชจเซ‡ เชกเซ…เชถเชฌเซ‹เชฐเซเชกเชฎเชพเช‚ เช•เชจเซ‡เช•เซเชŸ เชฅเชฏเซ‡เชฒเชพ เชฆเซ‡เช–เชพเชฏ เช›เซ‡, เชชเชฐเช‚เชคเซ เชฎเชพเชคเซเชฐ เชชเซเชฐเชฅเชฎ เชฐเชฟเช•เซเชตเซ‡เชธเซเชŸ เชจเซ€เชšเซ‡เชจเซ€ เชญเซ‚เชฒ เชธเชพเชฅเซ‡ เชจเชฟเชทเซเชซเชณ เชœเชพเชฏ เช›เซ‡ ``` [500]: Failed to load external module playwright: Error: Cannot find module '/app/node_modules/playwright/node_modules/playwright-core/browsers.json' ``` เชœเซ‹ เชคเชฎเซ‡ เชคเซ‡ เชชเซเชฐเซ‹เชตเชพเช‡เชกเชฐเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹ เช›เซ‹, เชคเซ‹ เชคเชฎเซ‡ เชนเชพเชฒเชฎเชพเช‚ เชœเซ‡ เชšเซ…เชจเชฒ เชชเชฐ เช›เซ‹ เชคเซ‡เชจเซ‹ `-web` เชŸเซ…เช— เชชเซเชฒ เช•เชฐเซ‹ โ€” เชฌเซ€เชœเซเช‚ เช•เช‚เชˆ เชฌเชฆเชฒเชพเชคเซเช‚ เชจเชฅเซ€. npm/CLI เช‡เชจเซเชธเซเชŸเซ‹เชฒเชฎเชพเช‚ (Docker เช‡เชฎเซ‡เชœ เชตเชฟเชจเชพ), เชธเชฎเช•เช•เซเชท เช–เซ‚เชŸเชคเซ‹ เชญเชพเช— เชฌเซเชฐเชพเช‰เชเชฐ เชฌเชพเช‡เชจเชฐเซ€ เช›เซ‡: เชนเซ‹เชธเซเชŸ เชชเชฐ `npx playwright install chromium` เชšเชฒเชพเชตเซ‹. #### เชชเซเชฐเซ€-เชฐเชฟเชฒเซ€เช เชšเซ…เชจเชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— `next` เชšเซ‡เชจเชฒ เชตเชฐเซเชคเชฎเชพเชจ เชกเชฟเชซเซ‰เชฒเซเชŸ `release/v*` เชฌเซเชฐเชพเชจเซเชš เชชเชฐเชจเชพ เชฆเชฐเซ‡เช• push เชตเช–เชคเซ‡ เชซเชฐเซ€เชฅเซ€ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ AMD64 เชคเชฅเชพ ARM64 เชฌเช‚เชจเซ‡ เชฎเชพเชŸเซ‡ เชชเซเชฐเช•เชพเชถเชฟเชค เชฅเชพเชฏ เช›เซ‡. เชœเซ‚เชจเซ€ maintenance เชฌเซเชฐเชพเชจเซเชšเซ‹ เชคเซ‡เชจเซ‡ overwrite เช•เชฐเซ€ เชถเช•เชคเซ€ เชจเชฅเซ€. เช†เช—เชพเชฎเซ€ stable tag เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚ เชธเช•เซเชฐเชฟเชฏ release เชฌเซเชฐเชพเชจเซเชšเชฎเชพเช‚ merge เชฅเชฏเซ‡เชฒเชพ เชธเซเชงเชพเชฐเชพเช“ เชฎเชพเชŸเซ‡ เช† เชšเซ‡เชจเชฒ pull เช•เชฐเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเซ€ image เชชเซ‚เชฐเซ€ เชชเชพเชกเซ‡ เช›เซ‡. ```bash docker pull diegosouzapw/omniroute:next docker pull diegosouzapw/omniroute:next-web ``` Docker Compose เชฎเชพเชŸเซ‡, เชชเชธเช‚เชฆ เช•เชฐเซ‡เชฒเซ€ profile เชฆเซเชตเชพเชฐเชพ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเซ€ image tag เชจเซ‡ override เช•เชฐเซ‹, เชชเช›เซ€ service เชจเซ‡ pull เช•เชฐเซ€เชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชฌเชจเชพเชตเซ‹: ```yaml services: omniroute: image: diegosouzapw/omniroute:next ``` ```bash docker compose pull docker compose up -d ``` #### เชธเซเชฐเช•เซเชทเชพ เช…เชจเซ‡ rollback `next` เชเช• เชฌเชฆเชฒเชพเชคเซ€ เชฐเชนเซ‡เชคเซ€ pre-release เชšเซ‡เชจเชฒ เช›เซ‡. เชธเช•เซเชฐเชฟเชฏ release เชฌเซเชฐเชพเชจเซเชš เชชเชฐเชจเชพ เช•เซ‹เชˆเชชเชฃ push เชตเช–เชคเซ‡ เชคเซ‡ เชฌเชฆเชฒเชพเชˆ เชถเช•เซ‡ เช›เซ‡ เช…เชจเซ‡ production เช‰เชชเชฏเซ‹เช— เชฎเชพเชŸเซ‡ **เชธเชฎเชฐเซเชฅเชฟเชค เชจเชฅเซ€**. เช•เซ‹เชˆ เชšเซ‹เช•เซเช•เชธ build เชจเซเช‚ เชฎเซ‚เชฒเซเชฏเชพเช‚เช•เชจ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ image digest เชจเซ‡ pin เช•เชฐเซ‹: ```bash docker pull diegosouzapw/omniroute:next docker image inspect diegosouzapw/omniroute:next --format '{{index .RepoDigests 0}}' ``` เชชเชฐเซ€เช•เซเชทเชฃ เชชเชนเซ‡เชฒเชพเช‚, OmniRoute data volume เช…เชฅเชตเชพ bind-mounted data directory เชจเซ‹ backup เชฒเซ‹. rollback เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เช—เชพเช‰ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชฏเซ‡เชฒ stable version เช…เชฅเชตเชพ digest เชจเซ‡ restore เช•เชฐเซ‹ เช…เชจเซ‡ container เชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชฌเชจเชพเชตเซ‹: ```bash docker pull diegosouzapw/omniroute: docker compose up -d ``` release-branch build เช•เซเชฏเชพเชฐเซ‡เชฏ `latest` เชจเซ‡ เช–เชธเซ‡เชกเซ€ เชถเช•เชคเซเช‚ เชจเชฅเซ€; เชฎเชพเชคเซเชฐ เชชเชพเชคเซเชฐ stable semantic version เชœ stable pointer เชจเซ‡ promote เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. `next` images เชฎเชพเช‚ release image inspection เช…เชจเซ‡ CRITICAL เชจเชฌเชณเชพเชˆเช“เชจเซ‡ เช…เชตเชฐเซ‹เชงเชคเซ‹ gate เชœเชพเชณเชตเซ€ เชฐเชพเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. **`latest`, git เชฎเชพเชŸเซ‡ เชคเชพเชœเช—เซ€เชจเซ€ เช–เชพเชคเชฐเซ€ เชจเชฅเซ€.** `main` เช…เชฅเชตเชพ เชธเช•เซเชฐเชฟเชฏ `release/v*` เชฌเซเชฐเชพเชจเซเชš เชชเชฐ merge เชฅเชฏเซ‡เชฒเชพ เชธเซเชงเชพเชฐเชพเช“, stable SemVer image เชชเซเชฐเช•เชพเชถเชฟเชค เชฅเชพเชฏ เช…เชจเซ‡ publish job `:latest` เชจเซ‡ promote เช•เชฐเซ‡ (เชคเซ‡ SemVer เชœเซ‡เชตเซ‹ เชœ digest) เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ `:latest` เชฎเชพเช‚ เชนเซ‹เชคเชพ **เชจเชฅเซ€**. GitHub เชชเชฐ เชธเซเชงเชพเชฐเซ‹ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชฆเซ‡เช–เชพเชคเซ‹ เชนเซ‹เชตเชพ เช›เชคเชพเช‚ เชœเซ‹ `latest` เชธเซเชฅเชฟเชฐ เชœเชฃเชพเชฏ, เชคเซ‹ release เชฌเซเชฐเชพเชจเซเชšเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ `:next` pull เช•เชฐเซ‹ เช…เชฅเชตเชพ SemVer tag เชจเซ€ เชฐเชพเชน เชœเซเช“. | เชคเชฎเชพเชฐเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชค | เช‰เชชเชฏเซ‹เช— | | --------------------------------------------------------------------- | --------------------------------------- | | เชเชตเซเช‚ GitOps / production เชœเซ‡เชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เชจ เชฅเชตเซ‹ เชœเซ‹เชˆเช | `:X.Y.Z` (เช…เชฅเชตเชพ image digest) เชจเซ‡ pin เช•เชฐเซ‹ | | เชชเซเชฐเช•เชพเชถเชฟเชค stable versions เช…เชจเซเชธเชฐเซ‹ เช…เชจเซ‡ เชฆเชฐเซ‡เช• release เชชเชฐ recreate เชธเซเชตเซ€เช•เชพเชฐเซ‹ | `:latest` | | เช…เชชเซเชฐเช•เชพเชถเชฟเชค `release/v*` commits เชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ‹ | `:next` (production เชฎเชพเชŸเซ‡ เชจเชนเซ€เช‚) | | `main` เชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ‹ | `:main` (production เชฎเชพเชŸเซ‡ เชจเชนเซ€เช‚) | ## Dockerเชฎเชพเช‚ เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เช…เชชเชกเซ‡เชŸเซเชธ เชชเซเชฐเช•เชพเชถเชฟเชค เช‡เชฎเซ‡เชœเชตเชพเชณเซเช‚ เช•เชจเซเชŸเซ‡เชจเชฐ เชชเซ‹เชคเชพเชจเซ‡ เชฌเชฆเชฒเซ€ เชถเช•เชคเซเช‚ เชจเชฅเซ€. เชœเซเชฏเชพเชฐเซ‡ OmniRoute เชถเซ‹เชงเซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เช…เช‚เชฆเชฐ เชšเชพเชฒเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡ (`.git` checkout เชจเชฅเซ€ เช…เชจเซ‡ npm เช‡เชจเซเชธเซเชŸเซ‹เชฒ เชชเชฃ เชจเชฅเซ€), เชคเซเชฏเชพเชฐเซ‡ เชนเซ‹เชฎ เชกเซ‡เชถเชฌเซ‹เชฐเซเชกเชจเซเช‚ เช…เชชเชกเซ‡เชŸ เชฌเซ‡เชจเชฐ npm/git เชธเซ‚เชšเชจเชพเช“เชจเซ‡ เชฌเชฆเชฒเซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเซ‹ เชนเซ‹เชธเซเชŸ เช•เชฎเชพเชจเซเชก เช•เซ‰เชชเซ€ เชฌเชŸเชจ เชธเชพเชฅเซ‡ เชฌเชคเชพเชตเซ‡ เช›เซ‡: ```bash docker compose pull omniroute && docker compose up -d --force-recreate omniroute ``` เชธเซ‡เชตเชพเชจเซเช‚ เชจเชพเชฎ `AUTO_UPDATE_SERVICE`เชฎเชพเช‚เชฅเซ€ เช†เชตเซ‡ เช›เซ‡ (เชกเชฟเชซเซ‰เชฒเซเชŸ `omniroute`, เชœเซ‡ `docker-compose.selfhost.yml`เชฎเชพเช‚เชจเซ€ เชธเซ‡เชตเชพ เช›เซ‡). `pull` เชซเช•เซเชค เชซเซเชฒเซ‹เชŸเชฟเช‚เช— เชŸเซ…เช— (`latest`, `next`)เชจเซ‡ เช†เช—เชณ เชตเชงเชพเชฐเซ‡ เช›เซ‡; เชชเชฟเชจ เช•เชฐเซ‡เชฒเชพ `:X.Y.Z` เชŸเซ…เช— เชฎเชพเชŸเซ‡ เชชเชนเซ‡เชฒเชพเช‚ เชŸเซ…เช—เชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เช•เชฐเซ‹. ### เชนเซ‹เชธเซเชŸ เชŸเซเชฐเชฟเช—เชฐ เชซเชพเช‡เชฒ เชตเชกเซ‡ เชเช•-เช•เซเชฒเชฟเช• เช…เชชเชกเซ‡เชŸเซเชธ `/var/run/docker.sock` เชฎเชพเช‰เชจเซเชŸ เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ **เชนเชฎเชฃเชพเช‚ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ‹** เช•เชพเชฐเซเชฏเชฐเชค เชฐเชพเช–เชตเชพ เชฎเชพเชŸเซ‡ (เชœเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ‡ เชนเซ‹เชธเซเชŸ เชชเชฐ root เชเช•เซเชธเซ‡เชธ เช†เชชเซ‡ เช›เซ‡ โ€” เช‰เชชเชฐ เช†เชชเซ‡เชฒเซ€ `cli` เชชเซเชฐเซ‹เชซเชพเช‡เชฒ เชšเซ‡เชคเชตเชฃเซ€ เชœเซเช“), OmniRoute เชธเซ‡เชตเชพ เชชเชฐ `DOCKER_UPDATE_TRIGGER_FILE` เชธเซ‡เชŸ เช•เชฐเซ‹ เช…เชจเซ‡ เชนเซ‹เชธเซเชŸ เชชเชฐ เชตเซ‰เชšเชฐ เชšเชฒเชพเชตเซ‹: ```yaml services: omniroute: environment: DOCKER_UPDATE_TRIGGER_FILE: /app/data/update/docker-update.request volumes: - ./data:/app/data ``` เชชเชพเชฅ `DATA_DIR`เชจเซ€ เช…เช‚เชฆเชฐ เชนเซ‹เชตเซ‹ เช†เชตเชถเซเชฏเช• เช›เซ‡ (เชธเชพเชชเซ‡เช•เซเชท เชฎเซ‚เชฒเซเชฏเซ‹ เชคเซ‡เชจเซ€ เชธเชพเชฎเซ‡ เชฐเชฟเชเซ‹เชฒเซเชต เชฅเชพเชฏ เช›เซ‡); เช…เชจเซเชฏ เช•เช‚เชˆเชชเชฃ เชจเช•เชพเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซเชฏเชพเชฐเชฌเชพเชฆ **เชนเชฎเชฃเชพเช‚ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ‹** เชคเซ‡ เชซเชพเช‡เชฒเชฎเชพเช‚ `{ "requestedAt": "...", "targetVersion": "X.Y.Z" }` เชฒเช–เซ‡ เช›เซ‡, `202` เชœเชตเชพเชฌ เช†เชชเซ‡ เช›เซ‡ เช…เชจเซ‡ เชจเชตเซเช‚ เชตเชฐเซเชเชจ เชฒเชพเช‡เชต เชฅเชพเชฏ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เชกเซ‡เชถเชฌเซ‹เชฐเซเชก `/api/system/version`เชจเซเช‚ เชชเซ‹เชฒเชฟเช‚เช— เช•เชฐเซ€เชจเซ‡ เชชเช›เซ€ เชซเชฐเซ€ เชฒเซ‹เชก เชฅเชพเชฏ เช›เซ‡. เช† เชฎเซ‹เชกเชฎเชพเช‚ OmniRoute เช•เซเชฏเชพเชฐเซ‡เชฏ เชถเซ‡เชฒ เช•เซ‡ Docker เช•เชฎเชพเชจเซเชก เชšเชฒเชพเชตเชคเซเช‚ เชจเชฅเซ€. เชฆเชฐเซ‡เช• เช…เชชเชกเซ‡เชŸ เช•เซเชฐเชฟเชฏเชพเชจเซ€ เชœเซ‡เชฎ, เชตเชฟเชจเช‚เชคเซ€ เชซเช•เซเชค เชฒเซ‚เชชเชฌเซ…เช•/LAN เช•เซเชฒเชพเชฏเชจเซเชŸเซเชธ เชชเชพเชธเซ‡เชฅเซ€ เชœ เชธเซเชตเซ€เช•เชพเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชฌเชพเช‡เชจเซเชก-เชฎเชพเช‰เชจเซเชŸ เช•เชฐเซ‡เชฒเซ€ เชกเซ‡เชŸเชพ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชนเซ‹เชธเซเชŸเชจเซ‡ เชจเชฟเชฐเซ€เช•เซเชทเชฃ เชฎเชพเชŸเซ‡ เชธเซเชฅเชฟเชฐ เชชเชพเชฅ เช†เชชเซ‡ เช›เซ‡. `systemd` เชฏเซเชจเชฟเชŸเซเชธเชจเชพ เชจเชฎเซ‚เชจเชพ (`/srv/omniroute`เชจเซ‡ เชคเชฎเชพเชฐเซ€ compose เชซเชพเช‡เชฒ เช…เชจเซ‡ `data/` เชงเชฐเชพเชตเชคเซ€ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เช…เชจเซเชธเชพเชฐ เชธเชฎเชพเชฏเซ‹เชœเชฟเชค เช•เชฐเซ‹): ```ini # /etc/systemd/system/omniroute-update.path [Unit] Description=OmniRoute เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เช…เชชเชกเซ‡เชŸ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซเช‚ เชจเชฟเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ‹ [Path] PathExists=/srv/omniroute/data/update/docker-update.request [Install] WantedBy=multi-user.target ``` ```ini # /etc/systemd/system/omniroute-update.service [Unit] Description=OmniRoute เช•เชจเซเชŸเซ‡เชจเชฐ pull เช•เชฐเซ€เชจเซ‡ เชซเชฐเซ€ เชฌเชจเชพเชตเซ‹ [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 ``` เชธเซ‡เชตเชพ pull เช•เชฐเชคเชพเช‚ เชชเชนเซ‡เชฒเชพเช‚ เชตเชฟเชจเช‚เชคเซ€ เชฆเซ‚เชฐ เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡เชฅเซ€ เชจเชฟเชทเซเชซเชณ เชฐเชจ เชตเชพเชฐเช‚เชตเชพเชฐ เชฒเซ‚เชช เชจ เชฅเชพเชฏ. `DOCKER_UPDATE_TRIGGER_FILE` เชตเชฟเชจเชพ เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เชฎเซ‡เชจเซเชฏเซเช…เชฒ เช•เชฎเชพเชจเซเชก เชชเซเชฐเชตเชพเชน เชœเชพเชณเชตเซ€ เชฐเชพเช–เซ‡ เช›เซ‡. ## เช‰เชชเชฒเชฌเซเชงเชคเชพ: เชกเชฟเชซเซ‰เชฒเซเชŸ SQLite เชธเชฟเช‚เช—เชฒ-เชฐเซ‡เชชเซเชฒเชฟเช•เชพ เช›เซ‡ เชธเซเชŸเซ‰เช• Docker / Kubernetes OmniRoute เช **เชเช• Node เชชเซเชฐเซ‹เชธเซ‡เชธ + เชเช• SQLite เชฐเชพเช‡เชŸเชฐ** เช›เซ‡. เช† เชŸเซ‹เชชเซ‹เชฒเซ‹เชœเซ€ เชชเชฐ เช‰เชšเซเชš เช‰เชชเชฒเชฌเซเชงเชคเชพ **เชธเชฎเชฐเซเชฅเชฟเชค เชจเชฅเซ€**. | เชฎเชฐเซเชฏเชพเชฆเชพ | เชชเชฐเชฟเชฃเชพเชฎ | | ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | เชเช•เชฎเชพเชคเซเชฐ เชฐเชพเช‡เชŸเชฐ | เชเช• เชœ SQLite เชซเชพเช‡เชฒ เชธเชพเชฎเซ‡ เชเช•เชฅเซ€ เชตเชงเซ เชฐเซ‡เชชเซเชฒเชฟเช•เชพ **เชšเชฒเชพเชตเชถเซ‹ เชจเชนเซ€เช‚**. เชคเซ‡ DBเชจเซ‡ เชฆเซ‚เชทเชฟเชค เช•เชฐเซ‡ เช›เซ‡. | | เชซเชฐเซ€ เชฌเชจเชพเชตเชตเซเช‚ / เชฐเชฟเชธเซเชŸเชพเชฐเซเชŸ / HEALTHCHECK kill | เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ เชฐเชนเซ‡เชฒเชพ SSE, เชกเซ‡เชถเชฌเซ‹เชฐเซเชก เชธเซ‡เชถเชจเซเชธ เช…เชจเซ‡ เช‡เชจ-เชฎเซ‡เชฎเชฐเซ€ เชธเซเชŸเซ‡เชŸเชจเซ‹ **เชธเช‚เชชเซ‚เชฐเซเชฃ เช†เช‰เชŸเซ‡เชœ**. เชฆเชฐเซ‡เช• เชœเซ‹เชกเชพเชฏเซ‡เชฒ เช•เซเชฒเชพเชฏเชจเซเชŸเชจเซเช‚ เช•เชจเซ‡เช•เซเชถเชจ เชคเซ‚เชŸเซ€ เชœเชพเชฏ เช›เซ‡. เช–เชพเชฒเซ€-เชเชจเซเชกเชชเซ‹เช‡เชจเซเชŸ เชตเชฟเชจเซเชกเซ‹ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชจเชตเซ€ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซ‡ OmniRoute JSON เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เชฐเชฟเชตเชฐเซเชธ-เชชเซเชฐเซ‰เช•เซเชธเซ€ **`502 Bad Gateway: Unknown error`** เชฎเชณเซ‡ เช›เซ‡ โ€” เช•เซเชฒเชพเชฏเชจเซเชŸเซเชธ เชคเซ‡เชจเซ‡ เชชเซเชฐเซ‹เชตเชพเช‡เชกเชฐเชจเซ€ เชจเชฟเชทเซเชซเชณเชคเชพเชฅเซ€ เช…เชฒเช— เช“เชณเช–เซ€ เชถเช•เชคเชพ เชจเชฅเซ€ (#11015). | | `/healthz` เชœเซ‡เชตเซ‹ เชœ เช‡เชตเซ‡เชจเซเชŸ เชฒเซ‚เชช | เชตเซเชฏเชธเซเชค เช•เซ…เชŸเชฒเซ‰เช— เช…เชฅเชตเชพ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ เชŸเชฟเช• เชชเซเชฐเซ‹เชฌเซเชธเชจเซ‡ เชตเชฟเชฒเช‚เชฌเชฟเชค เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡; เชคเซเชฏเชพเชฐเชฌเชพเชฆ เชŸเซ‚เช‚เช•เซ‹ เชŸเชพเช‡เชฎเช†เช‰เชŸ **เชเช•เชฎเชพเชคเซเชฐ** เชฐเซ‡เชชเซเชฒเชฟเช•เชพเชจเซ‡ เชฐเชฟเชธเซเชŸเชพเชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡. | **เชชเซเชฐเซ‹เชฌ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ** ([Kubernetes เชชเซเชฐเซ‹เชฌ เชญเชฒเชพเชฎเชฃเซ‹](../ops/MONITORING_GUIDE.md#kubernetes-probe-recommendations) เชชเชฃ เชœเซเช“): | เชชเซเชฐเซ‹เชฌ | เชฒเช•เซเชทเซเชฏ | เช‰เชชเชฏเซ‹เช— เช•เชฐเชถเซ‹ เชจเชนเซ€เช‚ | | -------------------------- | ----------------------------------------------------------- | --------------------------------------------------------- | | เชฒเชพเช‡เชตเชจเซ‡เชธ | `PORT` เชชเชฐ TCP (เชกเชฟเชซเซ‰เชฒเซเชŸ `20128`), เช…เชฅเชตเชพ เชธเซ‹เชซเซเชŸ HTTP `/healthz` | `/api/monitoring/health` | | เชฐเซ‡เชกเซ€เชจเซ‡เชธ | HTTP `GET /healthz` | เช‡เชตเซ‡เชจเซเชŸ เชฒเซ‚เชช เชตเซเชฏเชธเซเชค เชนเซ‹เชตเชพเชจเซ‡ เชฌเช‚เชง เชชเชกเซ‡เชฒเซเช‚ เช—เชฃเซ‡ เชเชตเชพ เชŸเซ‚เช‚เช•เชพ เชŸเชพเช‡เชฎเช†เช‰เชŸ | | เชŠเช‚เชกเชพเชฃเชชเซ‚เชฐเซเชตเช• / เชฎเชจเซเชทเซเชฏเซ‹ เชฎเชพเชŸเซ‡ | `/api/monitoring/health` | เชธเซเชตเชšเชพเชฒเชฟเชค kubelet เชฒเชพเช‡เชตเชจเซ‡เชธ | **เช…เชชเช—เซเชฐเซ‡เชกเซเชธ:** เชฆเชฐเซ‡เช• เชธเซ‡เชถเชจเชจเซเช‚ เช•เชจเซ‡เช•เซเชถเชจ เชคเซ‚เชŸเชถเซ‡ เชคเซ‡เชตเซ€ เช…เชชเซ‡เช•เซเชทเชพ เชฐเชพเช–เซ‹. เชถเช•เซเชฏ เชนเซ‹เชฏ เชคเซ‹ เช•เซเชฒเชพเชฏเชจเซเชŸเซเชธเชจเซ‡ เชกเซเชฐเซ‡เช‡เชจ เช•เชฐเซ‹; เชกเชฟเชซเซ‰เชฒเซเชŸ SQLite เชชเชฐ เช•เซ‹เชˆ เชฐเซ‹เชฒเชฟเช‚เช— เช…เชชเชกเซ‡เชŸ เชจเชฅเซ€. Compose `restart: unless-stopped` เชคเชฅเชพ Docker `HEALTHCHECK` เชชเชฃ เช•เชจเซเชŸเซ‡เชจเชฐ Unhealthy เชฅเชพเชฏ เชคเซเชฏเชพเชฐเซ‡ เชเช•เชฎเชพเชคเซเชฐ เชชเซเชฐเซ‹เชธเซ‡เชธเชจเซ‡ เชฌเชฆเชฒเซ€ เชฆเซ‡เชถเซ‡ โ€” เชคเซ‡เชจเซ€ เช…เชธเชฐเชจเซ‹ เชตเซเชฏเชพเชช เชชเชฃ เชธเชฎเชพเชจ เชฐเชนเซ‡เชถเซ‡. **เชเช• เชฐเซ‡เชชเซเชฒเชฟเช•เชพ** เชฎเชพเชŸเซ‡ Kubernetes เชธเซเชจเชฟเชชเซ‡เชŸ (Recreate เช†เชตเชถเซเชฏเช• เช›เซ‡; เชเช• SQLite เชซเชพเช‡เชฒ เชธเชพเชฎเซ‡ `replicas` เชตเชงเชพเชฐเชถเซ‹ เชจเชนเซ€เช‚): ```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, SIGTERM เชชเชนเซ‡เชฒเชพเช‚ kube เชจเซ‡ Service endpoints เชฆเซ‚เชฐ เช•เชฐเชตเชพ เชฆเซ‡ เช›เซ‡, เชœเซ‡เชฅเซ€ **เชจเชตเซ‹** เชŸเซเชฐเชพเชซเชฟเช• เชฌเช‚เชง เชฅเชˆ เชฐเชนเซ‡เชฒเซ€ process เชธเซเชงเซ€ เชชเชนเซ‹เช‚เชšเชตเชพเชจเซเช‚ เชฌเช‚เชง เช•เชฐเซ‡. เชšเชพเชฒเซ `/v1/responses` SSE เชจเซ‡ heavyweight admission leases (#11015) เชฆเซเชตเชพเชฐเชพ `SHUTDOWN_TIMEOUT_MS` (เชกเชฟเชซเซ‰เชฒเซเชŸ 30s) เชธเซเชงเซ€ drain เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซ‡เชฎ เช›เชคเชพเช‚ process เชธเซเชงเซ€ เชชเชนเซ‹เช‚เชšเชคเซ€ เชจเชตเซ€ requests เชจเซ‡ `503` + `Retry-After: 5` เชฎเชณเซ‡ เช›เซ‡. replacement Ready เชฅเชพเชฏ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€เชจเซ‹ Recreate empty-endpoint gap เชเช• เชธเช‚เชชเซ‚เชฐเซเชฃ outage เชœ เชฐเชนเซ‡ เช›เซ‡ โ€” เช† SQLite topology เช›เซ‡, probe เชจเซเช‚ misconfiguration เชจเชฅเซ€. External Postgres / multi-writer HA เช เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เซƒเชค stock path **เชจเชฅเซ€**. เชœเซ‹ เชคเชฎเชจเซ‡ HAเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เชคเซ‹ เชเช• เชœ replica เชฐเชพเช–เซ‹ เช…เชฅเชตเชพ project เชฆเซเชตเชพเชฐเชพ เช…เชฒเช—เชฅเซ€ เชชเชฐเซ€เช•เซเชทเชฃ เช…เชจเซ‡ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เช•เชฐเชพเชฏเซ‡เชฒเซ€ topology เชšเชฒเชพเชตเซ‹. Postgres/MySQL เชธเช‚เชฌเช‚เชงเชฟเชค เช•เชพเชฎ [#8075](https://github.com/diegosouzapw/OmniRoute/issues/8075)เชฎเชพเช‚ เช›เซ‡. เชคเซ‡ เช‰เชชเชฒเชฌเซเชง เชจ เชฅเชพเชฏ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€, **เชฎเซ‹เชŸเซ€** `/v1/responses` capacity เชตเชงเชพเชฐเชตเชพเชจเซ€ เชเช•เชฎเชพเชคเซเชฐ เชธเชฎเชฐเซเชฅเชฟเชค เชฐเซ€เชค N เชธเซเชตเชคเช‚เชคเซเชฐ processes (เช†เช—เชฒเซ‹ เชตเชฟเชญเชพเช—) เช›เซ‡, เชเช• volume เชชเชฐ `replicas > 1` เชจเชนเซ€เช‚. ## เชธเซเช•เซ‡เชฒ-เช†เช‰เชŸ: N เชธเซเชตเชคเช‚เชคเซเชฐ เชชเซเชฐเซ‹เชธเซ‡เชธ เชเช• Node เชชเซเชฐเซ‹เชธเซ‡เชธ เชเชŸเชฒเซ‡ **เชเช• V8 heap**. เชเช•เชฌเซ€เชœเชพ เชธเชพเชฅเซ‡ เช“เชตเชฐเชฒเซ‡เชช เชฅเชคเซ€ ~3โ€ฏMiB / ~750k-token เช•เซ‹เชกเชฟเช‚เช—-เชเชœเชจเซเชŸ `POST /v1/responses` เชตเชฟเชจเช‚เชคเซ€เช“ (RTK + Caveman) ~12โ€ฏGi เชชเชฐ เชคเซ‡ heap เชจเซ‡ เช…เชฌเซ‹เชฐเซเชŸ เช•เชฐเชพเชตเซ‡ เช›เซ‡ (`FATAL ERROR: Reached heap limit`) เช…เชจเซ‡ 16โ€ฏGi cgroup เชฎเชพเช‚ OOM เชธเชฐเซเชœเซ€ เชถเช•เซ‡ เช›เซ‡. [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) เชœเซเช“. เช† เชฎเชพเชชเชจ เชเช• **เชฎเซ‡เชฎเชฐเซ€-เชฌเชœเซ‡เชŸ** เชšเซ‡เชคเชตเชฃเซ€ เช›เซ‡, เชเช•เชธเชพเชฅเซ‡ เชšเชพเชฒเชคเซ€ เชฌเซ‡ เชฒเชพเช‚เชฌเซ€ `/v1/responses` เชฎเชพเชŸเซ‡เชจเซ€ เช‰เชคเซเชชเชพเชฆเชจเชจเซ€ เช•เช เซ‹เชฐ เชฎเชนเชคเซเชคเชฎ เชฎเชฐเซเชฏเชพเชฆเชพ เชจเชฅเซ€. เชนเซ‡เชตเซ€เชตเซ‡เช‡เชŸ เชšเซ‡เชŸเชจเซ€ เชธเซเชตเซ€เช•เซƒเชคเชฟ เช†เชชเชฎเซ‡เชณเซ‡ เชฎเซ‡เชณเชตเชพเชฏเซ‡เชฒเชพ เช‡เชจเซเชœเซ‡เชธเซเชŸ เชฌเชพเช‡เชŸ เชฌเชœเซ‡เชŸ (`OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES`, `src/shared/middleware/admissionBudget.ts`) เชฆเซเชตเชพเชฐเชพ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡, เชœเซ‡ เช เชœ V8/cgroup เชฎเชฐเซเชฏเชพเชฆเชพเชจเชพ เช†เชงเชพเชฐเซ‡ เชฎเชพเชชเชฌเชฆเซเชง เช•เชฐเชพเชฏเซ‡เชฒเซเช‚ เช›เซ‡ โ€” เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชฎเชพเชชเชฌเชฆเซเชง เช•เชฐเชพเชฏเซ‡เชฒเซ€ เชชเซเชฐเซ‹เชธเซ‡เชธ เชชเชฐ เชคเซ‡เชจเซ‡ เชตเชงเชพเชฐเซ€เชจเซ‡ เช“เชตเชฐเชฐเชพเช‡เชก เช•เชฐเชตเชพเชฅเซ€ (เช…เชฅเชตเชพ เชœเซ‚เชจเซ€ `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` เชตเชฟเชจเช‚เชคเซ€-เชธเช‚เช–เซเชฏเชพ เชฎเชฐเซเชฏเชพเชฆเชพ เชธเซ‡เชŸ เช•เชฐเชตเชพเชฅเซ€) เช…เชฌเซ‹เชฐเซเชŸ เชซเชฐเซ€ เชธเชฐเซเชœเชพเชฏ เช›เซ‡. เชจเชพเชจเซ€ เชšเซ‡เชŸเซเชธ, `/healthz`, `/v1/models`, เช…เชจเซ‡ MCP เช† เชฎเชฐเซเชฏเชพเชฆเชพเชฎเชพเช‚ **เชจเชฅเซ€**. ### เชเช• เชชเซเชฐเซ‹เชธเซ‡เชธ: เชฌเซ‡ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชฒเชพเช‚เชฌเซ€ `/v1/responses` เชเช• **เชธเซเชตเชธเซเชฅ** เชชเซเชฐเซ‹เชธเซ‡เชธ (heap `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` เช•เชฐเชคเชพเช‚ เชจเซ€เชšเซ‡, เชกเชฟเชซเซ‰เชฒเซเชŸ `0.75`) เชเช•เชธเชพเชฅเซ‡ เชฌเซ‡ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชฒเชพเช‚เชฌเซ€ `POST /v1/responses` เชตเชฟเชจเช‚เชคเซ€เช“ เชšเชฒเชพเชตเซ€ **เชถเช•เซ‡ เช›เซ‡**, เชœเซ‹ เชชเซเชฐเซ‹เชธเซ‡เชธ-เชตเซเชฏเชพเชชเซ€ เช‡เชจเชซเซเชฒเชพเช‡เชŸ-เชฌเชพเช‡เชŸ เชฌเชœเซ‡เชŸ (`OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110) เชฎเชพเช‚ เชนเชœเซ เชœเช—เซเชฏเชพ เชนเซ‹เชฏ. `OMNIROUTE_CHAT_LARGE_BODY_BYTES` เชœเซ‡เชŸเชฒเซ€ เช…เชฅเชตเชพ เชคเซ‡เชจเชพเชฅเซ€ เชฎเซ‹เชŸเซ€ เชฌเซ‹เชกเซ€เช (เชกเชฟเชซเซ‰เชฒเซเชŸ 256โ€ฏKiB) เชธเซเชŸเซเชฐเช•เซเชšเชฐ-เชนเซ‡เชตเซ€ เชตเชฟเชจเช‚เชคเซ€เช“ เชœเซ‡เชตเซ€ เชœ เชนเซ‡เชตเซ€เชตเซ‡เช‡เชŸ เชฒเซ€เช เชฒเซ‡ เช›เซ‡ เช…เชจเซ‡ เช เชœ [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) `tryAcquireHealthyHeadroom` เชเชธเซเช•เซ‡เชช (`OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`) เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡. เชเช•เชธเชพเชฅเซ‡ เชฆเชธเซ‡เช• เชฒเชพเช‚เชฌเชพ SSE เช•เซเชฒเชพเชฏเชจเซเชŸเซเชธ (เช“เชชเชฐเซ‡เชŸเชฐเซ‹เชจเซ‡ เช˜เชฃเซ€เชตเชพเชฐ 40โ€“50เชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเซ‡ เช›เซ‡) เชšเชฒเชพเชตเชตเชพ เช **เชฎเซ‡เชฎเชฐเซ€-เชฌเชœเซ‡เชŸ**เชจเซ‹ เชชเซเชฐเชถเซเชจ เช›เซ‡ โ€” heap + เชชเซเชฐเชพเชฅเชฎเชฟเช•/headroom เชธเซเชฒเซ‹เชŸเซเชธ + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES`เชจเซเช‚ เชฎเชพเชช เชจเช•เซเช•เซ€ เช•เชฐเซ‹ โ€” เชคเซ‡ เช‰เชคเซเชชเชพเชฆเชจเชจเซ€ เช•เช เซ‹เชฐ โ€œเชฎเชนเชคเซเชคเชฎ 2โ€ เชฎเชฐเซเชฏเชพเชฆเชพ เชจเชฅเซ€. เชฆเชฌเชพเชฃ เชนเซ‡เช เชณเชจเซเช‚ heap เชนเชœเซ€ เชชเชฃ เชซเชฐเซ€ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเชพ `503` เชธเชพเชฅเซ‡ เชฒเซ‹เชก เช˜เชŸเชพเชกเซ‡ เช›เซ‡, เชœเซ‡เชฅเซ€ #7849 เชซเชฐเซ€ เชจ เชธเชฐเซเชœเชพเชฏ. **เชเช•เชฅเซ€ เชตเชงเซ heaps** (เชธเซเชตเชคเช‚เชคเซเชฐ V8 old-spaces) เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ **เช†เชœเซ‡**: | เช•เชฐเซ‹ | เชจ เช•เชฐเซ‹ | | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | | **N containers/pods** เชšเชฒเชพเชตเซ‹, เชฆเชฐเซ‡เช•เชจเซเช‚ **เชชเซ‹เชคเชพเชจเซเช‚** `DATA_DIR` / volume เชนเซ‹เชฏ | เชเช• เชœ SQLite เชซเชพเช‡เชฒ เชธเชพเชฎเซ‡ `replicas > 1` เชธเซ‡เชŸ เชจ เช•เชฐเซ‹ | | heap / inflight-byte เชฌเชœเซ‡เชŸเชจเชพ เช†เชงเชพเชฐเซ‡ เชญเชพเชฐเซ‡ in-flight + healthy-headroom เชฎเชพเชชเชฌเชฆเซเชง เช•เชฐเซ‹; 1โ€“2 เชฐเซ‚เชขเชฟเชšเซเชธเซเชค #7849 เชกเชฟเชซเซ‰เชฒเซเชŸ เช›เซ‡, เช‰เชคเซเชชเชพเชฆเชจเชจเซ€ เช•เช เซ‹เชฐ เชฎเชนเชคเซเชคเชฎ เชฎเชฐเซเชฏเชพเชฆเชพ เชจเชฅเซ€ | เชเช• เชชเซเชฐเซ‹เชธเซ‡เชธเชจเซ‡ 8ร— RAM เช…เชจเซ‡ เช…เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช—เชฃเชคเชฐเซ€ เชฎเชฐเซเชฏเชพเชฆเชพ เชจ เช†เชชเซ‹ | | เชตเซˆเช•เชฒเซเชชเชฟเช•: **เชตเชนเซ‡เช‚เชšเชพเชฏเซ‡เชฒเชพ เช•เซเชตเซ‹เชŸเชพ เช•เชพเช‰เชจเซเชŸเชฐเซเชธ** เชฎเชพเชŸเซ‡ `QUOTA_STORE_DRIVER=redis` + `QUOTA_STORE_REDIS_URL` | Redis เชจเซ‡ เชตเชนเซ‡เช‚เชšเชพเชฏเซ‡เชฒ SQLite เชจ เชฎเชพเชจเซ‹ โ€” เชคเซ‡ เชเชตเซเช‚ เชจเชฅเซ€ | | เชฆเชฐเซ‡เช• เช‡เชจเซเชธเซเชŸเชจเซเชธเชฎเชพเช‚ เชชเซเชฐเซ‹เชตเชพเช‡เชกเชฐ เชธเชฟเช•เซเชฐเซ‡เชŸเซเชธเชจเซ€ เชจเช•เชฒ เช•เชฐเซ‹ (เช…เชฅเชตเชพ เชตเชฟเชญเชพเชœเชฟเชค เชกเซ…เชถเชฌเซ‹เชฐเซเชกเซเชธ เชธเซเชตเซ€เช•เชพเชฐเซ‹) | เช‡เชจเซเชธเซเชŸเชจเซเชธเชฎเชพเช‚ เชเช• เชกเซ…เชถเชฌเซ‹เชฐเซเชก / เชเช• เช•เซ‰เชฒ-เชฒเซ‰เช—เชจเซ€ เช…เชชเซ‡เช•เซเชทเชพ เชจ เชฐเชพเช–เซ‹ | | เช†เช—เชณ เช•เซ‹เชˆเชชเชฃ เชฒเซ‹เชก เชฌเซ‡เชฒเซ‡เชจเซเชธเชฐ เชฎเซ‚เช•เซ‹; API เช•เซ€ เช…เชฅเชตเชพ เชธเซ‡เชถเชจ เชชเซเชฐเชฎเชพเชฃเซ‡ เชธเซเชŸเชฟเช•เซ€ เชฐเชพเช–เชตเซเช‚ เชชเซ‚เชฐเชคเซเช‚ เช›เซ‡ | เชตเซ‡เชจเซเชกเชฐ-เชตเชฟเชถเชฟเชทเซเชŸ เชธเชพเช‡เช-เช…เชตเซ‡เชฐ เชฎเชฟเชกเชฒเชตเซ‡เชฐเชจเซ€ เช†เชตเชถเซเชฏเช•เชคเชพ เชจ เชฐเชพเช–เซ‹ | เชนเชพเชฐเซเชกเชตเซ‡เชฐ: เชฆเชฐเซ‡เช• เช‡เชจเซเชธเซเชŸเชจเซเชธเชฎเชพเช‚ เชเช•เชธเชพเชฅเซ‡ เชšเชพเชฒเชคเซ€ เชฒเชพเช‚เชฌเซ€ `/v1/responses`เชจเซ€ เชธเช‚เช–เซเชฏเชพ เช **เชฎเซ‡เชฎเชฐเซ€-เชฌเชœเซ‡เชŸ**เชจเซ‹ เชชเซเชฐเชถเซเชจ เช›เซ‡ (heap + inflight-byte / #10110). เชธเซเชตเชคเช‚เชคเซเชฐ `DATA_DIR` เชงเชฐเชพเชตเชคเชพ `N` เช‡เชจเซเชธเซเชŸเชจเซเชธ เชนเชœเซ€ เชชเชฃ heaps เชจเซ‡ เช—เซเชฃเชพเช•เชพเชฐเซ‡ เชตเชงเชพเชฐเซ‡ เช›เซ‡: เชนเซ‹เชธเซเชŸ RAM เช `N ร— cgroup`เชจเซ‡ เชธเชฎเชพเชตเซ€ เชถเช•เซ‡ เชเชŸเชฒเซ€ เชนเซ‹เชตเซ€ เชœเซ‹เชˆเช, โ€œN=8 เชงเชฐเชพเชตเชคเซ‹ เชเช• 16โ€ฏGi podโ€ เชจเชนเซ€เช‚. เชเช• SQLite เชซเชพเช‡เชฒ เชชเชฐ เช•เซเชฏเชพเชฐเซ‡เชฏ `replicas > 1` เชจ เชฐเชพเช–เซ‹. Compose เชฐเซ‚เชชเชฐเซ‡เช–เชพ (เชฌเซ‡ heaps, เชฌเซ‡ volumes โ€” `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เชจเซ€ เชฌเชนเชพเชฐ compression) [#11023](https://github.com/diegosouzapw/OmniRoute/issues/11023) เช›เซ‡. เชตเชนเซ‡เช‚เชšเชพเชฏเซ‡เชฒเซ€ เชŸเช•เชพเช‰ เชธเซเชŸเซ‡เชŸ เชชเชฐ เชเช• เชคเชพเชฐเซเช•เชฟเช• เช•เซเชฒเชธเซเชŸเชฐ [#8075](https://github.com/diegosouzapw/OmniRoute/issues/8075) เช›เซ‡. ## Dockerเชจเซ€ เช…เช‚เชฆเชฐ Geminiเชจเซ€ เชชเซเชฐเชพเชฆเซ‡เชถเชฟเช• เชญเซ‚เชฒเซ‹ Google AI Studio / Gemini API, FAILED_PRECONDITION เชธเชพเชฅเซ‡ HTTP 400 เช…เชจเซ‡ `User location is not supported for the API use.` เชชเชฐเชค เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เชนเซ‹เชธเซเชŸ เชชเชฐ เชธเชซเชณ เชฅเชฏเซ‡เชฒเซ€ เชตเชฟเชจเช‚เชคเซ€ เช เชธเชพเชฌเชฟเชค เช•เชฐเชคเซ€ เชจเชฅเซ€ เช•เซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เช เชœ เช†เช‰เชŸเชฌเชพเช‰เชจเซเชก เชฐเซ‚เชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡. DNS เช•เซเชฐเชฎ, IPv4/IPv6 เช•เชจเซ‡เช•เซเชŸเชฟเชตเชฟเชŸเซ€, VPN เชฐเซ‚เชŸเชฟเช‚เช— เช…เชจเซ‡ เช—เซ‹เช เชตเซ‡เชฒเชพ เชชเซเชฐเซ‹เช•เซเชธเซ€ เช…เชฒเช— เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. [Googleเชจเชพ เชธเชฎเชฐเซเชฅเชฟเชค เชชเซเชฐเชฆเซ‡เชถเซ‹](https://ai.google.dev/gemini-api/docs/available-regions) เชคเซ‡เชฎเชœ เชตเชพเชธเซเชคเชตเชฟเช• เช•เชจเซ‡เช•เซเชถเชจ เชฐเซ‚เชŸ เชคเชชเชพเชธเซ‹; เชซเช•เซเชค เช† เชญเซ‚เชฒ เช–เชฐเชพเชฌ API เช•เซ€เชจเซ‡ เช“เชณเช–เซ€ เชฌเชคเชพเชตเชคเซ€ เชจเชฅเซ€. ### เช•เชจเซ‡เช•เซเชถเชจ-เชตเชฟเชถเชฟเชทเซเชŸ เชชเซเชฐเซ‹เช•เซเชธเซ€เชจเซ‡ เชชเซเชฐเชพเชงเชพเชจเซเชฏ เช†เชชเซ‹ เช…เชธเชฐเช—เซเชฐเชธเซเชค Gemini เช•เชจเซ‡เช•เซเชถเชจ เชฎเชพเชŸเซ‡ OmniRouteเชจเชพ [เช•เชจเซ‡เช•เซเชถเชจ-เชฆเซ€เช  เชชเซเชฐเซ‹เช•เซเชธเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ](../ops/PROXY_GUIDE.md#4-level-proxy-system) เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹, เชคเซเชฏเชพเชฐเชฌเชพเชฆ เช เชœ เชฎเซ‹เชกเซ‡เชฒ เชธเชพเชฅเซ‡ **เช•เชจเซ‡เช•เซเชถเชจเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ‹** เช…เชจเซ‡ เชเช• เชจเชพเชจเซ€ เชตเชฟเชจเช‚เชคเซ€ เชซเชฐเซ€เชฅเซ€ เช•เชฐเซ‹. เช† เชฐเซ‚เชŸเชฟเช‚เช— เชซเซ‡เชฐเชซเชพเชฐเชจเซ‡ เชคเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชชเซ‚เชฐเชคเซ‹ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชฐเชพเช–เซ‡ เช›เซ‡. เชšเช•เชพเชธเซ‹ เช•เซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚เชฅเซ€ เชชเซเชฐเซ‹เช•เซเชธเซ€ เชธเซเชงเซ€ เชชเชนเซ‹เช‚เชšเซ€ เชถเช•เชพเชฏ เช›เซ‡ เช…เชจเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เช–เชฐเซ‡เช–เชฐ เชคเซ‡เชจเซ‡ เชชเชธเช‚เชฆ เช•เชฐเซ‡ เช›เซ‡. เชฐเซ‚เชŸ เชฌเชฆเชฒเชตเชพเชฅเซ€ เช…เชชเชธเซเชŸเซเชฐเซ€เชฎ เชชเซเชฐเชพเชฆเซ‡เชถเชฟเช• เชชเชพเชคเซเชฐเชคเชพเชจเซ€ เช–เชพเชคเชฐเซ€ เชฅเชคเซ€ เชจเชฅเซ€. ### เชนเซ‹เชธเซเชŸ เช…เชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เชจเซ‡เชŸเชตเชฐเซเช•เชฟเช‚เช—เชจเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€ เช•เชฐเซ‹ เชชเซเชฐเชฎเชพเชฃเชฟเชค เชชเชฐเชฟเชฃเชพเชฎเซ‹เชจเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช•เซ€, เชฎเซ‹เชกเซ‡เชฒ เช…เชจเซ‡ เชตเชฟเชจเช‚เชคเซ€ เชเช•เชธเชฐเช–เชพเช‚ เชฐเชพเช–เซ‹; เช•เซเชฏเชพเชฐเซ‡เชฏ เช“เชณเช–เชชเชคเซเชฐเซ‹, เชชเซเชฐเซ‹เช•เซเชธเซ€ เชชเชพเชธเชตเชฐเซเชกเซ‹ เช…เชฅเชตเชพ เชธเช‚เชชเซ‚เชฐเซเชฃ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชนเซ‡เชกเชฐเซ‹เชจเซ‡ เช•เซ‹เชˆ เช‡เชถเซเชฏเซ‚เชฎเชพเช‚ เชชเซ‡เชธเซเชŸ เช•เชฐเชถเซ‹ เชจเชนเซ€เช‚. เชชเชนเซ‡เชฒเชพเช‚ เชคเชชเชพเชธเซ‹ เช•เซ‡ OS เชฐเชฟเชเซ‹เชฒเซเชตเชฐ เช•เชฏเชพ เชเชกเซเชฐเซ‡เชธ เชซเซ‡เชฎเชฟเชฒเซ€ เช†เชชเซ‡ เช›เซ‡; เชนเซ‹เชธเซเชŸ เช…เชจเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เช…เช‚เชฆเชฐ เช เชœ เช•เชฎเชพเชจเซเชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹: ```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)); })' ``` `omniroute`เชจเซ‡ เชคเชฎเซ‡ เชšเชฒเชพเชตเชคเชพ เชนเซ‹ เชคเซ‡ เชธเซ‡เชตเชพ เชตเชกเซ‡ เชฌเชฆเชฒเซ‹ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, `omniroute-web`). เช† เช•เชฎเชพเชจเซเชกเซ‹ เช“เชณเช–เชชเชคเซเชฐเซ‹ เช…เชฅเชตเชพ IP เชเชกเซเชฐเซ‡เชธ เชตเชฟเชจเชพ เชเชกเซเชฐเซ‡เชธ เชซเซ‡เชฎเชฟเชฒเซ€ เชชเซเชฐเชฟเชจเซเชŸ เช•เชฐเซ‡ เช›เซ‡. เชชเชฐเชค เชฎเชณเซ‡เชฒเซเช‚ `6` เชซเช•เซเชค IPv6 DNS เชชเชฐเชฟเชฃเชพเชฎ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡: เชคเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเชพ IPv6 เชฐเซ‚เชŸ เช…เชฅเชตเชพ API เชเช•เซเชธเซ‡เชธเชจเซ‡ เชธเชพเชฌเชฟเชค เช•เชฐเชคเซเช‚ **เชจเชฅเซ€**. เชœเซเชฏเชพเช‚ `curl` เช‡เชจเซเชธเซเชŸเซ‰เชฒ เช•เชฐเซ‡เชฒเซเช‚ เชนเซ‹เชฏ เชคเซเชฏเชพเช‚ เชฌเช‚เชจเซ‡ เชชเชฐเซเชฏเชพเชตเชฐเชฃเซ‹เชฎเชพเช‚ `curl -4 -I https://generativelanguage.googleapis.com`เชจเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€ `curl -6 -I https://generativelanguage.googleapis.com` เชธเชพเชฅเซ‡ เช•เชฐเซ‹. HTTP เชชเซเชฐเชคเชฟเชธเชพเชฆ เชคเซ‡ เชชเซเชฐเซ‹เชฌ เชฎเชพเชŸเซ‡ เช•เชจเซ‡เช•เซเชŸเชฟเชตเชฟเชŸเซ€ เชธเชพเชฌเชฟเชค เช•เชฐเซ‡ เช›เซ‡, เชญเชฒเซ‡ เชคเซ‡ เช…เชชเซเชฐเชฎเชพเชฃเชฟเชค เชญเซ‚เชฒ เชนเซ‹เชฏ; เชฎเชพเชคเซเชฐ เชชเซเชฐเชฎเชพเชฃเชฟเชค เชฎเซ‹เชกเซ‡เชฒ เชตเชฟเชจเช‚เชคเซ€ เชœ Gemini เชฎเชพเชŸเซ‡เชจเซ€ เชชเชพเชคเซเชฐเชคเชพเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ‡ เช›เซ‡. ### เชนเซ‹เชธเซเชŸ-เชธเซเชคเชฐเชจเซ‹ เชตเชฟเช•เชฒเซเชช: เช•เชพเชฐเซเชฏเชฐเชค IPv6 เช…เชจเซ‡ เชฐเชฟเชเซ‹เชฒเซเชตเชฐ เชจเซ€เชคเชฟ [#12762](https://github.com/diegosouzapw/OmniRoute/issues/12762)เชจเชพ เชฐเชฟเชชเซ‹เชฐเซเชŸเชฐเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ IPv6 เชธเช•เซเชทเชฎ เช•เชฐเซ€เชจเซ‡ เช…เชจเซ‡ glibc เชเชกเซเชฐเซ‡เชธ เชชเชธเช‚เชฆเช—เซ€ เชฌเชฆเชฒเซ€เชจเซ‡ เชคเซ‡เชฎเชจเชพ เชชเชฐเซเชฏเชพเชตเชฐเชฃเชฎเชพเช‚ เชเช•เซเชธเซ‡เชธ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซ€ เชนเชคเซ€. เช†เชจเซ‡ เชชเชฐเซเชฏเชพเชตเชฐเชฃ-เชตเชฟเชถเชฟเชทเซเชŸ เชตเชฟเช•เชฒเซเชช เชฎเชพเชจเซ‹. เชฐเชฟเชเซ‹เชฒเซเชตเชฐ เชชเชธเช‚เชฆเช—เซ€เช“ เชธเชฎเชพเชฏเซ‹เชœเชฟเชค เช•เชฐเชคเชพเช‚ เชชเชนเซ‡เชฒเชพเช‚ เช•เชพเชฐเซเชฏเชฐเชค เชนเซ‹เชธเซเชŸ IPv6, เช•เชจเซเชŸเซ‡เชจเชฐ เช‡เช—เซเชฐเซ‡เชธ/เชฐเซ‚เชŸเชฟเช‚เช— เช…เชจเซ‡ เชซเชพเชฏเชฐเชตเซ‰เชฒเชจเชพ เชจเชฟเชฏเชฎเซ‹เชจเซ€ เชชเซเชทเซเชŸเชฟ เช•เชฐเซ‹. เชซเช•เซเชค เช–เชพเชจเช—เซ€ ULA เชเชกเซเชฐเซ‡เชธ เชœเชพเชนเซ‡เชฐ IPv6 เช•เชจเซ‡เช•เซเชŸเชฟเชตเชฟเชŸเซ€ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชคเซเช‚ เชจเชฅเซ€. Composeเชจเชพ เชกเชฟเชซเซ‰เชฒเซเชŸ เชจเซ‡เชŸเชตเชฐเซเช• เชธเชพเชฅเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœเซ‹เชกเชพเชฏเซ‡เชฒเซ€ เชธเซ‡เชตเชพเช“ เชฎเชพเชŸเซ‡, เช† เชซเซเชฐเซ‡เช—เชฎเซ‡เชจเซเชŸ เชคเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ IPv6 เชธเช•เซเชทเชฎ เช•เชฐเซ‡ เช›เซ‡; เชคเชฎเชพเชฐเซ€ เชธเซ‡เชตเชพเชจเชพ เชฌเชพเช•เซ€เชจเชพ เชญเชพเช—เซ‹, เชชเซ‹เชฐเซเชŸเซเชธ, เชตเซ‹เชฒเซเชฏเซเชฎเซเชธ เช…เชจเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชœเชพเชณเชตเซ€ เชฐเชพเช–เซ‹: ```yaml networks: default: enable_ipv6: true ``` เชจเชพเชฎเชตเชพเชณเชพ เชจเซ‡เชŸเชตเชฐเซเช• เชฎเชพเชŸเซ‡, เชธเซ‡เชตเชพ เช–เชฐเซ‡เช–เชฐ เชœเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏ เช›เซ‡ เชคเซ‡เชจเชพ เชชเชฐ เชคเซ‡เชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเซ‹. Docker ULA เชธเชฌเชจเซ‡เชŸ เชซเชพเชณเชตเซ€ เชถเช•เซ‡ เช›เซ‡; เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเชพเชฐเชพ เชจเซ‡เชŸเชตเชฐเซเช•เชจเซ‡ เชคเซ‡เชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เชœ เชธเซเชชเชทเซเชŸ, เช“เชตเชฐเชฒเซ…เชช เชจ เชฅเชคเซเช‚ เชธเชฌเชจเซ‡เชŸ เชชเชธเช‚เชฆ เช•เชฐเซ‹. [Docker IPv6 เชจเซ‡เชŸเชตเชฐเซเช•เชฟเช‚เช—](https://docs.docker.com/engine/daemon/ipv6/) เช…เชจเซ‡ [Compose เชจเซ‡เชŸเชตเชฐเซเช• เชตเชฟเช•เชฒเซเชชเซ‹](https://docs.docker.com/reference/compose-file/networks/#enable_ipv6) เชœเซเช“. **glibc-เช†เชงเชพเชฐเชฟเชค เช‡เชฎเซ‡เชœ** เชชเชฐ, `/etc/gai.conf` เชเชกเซเชฐเซ‡เชธ เชชเชธเช‚เชฆเช—เซ€ เชฌเชฆเชฒเซ€ เชถเช•เซ‡ เช›เซ‡. เชนเชพเชฒเชจเซ€ เชฐเชฟเชชเซ‹เชเชฟเชŸเชฐเซ€ Dockerfile, Debianเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡; เช•เชธเซเชŸเชฎ musl-เช†เชงเชพเชฐเชฟเชค เช‡เชฎเซ‡เชœเซ‹ เช† เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซ€ เชจเชฅเซ€. เชฐเชฟเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡เชฒเซ‹ เชธเชฎเชพเชฏเซ‹เชœเชจ ULA เชฒเซ‡เชฌเชฒเชจเซ‡ `label fc00::/7 6`เชฎเชพเช‚เชฅเซ€ `label fc00::/7 1`เชฎเชพเช‚ เชฌเชฆเชฒเซ‡ เช›เซ‡. เช‡เชฎเซ‡เชœเชจเชพ เชธเช‚เชชเซ‚เชฐเซเชฃ เชจเซ€เชคเชฟ เช•เซ‹เชทเซเชŸเช•เชฅเซ€ เชถเชฐเซ‚เช†เชค เช•เชฐเซ‹ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เช…เชจเซเชฏ เชเชจเซเชŸเซเชฐเซ€เช“ เชœเชพเชณเชตเซ€ เชฐเชพเช–เซ‹: `label` เช…เชฅเชตเชพ `precedence` เชเชจเซเชŸเซเชฐเซ€ เช‰เชฎเซ‡เชฐเชตเชพเชฅเซ€ เชคเซ‡ เชกเชฟเชซเซ‰เชฒเซเชŸ เช•เซ‹เชทเซเชŸเช• เชฌเชฆเชฒเชพเชˆ เชœเชพเชฏ เช›เซ‡, เชคเซ‡เชฅเซ€ เชฎเชพเชคเซเชฐ เชฌเชฆเชฒเชพเชฏเซ‡เชฒเซ€ เชฒเชพเช‡เชจ เชงเชฐเชพเชตเชคเซ€ เชซเชพเช‡เชฒ เชชเซ‚เชฐเชคเซ€ เชจเชฅเซ€. [glibc เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชธเช‚เชฆเชฐเซเชญ](https://github.com/bminor/glibc/blob/master/posix/gai.conf) เช† เชธเชฟเชฎเซ‡เชจเซเชŸเชฟเช•เซเชธเชจเซเช‚ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เช•เชฐเซ‡ เช›เซ‡. เชธเชฎเซ€เช•เซเชทเชพ เช•เชฐเซ‡เชฒเซ€ เชซเชพเช‡เชฒเชจเซ‡ `/etc/gai.conf` เชชเชฐ เชฎเชพเชคเซเชฐ-เชตเชพเช‚เชšเชจ เชฎเซ‹เชกเชฎเชพเช‚ bind-mount เช•เชฐเซ‹ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฒเชพเช—เซ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเซ‡เชตเชพ เชซเชฐเซ€เชฅเซ€ เชฌเชจเชพเชตเซ‹. เช† เชคเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚เชจเชพ **เชคเชฎเชพเชฎ เช†เช‰เชŸเชฌเชพเช‰เชจเซเชก เชŸเซเชฐเชพเชซเชฟเช•** เชฎเชพเชŸเซ‡ OS เชเชกเซเชฐเซ‡เชธ เชชเชธเช‚เชฆเช—เซ€ เชฌเชฆเชฒเซ‡ เช›เซ‡. เชคเซ‡ เชฆเชฐเซ‡เช• เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ IPv6 เชชเชธเช‚เชฆ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชซเชฐเชœ เชชเชพเชกเชคเซเช‚ เชจเชฅเซ€: Nodeเชจเซ‹ DNS เช•เซเชฐเชฎ เช…เชจเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชชเชธเช‚เชฆเช—เซ€ เชชเชฃ เชฎเชนเชคเซเชต เชงเชฐเชพเชตเซ‡ เช›เซ‡. เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, `--dns-result-order=ipv4first` IPv4เชจเซ‡ เชชเซเชฐเชพเชงเชพเชจเซเชฏ เช†เชชเซ‡ เช›เซ‡ เช…เชจเซ‡ เชฎเชพเชคเซเชฐ IPv4 เชธเช‚เชฌเช‚เชงเชฟเชค เชจเชฟเชทเซเชซเชณเชคเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชพเชฏ เชจเชฅเซ€. [Node DNS เช•เซเชฐเชฎ](https://nodejs.org/api/dns.html#dnssetdefaultresultorderorder) เชœเซเช“. เชนเซ‹เชธเซเชŸ-เชธเซเชคเชฐเชจเชพ เช•เซ‹เชˆเชชเชฃ เชซเซ‡เชฐเชซเชพเชฐ เชชเช›เซ€ Gemini เช…เชจเซ‡ เชคเชฎเชพเชฐเชพ เช…เชจเซเชฏ เชชเซเชฐเชฆเชพเชคเชพเช“เชจเซเช‚ เชซเชฐเซ€เชฅเซ€ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ‹. เชชเชพเช›เชพ เชซเชฐเชตเชพ เชฎเชพเชŸเซ‡, เช•เชธเซเชŸเชฎ `gai.conf` เชฎเชพเช‰เชจเซเชŸ เชฆเซ‚เชฐ เช•เชฐเซ‹, เช…เช—เชพเช‰เชจเซเช‚ เชจเซ‡เชŸเชตเชฐเซเช• เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซ‹ เช…เชจเซ‡ เชœเชพเชณเชตเชฃเซ€ เชธเชฎเชฏเช—เชพเชณเชพ เชฆเชฐเชฎเชฟเชฏเชพเชจ เช…เชธเชฐเช—เซเชฐเชธเซเชค เชธเซ‡เชตเชพ/เชจเซ‡เชŸเชตเชฐเซเช• เชซเชฐเซ€เชฅเซ€ เชฌเชจเชพเชตเซ‹. เชจเซ‡เชŸเชตเชฐเซเช• เชซเชฐเซ€เชฅเซ€ เชฌเชจเชพเชตเชตเชพเชฅเซ€ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏเซ‡เชฒเชพ เช…เชจเซเชฏ เช•เชจเซเชŸเซ‡เชจเชฐเซ‹เชฎเชพเช‚ เชตเชฟเช•เซเชทเซ‡เชช เชชเชกเซ€ เชถเช•เซ‡ เช›เซ‡; เชธเซเชฅเชพเชฏเซ€ เชกเซ‡เชŸเชพ เชตเซ‹เชฒเซเชฏเซเชฎ เช•เชพเชขเซ€ เชจเชพเช–เชถเซ‹ เชจเชนเซ€เช‚. ## เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชจเซ‹เช‚เชงเซ‹ - **SQLite WAL เชฎเซ‹เชก:** `docker stop` เชจเซ‡ เชชเซ‚เชฐเซเชฃ เชฅเชตเชพ เชฆเซ‡เชตเซเช‚ เชœเซ‹เชˆเช, เชœเซ‡เชฅเซ€ OmniRoute เชจเชตเซ€เชจเชคเชฎ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ‡ เชชเชพเช›เชพ `storage.sqlite` เชฎเชพเช‚ เชšเซ‡เช•เชชเซ‰เช‡เชจเซเชŸ เช•เชฐเซ€ เชถเช•เซ‡. เชธเชพเชฅเซ‡ เช†เชชเซ‡เชฒเซ€ Compose เชซเชพเช‡เชฒเซ‹เชฎเชพเช‚ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ 40s เชจเซ‹ เชธเซเชŸเซ‹เชช เช—เซเชฐเซ‡เชธ เชชเชฟเชฐเชฟเชฏเชก เชธเซ‡เชŸ เช•เชฐเซ‡เชฒเซ‹ เช›เซ‡. เชœเซ‹ เชคเชฎเซ‡ เช‡เชฎเซ‡เชœเชจเซ‡ เชธเซ€เชงเซ€ เชšเชฒเชพเชตเซ‹ เช›เซ‹, เชคเซ‹ `--stop-timeout 40` เชœเชพเชณเชตเซ€ เชฐเชพเช–เซ‹. - **`DISABLE_SQLITE_AUTO_BACKUP`:** เชœเซ‹ เชจเชฟเชฏเชฎเชฟเชค/เชฒเช–เชพเชฃ-เชชเซ‚เชฐเซเชต เชฌเซ…เช•เช…เชช เชฌเชพเชนเซเชฏ เชฐเซ€เชคเซ‡ เชธเช‚เชšเชพเชฒเชฟเชค เชฅเชคเชพ เชนเซ‹เชฏ, เชคเซ‹ เชคเซ‡เชจเซ‡ `true` เชชเชฐ เชธเซ‡เชŸ เช•เชฐเซ‹. เชนเชพเชฒเชจเชพ เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเชพ เชฎเชพเช‡เช—เซเชฐเซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชนเชœเซ เชชเชฃ เชคเซ‡เชฎเชจเซ‹ เชชเซ‹เชคเชพเชจเซ‹ เชŸเช•เชพเช‰ เชธเซเชฐเช•เซเชทเชพ เชธเซเชจเซ…เชชเชถเซ‰เชŸ เช…เชจเซ‡ เชธเชพเชฎเซ‚เชนเชฟเช• เชฎเชพเช‡เช—เซเชฐเซ‡เชถเชจ เช—เชพเชฐเซเชก เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. - **เชกเซ‡เชŸเชพ เชธเซเชฅเชพเชฏเชฟเชคเซเชต:** เช•เชจเซเชŸเซ‡เชจเชฐ เชฐเซ€เชธเซเชŸเชพเชฐเซเชŸ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชคเชฎเชพเชฐเชพ เชกเซ‡เชŸเชพเชฌเซ‡เช, เช•เซ€ เช…เชจเซ‡ เช•เชจเซเชซเชฟเช—เชฐเซ‡เชถเชจเชจเซ‡ เชœเชพเชณเชตเซ€ เชฐเชพเช–เชตเชพ เชฎเชพเชŸเซ‡ เชนเช‚เชฎเซ‡เชถเชพเช‚ `/app/data` เชชเชฐ เชตเซ‰เชฒเซเชฏเซเชฎ เชฎเชพเช‰เชจเซเชŸ เช•เชฐเซ‹. - **เชชเซ‹เชฐเซเชŸ เช•เชจเซเชซเชฟเช—เชฐเซ‡เชถเชจ:** เชกเชฟเชซเซ‰เชฒเซเชŸ `20128` เชชเซ‹เชฐเซเชŸ เชฌเชฆเชฒเชตเชพ เชฎเชพเชŸเซ‡ `PORT` เชเชจเซเชตเชพเชฏเชฐเซเชจเชฎเซ‡เชจเซเชŸ เชตเซ‡เชฐเชฟเชเชฌเชฒเชจเซ‡ เช“เชตเชฐเชฐเชพเช‡เชก เช•เชฐเซ‹. ## เช† เชชเชฃ เชœเซเช“ - [VM เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชฟเช•เชพ](../ops/VM_DEPLOYMENT_GUIDE.md) โ€” VM + nginx + Cloudflare เชธเซ‡เชŸเช…เชช - [Fly.io เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸ เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชฟเช•เชพ](../ops/FLY_IO_DEPLOYMENT_GUIDE.md) โ€” Fly.io เชชเชฐ เชกเชฟเชชเซเชฒเซ‹เชฏ เช•เชฐเซ‹ - [เชเชจเซเชตเชพเชฏเชฐเซเชจเชฎเซ‡เชจเซเชŸ เช•เชจเซเชซเชฟเช—](../reference/ENVIRONMENT.md) โ€” เชธเช‚เชชเซ‚เชฐเซเชฃ `.env` เชธเช‚เชฆเชฐเซเชญ