Skip to content

dkfhddla/codex-lb-cinamon

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

536 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

codex-lb-cinamon

์—ฌ๋Ÿฌ ChatGPT ๊ณ„์ •์„ ๋ฌถ์–ด์„œ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ด€๋ฆฌํ•˜๊ณ , Codex CLI๋‚˜ OpenAI ํ˜ธํ™˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ณตํ†ต ์—”๋“œํฌ์ธํŠธ๋กœ ๋ถ™์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ”„๋ก์‹œ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ์—์„œ ๊ณ„์ •, API ํ‚ค, ์‚ฌ์šฉ๋Ÿ‰, ์ตœ๊ทผ ์š”์ฒญ์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํฌํฌ codex-lb-cinamon์€ codex-lb๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ, OpenAI Platform API key๋ฅผ ๋ณด์กฐ upstream์œผ๋กœ ๋“ฑ๋กํ•ด ChatGPT ๊ณ„์ •๋“ค์˜ ์‚ฌ์šฉ๋Ÿ‰์ด ๋ชจ๋‘ ์†Œ์ง„๋˜์—ˆ์„ ๋•Œ fallback์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์ฆ‰ ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋Š” ๊ณ„์† ChatGPT ๊ณ„์ • ํ’€์„ ์‚ฌ์šฉํ•˜๊ณ , ํ•„์š”ํ•  ๋•Œ๋งŒ Platform API๋กœ ์šฐํšŒํ•˜๋Š” ๊ฐœ์ธ/์‚ฌ๋‚ด ์šด์˜์šฉ ํฌํฌ๋ฅผ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

Platform fallback ์ฃผ์˜์‚ฌํ•ญ

  • openai_platform์€ ์—ฌ์ „ํžˆ fallback ์ „์šฉ์ž…๋‹ˆ๋‹ค. ์ตœ์†Œ 1๊ฐœ์˜ ํ™œ์„ฑ chatgpt_web ๊ณ„์ •์ด ์žˆ์–ด์•ผ ๋“ฑ๋ก๊ณผ ๋ผ์šฐํŒ…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ fallback์€ ๋ชจ๋“  ํ˜ธํ™˜ ChatGPT ๊ณ„์ •์ด drain ๊ธฐ์ค€์„ ๋„˜์—ˆ์„ ๋•Œ๋งŒ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ ๊ธฐ์ค€: primary remaining <= 10%, secondary remaining <= 5%
  • CODEX_LB_PLATFORM_FALLBACK_FORCE_ENABLED=true๋ฅผ ์ฃผ๋ฉด usage drain ์—ฌ๋ถ€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ fallback ํŒ์ •์„ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • backend_codex_http๋ฅผ ์ผœ๋ฉด HTTP GET /backend-api/codex/models ์™€ HTTP POST /backend-api/codex/responses ๊ฐ€ Platform fallback ํ›„๋ณด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • HTTP POST /backend-api/codex/responses ์—์„œ session_id, x-codex-session-id, x-codex-conversation-id, x-codex-turn-state ๊ฐ™์€ Codex ์„ธ์…˜ ํ—ค๋”๋Š” fallback์„ ๋ง‰์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ payload์˜ conversation ๋˜๋Š” previous_response_id ๋Š” ์—ฌ์ „ํžˆ Platform์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ fallback ๋Œ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
  • websocket /backend-api/codex/responses, /v1/chat/completions, compact ๊ฒฝ๋กœ๋Š” phase 1์—์„œ Platform fallback์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

  • ์—ฌ๋Ÿฌ ChatGPT ๊ณ„์ •์„ ํ•œ ํ’€๋กœ ๋ฌถ์–ด์„œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ
  • ๊ณ„์ •๋ณ„ ์‚ฌ์šฉ๋Ÿ‰, ํ† ํฐ, ๋น„์šฉ, ์ตœ๊ทผ ์ถ”์ด ํ™•์ธ
  • ๋Œ€์‹œ๋ณด๋“œ์—์„œ API ํ‚ค ๋ฐœ๊ธ‰ ๋ฐ ํ‚ค๋ณ„ ์ œํ•œ ์„ค์ •
  • Codex CLI, OpenCode, OpenClaw, OpenAI SDK์™€ ์—ฐ๋™
  • ์—…์ŠคํŠธ๋ฆผ ๋ชจ๋ธ ๋ชฉ๋ก ์ž๋™ ๋™๊ธฐํ™”
  • ๋Œ€์‹œ๋ณด๋“œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ ์„ ํƒํ˜• TOTP ์ธ์ฆ

๋น ๋ฅธ ์‹œ์ž‘

PyPI๋กœ ์„ค์น˜:

macOS / Linux:

python3.13 -m venv .venv
source .venv/bin/activate
pip install codex-lb-cinamon
codex-lb-cinamon start
# ๋™์ž‘ ์ƒํƒœ ํ™•์ธ
codex-lb-cinamon status
# ์ข…๋ฃŒ ์‹œ
codex-lb-cinamon shutdown

