codex-proxy Docker & Self-Hosted Deployment

GitHub

OpenAI-compatible proxy for ChatGPT Codex Responses API

1,814 stars TypeScript TypeScript 1 file ยท ~16,368 tokens
RAW Compose
1. Pull Image (GHCR) docker pull ghcr.io/icebear0828/codex-proxy
2. Docker Run (1-Click Launch) docker run -d --name codex-proxy -p 8080:8080 --restart always ghcr.io/icebear0828/codex-proxy:latest
3. Podman Run podman run -d --name codex-proxy -p 8080:8080 --restart always ghcr.io/icebear0828/codex-proxy:latest
4. Skopeo Inspect (Zero-Pull Manifest) skopeo inspect docker://ghcr.io/icebear0828/codex-proxy:latest
5. ORAS Pull (OCI Artifact) oras pull ghcr.io/icebear0828/codex-proxy:latest
6. Compose Deployment docker compose up -d
docker-compose.yml
Download .yml
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