OpenAI-compatible proxy for ChatGPT Codex Responses API
docker pull ghcr.io/icebear0828/codex-proxy
docker run -d --name codex-proxy -p 8080:8080 --restart always ghcr.io/icebear0828/codex-proxy:latest
podman run -d --name codex-proxy -p 8080:8080 --restart always ghcr.io/icebear0828/codex-proxy:latest
skopeo inspect docker://ghcr.io/icebear0828/codex-proxy:latest
oras pull ghcr.io/icebear0828/codex-proxy:latest
docker compose up -d
services:
codex-proxy:
image: ghcr.io/icebear0828/codex-proxy:latest
# To build from source instead: comment out 'image' above, uncomment 'build' below
# build: .
extra_hosts:
- "host.docker.internal:host-gateway"
ports:
# Loopback-only on the host by default; change to "${PORT:-8080}:8080"
# if you intentionally want LAN access.
- "127.0.0.1:${PORT:-8080}:8080"
- "1455:1455"
# Optional Ollama-compatible bridge. Enable ollama.enabled and use
# ollama.host=0.0.0.0 inside the container before uncommenting.
# Host binding stays loopback-only to avoid exposing the unauthenticated
# Ollama API to the LAN.
# - "127.0.0.1:${OLLAMA_BRIDGE_PORT:-11434}:11434"
volumes:
- ./data:/app/data
- ./config:/app/config
restart: unless-stopped
# Without an explicit memory limit, Node/V8 sizes its default heap off the
# *host's* total memory, not this container's. On a shared host that means
# the process can grow well past what you actually want it to use before
# GC gets aggressive, and if the host is memory-constrained that growth can
# take the whole machine down before this container ever gets OOM-killed.
# Tune both to your host by setting MEM_LIMIT and NODE_OPTIONS in .env:
# mem_limit should leave headroom for everything else running there, and
# --max-old-space-size should stay comfortably below mem_limit (V8's heap
# is only part of the process's RSS).
mem_limit: ${MEM_LIMIT:-768m}
env_file:
- .env
environment:
- NODE_ENV=production
- PORT=8080
- CODEX_PROXY_HOST=0.0.0.0
- NODE_OPTIONS=${NODE_OPTIONS:---max-old-space-size=512}
# -- Automatic updates (uncomment to enable) --
# watchtower:
# image: containrrr/watchtower
# volumes:
# - /var/run/docker.sock:/var/run/docker.sock
# command: --cleanup --interval 3600 codex-proxy
# restart: unless-stopped