Windows PowerShell:

py -3.13 -m venv .venv
.venv\Scripts\Activate.ps1
pip install codex-lb-cinamon
codex-lb-cinamon start
# ๋™์ž‘ ์ƒํƒœ ํ™•์ธ
codex-lb-cinamon status
# ์ข…๋ฃŒ ์‹œ
codex-lb-cinamon shutdown

ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ๋ช…์‹œ ์‹คํ–‰:

codex-lb-cinamon serve

macOS ๋ฉ”๋‰ด๋ฐ” ์•ฑ ์‹คํ–‰:

# ๋ฉ”๋‰ด๋ฐ” ์•ฑ์—์„œ ์„œ๋ฒ„ ์‹œ์ž‘/์ข…๋ฃŒ๊นŒ์ง€ ํ•จ๊ป˜ ์ œ์–ด
codex-lb-cinamon menubar --manage-server --start-on-launch

๊ฐœ๋ฐœ ์ฒดํฌ์•„์›ƒ์—์„œ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ๊ฐ™์€ ๋ช…๋ น ์•ž์— uv run์„ ๋ถ™์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

uv run codex-lb-cinamon menubar --manage-server --start-on-launch

ํ„ฐ๋ฏธ๋„ ์—†์ด ์›ํด๋ฆญ์œผ๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด Finder์—์„œ repo ๋ฃจํŠธ ํด๋”๋ฅผ ์—ด๊ณ  CodexLBCinamonMenubar.app ์•„์ด์ฝ˜์„ ๋”๋ธ”ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

/Users/jacob/Workspace/codex-lb-cinamon/CodexLBCinamonMenubar.app

์ž์ฃผ ์“ด๋‹ค๋ฉด ์ด .app ์•„์ด์ฝ˜์„ Dock์— ๋Œ์–ด๋‹ค ๋†“๊ณ  Dock์—์„œ ํด๋ฆญํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด ๋Ÿฐ์ฒ˜๋Š” repo ๋ฃจํŠธ์— ๋‘” ๊ฐœ๋ฐœ ์ฒดํฌ์•„์›ƒ์šฉ ์•ฑ ๋ฒˆ๋“ค์ด๋ฉฐ, ๋‚ด๋ถ€์ ์œผ๋กœ .venv/bin/python -m app.cli menubar --manage-server --start-on-launch๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

menubar --manage-server๋Š” macOS ์ƒ๋‹จ ๋ฉ”๋‰ด๋ฐ”์—์„œ ์„œ๋ฒ„ ์‹œ์ž‘/์ข…๋ฃŒ, ์ƒํƒœ ์ƒˆ๋กœ๊ณ ์นจ, ๋Œ€์‹œ๋ณด๋“œ ์—ด๊ธฐ, ๋กœ๊ทธ ์—ด๊ธฐ, codex-provider sync ์‹คํ–‰์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. --start-on-launch๋ฅผ ํ•จ๊ป˜ ์ฃผ๋ฉด ๋ฉ”๋‰ด๋ฐ” ์•ฑ ์‹œ์ž‘ ์‹œ ์ถ”์ ๋œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„œ๋ฒ„๊ฐ€ ์—†์„ ๋•Œ ์ž๋™์œผ๋กœ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Sync Providers ๋ฉ”๋‰ด๋Š” codex-provider ์‹คํ–‰ ํŒŒ์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. LaunchAgent๋‚˜ Dock ์‹คํ–‰์€ shell PATH๋ฅผ ๊ทธ๋Œ€๋กœ ์ƒ์†ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ž๋™ ๊ฐ์ง€๊ฐ€ ์‹คํŒจํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” CODEX_PROVIDER_BIN์— ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์„ธ์š”.

export CODEX_PROVIDER_BIN=/opt/homebrew/bin/codex-provider

์ด ๋ช…๋ น์€ ๋ฉ”๋‰ด๋ฐ” ์•ฑ ์ž์ฒด๋ฅผ ํ„ฐ๋ฏธ๋„ foreground ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ„ฐ๋ฏธ๋„์„ ๋‹ซ์œผ๋ฉด ๋ฉ”๋‰ด๋ฐ” ์•ฑ๋„ ํ•จ๊ป˜ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. --manage-server์™€ --start-on-launch๋Š” ์ถ”์ ๋œ API ์„œ๋ฒ„๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์˜ต์…˜์ด๋ฉฐ, ๋ฉ”๋‰ด๋ฐ” ์•ฑ ํ”„๋กœ์„ธ์Šค๋ฅผ macOS ๋กœ๊ทธ์ธ ํ•ญ๋ชฉ์ด๋‚˜ LaunchAgent๋กœ ๋“ฑ๋กํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

