# ๐Ÿณ Docker Guide โ€” OmniRoute (เจชเฉฐเจœเจพเจฌเฉ€) ๐ŸŒ **Languages:** ๐Ÿ‡บ๐Ÿ‡ธ [English](../../../../guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ช๐Ÿ‡น [am](../../../am/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ธ๐Ÿ‡ฆ [ar](../../../ar/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ฆ๐Ÿ‡ฟ [az](../../../az/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ง๐Ÿ‡ฌ [bg](../../../bg/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ง๐Ÿ‡ฉ [bn](../../../bn/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ง๐Ÿ‡ฆ [bs](../../../bs/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡จ๐Ÿ‡ฟ [cs](../../../cs/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ฉ๐Ÿ‡ฐ [da](../../../da/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ฉ๐Ÿ‡ช [de](../../../de/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ฌ๐Ÿ‡ท [el](../../../el/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ช๐Ÿ‡ธ [es](../../../es/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ช๐Ÿ‡ช [et](../../../et/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ท [fa](../../../fa/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ซ๐Ÿ‡ฎ [fi](../../../fi/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ซ๐Ÿ‡ท [fr](../../../fr/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ช [ga](../../../ga/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [gu](../../../gu/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฌ [ha](../../../ha/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ฑ [he](../../../he/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ณ [hi](../../../hi/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ญ๐Ÿ‡ท [hr](../../../hr/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ญ๐Ÿ‡บ [hu](../../../hu/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ฆ๐Ÿ‡ฒ [hy](../../../hy/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡ฉ [id](../../../id/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ณ๐Ÿ‡ฌ [ig](../../../ig/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ฎ๐Ÿ‡น [it](../../../it/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ฏ๐Ÿ‡ต [ja](../../../ja/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ฌ๐Ÿ‡ช [ka](../../../ka/docs/guides/DOCKER_GUIDE.md) ยท ๐Ÿ‡ฐ๐Ÿ‡ญ [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) ยท ๐Ÿ‡ต๐Ÿ‡ญ [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 `422` เจฆเฉ‡ เจจเจพเจฒ `containerEphemeralTarget: true` เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆเฅค ### เจธเจฟเจซเจผเจพเจฐเจธเจผเฉ€: 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 เจœเจพเจ‚ เจ‡เจธเฉ‡ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ‡ เจŸเฉ‚เจฒ เจคเฉเจนเจพเจกเฉ‡ เจฒเฉˆเจชเจŸเจพเจช เจ‰เฉฑเจคเฉ‡ เจšเฉฑเจฒเจฆเฉ‡ เจนเจจ เจคเจพเจ‚ เจ‡เจน เจธเจนเฉ€ เจšเฉ‹เจฃ เจนเฉˆ โ€” เจ…เจคเฉ‡ เจ†เจฎ เจคเฉŒเจฐ เจ‰เฉฑเจคเฉ‡ เจธเฉˆเฉฑเจŸเจ…เฉฑเจช เจตเฉ€ เจ‡เจนเฉ€ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค ### เจตเจฟเจ•เจฒเจช: เจนเฉ‹เจธเจŸ เจธเฉฐเจฐเจšเจจเจพ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ bind-mount เจ•เจฐเฉ‹ (`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 ``` bind mount เจนเฉ€ เจชเจพเจฅ เจจเฉ‚เฉฐ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ: OmniRoute `/proc/self/mountinfo` เจชเฉœเฉเจนเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจฎเจพเจŠเจ‚เจŸ เจ•เฉ€เจคเฉ‡ เจชเจพเจฅเจพเจ‚ (เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€เจ†เจ‚, เจœเจฟเจจเฉเจนเจพเจ‚ เจฆเฉ‡ เจšเจพเจˆเจฒเจก เจฎเจพเจŠเจ‚เจŸ เจนเจจ, เจœเฉ‹ เจ‰เฉฑเจชเจฐ เจฆเจฟเฉฑเจคเฉ‡ `/host-home` เจฆเฉ‡ เจฐเฉ‚เจช เจจเจพเจฒ เจฌเจฟเจฒเจ•เฉเจฒ เจฎเฉ‡เจฒ เจ–เจพเจ‚เจฆเจพ เจนเฉˆ) เจ‰เฉฑเจคเฉ‡ เจฒเจฟเจ–เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจœเจฆเจ•เจฟ เจฎเจพเจŠเจ‚เจŸ เจจเจพ เจ•เฉ€เจคเฉ‡ เจชเจพเจฅเจพเจ‚ เจฒเจˆ เจ…เจœเฉ‡ เจตเฉ€ เจ‡เจจเจ•เจพเจฐ เจ•เจฐเจฆเจพ เจนเฉˆเฅค ### เจฌเจšเจพเจ… เจฆเจพ เจฐเจธเจคเจพ: เจ•เฉฐเจŸเฉ‡เจจเจฐ เจฆเฉ‡ เจ†เจชเจฃเฉ‡ CLIs เจฆเฉ€ เจธเฉฐเจฐเจšเจจเจพ เจ•เจฐเฉ‹ (เจธเฉฐเจœเจฎ เจจเจพเจฒ เจตเจฐเจคเฉ‹) เจœเจฆเฉ‹เจ‚ CLIs เจธเฉฑเจšเจฎเฉเฉฑเจš เจ•เฉฐเจŸเฉ‡เจจเจฐ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจนเฉ€ เจฎเฉŒเจœเฉ‚เจฆ เจนเฉ‹เจฃ (`cli` เจชเฉเจฐเฉ‹เจซเจผเจพเจˆเจฒ), เจคเจพเจ‚ เจ‡เจน เจฒเจฟเจ–เจค เจœเจพเจฃเจฌเฉเฉฑเจ เจ•เฉ‡ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค เจ•เจฟเจธเฉ‡ เจตเฉ€ `setup-*` เจ•เจฎเจพเจ‚เจก เจจเฉ‚เฉฐ `--allow-container-write` เจฆเจฟเจ“, เจœเจพเจ‚ เจธเจฐเจตเจฐ เจฒเจˆ `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE=true` เจธเฉˆเฉฑเจŸ เจ•เจฐเฉ‹เฅค เจฒเจฟเจ–เจค เจ‡เจธ เจšเฉ‡เจคเจพเจตเจจเฉ€ เจจเจพเจฒ เจ…เฉฑเจ—เฉ‡ เจตเจงเจฆเฉ€ เจนเฉˆ เจ•เจฟ เจ‡เจน เจ•เฉฐเจŸเฉ‡เจจเจฐ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ•เจพเจ‡เจฎ เจจเจนเฉ€เจ‚ เจฐเจนเฉ‡เจ—เฉ€เฅค > **เจธเฉเจฐเฉฑเจ–เจฟเจ† เจšเฉ‡เจคเจพเจตเจจเฉ€ โ€” `cli` เจชเฉเจฐเฉ‹เจซเจผเจพเจˆเจฒ + `docker.sock` เจฎเจพเจŠเจ‚เจŸเฅค** > `cli` เจชเฉเจฐเฉ‹เจซเจผเจพเจˆเจฒ `/var/run/docker.sock` เจจเฉ‚เฉฐ bind-mount เจ•เจฐเจฆเจพ เจนเฉˆ เจคเจพเจ‚ เจœเฉ‹ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจ…เฉฐเจฆเจฐเจฒเจพ > เจ†เจŸเฉ‹-เจ…เฉฑเจชเจกเฉ‡เจŸเจฐ เจนเฉ‹เจธเจŸ เจกเฉ€เจฎเจจ เจคเฉ‹เจ‚ เจธเจŸเฉˆเจ• เจฎเฉเฉœ เจฌเจฃเจพ เจธเจ•เฉ‡ > (`src/lib/system/autoUpdate.ts` เจ‰เจธ เจธเจพเจ•เจŸ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจœเจฆเฉ‹เจ‚ เจ‡เจน > เจฎเฉŒเจœเฉ‚เจฆ เจจเจพ เจนเฉ‹เจตเฉ‡ เจคเจพเจ‚ Docker เจชเจพเจฅ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ)เฅค เจ‰เจน เจธเจพเจ•เจŸ **เจนเฉ‹เจธเจŸ-root เจญเจฐเฉ‹เจธเฉ‡ เจฆเฉ€ > เจธเฉ€เจฎเจพ** เจนเฉˆ: เจœเฉ‹ เจตเฉ€ เจ‡เจธ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจธเจ•เจฆเจพ เจนเฉˆ, เจ‰เจน เจนเฉ‹เจธเจŸ Docker เจกเฉ€เจฎเจจ เจจเฉ‚เฉฐ > root เจตเจœเฉ‹เจ‚ เจšเจฒเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ โ€” เจ‰เจน เจนเฉ‹เจธเจŸ เจ‰เฉฑเจคเฉ‡ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจจเฉ‚เฉฐ เจฌเจฃเจพ, เจœเจพเจ‚เจš, เจฐเฉ‹เจ• เจ…เจคเฉ‡ เจนเจŸเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค > เจชเฉเจฐเจญเจพเจต: > > 1. **`cli` เจชเฉเจฐเฉ‹เจซเจผเจพเจˆเจฒ เจฆเจพ เจชเฉ‹เจฐเจŸ เจ•เจฆเฉ‡ เจตเฉ€ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจ‰เฉฑเจคเฉ‡ เจ‰เจชเจฒเจฌเจง เจจเจพ เจ•เจฐเฉ‹เฅค** เจ‡เจธเจจเฉ‚เฉฐ > `127.0.0.1` เจ‰เฉฑเจคเฉ‡ เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจ•เจฐเฉ‹ (`ports: "127.0.0.1:${DASHBOARD_PORT:-20128}:..."`) > โ€” LAN เจคเฉ‹เจ‚ เจชเจนเฉเฉฐเจšเจฏเฉ‹เจ— `cli` เจชเฉเจฐเฉ‹เจซเจผเจพเจˆเจฒ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจกเฉˆเจธเจผเจฌเฉ‹เจฐเจก-เจชเฉฑเจงเจฐเฉ€ RCE เจจเฉ‚เฉฐ > เจชเฉ‚เจฐเฉ‡ เจนเฉ‹เจธเจŸ เจฆเฉ‡ เจธเจฎเจเฉŒเจคเฉ‡ เจตเจฟเฉฑเจš เจฌเจฆเจฒ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค > 2. **`cli` เจชเฉเจฐเฉ‹เจซเจผเจพเจˆเจฒ เจตเจฟเฉฑเจš เจ•เฉ‹เจˆ เจตเจพเจงเฉ‚ เจนเฉ‹เจธเจŸ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ bind เจจเจพ เจ•เจฐเฉ‹เฅค** > 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` (10s เจฆเจพ เจ…เฉฐเจคเจฐเจพเจฒ) | เจธเฉฐเจฌเฉฐเจงเจฟเจค เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ: - `REDIS_URL` โ€” เจเจช เจตเจฟเฉฑเจš เจ‡เฉฐเจœเฉˆเจ•เจŸ เจ•เฉ€เจคเฉ€ เจ•เจจเฉˆเจ•เจธเจผเจจ เจธเจŸเฉเจฐเจฟเฉฐเจ— (เจกเจฟเจซเจพเจฒเจŸ เจฐเฉ‚เจช เจตเจฟเฉฑเจš `redis://redis:6379`)เฅค - `REDIS_PORT` โ€” Redis เจ•เฉฐเจŸเฉ‡เจจเจฐ เจฒเจˆ เจนเฉ‹เจธเจŸ-เจธเจพเจˆเจก เจชเฉ‹เจฐเจŸ เจฎเฉˆเจชเจฟเฉฐเจ—เฅค - `REDIS_BIND_HOST` โ€” เจ‰เจน เจนเฉ‹เจธเจŸ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจœเจฟเจธ 'เจคเฉ‡ เจชเฉ‹เจฐเจŸ เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค เจกเจฟเจซเจพเจฒเจŸ `127.0.0.1` เจนเฉˆเฅค > **เจกเจฟเจซเจพเจฒเจŸ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจฒเฉ‚เจชเจฌเฉˆเจ• เจ•เจฟเจ‰เจ‚:** เจธเจพเจˆเจกเจ•เจพเจฐ `requirepass` เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจšเฉฑเจฒเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจเจช > เจ•เฉฐเจŸเฉ‡เจจเจฐ เจ•เฉฐเจชเฉ‹เจœเจผ เจจเฉˆเฉฑเจŸเจตเจฐเจ• (`redis:6379`) เจฐเจพเจนเฉ€เจ‚ เจ‡เจธ เจคเฉฑเจ• เจชเจนเฉเฉฐเจšเจฆเฉ‡ เจนเจจ โ€” เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจชเฉ‹เจฐเจŸ > เจธเจฟเจฐเจซเจผ เจนเฉ‹เจธเจŸ-เจธเจพเจˆเจก เจŸเฉ‚เจฒเจฟเฉฐเจ— (`redis-cli`, เจ‡เฉฑเจ• เจฒเฉ‹เจ•เจฒ `npm run dev`) เจฒเจˆ เจนเฉˆเฅค เจ‡เจธเจจเฉ‚เฉฐ > `0.0.0.0` 'เจคเฉ‡ เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจ•เจฐเจจ เจจเจพเจฒ เจฌเจฟเจจเจพเจ‚ เจชเฉเจฐเจฎเจพเจฃเฉ€เจ•เจฐเจจ เจตเจพเจฒเจพ Redis เจคเฉเจนเจพเจกเฉ‡ LAN เจฆเฉ‡ เจนเจฐเฉ‡เจ• เจนเฉ‹เจธเจŸ เจฒเจˆ เจ‰เจชเจฒเจฌเจง เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพเฅค เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ > `REDIS_BIND_HOST=0.0.0.0` เจธเฉˆเฉฑเจŸ เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจธเจฐเจตเจฟเจธ เจฆเฉ‡ `command:` เจตเจฟเฉฑเจš `--requirepass` เจตเฉ€ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹เฅค **Redis เจจเฉ‚เฉฐ เจ…เจธเจฎเจฐเฉฑเจฅ เจ•เจฐเจจเจพ** เจธเจฟเจซเจผเจพเจฐเจธเจผเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ (เจฐเฉ‡เจŸ เจฒเจฟเจฎเจฟเจŸเจฐ เจ‡เจจ-เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจซเจพเจฒเจฌเฉˆเจ• 'เจคเฉ‡ เจ† เจœเจพเจตเฉ‡เจ—เจพ)เฅค เจœเฉ‡ เจ‡เจน เจฒเจพเจœเจผเจฎเฉ€ เจนเฉ‹เจตเฉ‡, เจคเจพเจ‚ เจœเจพเจ‚ `docker-compose.yml` เจตเจฟเฉฑเจšเฉ‹เจ‚ `redis:` เจธเจฐเจตเจฟเจธ เจฌเจฒเจพเจ• เจนเจŸเจพเจ“/เจ•เจฎเฉˆเจ‚เจŸ เจ•เจฐเฉ‹ เจœเจพเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจธเจฟเจซเจผเจฐ เจคเฉฑเจ• เจธเจ•เฉ‡เจฒ เจ•เจฐเฉ‹: ```bash docker compose up -d --scale redis=0 ``` ## เจชเฉเจฐเฉ‹เจกเจ•เจธเจผเจจ เจ•เฉฐเจชเฉ‹เจœเจผ เจกเจฟเจตเฉˆเจฒเจชเจฎเฉˆเจ‚เจŸ เจฆเฉ‡ เจจเจพเจฒ-เจจเจพเจฒ เจšเฉฑเจฒเจฃ เจตเจพเจฒเฉ‡ เจ‡เฉฑเจ• เจ…เจฒเฉฑเจ— เจชเฉเจฐเฉ‹เจกเจ•เจธเจผเจจ เจธเจจเฉˆเจชเจธเจผเจพเจŸ เจฒเจˆ `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 ``` เจชเฉเจฐเฉ‹เจก เจธเจŸเฉˆเจ• เจกเจฟเจตเฉˆเจฒเจชเจฎเฉˆเจ‚เจŸ เจ•เฉฐเจชเฉ‹เจœเจผ เจฆเฉ‡ เจธเจฎเจพเจ‚เจคเจฐ เจšเฉฑเจฒเจฆเจพ เจนเฉˆ (เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจฆเฉ‡ เจจเจพเจฎ, เจชเฉ‹เจฐเจŸ เจ…เจคเฉ‡ เจตเจพเจฒเจฟเจŠเจฎ เจตเฉฑเจ–เจฐเฉ‡ เจนเจจ), เจ‡เจธ เจฒเจˆ เจชเฉเจฐเฉ‹เจกเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจšเจพเจฒเฉ‚ เจฐเฉฑเจ–เจฆเฉ‡ เจนเฉ‹เจ เจคเฉเจธเฉ€เจ‚ เจฒเฉ‹เจ•เจฒ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจœเจพเจฐเฉ€ เจฐเฉฑเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค ## 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`เฅค **เจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ เจ‡เจน เจชเฉเจฐเฉ‹เจตเจพเจˆเจกเจฐ เจตเจฐเจคเจฆเฉ‡ เจนเฉ‹ เจคเจพเจ‚ เจ‡เจน เจšเฉเจฃเฉ‹** โ€” เจ‡เจธ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจธเจงเจพเจฐเจจ เจ‡เจฎเฉ‡เจœ เจฌเฉ‡เจจเจคเฉ€ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจ…เจธเจซเจฒ เจนเฉ‹ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ (เจฐเจฟเจฒเฉ€เจœเจผ เจšเฉˆเจจเจฒเจพเจ‚ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเจพ `-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 เจชเฉเจจเจฐ-เจจเจฟเจฐเจฎเจพเจฃ (เจฎเฉเฉฑเจฆเจพ #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 killer เจซเจฟเจฐ เจฌเจฟเจจเจพเจ‚ เจ•เจฟเจธเฉ‡ เจ—เจฒเจคเฉ€-เจธเฉเจจเฉ‡เจนเฉ‡ เจฆเฉ‡ 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 เจฆเฉเจ†เจฐเจพ เจšเฉเฉฑเจชเจšเจพเจช เจฌเฉฐเจฆ เจ•เฉ€เจคเจพ เจ—เจฟเจ† | | 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 เจธเฉ€เจฎเจพ เจจเฉ‚เฉฐ เจจเจฟเจฏเฉฐเจคเจฐเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆเฅค - เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจฎเฉ‡เจœ เจ‡เจธเจจเฉ‚เฉฐ เจนเจฎเฉ‡เจธเจผเจพ เจธเฉˆเฉฑเจŸ เจ•เจฐเจฆเฉ€ เจนเฉˆ, launcher เจฆเจพ เจ†เจชเจฃเจพ RAM-เจ…เจจเฉเจธเจพเจฐ เจ•เฉˆเจฒเฉ€เจฌเจฐเฉ‡เจŸ เจ•เฉ€เจคเจพ fallback Docker เจ…เจงเฉ€เจจ เจ•เจฆเฉ‡ เจฒเจพเจ—เฉ‚ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเจพเฅค เจตเจฐเจ•เจฒเฉ‹เจก เจฒเจˆ เจ‡เจธเจจเฉ‚เฉฐ เจธเจชเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจตเจงเจพเจ“ (เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ€ เจธเจพเจฐเจฃเฉ€)เฅค coding-agent `/v1/responses` เจฒเจˆ `2048` เจ…เจœเฉ‡ เจตเฉ€ เจฌเจนเฉเจค เจ˜เฉฑเจŸ เจนเฉˆเฅค ### เจ•เฉ‹เจกเจฟเฉฐเจ— เจเจœเฉฐเจŸเจพเจ‚ เจฒเจˆ เจฐเจจเจŸเจพเจˆเจฎ RAM 1โ€ฏGiB Docker เจกเจฟเจซเจพเจฒเจŸ dashboard/เจนเจฒเจ•เฉ€-chat เจฒเจˆ เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ เจธเฉ€เจฎเจพ เจนเฉˆ, production เจ†เจ•เจพเจฐ เจจเจนเฉ€เจ‚เฅค เจฒเฉฐเจฌเฉ€เจ†เจ‚ `POST /v1/responses` เจฌเจพเจกเฉ€เจ†เจ‚ (เจธเฉˆเจ‚เจ•เฉœเฉ‡ เจธเฉเจจเฉ‡เจนเฉ‡, เจฆเจฐเจœเจจเจพเจ‚ เจŸเฉ‚เจฒ) compression เจฆเฉŒเจฐเจพเจจ เจ•เจˆ in-memory graphs เจจเฉ‚เฉฐ เจฌเจฐเจ•เจฐเจพเจฐ เจฐเฉฑเจ–เจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจ‡เฉฑเจ•เฉ‹ เจธเจฎเฉ‡เจ‚ เจšเฉฑเจฒ เจฐเจนเฉ€เจ†เจ‚ เจฒเจ—เจญเจ— 3โ€ฏMiB / เจฒเจ—เจญเจ— 750k-token เจฆเฉ€เจ†เจ‚ เจฆเฉ‹ overlapping เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจจเฉ‡ **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 เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ เจฐเจนเจฟเฉฐเจฆเฉ‡ เจนเจจเฅค | เจตเจฐเจ•เจฒเฉ‹เจก | `OMNIROUTE_MEMORY_MB` | เจ•เฉฐเจŸเฉ‡เจจเจฐ / cgroup | เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ | | ------------------------------------ | ------------------------ | --------------------- | ---------------------------------------------------------------------------------------------- | | Dashboard, เจ‡เฉฑเจ• เจนเจฒเจ•เฉ€ chat | `1024` (เจ‡เจฎเฉ‡เจœ เจกเจฟเจซเจพเจฒเจŸ) | โ‰ฅ2โ€ฏGiB | | | เจ‡เฉฑเจ• เจ•เฉ‹เจกเจฟเฉฐเจ— เจเจœเฉฐเจŸ (Claude/Codex/Grok) | `8192` | โ‰ฅ10โ€ฏGiB | เจ†เจฎ single-session `/v1/responses` | | เจ‡เฉฑเจ•เฉ‹ เจธเจฎเฉ‡เจ‚ เจฆเฉ‹ เจฒเฉฐเจฌเฉ€เจ†เจ‚ `/v1/responses` | `10240`โ€“`12288` | โ‰ฅ12โ€“16โ€ฏGiB | เจฒเจ—เจญเจ— 12โ€ฏGiB heap 'เจคเฉ‡ เจฎเจพเจชเจฟเจ† เจ—เจฟเจ† V8 abort | | เจ‡เฉฑเจ•เฉ‹ เจธเจฎเฉ‡เจ‚ เจคเจฟเฉฐเจจ เจœเจพเจ‚ เจตเฉฑเจง เจฒเฉฐเจฌเฉ‡ contexts | เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† 'เจคเฉ‡ เจจเจพ เจšเจฒเจพเจ“ | เจฒเฉœเฉ€เจตเจพเจฐ เจšเจฒเจพเจ“ / เจนเฉ‹เจฐ RAM | เจกเจฟเจซเจพเจฒเจŸ heavyweight admission 1 in-flight เจนเฉˆ; RAM เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจฃ เจจเจพเจฒ abort เจฎเฉเฉœ เจตเจพเจชเจฐเจฆเจพ เจนเฉˆ | bare metal 'เจคเฉ‡ `omniroute serve`, เจœเจฆเฉ‹เจ‚ `OMNIROUTE_MEMORY_MB` **เจธเฉˆเฉฑเจŸ เจจเจพ เจนเฉ‹เจตเฉ‡**, RAM เจฆเฉ‡ เจฒเจ—เจญเจ— 35% เจ…เจจเฉเจธเจพเจฐ เจ•เฉˆเจฒเฉ€เจฌเจฐเฉ‡เจŸ เจ•เจฐเจฆเจพ เจนเฉˆ (`[512, 4096]` เจคเฉฑเจ• เจธเฉ€เจฎเจฟเจค)เฅค Docker เจนเจฎเฉ‡เจธเจผเจพ `1024` เจธเฉˆเฉฑเจŸ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจ…เจงเจฟเจ•เจพเจฐเจค เจ‡เจฎเฉ‡เจœ เจตเจฟเฉฑเจš เจ‰เจน 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` | เจธเจตเฉˆ-เจ…เฉฑเจชเจกเฉ‡เจŸ เจตเจฐเจ•เจซเจผเจฒเฉ‹ เจฒเจˆ `/workspace/omniroute` 'เจคเฉ‡ `cli` เจชเฉเจฐเฉ‹เจซเจผเจพเจˆเจฒ เจตเจฟเฉฑเจš เจฎเจพเจŠเจ‚เจŸ เจ•เฉ€เจคเจพ เจนเฉ‹เจธเจŸ เจชเจพเจฅ | `.` (เจฎเฉŒเจœเฉ‚เจฆเจพ เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€) | | `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` เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเจฟเจธเจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจ‡เจฎเฉ‡เจœ เจตเฉฑเจฒเฉ‹เจ‚ เจเจ•เจธเจชเฉ‹เจฐเจŸ เจ•เจฐเจจเจพ เจฒเจพเจœเจผเจฎเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค | `~/.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` เจจเฉ‚เฉฐ standalone bundle เจตเจฟเฉฑเจš เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค OmniRoute เจเจช เจฐเฉ‚เจŸ เจ‰เฉฑเจคเฉ‡ เจ‡เฉฑเจ• sentinel เจซเจผเจพเจˆเจฒ เจตเจฟเฉฑเจš เจชเจนเจฟเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเฉ‡ เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ เจฆเจฐเจœ เจ•เจฐเจฆเจพ เจนเฉˆ (`npm run build` เจฆเฉŒเจฐเจพเจจ เจฒเจฟเจ–เจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ; `scripts/docker/ensure-docker-base-path.mjs` เจตเฉฑเจฒเฉ‹เจ‚ เจชเฉœเฉเจนเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ) เจ…เจคเฉ‡ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจธเจผเฉเจฐเฉ‚ เจนเฉ‹เจฃ เจตเฉ‡เจฒเฉ‡ เจ‡เจธ เจฆเฉ€ เจคเฉเจฒเจจเจพ `OMNIROUTE_BASE_PATH` เจจเจพเจฒ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจœเจฆเฉ‹เจ‚ เจ‡เจน เจตเฉฑเจ–เจฐเฉ‡ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ เจ…เจคเฉ‡ เจ‡เจฎเฉ‡เจœ เจกเฉ‹เจฎเฉ‡เจจ เจฐเฉ‚เจŸ เจฒเจˆ เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจธเฉ€, เจคเจพเจ‚ `node dev/run-standalone.mjs` เจฆเฉ‡ เจšเฉฑเจฒเจฃ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ entrypoint standalone manifests, embedded `basePath`/`assetPrefix` literals (Next 16 SSR asset URLs เจจเฉ‚เฉฐ เจธเจฟเจฐเจซเจผ `assetPrefix` เจคเฉ‹เจ‚ เจฐเฉˆเจ‚เจกเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ โ€” patcher เจธเจฌเจชเจพเจฅ เจจเฉ‚เฉฐ เจ‡เจธ เจตเจฟเฉฑเจš เจตเฉ€ เจชเฉเจฐเจคเฉ€เจฌเจฟเฉฐเจฌเจค เจ•เจฐเจฆเจพ เจนเฉˆ), เจชเจนเจฟเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจธเจผเจพเจฎเจฒ `/_next/static` asset URLs (client-reference manifests, media imports, prerendered error pages) เจ…เจคเฉ‡ client `process.env` shim เจจเฉ‚เฉฐ เจฎเฉเฉœ เจฒเจฟเจ–เจฆเจพ เจนเฉˆเฅค ### Compose เจฌเจฟเจฒเจก (เจธเจฟเจซเจผเจพเจฐเจธเจผเฉ€) เจฆเฉ‹เจตเฉ‡เจ‚ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ `.env` เจตเจฟเฉฑเจš เจธเฉˆเฉฑเจŸ เจ•เจฐเฉ‹, เจซเจฟเจฐ เจฎเฉเฉœ เจฌเจฟเจฒเจก เจ•เจฐเฉ‹ เจคเจพเจ‚ เจœเฉ‹ เจ‡เจฎเฉ‡เจœ เจ…เจคเฉ‡ runtime เจ‡เฉฑเจ•เฉ‹ เจธเฉฐเจฐเจšเจจเจพ เจตเจฐเจคเจฃ: ```bash # .env OMNIROUTE_BASE_PATH=/omniroute NEXT_PUBLIC_BASE_URL=https://myhostname.example.com/omniroute ``` ```bash docker compose --profile base up -d --build ``` `docker-compose.yml`, `OMNIROUTE_BASE_PATH` เจจเฉ‚เฉฐ Docker build-arg เจ…เจคเฉ‡ runtime environment variable เจฆเฉ‹เจตเจพเจ‚ เจตเจœเฉ‹เจ‚ เจ…เฉฑเจ—เฉ‡ เจญเฉ‡เจœเจฆเจพ เจนเฉˆเฅค ### เจชเจนเจฟเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจฌเจฃเจฟเจ† root image + runtime subpath เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค `diegosouzapw/omniroute:*` images เจกเฉ‹เจฎเฉ‡เจจ เจฐเฉ‚เจŸ เจฒเจˆ เจฌเจฃเจพเจ เจ—เจ เจนเจจเฅค เจคเฉเจธเฉ€เจ‚ เจซเจฟเจฐ เจตเฉ€ runtime เจตเฉ‡เจฒเฉ‡ `OMNIROUTE_BASE_PATH` เจธเฉˆเฉฑเจŸ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹; เจ•เฉฐเจŸเฉ‡เจจเจฐ startup เจ‰เฉฑเจคเฉ‡ bundle เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเจพเจฐ patch เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธเจจเฉ‚เฉฐ เจฎเฉ‡เจฒ เจ–เจพเจ‚เจฆเฉ‡ public origin เจจเจพเจฒ เจœเฉ‹เฉœเฉ‹: ```yaml services: omniroute: image: diegosouzapw/omniroute:latest environment: OMNIROUTE_BASE_PATH: /omniroute NEXT_PUBLIC_BASE_URL: https://myhostname.example.com/omniroute ``` เจฐเจฟเจตเจฐเจธ เจชเฉเจฐเจพเจ•เจธเฉ€ เจจเฉ‚เฉฐ **เจชเฉ‚เจฐเจพ** เจฌเจพเจนเจฐเฉ€ เจชเจพเจฅ เจ…เฉฑเจ—เฉ‡ เจญเฉ‡เจœเจฃ เจฒเจˆ เจธเฉฐเจฐเจšเจฟเจค เจ•เจฐเฉ‹ (prefix เจจเจพ เจนเจŸเจพเจ“)เฅค Traefik เจจเฉ‚เฉฐ `StripPrefix` เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ `PathPrefix(`/omniroute`)` เจจเฉ‚เฉฐ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจตเฉฑเจฒ route เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจœเฉ‹ Next.js เจจเฉ‚เฉฐ `/omniroute/...` เจฎเจฟเจฒเฉ‡ เจ…เจคเฉ‡ เจ‰เจน assets เจจเฉ‚เฉฐ `/omniroute/_next/...` เจคเฉ‹เจ‚ serve เจ•เจฐเฉ‡เฅค Docker healthcheck, เจธเจฐเจ—เจฐเจฎ `OMNIROUTE_BASE_PATH` เจจเจพเจฒ prefix เจ•เฉ€เจคเฉ‡ เจนเจฒเจ•เฉ‡ `/healthz` lifecycle endpoint เจจเฉ‚เฉฐ probe เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจฎเจจเฉเฉฑเจ–เฉ€/dashboard diagnostics เจฒเจˆ `/api/monitoring/health` เจ‰เจชเจฒเจฌเจง เจฐเจนเจฟเฉฐเจฆเจพ เจนเฉˆ; เจ•เฉฐเจŸเฉ‡เจจเจฐ HEALTHCHECK เจจเฉ‚เฉฐ เจฎเฉเฉœ เจ‡เจธ เจตเฉฑเจฒ เจฆเจฐเจธเจพเจ‰เจฃ เจฒเจˆ (เจ‰เจฆเจพเจนเจฐเจจ เจตเจœเฉ‹เจ‚, เจกเฉ‚เฉฐเจ˜เฉ€ health enforcement เจฒเจˆ), `OMNIROUTE_HEALTHCHECK_PATH=/api/monitoring/health` เจธเฉˆเฉฑเจŸ เจ•เจฐเฉ‹เฅค เจ‡เจน เจชเจพเจฅ เจ‡เฉฑเจ• **เจกเฉ‚เฉฐเจ˜เฉ€** เจœเจพเจ‚เจš เจนเฉˆ (DB + monitoring summary) โ€” เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจฎเฉเฉœ เจšเฉเจฃเจฆเฉ‡ เจนเฉ‹ เจคเจพเจ‚ เจ‡เจน Docker เจฆเฉ‡ เจ˜เฉฑเจŸ-เจตเจพเจฐ เจšเฉฑเจฒเจฃ เจตเจพเจฒเฉ‡ `HEALTHCHECK` เจฒเจˆ เจขเฉเจ•เจตเจพเจ‚ เจนเฉˆ, เจชเจฐ Kubernetes `livenessProbe` intervals เจฒเจˆ **เจจเจนเฉ€เจ‚**เฅค orchestrators (Kubernetes, Nomad เจ†เจฆเจฟ) เจฒเจˆ: | Probe | เจคเจฐเจœเฉ€เจน เจฆเจฟเจ“ | เจฌเจšเฉ‹ | | --------------- | ------------------------------------------------------------------- | ---------------------------------------------------------- | | Liveness | HTTP `GET /livez`, เจœเจพเจ‚ เจฎเฉเฉฑเจ– port (`PORT`, default `20128`) เจ‰เฉฑเจคเฉ‡ TCP | liveness เจตเจœเฉ‹เจ‚ `/api/monitoring/health` | | Readiness | HTTP `GET /healthz` | เจ›เฉ‹เจŸเฉ‡ timeouts, เจœเฉ‹ event-loop เจฆเฉ‡ busy เจนเฉ‹เจฃ เจจเฉ‚เฉฐ dead เจฎเฉฐเจจเจฆเฉ‡ เจนเจจ | | Deep / blackbox | `/api/monitoring/health` | โ€” | `/healthz` process lifecycle (`ok` / `starting` / `stopping`) เจฆเฉ€ เจฐเจฟเจชเฉ‹เจฐเจŸ เจ•เจฐเจฆเจพ เจนเฉˆเฅค `/livez` เจธเจฟเจฐเจซเจผ process-alive เจนเฉˆ (เจœเจฆเฉ‹เจ‚ เจตเฉ€ handler เจšเฉฑเจฒ เจธเจ•เจฆเจพ เจนเฉˆ, 200; เจ‡เจน readiness เจฆเฉ€ เจ‰เจกเฉ€เจ• เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ)เฅค เจฆเฉ‹เจตเฉ‡เจ‚ เจนเจพเจฒเฉ‡ เจตเฉ€ request handling เจตเจพเจฒเฉ‡ เจ‰เจธเฉ‡ Node event loop เจ‰เฉฑเจคเฉ‡ เจšเฉฑเจฒเจฆเฉ‡ เจนเจจ, เจ‡เจธ เจฒเจˆ CPU-bound catalog เจœเจพเจ‚ compression เจฆเจพ เจ•เฉฐเจฎ เจ‰เจจเฉเจนเจพเจ‚ เจตเจฟเฉฑเจš เจฆเฉ‡เจฐเฉ€ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ โ€” busy โ‰  deadเฅค เจœเฉ‡ HTTP probes time out เจนเฉ‹ เจœเจพเจฃ เจคเจพเจ‚ TCP liveness เจจเฉ‚เฉฐ เจคเจฐเจœเฉ€เจน เจฆเจฟเจ“เฅค เจชเฉ‚เจฐเฉ€ probe เจธเฉ‡เจง: [Monitoring guide โ€” Kubernetes probe recommendations](../ops/MONITORING_GUIDE.md#kubernetes-probe-recommendations)เฅค ## Caddy เจจเจพเจฒ Docker Compose (HTTPS Auto-TLS) OmniRoute เจจเฉ‚เฉฐ Caddy เจฆเฉ€ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• SSL เจชเฉเจฐเฉ‹เจตเจฟเจœเจผเจจเจฟเฉฐเจ— เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจขเฉฐเจ— เจจเจพเจฒ เจ‰เจชเจฒเจฌเจง เจ•เจฐเจตเจพเจ‡เจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ“ เจ•เจฟ เจคเฉเจนเจพเจกเฉ‡ เจกเฉ‹เจฎเฉ‡เจจ เจฆเจพ 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, `NEXT_PUBLIC_BASE_URL` เจจเฉ‚เฉฐ OAuth เจ•เจพเจฒเจฌเฉˆเจ•เจพเจ‚ เจ…เจคเฉ‡ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ‡ เจœเจจเจคเจ• เจฒเจฟเฉฐเจ•เจพเจ‚ เจฒเจˆ เจ•เฉˆเจจเฉ‹เจจเจฟเจ•เจฒ เจœเจจเจคเจ• เจฎเฉ‚เจฒ เจตเจœเฉ‹เจ‚ เจตเจฐเจคเจฆเจพ เจนเฉˆ; เจชเฉเจฐเจฎเจพเจฃเจฟเจค เจกเฉˆเจธเจผเจฌเฉ‹เจฐเจก เจฐเจพเจˆเจŸเจพเจ‚ เจธเจฎเจพเจจ-เจฎเฉ‚เจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ‡ เจจเจพเจฒ เจธเฉˆเจธเจผเจจ-เจฌเฉฑเจง 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 เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ€เจ†เจ‚เฅค เจ‡เจน เจšเฉˆเจจเจฒ เจ‰เจนเจจเจพเจ‚ fixes เจฒเจˆ pull เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เจฃ เจตเจพเจฒเฉ€ image เจฎเฉเจนเฉฑเจˆเจ† เจ•เจฐเจฆเจพ เจนเฉˆ เจœเฉ‹ เจ…เจ—เจฒเจพ stable tag เจฌเจฃเจพเจ เจœเจพเจฃ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจธเจฐเจ—เจฐเจฎ release เจฌเฉเจฐเจพเจ‚เจš เจตเจฟเฉฑเจš merge เจนเฉ‹ เจšเฉเฉฑเจ•เฉ€เจ†เจ‚ เจนเจจเฅค ```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 ``` #### เจธเฉเจฐเฉฑเจ–เจฟเจ† เจ…เจคเฉ‡ เจฐเฉ‹เจฒเจฌเฉˆเจ• `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 เจฒเจ“เฅค เจฐเฉ‹เจฒเจฌเฉˆเจ• เจ•เจฐเจจ เจฒเจˆ, เจชเจนเจฟเจฒเจพเจ‚ เจตเจฐเจคเฉ‡ เจ—เจ 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-vulnerability gate เจฌเจฐเจ•เจฐเจพเจฐ เจฐเจนเจฟเฉฐเจฆเจพ เจนเฉˆเฅค **`latest`, git เจฒเจˆ เจจเจตเฉ€เจจเจคเจฎ เจนเฉ‹เจฃ เจฆเฉ€ เจ—เจพเจฐเฉฐเจŸเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค** `main` เจœเจพเจ‚ เจธเจฐเจ—เจฐเจฎ `release/v*` เจฌเฉเจฐเจพเจ‚เจš เจ‰เฉฑเจคเฉ‡ merge เจ•เฉ€เจคเฉ€เจ†เจ‚ fixes เจ‰เจฆเฉ‹เจ‚ เจคเฉฑเจ• `:latest` เจตเจฟเฉฑเจš **เจธเจผเจพเจฎเจฒ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเฉ€เจ†เจ‚**, เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• เจ‡เฉฑเจ• stable SemVer image เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจ…เจคเฉ‡ publish job `:latest` เจจเฉ‚เฉฐ promote เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ€ (เจ‰เจธ SemVer เจตเจพเจฒเจพ เจนเฉ€ digest)เฅค เจœเฉ‡ GitHub เจ‰เฉฑเจคเฉ‡ fix เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡ เจฐเจนเฉ€ เจนเฉˆ เจชเจฐ `latest` เจฐเฉเจ•เจฟเจ† เจนเฉ‹เจ‡เจ† เจฒเฉฑเจ—เจฆเจพ เจนเฉˆ, เจคเจพเจ‚ release เจฌเฉเจฐเจพเจ‚เจš เจจเฉ‚เฉฐ เจŸเฉˆเจธเจŸ เจ•เจฐเจจ เจฒเจˆ `:next` pull เจ•เจฐเฉ‹ เจœเจพเจ‚ SemVer tag เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเฉ‹เฅค | เจคเฉเจธเฉ€เจ‚ เจ•เฉ€ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹ | เจตเจฐเจคเฉ‹ | | ---------------------------------------------------------------------------------- | --------------------------------------- | | GitOps / production เจœเจฟเจธ เจตเจฟเฉฑเจš drift เจจเจนเฉ€เจ‚ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ | `:X.Y.Z` (เจœเจพเจ‚ image digest) เจจเฉ‚เฉฐ pin เจ•เจฐเฉ‹ | | เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค stable releases เจจเฉ‚เฉฐ follow เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจนเจฐ release เจ‰เฉฑเจคเฉ‡ recreate เจธเจตเฉ€เจ•เจพเจฐ เจ•เจฐเจจเจพ | `:latest` | | เจ…เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค `release/v*` commits เจจเฉ‚เฉฐ เจŸเฉˆเจธเจŸ เจ•เจฐเจจเจพ | `:next` (production เจฒเจˆ เจจเจนเฉ€เจ‚) | | `main` เจจเฉ‚เฉฐ เจŸเฉˆเจธเจŸ เจ•เจฐเจจเจพ | `:main` (production เจฒเจˆ เจจเจนเฉ€เจ‚) | ## Docker เจตเจฟเฉฑเจš เจกเฉˆเจธเจผเจฌเฉ‹เจฐเจก เจ…เฉฑเจชเจกเฉ‡เจŸ เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจ‡เจฎเฉ‡เจœ เจตเจพเจฒเจพ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจ†เจชเจฃเฉ‡ เจ†เจช เจจเฉ‚เฉฐ เจฌเจฆเจฒ เจจเจนเฉ€เจ‚ เจธเจ•เจฆเจพเฅค เจœเจฆเฉ‹เจ‚ OmniRoute เจจเฉ‚เฉฐ เจชเจคเจพ เจฒเฉฑเจ—เจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจน เจ•เจฟเจธเฉ‡ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจšเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉˆ (`.git` เจšเฉˆเฉฑเจ•เจ†เจ‰เจŸ เจจเจนเฉ€เจ‚, 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=Watch for OmniRoute dashboard update requests [Path] PathExists=/srv/omniroute/data/update/docker-update.request [Install] WantedBy=multi-user.target ``` ```ini # /etc/systemd/system/omniroute-update.service [Unit] Description=Pull and recreate the OmniRoute container [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 ``` เจธเฉ‡เจตเจพ เจชเฉเฉฑเจฒ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจฌเฉ‡เจจเจคเฉ€ เจจเฉ‚เฉฐ เจนเจŸเจพเจ‰เจ‚เจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจœเฉ‹ เจ…เจธเจซเจฒ เจฐเจจ เจฒเฉ‚เจช เจตเจฟเฉฑเจš เจจเจพ เจชเจตเฉ‡เฅค `DOCKER_UPDATE_TRIGGER_FILE` เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจกเฉˆเจธเจผเจฌเฉ‹เจฐเจก เจฎเฉˆเจจเฉเจ…เจฒ เจ•เจฎเจพเจ‚เจก เจชเฉเจฐเจตเจพเจน เจจเฉ‚เฉฐ เจœเจพเจฐเฉ€ เจฐเฉฑเจ–เจฆเจพ เจนเฉˆเฅค ## เจ‰เจชเจฒเจฌเจงเจคเจพ: เจกเจฟเจซเจพเจฒเจŸ SQLite เจ‡เฉฑเจ•เฉ‹ เจฐเฉˆเจชเจฒเจฟเจ•เจพ เจตเจพเจฒเจพ เจนเฉˆ เจฎเจฟเจ†เจฐเฉ€ Docker / Kubernetes OmniRoute เจตเจฟเฉฑเจš **เจ‡เฉฑเจ• Node เจชเฉเจฐเฉ‹เจธเฉˆเฉฑเจธ + เจ‡เฉฑเจ• SQLite เจฐเจพเจˆเจŸเจฐ** เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจŸเฉ‹เจชเฉ‹เจฒเฉ‹เจœเฉ€ เจ‰เฉฑเจคเฉ‡ เจ‰เฉฑเจš เจ‰เจชเจฒเจฌเจงเจคเจพ **เจธเจฎเจฐเจฅเจฟเจค เจจเจนเฉ€เจ‚ เจนเฉˆ**เฅค | เจชเจพเจฌเฉฐเจฆเฉ€ | เจจเจคเฉ€เจœเจพ | | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | เจ‡เฉฑเจ•เฉ‹ เจฐเจพเจˆเจŸเจฐ | เจ‡เฉฑเจ•เฉ‹ SQLite เจซเจผเจพเจˆเจฒ เจฒเจˆ เจ•เจˆ เจฐเฉˆเจชเจฒเจฟเจ•เจพ **เจจเจพ** เจšเจฒเจพเจ“เฅค เจ‡เจธ เจจเจพเจฒ DB เจ–เจผเจฐเจพเจฌ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค | | เจฎเฉเฉœ เจฌเจฃเจพเจ‰เจฃเจพ / เจฐเฉ€เจธเจŸเจพเจฐเจŸ / HEALTHCHECK เจ•เจฟเจฒ | เจšเฉฑเจฒ เจฐเจนเฉ‡ SSE, เจกเฉˆเจธเจผเจฌเฉ‹เจฐเจก เจธเฉˆเจธเจผเจจเจพเจ‚ เจ…เจคเฉ‡ เจ‡เจจ-เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจธเจฅเจฟเจคเฉ€ เจฆเฉ€ **เจชเฉ‚เจฐเฉ€ เจฌเฉฐเจฆเจธเจผ**เฅค เจนเจฐ เจ•เจจเฉˆเจ•เจŸ เจ•เฉ€เจคเจพ เจ•เจฒเจพเจ‡เฉฐเจŸ เจกเจฟเจธเจ•เจจเฉˆเจ•เจŸ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ–เจผเจพเจฒเฉ€-เจเจ‚เจกเจชเฉŒเจ‡เฉฐเจŸ เจตเจฟเฉฐเจกเฉ‹ เจฆเฉŒเจฐเจพเจจ เจจเจตเฉ€เจ†เจ‚ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจฐเจฟเจตเจฐเจธ-เจชเฉเจฐเฉŒเจ•เจธเฉ€ **`502 Bad Gateway: Unknown error`** เจฎเจฟเจฒเจฆเจพ เจนเฉˆ, OmniRoute JSON เจจเจนเฉ€เจ‚ โ€” เจ•เจฒเจพเจ‡เฉฐเจŸ เจ‡เจธเจจเฉ‚เฉฐ เจชเฉเจฐเฉ‹เจตเจพเจˆเจกเจฐ เจฆเฉ€ เจ…เจธเจซเจฒเจคเจพ เจคเฉ‹เจ‚ เจตเฉฑเจ–เจฐเจพ เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ (#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 เจนเจŸเจพเจ‰เจฃ เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจœเฉ‹ **เจจเจตเจพเจ‚** เจŸเฉเจฐเฉˆเจซเจผเจฟเจ• เจฌเฉฐเจฆ เจนเฉ‹ เจฐเจนเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจคเฉฑเจ• เจชเจนเฉเฉฐเจšเจฃเจพ เจฌเฉฐเจฆ เจ•เจฐ เจฆเฉ‡เจตเฉ‡เฅค เจšเฉฑเจฒ เจฐเจนเฉ€ `/v1/responses` SSE เจจเฉ‚เฉฐ heavyweight admission leases (#11015) เจฐเจพเจนเฉ€เจ‚ `SHUTDOWN_TIMEOUT_MS` (เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš 30s) เจคเฉฑเจ• เจชเฉ‚เจฐเจพ เจนเฉ‹เจฃ เจฆเจฟเฉฑเจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจœเจฟเจนเฉœเฉ€เจ†เจ‚ เจจเจตเฉ€เจ†เจ‚ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจซเจฟเจฐ เจตเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจคเฉฑเจ• เจชเจนเฉเฉฐเจšเจฆเฉ€เจ†เจ‚ เจนเจจ, เจ‰เจจเฉเจนเจพเจ‚ เจจเฉ‚เฉฐ `503` + `Retry-After: 5` เจฎเจฟเจฒเจฆเจพ เจนเฉˆเฅค เจฌเจฆเจฒเจตเจพเจ‚ Ready เจนเฉ‹เจฃ เจคเฉฑเจ• Recreate เจ•เจพเจฐเจจ เจฌเจฃเจฟเจ† เจ–เจผเจพเจฒเฉ€-endpoint เจ…เฉฐเจคเจฐเจพเจฒ เจชเฉ‚เจฐเฉ€ เจธเฉ‡เจตเจพ-เจฌเฉฐเจฆเฉ€ เจนเฉ€ เจฐเจนเจฟเฉฐเจฆเจพ เจนเฉˆ โ€” เจ‡เจน SQLite เจŸเฉ‹เจชเฉ‹เจฒเฉ‹เจœเฉ€ เจฆเจพ เจจเจคเฉ€เจœเจพ เจนเฉˆ, probe เจฆเฉ€ เจ—เจผเจฒเจค เจธเฉฐเจฐเจšเจจเจพ เจจเจนเฉ€เจ‚เฅค External Postgres / multi-writer HA เจ•เฉ‹เจˆ **เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจฌเฉฑเจง** เจฎเจฟเจ†เจฐเฉ€ เจฐเจพเจน เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจœเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ HA เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจคเจพเจ‚ เจ‡เฉฑเจ•เฉ‹ replica เจฐเฉฑเจ–เฉ‹ เจœเจพเจ‚ เจ…เจœเจฟเจนเฉ€ เจŸเฉ‹เจชเฉ‹เจฒเฉ‹เจœเฉ€ เจšเจฒเจพเจ“ เจœเจฟเจธเจฆเฉ€ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจจเฉ‡ เจตเฉฑเจ–เจฐเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจœเจพเจ‚เจš เจ•เฉ€เจคเฉ€ เจ…เจคเฉ‡ เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจฌเฉฑเจง เจ•เฉ€เจคเจพ เจนเฉ‹เจตเฉ‡เฅค Postgres/MySQL เจธเฉฐเจฌเฉฐเจงเฉ€ เจ•เฉฐเจฎ [#8075](https://github.com/diegosouzapw/OmniRoute/issues/8075) เจตเจฟเฉฑเจš เจนเฉˆเฅค เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• เจ‡เจน เจœเจพเจฐเฉ€ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเจพ, **เจตเฉฑเจกเฉ€เจ†เจ‚** `/v1/responses` เจฆเฉ€ เจธเจฎเจฐเฉฑเจฅเจพ เจตเจงเจพเจ‰เจฃ เจฆเจพ เจ‡เจ•เฉฑเจฒเจพ เจธเจฎเจฐเจฅเจฟเจค เจคเจฐเฉ€เจ•เจพ N เจธเฉเจคเฉฐเจคเจฐ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ (เจ…เจ—เจฒเจพ เจญเจพเจ—) เจนเจจ, เจจเจพ เจ•เจฟ เจ‡เฉฑเจ• volume เจ‰เฉฑเจคเฉ‡ `replicas > 1`เฅค ## เจธเจ•เฉ‡เจฒ-เจ†เจ‰เจŸ: N เจธเฉเจคเฉฐเจคเจฐ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ†เจตเจพเจ‚ เจ‡เฉฑเจ• Node เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† **เจ‡เฉฑเจ• V8 เจนเฉ€เจช** เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจฆเฉ‹ เจ‡เฉฑเจ•-เจฆเฉ‚เจœเฉ‡ เจจเจพเจฒ เจ“เจตเจฐเจฒเฉˆเจช เจ•เจฐเจฆเฉ€เจ†เจ‚ ~3โ€ฏMiB / ~750k-token เจ•เฉ‹เจกเจฟเฉฐเจ—-เจเจœเฉฐเจŸ `POST /v1/responses` เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ (RTK + Caveman) เจฒเจ—เจญเจ— ~12โ€ฏGi เจ‰เฉฑเจคเฉ‡ เจ‰เจธ เจนเฉ€เจช เจจเฉ‚เฉฐ เจฐเฉ‹เจ• เจฆเจฟเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ (`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` เจ‡เฉฑเจ• **เจธเจฟเจนเจคเจฎเฉฐเจฆ** เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† (เจนเฉ€เจช `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 เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ) เจ‡เฉฑเจ• **เจฎเฉˆเจฎเฉ‹เจฐเฉ€-เจฌเจœเจŸ** เจฆเจพ เจธเจตเจพเจฒ เจนเฉˆ โ€” เจนเฉ€เจช + เจชเฉเจฐเจพเจ‡เจฎเจฐเฉ€/เจนเฉˆเฉฑเจกเจฐเฉ‚เจฎ เจธเจฒเจพเจŸ + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` เจฆเจพ เจ†เจ•เจพเจฐ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเฉ‹ โ€” เจ‡เจน เจ‰เจคเจชเจพเจฆ เจฆเฉ€ เจธเจ–เจผเจค โ€œเจ…เจงเจฟเจ•เจคเจฎ 2โ€ เจธเฉ€เจฎเจพ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจฆเจฌเจพเจ… เจนเฉ‡เจ เจฒเจพ เจนเฉ€เจช เจซเจฟเจฐ เจตเฉ€ เจฆเฉเจฌเจพเจฐเจพ เจ•เฉ‹เจธเจผเจฟเจธเจผเจฏเฉ‹เจ— `503` เจจเจพเจฒ เจฒเฉ‹เจก เจ˜เจŸเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจœเฉ‹ #7849 เจฎเฉเฉœ เจจเจพ เจตเจพเจชเจฐเฉ‡เฅค **เจนเฉ€เจชเจพเจ‚ เจจเฉ‚เฉฐ เจ—เฉเจฃเจพ เจ•เจฐเจจ** (เจธเฉเจคเฉฐเจคเจฐ V8 old-spaces) เจฒเจˆ **เจ…เฉฑเจœ**: | เจ‡เจน เจ•เจฐเฉ‹ | เจ‡เจน เจจเจพ เจ•เจฐเฉ‹ | | -------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | | **N containers/pods** เจšเจฒเจพเจ“, เจนเจฐเฉ‡เจ• เจฆเฉ‡ เจ†เจชเจฃเฉ‡ **เจตเฉฑเจ–เจฐเฉ‡** `DATA_DIR` / volume เจจเจพเจฒ | เจ‡เฉฑเจ• SQLite เจซเจผเจพเจˆเจฒ เจฒเจˆ `replicas > 1` เจธเฉˆเฉฑเจŸ เจ•เจฐเฉ‹ | | เจญเจพเจฐเฉ€ เจ‡เจจ-เจซเจฒเจพเจˆเจŸ + เจธเจฟเจนเจคเจฎเฉฐเจฆ-เจนเฉˆเฉฑเจกเจฐเฉ‚เจฎ เจฆเจพ เจ†เจ•เจพเจฐ เจนเฉ€เจช / เจ‡เจจเจซเจฒเจพเจˆเจŸ-เจฌเจพเจˆเจŸ เจฌเจœเจŸ เจฆเฉ‡ เจ†เจงเจพเจฐ โ€™เจคเฉ‡ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเฉ‹; 1โ€“2 เจธเฉฐเจญเจพเจฒเฉ‚ #7849 เจกเจฟเจซเฉŒเจฒเจŸ เจนเฉˆ, เจ‰เจคเจชเจพเจฆ เจฆเฉ€ เจธเจ–เจผเจค เจ…เจงเจฟเจ•เจคเจฎ เจธเฉ€เจฎเจพ เจจเจนเฉ€เจ‚ | เจ‡เฉฑเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ 8ร— RAM เจ…เจคเฉ‡ เจฌเฉ‡เจนเฉฑเจฆ เจ—เจฟเจฃเจคเฉ€ เจธเฉ€เจฎเจพ เจฆเจฟเจ“ | | เจตเจฟเจ•เจฒเจชเจฟเจ•: **เจธเจพเจ‚เจเฉ‡ เจ•เฉ‹เจŸเจพ เจ•เจพเจŠเจ‚เจŸเจฐเจพเจ‚** เจฒเจˆ `QUOTA_STORE_DRIVER=redis` + `QUOTA_STORE_REDIS_URL` | Redis เจจเฉ‚เฉฐ เจธเจพเจ‚เจเฉ€ SQLite เจธเจฎเจเฉ‹ โ€” เจ‡เจน เจ…เจœเจฟเจนเจพ เจจเจนเฉ€เจ‚ เจนเฉˆ | | เจชเฉเจฐเจฆเจพเจคเจพ เจธเฉ€เจ•เฉเจฐเฉ‡เจŸ เจนเจฐ เจ‡เฉฐเจธเจŸเฉˆเจ‚เจธ เจตเจฟเฉฑเจš เจจเจ•เจฒ เจ•เจฐเฉ‹ (เจœเจพเจ‚ เจตเฉฐเจกเฉ‡ เจนเฉ‹เจ เจกเฉˆเจธเจผเจฌเฉ‹เจฐเจก เจธเจตเฉ€เจ•เจพเจฐ เจ•เจฐเฉ‹) | เจธเจพเจฐเฉ‡ เจ‡เฉฐเจธเจŸเฉˆเจ‚เจธเจพเจ‚ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจกเฉˆเจธเจผเจฌเฉ‹เจฐเจก / เจ‡เฉฑเจ• เจ•เจพเจฒ-เจฒเฉŒเจ— เจฆเฉ€ เจ‰เจฎเฉ€เจฆ เจ•เจฐเฉ‹ | | เจ…เฉฑเจ—เฉ‡ เจ•เฉ‹เจˆ เจตเฉ€ เจฒเฉ‹เจก เจฌเฉˆเจฒเฉˆเจ‚เจธเจฐ เจฒเจ—เจพเจ“; API เจ•เฉเฉฐเจœเฉ€ เจœเจพเจ‚ เจธเฉˆเจธเจผเจจ เจ…เจจเฉเจธเจพเจฐ เจธเจŸเจฟเฉฑเจ•เฉ€ เจนเฉ‹เจฃเจพ เจ•เจพเจซเจผเฉ€ เจนเฉˆ | เจตเจฟเจ•เจฐเฉ‡เจคเจพ-เจตเจฟเจธเจผเฉ‡เจธเจผ เจ†เจ•เจพเจฐ-เจธเจšเฉ‡เจค เจฎเจฟเจกเจฒเจตเฉ‡เจ…เจฐ เจจเฉ‚เฉฐ เจฒเจพเจœเจผเจฎเฉ€ เจฌเจฃเจพเจ“ | เจนเจพเจฐเจกเจตเฉ‡เจ…เจฐ: เจชเฉเจฐเจคเฉ€-เจ‡เฉฐเจธเจŸเฉˆเจ‚เจธ เจธเจฎเจ•เจพเจฒเฉ€ เจฒเฉฐเจฌเฉ€เจ†เจ‚ `/v1/responses` เจ‡เฉฑเจ• **เจฎเฉˆเจฎเฉ‹เจฐเฉ€-เจฌเจœเจŸ** เจฆเจพ เจธเจตเจพเจฒ เจนเจจ (เจนเฉ€เจช + เจ‡เจจเจซเจฒเจพเจˆเจŸ-เจฌเจพเจˆเจŸ / #10110)เฅค `N` เจธเฉเจคเฉฐเจคเจฐ `DATA_DIR`s เจซเจฟเจฐ เจตเฉ€ เจนเฉ€เจชเจพเจ‚ เจจเฉ‚เฉฐ เจ—เฉเจฃเจพ เจ•เจฐเจฆเฉ‡ เจนเจจ: เจนเฉ‹เจธเจŸ RAM เจจเฉ‚เฉฐ `N ร— cgroup` เจธเฉฐเจญเจพเจฒเจฃเจพ เจฒเจพเจœเจผเจฎเฉ€ เจนเฉˆ, เจจเจพ เจ•เจฟ โ€œN=8 เจตเจพเจฒเจพ เจ‡เฉฑเจ• 16โ€ฏGi podเฅคโ€ เจ‡เฉฑเจ• SQLite เจซเจผเจพเจˆเจฒ เจ‰เฉฑเจคเฉ‡ เจ•เจฆเฉ‡ เจตเฉ€ `replicas > 1` เจจเจพ เจตเจฐเจคเฉ‹เฅค Compose เจ–เจพเจ•เจพ (เจฆเฉ‹ เจนเฉ€เจช, เจฆเฉ‹ เจตเจพเจฒเจฟเจŠเจฎ โ€” `deploy.replicas: 2` เจจเจนเฉ€เจ‚): ```yaml services: omniroute-a: image: diegosouzapw/omniroute:3.8.49 environment: DATA_DIR: /app/data OMNIROUTE_MEMORY_MB: "12288" QUOTA_STORE_DRIVER: redis QUOTA_STORE_REDIS_URL: redis://redis:6379 volumes: [omniroute-a-data:/app/data] ports: ["20128:20128"] omniroute-b: image: diegosouzapw/omniroute:3.8.49 environment: DATA_DIR: /app/data OMNIROUTE_MEMORY_MB: "12288" QUOTA_STORE_DRIVER: redis QUOTA_STORE_REDIS_URL: redis://redis:6379 volumes: [omniroute-b-data:/app/data] ports: ["20138:20128"] volumes: omniroute-a-data: omniroute-b-data: ``` เจ‡เจจ-เจชเฉเจฐเฉ‹เจธเฉˆเจธ เจ˜เจฃเจคเจพ (HTTP isolate เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ เจ•เฉฐเจชเฉเจฐเฉˆเจธเจผเจจ) [#11023](https://github.com/diegosouzapw/OmniRoute/issues/11023) เจนเฉˆเฅค เจธเจพเจ‚เจเฉ€ เจŸเจฟเจ•เจพเจŠ เจธเจŸเฉ‡เจŸ เจ‰เฉฑเจคเฉ‡ เจ‡เฉฑเจ• เจฒเฉŒเจœเจฟเจ•เจฒ เจ•เจฒเฉฑเจธเจŸเจฐ [#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` เจ‰เฉฑเจคเฉ‡ เจธเจฟเจฐเจซเจผ-เจชเฉœเฉเจนเจจเจฏเฉ‹เจ— เจขเฉฐเจ— เจจเจพเจฒ เจฌเจพเจˆเจ‚เจก-เจฎเจพเจŠเจ‚เจŸ เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฒเจˆ เจธเฉ‡เจตเจพ เจฎเฉเฉœ เจฌเจฃเจพเจ“เฅค เจ‡เจน เจ‰เจธ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจฆเฉ‡ **เจธเจพเจฐเฉ‡ เจ†เจ‰เจŸเจฌเจพเจŠเจ‚เจก เจŸเฉเจฐเฉˆเจซเจฟเจ•** เจฒเจˆ 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` เจนเจตเจพเจฒเจพ