ํ„ฐ๋ฏธ๋„๊ณผ ๋ถ„๋ฆฌํ•ด์„œ ์‹คํ–‰ํ•˜๋ ค๋ฉด nohup์œผ๋กœ detached ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mkdir -p ~/.codex-lb
nohup uv run codex-lb-cinamon menubar --manage-server --start-on-launch \
  > ~/.codex-lb/menubar.log 2>&1 &
disown

์ผ์ƒ์ ์œผ๋กœ ๊ณ„์† ์‚ฌ์šฉํ•  ๋•Œ๋Š” macOS LaunchAgent ๋“ฑ๋ก์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ํ˜„์žฌ checkout์„ ์ „์—ญ ๋„๊ตฌ๋กœ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

uv tool install --reinstall .

uv๊ฐ€ /Users/jacob/.local/bin์ด PATH์— ์—†๋‹ค๊ณ  ์•ˆ๋‚ดํ•˜๋ฉด, LaunchAgent์˜ ProgramArguments์—๋Š” /Users/jacob/.local/bin/codex-lb-cinamon์ฒ˜๋Ÿผ ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ codex-lb-cinamon๋งŒ ์ž…๋ ฅํ•ด ์ตœ์‹  ์„ค์น˜๋ณธ์„ ์“ฐ๋ ค๋ฉด ~/.local/bin์„ shell PATH ์•ž์ชฝ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋‹ค์Œ ~/Library/LaunchAgents/com.cinev.codex-lb-cinamon.menubar.plist์— ์•„๋ž˜์ฒ˜๋Ÿผ ๋“ฑ๋กํ•˜๋ฉด ๋กœ๊ทธ์ธ ์‹œ ๋ฉ”๋‰ด๋ฐ” ์•ฑ์ด ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๊ณ , ๋ฉ”๋‰ด๋ฐ” ์•ฑ์ด ์„œ๋ฒ„๋ฅผ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.cinev.codex-lb-cinamon.menubar</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Users/jacob/.local/bin/codex-lb-cinamon</string>
    <string>menubar</string>
    <string>--manage-server</string>
    <string>--start-on-launch</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>EnvironmentVariables</key>
  <dict>
    <key>CODEX_PROVIDER_BIN</key>
    <string>/opt/homebrew/bin/codex-provider</string>
  </dict>
  <key>KeepAlive</key>
  <dict>
    <key>SuccessfulExit</key>
    <false/>
  </dict>
  <key>StandardOutPath</key>
  <string>/Users/jacob/.codex-lb/menubar.launchd.out.log</string>
  <key>StandardErrorPath</key>
  <string>/Users/jacob/.codex-lb/menubar.launchd.err.log</string>
</dict>
</plist>

๋“ฑ๋ก ํ›„ ์ฆ‰์‹œ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ํ˜„์žฌ macOS ์‚ฌ์šฉ์ž UID๋ฅผ ํ™•์ธํ•œ ๋’ค bootstrap/kickstart๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

id -u
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.cinev.codex-lb-cinamon.menubar.plist
launchctl kickstart -k gui/$(id -u)/com.cinev.codex-lb-cinamon.menubar

ํ•ด์ œํ•˜๋ ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

launchctl bootout gui/$(id -u)/com.cinev.codex-lb-cinamon.menubar

์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ์„œ๋ฒ„๋งŒ ์ฝ๊ณ  ์‹ถ๋‹ค๋ฉด ๊ธฐ์กด์ฒ˜๋Ÿผ base URL์„ ์ง€์ •ํ•ด ์ƒํƒœ ์•ฑ์œผ๋กœ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

codex-lb-cinamon menubar --base-url http://127.0.0.1:2455

๊ธฐ๋ณธ PID ํŒŒ์ผ๊ณผ ๋กœ๊ทธ ํŒŒ์ผ์€ ์•„๋ž˜ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

macOS / Linux: ~/.codex-lb/server.pid
macOS / Linux: ~/.codex-lb/server.log
Windows: %USERPROFILE%\.codex-lb\server.pid
Windows: %USERPROFILE%\.codex-lb\server.log

์›ํ•˜๋ฉด start์—๋Š” --pid-file, --log-file, --host, --port๋ฅผ ํ•จ๊ป˜ ์ค„ ์ˆ˜ ์žˆ๊ณ , serve์—๋Š” --host, --port, --ssl-certfile, --ssl-keyfile๋ฅผ ํ•จ๊ป˜ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. menubar --manage-server๋„ ๊ฐ™์€ ์„œ๋ฒ„ bind/TLS ์˜ต์…˜๊ณผ --pid-file, --log-file, --startup-timeout์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Remote Setup

์›๊ฒฉ์—์„œ ์ฒ˜์Œ ๋Œ€์‹œ๋ณด๋“œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•  ๋•Œ๋Š” bootstrap token์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ ์ƒ์„ฑ(๊ธฐ๋ณธ):

docker logs codex-lb-cinamon
# ============================================
#   Dashboard bootstrap token (first-run):
#   <token>
# ============================================

๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์•„์ง ์—†๊ณ  CODEX_LB_DASHBOARD_BOOTSTRAP_TOKEN ์„ ์ง€์ •ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์„œ๋ฒ„๊ฐ€ 1ํšŒ์šฉ bootstrap token์„ ์ƒ์„ฑํ•ด ๋กœ๊ทธ์— ๋‚จ๊น๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ replica๊ฐ€ ๊ฐ™์€ ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์žฌ์‹œ์ž‘ ๋’ค์—๋„ ๊ฐ™์€ ํ† ํฐ์„ ๋ณต๊ตฌํ•ด ๋‹ค์‹œ ๋กœ๊ทธ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜๋™ ์ง€์ •:

docker run -d --name codex-lb-cinamon \
  -e CODEX_LB_DASHBOARD_BOOTSTRAP_TOKEN=your-secret-token \
  -p 2455:2455 -p 1455:1455 \
  -v codex-lb-cinamon-data:/var/lib/codex-lb \
  ghcr.io/cinev/codex-lb-cinamon:latest

localhost ๋‚˜ host-OS bypass ๋กœ ๋ถ„๋ฅ˜๋˜๋Š” ์š”์ฒญ์€ bootstrap token ์—†์ด๋„ ์ดˆ๊ธฐ ์„ค์ •์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋ฉด:

codex-lb-cinamon-db upgrade head

๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:2455 ๋กœ ์ ‘์†ํ•œ ๋’ค ๊ณ„์ •์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰:

docker volume create codex-lb-cinamon-data
docker run -d --name codex-lb-cinamon \
  -p 2455:2455 -p 1455:1455 \
  -v codex-lb-cinamon-data:/var/lib/codex-lb \
  -e CODEX_LB_HTTP_RESPONSES_SESSION_BRIDGE_INSTANCE_ID=codex-lb-cinamon-local \
  -e CODEX_LB_INSECURE_ALLOW_REMOTE_NO_AUTH=true \
  -e CODEX_LB_INSECURE_ALLOW_REMOTE_NO_AUTH_HOST_CIDRS=172.17.0.0/16 \
  ghcr.io/cinev/codex-lb-cinamon:latest

๋˜๋Š” ๋กœ์ปฌ ์‹คํ–‰:

uvx codex-lb-cinamon

๋ช…๋ น์€ serve์™€ ๋™์ผํ•˜๊ฒŒ foreground ์„œ๋ฒ„๋ฅผ ๋ฐ”๋กœ ๋„์šฐ๋ฉฐ, ํ•„์š”ํ•˜๋ฉด ์ถ”๊ฐ€ ์ธ์ž๋ฅผ ๊ทธ๋Œ€๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰ํ•  ๋•Œ๋Š” ์•„๋ž˜ ์„ค์ •์„ ํ•จ๊ป˜ ์ฃผ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

  • CODEX_LB_HTTP_RESPONSES_SESSION_BRIDGE_INSTANCE_ID=codex-lb-cinamon-local
    • ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘ ์‹œ bridge instance id๊ฐ€ ํ”๋“ค๋ฆฌ์ง€ ์•Š๊ฒŒ ํ•ด์„œ ์„ธ์…˜ ๋ธŒ๋ฆฌ์ง€ ์•ˆ์ •์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  • CODEX_LB_INSECURE_ALLOW_REMOTE_NO_AUTH=true
    • ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ๋‚˜ ์‚ฌ๋‚ด ๊ฐœ์ธ์šฉ์ฒ˜๋Ÿผ ์ œํ•œ๋œ ํ™˜๊ฒฝ์—์„œ ๋กœ๊ทธ์ธ, bootstrap, proxy API key ์ธ์ฆ ์—†์ด ๋ฐ”๋กœ ๋ถ™์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
    • ํ…Œ์ŠคํŠธ/๋‚ด๋ถ€ ์‚ฌ์šฉ ์ „์šฉ์ด๋ฉฐ, ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜๋Š” ํ™˜๊ฒฝ์—๋Š” ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Docker๋ฅผ ์“ด๋‹ค๋ฉด ์•„๋ž˜ CIDR ์„ค์ •๋„ ํ•จ๊ป˜ ์ฃผ๋Š” ํŽธ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

  • CODEX_LB_INSECURE_ALLOW_REMOTE_NO_AUTH_HOST_CIDRS=172.17.0.0/16
    • Docker bridge ํ™˜๊ฒฝ์—์„œ ํ˜ธ์ŠคํŠธ OS์—์„œ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ๋งŒ ๋ฌด์ธ์ฆ์œผ๋กœ ํ—ˆ์šฉํ•˜๋ ค๋ฉด ํ•จ๊ป˜ ์ฃผ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
    • Docker ๊ธฐ๋ณธ bridge ๋Œ€์—ญ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์„ค์ •์ด ๋‹ค๋ฅด๋ฉด ์‹ค์ œ bridge CIDR์— ๋งž๊ฒŒ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Podman์„ ์“ด๋‹ค๋ฉด ์œ„ CIDR ๊ฐ’์€ ๊ทธ๋Œ€๋กœ ์“ฐ์ง€ ๋ง๊ณ , ํ™˜๊ฒฝ์— ๋งž๋Š” bridge ๋Œ€์—ญ์„ ๋„ฃ๊ฑฐ๋‚˜ ์ž๋™ ๊ฐ์ง€์— ๋งก๊ธฐ์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด rootless Podman์€ 10.88.0.0/16 ๊ณ„์—ด์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

Podman์€ rootless๋กœ ์“ฐ๊ธฐ ์‰ฝ๊ณ  ๋น„๊ต์  ๊ฐ€๋ฒผ์šด ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์ด๋ผ, Docker๊ฐ€ ๋ฌด๊ฒ๋‹ค๊ณ  ๋А๊ปด์ง€๋ฉด ํ•œ ๋ฒˆ ์จ๋ณผ ๋งŒํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ์„ค์ •

  1. ๋Œ€์‹œ๋ณด๋“œ์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.
  2. ChatGPT ๊ณ„์ •๊ณผ Platform API Key๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ์—์„œ codex-lb-cinamon ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Platform API Key ๋“ฑ๋ก

๋Œ€์‹œ๋ณด๋“œ์—์„œ Platform ํ‚ค๋ฅผ ๋„ฃ์„ ๋•Œ๋Š” Accounts ํŽ˜์ด์ง€์—์„œ Add OpenAI Platform API key๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ ํ•ญ๋ชฉ:

  • Label: ๋Œ€์‹œ๋ณด๋“œ์—์„œ ๊ตฌ๋ถ„ํ•  ์ด๋ฆ„
  • API key: OpenAI Platform API ํ‚ค
  • Organization, Project: ์“ฐ๋Š” ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ, ๋น„์›Œ๋‘ฌ๋„ ๋จ

์ค‘์š”:

  • Platform API key๋Š” ๋‹จ๋…์œผ๋กœ ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋จผ์ € ํ™œ์„ฑ ChatGPT ๊ณ„์ •์ด ์ตœ์†Œ 1๊ฐœ ์žˆ์–ด์•ผ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.
  • Eligible routes๋ฅผ ํ•˜๋‚˜๋„ ์ฒดํฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋“ฑ๋ก์€ ๋˜์–ด๋„ ์‹ค์ œ ๋ผ์šฐํŒ…์—๋Š” ์“ฐ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Codex app์ด๋‚˜ Codex CLI์— ๋ถ™์ผ ๊ฑฐ๋ฉด Eligible routes์˜ ์ฒดํฌ๋ฐ•์Šค 3๊ฐœ๋ฅผ ์ „๋ถ€ ์ฒดํฌํ•˜์„ธ์š”.

  • Fallback HTTP /v1/models
  • Fallback stateless HTTP /v1/responses
  • Fallback HTTP /backend-api/codex

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๊ธฐ์ค€์œผ๋กœ ๋ณด๋ฉด:

  • Codex app / Codex CLI ์‚ฌ์šฉ: ์œ„ 3๊ฐœ ์ „๋ถ€ ์ฒดํฌ
  • ์ผ๋ฐ˜ OpenAI ํ˜ธํ™˜ /v1 ํด๋ผ์ด์–ธํŠธ๋งŒ ์‚ฌ์šฉ: ๋ณดํ†ต /v1/models, /v1/responses ์ชฝ๋งŒ ์ฒดํฌํ•˜๋ฉด ๋จ

ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ

OpenAI ํ˜ธํ™˜ ํด๋ผ์ด์–ธํŠธ๋Š” ๋ชจ๋‘ codex-lb-cinamon์„ upstream์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. API ํ‚ค ์ธ์ฆ์„ ์ผ  ๊ฒฝ์šฐ ๋Œ€์‹œ๋ณด๋“œ์—์„œ ๋ฐœ๊ธ‰ํ•œ ํ‚ค๋ฅผ Bearer ํ† ํฐ์œผ๋กœ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์—”๋“œํฌ์ธํŠธ ์„ค์ • ์œ„์น˜
Codex CLI http://127.0.0.1:2455/backend-api/codex ~/.codex/config.toml
OpenCode http://127.0.0.1:2455/v1 ~/.config/opencode/opencode.json
OpenClaw http://127.0.0.1:2455/v1 ~/.openclaw/openclaw.json
OpenAI Python SDK http://127.0.0.1:2455/v1 ์ฝ”๋“œ์—์„œ ์„ค์ •
Codex CLI / IDE ํ™•์žฅ

~/.codex/config.toml:

๊ฐ€์žฅ ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด:

  • model_provider = "codex-lb-cinamon" ๋Š” ํŒŒ์ผ ๋งจ ์œ„์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  • [model_providers.codex-lb-cinamon] ๋ธ”๋ก์€ ํŒŒ์ผ ๋งจ ์•„๋ž˜์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  1. ๋จผ์ € ์•„๋ž˜ 1์ค„์„ ํŒŒ์ผ ๋งจ ์œ„์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
    • [ ... ] ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹ค๋ฅธ ์„น์…˜ ์•ˆ์— ๋„ฃ์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
    • model ์ด๋‚˜ model_reasoning_effort ๋Š” ์—ฌ๊ธฐ์„œ ๊ฑด๋“œ๋ฆด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.
    • ์ด๋ฏธ model_provider๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’๋งŒ codex-lb-cinamon์œผ๋กœ ๋ฐ”๊พธ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
model_provider = "codex-lb-cinamon"
  1. ๊ทธ๋‹ค์Œ ์•„๋ž˜ ๊ณต๊ธ‰์ž ์ •์˜ ๋ธ”๋ก์„ ํŒŒ์ผ ๋งจ ์•„๋ž˜์— ๊ทธ๋Œ€๋กœ ๋ถ™์—ฌ ๋„ฃ์Šต๋‹ˆ๋‹ค.
    • ์ด ๋ธ”๋ก์€ ๋‹ค๋ฅธ [ ... ] ์„น์…˜๋“ค ์•„๋ž˜์— ๋”ฐ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ๋ฉ๋‹ˆ๋‹ค.
[model_providers.codex-lb-cinamon]
name = "OpenAI"
base_url = "http://127.0.0.1:2455/backend-api/codex"
wire_api = "responses"

์ฆ‰, ์ตœ์ข… ํŒŒ์ผ ๋ชจ์–‘์€ ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฉ๋‹ˆ๋‹ค.

model_provider = "codex-lb-cinamon"

[model_providers.codex-lb-cinamon]
name = "OpenAI"
base_url = "http://127.0.0.1:2455/backend-api/codex"
wire_api = "responses"

codex-lb-cinamon์˜ API ํ‚ค ์ธ์ฆ์„ ์ผ  ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

model_provider = "codex-lb-cinamon"

[model_providers.codex-lb-cinamon]
name = "OpenAI"
base_url = "http://127.0.0.1:2455/backend-api/codex"
wire_api = "responses"
env_key = "CODEX_LB_API_KEY"
supports_websockets = true
requires_openai_auth = true
export CODEX_LB_API_KEY="sk-clb-..."
codex

์ •๋ฆฌํ•˜๋ฉด:

  • model_provider = "codex-lb-cinamon": ์ตœ์ƒ์œ„ ์„ค์ •
  • [model_providers.codex-lb-cinamon]: ๊ณต๊ธ‰์ž ์ƒ์„ธ ์ •์˜ ๋ธ”๋ก
  • ๋‘ ์ด๋ฆ„ codex-lb-cinamon์€ ๋ฐ˜๋“œ์‹œ ์„œ๋กœ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • model / model_reasoning_effort ๋Š” ๊ธฐ์กด Codex ์„ค์ •์„ ๊ทธ๋Œ€๋กœ ์จ๋„ ๋ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋ฉ”๋ชจ:

  • CODEX_LB_UPSTREAM_STREAM_TRANSPORT=websocket ๋ฅผ ์ฃผ๋ฉด ์—…์ŠคํŠธ๋ฆผ ์ŠคํŠธ๋ฆฌ๋ฐ์„ WebSocket ์šฐ์„ ์œผ๋กœ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ๊ฐ’์ธ auto๋Š” Codex ์ „์šฉ ํ—ค๋”๋‚˜ ๋ชจ๋ธ์— ๋งž์ถฐ ์ ์ ˆํ•œ transport๋ฅผ ๊ณ ๋ฆ…๋‹ˆ๋‹ค.
  • Codex ์ž์ฒด์˜ ์‹คํ—˜์  WebSocket ํ”Œ๋ž˜๊ทธ๋Š” ๊ณ„์† wire_api = "responses" ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์ „์ œ์ž…๋‹ˆ๋‹ค.
OpenCode

Before starting, please ensure that all existing OpenAI credentials is cleared in ~/.local/share/opencode/auth.json You can clean the config by using this one-liner jq 'del(.openai)' ~/.local/share/opencode/auth.json > auth.json.tmp && mv auth.json.tmp ~/.local/share/opencode/auth.json

~/.config/opencode/opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "openai": {
      "options": {
        "baseURL": "http://127.0.0.1:2455/v1",
        "apiKey": "{env:CODEX_LB_API_KEY}"
      },
      "models": {
        "gpt-5.4": {
          "name": "GPT-5.4",
          "reasoning": true,
          "options": { "reasoningEffort": "high", "reasoningSummary": "detailed" },
          "limit": { "context": 1050000, "output": 128000 }
        },
        "gpt-5.3-codex": {
          "name": "GPT-5.3 Codex",
          "reasoning": true,
          "options": { "reasoningEffort": "high", "reasoningSummary": "detailed" },
          "limit": { "context": 272000, "output": 65536 }
        }
      }
    }
  },
  "model": "openai/gpt-5.3-codex"
}
export CODEX_LB_API_KEY="sk-clb-..."
opencode
OpenClaw

~/.openclaw/openclaw.json:

{
  "agents": {
    "defaults": {
      "model": { "primary": "codex-lb-cinamon/gpt-5.4" },
      "models": {
        "codex-lb-cinamon/gpt-5.4": { "params": { "cacheRetention": "short" } },
        "codex-lb-cinamon/gpt-5.4-mini": { "params": { "cacheRetention": "short" } },
        "codex-lb-cinamon/gpt-5.3-codex": { "params": { "cacheRetention": "short" } }
      }
    }
  },
  "models": {
    "mode": "merge",
    "providers": {
      "codex-lb-cinamon": {
        "baseUrl": "http://127.0.0.1:2455/v1",
        "apiKey": "${CODEX_LB_API_KEY}",
        "api": "openai-responses",
        "models": [
          {
            "id": "gpt-5.4",
            "name": "gpt-5.4 (codex-lb-cinamon)",
            "contextWindow": 1050000,
            "contextTokens": 272000,
            "maxTokens": 4096,
            "input": ["text"],
            "reasoning": false
          },
          {
            "id": "gpt-5.4-mini",
            "name": "gpt-5.4-mini (codex-lb-cinamon)",
            "contextWindow": 400000,
            "contextTokens": 272000,
            "maxTokens": 4096,
            "input": ["text"],
            "reasoning": false
          }
        ]
      }
    }
  }
}

CODEX_LB_API_KEY ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ${CODEX_LB_API_KEY} ์ž๋ฆฌ์— ๋Œ€์‹œ๋ณด๋“œ์—์„œ ๋ฐœ๊ธ‰ํ•œ ํ‚ค๋ฅผ ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. API ํ‚ค ์ธ์ฆ์ด ๊บผ์ ธ ์žˆ์–ด๋„ ๋น„๋กœ์ปฌ ์š”์ฒญ์€ proxy ์ธ์ฆ์ด ์ค€๋น„๋˜๊ธฐ ์ „๊นŒ์ง€ ๊ฑฐ์ ˆ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OpenAI Python SDK
from openai import OpenAI

client = OpenAI(
    base_url="http://127.0.0.1:2455/v1",
    api_key="sk-clb-...",  # ๋Œ€์‹œ๋ณด๋“œ์—์„œ ๋ฐœ๊ธ‰ํ•œ ํ‚ค. ์ธ์ฆ์ด ๊บผ์ ธ ์žˆ์œผ๋ฉด ์•„๋ฌด non-empty ๋ฌธ์ž์—ด๋„ ๊ฐ€๋Šฅ
)

response = client.chat.completions.create(
    model="gpt-5.3-codex",
    messages=[{"role": "user", "content": "์•ˆ๋…•ํ•˜์„ธ์š”"}],
)

print(response.choices[0].message.content)

API ํ‚ค ์ธ์ฆ(Codex LB ์ธ์ฆ์šฉ, Platform API key๊ฐ€ ์•„๋‹˜.)

API ํ‚ค ์ธ์ฆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊บผ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ƒํƒœ์—์„œ๋Š” ๋ณดํ˜ธ๋œ ํ”„๋ก์‹œ ๋ผ์šฐํŠธ์— ๋Œ€ํ•ด ๋กœ์ปฌ ์š”์ฒญ๋งŒ ํ‚ค ์—†์ด ํ†ต๊ณผํ•˜๊ณ , ๋น„๋กœ์ปฌ ์š”์ฒญ์€ proxy ์ธ์ฆ์ด ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๊ฑฐ์ ˆ๋ฉ๋‹ˆ๋‹ค. Docker, VM, ์›๊ฒฉ ๋„คํŠธ์›Œํฌ์ฒ˜๋Ÿผ ์„œ๋น„์Šค๊ฐ€ ๋น„๋กœ์ปฌ๋กœ ์ธ์‹ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ๋ถ™๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” ๋ณดํ†ต ๋Œ€์‹œ๋ณด๋“œ์˜ Settings -> API Key Auth ์—์„œ ์ด ๊ธฐ๋Šฅ์„ ์ผœ๊ณ  ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ™œ์„ฑํ™” ํ›„์—๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์ด ๋‹ค์Œ ํ˜•์‹์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Authorization: Bearer sk-clb-...

์ ์šฉ ๋ผ์šฐํŠธ:

  • /v1/*
  • /backend-api/codex/*
  • /backend-api/transcribe

/api/codex/usage ๋Š” ๋ณ„๋„ caller-identity ๊ฒฝ๋กœ๋ผ ๋Œ€์‹œ๋ณด๋“œ ์„ธ์…˜๋งŒ์œผ๋กœ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

API ํ‚ค๋Š” Dashboard -> API Keys -> Create ์—์„œ ๋ฐœ๊ธ‰ํ•˜๋ฉฐ, ์ „์ฒด ํ‚ค ๊ฐ’์€ ์ƒ์„ฑ ์‹œ ํ•œ ๋ฒˆ๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ง€์› ํ•ญ๋ชฉ:

  • ๋งŒ๋ฃŒ์ผ
  • ํ—ˆ์šฉ ๋ชจ๋ธ ์ œํ•œ
  • ๊ฐ•์ œ ๋ชจ๋ธ
  • ํ† ํฐ / ๋น„์šฉ / ๊ธฐ๊ฐ„ ๊ธฐ๋ฐ˜ ์ œํ•œ

์„ค์ •

  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” CODEX_LB_ ์ ‘๋‘์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ๋Š” .env.example ์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€์‹œ๋ณด๋“œ ์ธ์ฆ ์„ค์ •์€ UI์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ DB๋Š” SQLite์ด๋ฉฐ, CODEX_LB_DATABASE_URL ์„ ์ฃผ๋ฉด PostgreSQL๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์‹œ๋ณด๋“œ ์ธ์ฆ ๋ชจ๋“œ

codex-lb-cinamon ์€ ๋‹ค์Œ 3๊ฐ€์ง€ ๋Œ€์‹œ๋ณด๋“œ ์ธ์ฆ ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • CODEX_LB_DASHBOARD_AUTH_MODE=standard
    • ๊ธฐ๋ณธ ๋‚ด์žฅ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ธ์ฆ๊ณผ ์„ ํƒํ˜• TOTP๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • CODEX_LB_DASHBOARD_AUTH_MODE=trusted_header
    • ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๊ฐ€ ์ฃผ์ž…ํ•œ ์ธ์ฆ ํ—ค๋”๋ฅผ ์‹ ๋ขฐํ•ฉ๋‹ˆ๋‹ค.
    • CODEX_LB_FIREWALL_TRUST_PROXY_HEADERS=true, CODEX_LB_FIREWALL_TRUSTED_PROXY_CIDRS, CODEX_LB_DASHBOARD_AUTH_PROXY_HEADER ์„ค์ •์ด ํ•จ๊ป˜ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    • ๋‚ด์žฅ ๋น„๋ฐ€๋ฒˆํ˜ธ/TOTP๋Š” fallback ์œผ๋กœ ๊ณ„์† ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • CODEX_LB_DASHBOARD_AUTH_MODE=disabled
    • ์•ฑ ๋ ˆ๋ฒจ ๋Œ€์‹œ๋ณด๋“œ ์ธ์ฆ์„ ์™„์ „ํžˆ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค.
    • ์™ธ๋ถ€ ์ธ์ฆ์ด๋‚˜ ๋„คํŠธ์›Œํฌ ์ œํ•œ์ด ์žˆ๋Š” ํ™˜๊ฒฝ์—์„œ๋งŒ ์“ฐ๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

trusted_header ์˜ˆ์‹œ:

CODEX_LB_FIREWALL_TRUST_PROXY_HEADERS=true
CODEX_LB_FIREWALL_TRUSTED_PROXY_CIDRS=172.18.0.0/16
CODEX_LB_DASHBOARD_AUTH_PROXY_HEADER=Remote-User

์‹ ๋ขฐ ํ—ค๋”๊ฐ€ ์—†๊ณ  fallback ๋น„๋ฐ€๋ฒˆํ˜ธ๋„ ์„ค์ •๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋Œ€์‹œ๋ณด๋“œ๋Š” fail-closed ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์œ„์น˜

์‹คํ–‰ ๋ฐฉ์‹ ๊ฒฝ๋กœ
๋กœ์ปฌ / uvx codex-lb-cinamon ~/.codex-lb/
์ปจํ…Œ์ด๋„ˆ /var/lib/codex-lb/

์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ฐฑ์—…ํ•˜๋ฉด ๊ณ„์ •, ์„ค์ •, ํ‚ค, ๋กœ๊ทธ๋ฅผ ๋ณด์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐํฌ ๋ฉ”๋ชจ

์ด ํฌํฌ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฌธ์„œ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. Kubernetes/Helm ๊ด€๋ จ ์ ˆ์ฐจ๋Š” ์ด README์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ฃผ์†Œ:

ghcr.io/cinev/codex-lb-cinamon

๊ฐœ๋ฐœ

# ๋ฐฑ์—”๋“œ + ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ ์„œ๋ฒ„
uv sync
cd frontend && bun install && cd ..
uv run fastapi run app/main.py --reload
cd frontend && bun run dev

์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ:

docker compose watch

๊ธฐ๋ณธ ํฌํŠธ:

  • ๋ฐฑ์—”๋“œ: 2455
  • ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ ์„œ๋ฒ„: 5173

About

Codex/ChatGPT multiple account load balancer & proxy with usage tracking, dashboard, and OpenCode-compatible endpoints

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Python 85.6%
  • TypeScript 13.9%
  • Shell 0.1%
  • CSS 0.1%
  • Go Template 0.1%
  • JavaScript 0.1%
  • Other 0.1%