<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>
    Self-Hosted on skywirex
    
    </title>
    <link>https://skywirex.com/self-hosted/</link>
    <description>Recent content 
    
    in Self-Hosted on skywirex
    </description>
    <generator>Hugo -- gohugo.io</generator>
    <language>vi-vn</language>
    
    
    <lastBuildDate>Mon, 31 Aug 2026 21:00:00 +0700</lastBuildDate>
    
    
        <atom:link href="https://skywirex.com/self-hosted/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>CLIProxyAPI with CPA Manager Plus: A Self-Hosted AI Gateway and Observability Stack</title>
      <link>https://skywirex.com/cliproxyapi-with-cpa-manager-plus/</link>
      <pubDate>Mon, 31 Aug 2026 21:00:00 +0700</pubDate>
      
      <guid>https://skywirex.com/cliproxyapi-with-cpa-manager-plus/</guid>
      <description>&lt;h1 id=&#34;cliproxyapi-with-cpa-manager-plus&#34;&gt;CLIProxyAPI with CPA Manager Plus&lt;/h1&gt;
&lt;p&gt;If you use AI subscription plans such as Claude Code, ChatGPT Codex, Gemini (Antigravity), Grok Build, or Kimi Code and want to call them through a standard OpenAI/Gemini/Claude API endpoint while tracking requests, costs, and account status in an intuitive dashboard, the combination of &lt;strong&gt;CLIProxyAPI&lt;/strong&gt; + &lt;strong&gt;CPA Manager Plus&lt;/strong&gt; is a self-hosted solution worth considering. This article introduces both projects, highlights their key features, explains why you should use them together, and walks through deployment with Docker Compose.&lt;/p&gt;
&lt;h2 id=&#34;1-what-is-cliproxyapi&#34;&gt;1. What is CLIProxyAPI?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/router-for-me/CLIProxyAPI&#34;&gt;CLIProxyAPI&lt;/a&gt; is an open-source proxy server that wraps AI CLI/agent tools (Antigravity, ChatGPT Codex, Claude Code, Grok Build, etc.) into an API service compatible with the OpenAI, Gemini, and Claude standards. In other words, instead of paying for separate API access for each provider, you can leverage the subscription plans you have already purchased (Claude Pro, ChatGPT Plus/Pro, Gemini, etc.) to call models through a local API endpoint that works with most existing SDKs and clients.&lt;/p&gt;
&lt;p&gt;The project currently supports a wide range of large model providers: Kimi (Moonshot AI), OpenAI GPT series, Anthropic Claude series, Google Gemini (via Antigravity), and xAI Grok - all through OAuth login or API key, without exposing sensitive account information outside your own server.&lt;/p&gt;
&lt;h2 id=&#34;2-what-is-cpa-manager-plus&#34;&gt;2. What is CPA Manager Plus?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://seakee.github.io/CPA-Manager-Plus/docs/en/&#34;&gt;CPA Manager Plus&lt;/a&gt; (CPAMP) is an administration and monitoring dashboard built specifically for CLIProxyAPI. If CLIProxyAPI is the &amp;ldquo;engine&amp;rdquo; that processes requests, then CPA Manager Plus is the &amp;ldquo;dashboard&amp;rdquo; that lets you see everything the engine is doing: configuring providers/OAuth, monitoring requests in real time, analyzing costs, checking quotas and account health for Codex/Claude/xAI, all within a self-hosted interface.&lt;/p&gt;
&lt;p&gt;CPA Manager Plus offers two deployment modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lightweight Panel&lt;/strong&gt;: replaces only the default admin UI of CLIProxyAPI. No additional service, database, or port required.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full Mode&lt;/strong&gt;: runs a standalone Manager Server (image &lt;code&gt;seakee/cpa-manager-plus&lt;/code&gt;) backed by a SQLite database that stores request history, supports cost analysis, account checks, and automation. This is the mode designed to run alongside CLIProxyAPI in a Docker Compose stack.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3-key-features-of-cliproxyapi&#34;&gt;3. Key Features of CLIProxyAPI&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-standard API endpoints&lt;/strong&gt;: provides interfaces compatible with OpenAI (including the Responses API), Gemini (including the Interactions API), and Claude for CLI models.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OAuth support for multiple providers&lt;/strong&gt;: OpenAI Codex, Claude Code, Grok Build, Gemini/Antigravity, Kimi - login with your existing subscription account, no separate API key needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streaming and non-streaming responses&lt;/strong&gt;, including WebSocket-based replies where supported.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function calling / tool use&lt;/strong&gt;: compatible with agents that need to invoke tools.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multimodal input&lt;/strong&gt;: accepts both text and images.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-account load balancing (round-robin)&lt;/strong&gt;: combine multiple Gemini, OpenAI, Claude, or Grok accounts to increase usage quotas and reduce rate-limit risk.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom OpenAI-compatible provider support&lt;/strong&gt; through configuration, for example OpenRouter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Management API&lt;/strong&gt; for remote configuration and account management - the foundation that tools like CPA Manager Plus connect to.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Go SDK&lt;/strong&gt; that lets you embed the proxy directly into other applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;4-why-combine-cliproxyapi-with-cpa-manager-plus&#34;&gt;4. Why Combine CLIProxyAPI with CPA Manager Plus?&lt;/h2&gt;
&lt;p&gt;On its own, CLIProxyAPI only focuses on forwarding and formatting requests and responses. Since v6.10.0 the project has removed its built-in usage statistics feature to keep the core lightweight. This means that if you run CLIProxyAPI alone, you have no overall visibility into:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which requests are failing, how latency looks, and where calls originate.&lt;/li&gt;
&lt;li&gt;Estimated costs per model and per account.&lt;/li&gt;
&lt;li&gt;Which Codex/Claude/xAI accounts are nearing quota exhaustion or are &amp;ldquo;unhealthy&amp;rdquo; and need cleanup.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is exactly why &lt;strong&gt;CPA Manager Plus&lt;/strong&gt; is recommended: it turns CLIProxyAPI from a &amp;ldquo;silent, hard-to-control&amp;rdquo; proxy into a system that can be operated long-term by a team or by an individual running multiple AI accounts simultaneously. Concrete benefits:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Granular request monitoring&lt;/strong&gt;: track by account, model, channel, latency, status, and token usage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible cost estimation&lt;/strong&gt;: edit model pricing tables, one-click sync prices from LiteLLM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quota and account health management&lt;/strong&gt;: run batch checks, detect exhausted or errored accounts, get cleanup suggestions, and execute one-click remediation. Very useful when managing many Codex/Claude accounts at once.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persistent storage&lt;/strong&gt;: all events are saved to SQLite, so data survives container restarts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear separation of concerns&lt;/strong&gt;: CLIProxyAPI handles proxying and gateway logic; CPA Manager Plus handles observability and administration. The split makes the stack easier to scale and maintain, in line with the &amp;ldquo;one service per responsibility&amp;rdquo; principle of Docker Compose deployments.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;5-docker-compose-deployment&#34;&gt;5. Docker Compose Deployment&lt;/h2&gt;
&lt;p&gt;Below is a Docker Compose configuration that runs CLIProxyAPI alongside CPA Manager:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;---
&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:
  &lt;span style=&#34;color:#f92672&#34;&gt;cli-proxy-api&lt;/span&gt;:
    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;eceasy/cli-proxy-api:latest&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;pull_policy&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;always&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cli-proxy-api&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:
      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./config/config.yaml:/CLIProxyAPI/config.yaml&lt;/span&gt;
      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./auths:/root/.cli-proxy-api&lt;/span&gt;
      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./logs:/CLIProxyAPI/logs&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:
      - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8317:8317&amp;#34;&lt;/span&gt;
      - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;8085:8085&amp;#34;&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:
      - &lt;span style=&#34;color:#ae81ff&#34;&gt;cpa-net&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;cpa-manager-plus&lt;/span&gt;:
    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;seakee/cpa-manager-plus:latest&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;pull_policy&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;always&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cpa-manager-plus&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;unless-stopped&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:
      &lt;span style=&#34;color:#f92672&#34;&gt;HTTP_ADDR&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0.0.0.0:18317&amp;#34;&lt;/span&gt;
      &lt;span style=&#34;color:#f92672&#34;&gt;USAGE_DB_PATH&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/data/usage.sqlite&amp;#34;&lt;/span&gt;
      &lt;span style=&#34;color:#f92672&#34;&gt;CPA_MANAGER_DATA_KEY_PATH&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/data/data.key&amp;#34;&lt;/span&gt;
      &lt;span style=&#34;color:#f92672&#34;&gt;CPA_MANAGER_ADMIN_KEY&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;set-a-long-random-admin-key&amp;gt;&amp;#34;&lt;/span&gt;
      &lt;span style=&#34;color:#f92672&#34;&gt;CPA_UPSTREAM_URL&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://cli-proxy-api:8317&amp;#34;&lt;/span&gt;
      &lt;span style=&#34;color:#f92672&#34;&gt;CPA_MANAGEMENT_KEY&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;match-remote-management.secret-key&amp;gt;&amp;#34;&lt;/span&gt;
      &lt;span style=&#34;color:#f92672&#34;&gt;USAGE_COLLECTOR_MODE&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;auto&amp;#34;&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:
      - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;18317:18317&amp;#34;&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:
      - &lt;span style=&#34;color:#ae81ff&#34;&gt;cpa-manager-data:/data&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:
      - &lt;span style=&#34;color:#ae81ff&#34;&gt;cli-proxy-api&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:
      - &lt;span style=&#34;color:#ae81ff&#34;&gt;cpa-net&lt;/span&gt;
&lt;span style=&#34;color:#f92672&#34;&gt;networks&lt;/span&gt;:
  &lt;span style=&#34;color:#f92672&#34;&gt;cpa-net&lt;/span&gt;:
&lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:
  &lt;span style=&#34;color:#f92672&#34;&gt;cpa-manager-data&lt;/span&gt;:
    &lt;span style=&#34;color:#f92672&#34;&gt;external&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
    &lt;span style=&#34;color:#f92672&#34;&gt;name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;cpa_cpa-manager-data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;component-explanation&#34;&gt;Component Explanation&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;cli-proxy-api&lt;/code&gt; service&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;image: eceasy/cli-proxy-api:latest&lt;/code&gt;: community-packaged CLIProxyAPI image.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./config/config.yaml:/CLIProxyAPI/config.yaml&lt;/code&gt;: mount the main config file where API keys, provider lists, and the Management API toggle are declared.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./auths:/root/.cli-proxy-api&lt;/code&gt;: stores OAuth tokens after logging in to Claude Code, Codex, Gemini, etc. This directory must be persisted so you do not have to re-authenticate every time the container restarts.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./logs:/CLIProxyAPI/logs&lt;/code&gt;: runtime logs, useful for debugging.&lt;/li&gt;
&lt;li&gt;Port &lt;code&gt;8317&lt;/code&gt;: main API port (OpenAI/Gemini/Claude-compatible endpoint). Port &lt;code&gt;8085&lt;/code&gt; is usually used for OAuth callback when logging in accounts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;cpa-manager-plus&lt;/code&gt; service&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;HTTP_ADDR&lt;/code&gt;: internal address and port that the Manager Server listens on inside the container, matching the &lt;code&gt;18317&lt;/code&gt; port published to the host.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;USAGE_DB_PATH&lt;/code&gt; / &lt;code&gt;CPA_MANAGER_DATA_KEY_PATH&lt;/code&gt;: paths to the SQLite database (&lt;code&gt;usage.sqlite&lt;/code&gt;) and encryption key file (&lt;code&gt;data.key&lt;/code&gt;), both stored under &lt;code&gt;/data&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CPA_MANAGER_ADMIN_KEY&lt;/code&gt;: administrator key used to log in to the CPA Manager Plus dashboard. Set a long, random, secret string - this is your dashboard login key, separate from the CLIProxyAPI Management Key.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CPA_UPSTREAM_URL&lt;/code&gt;: points to CLIProxyAPI&amp;rsquo;s internal address within the same Docker network (&lt;code&gt;http://cli-proxy-api:8317&lt;/code&gt;). Docker Compose resolves the service name to an internal DNS entry.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CPA_MANAGEMENT_KEY&lt;/code&gt;: must exactly match the &lt;code&gt;remote-management.secret-key&lt;/code&gt; declared in &lt;code&gt;config.yaml&lt;/code&gt; of CLIProxyAPI. This is the key that authorizes the Manager Server to call CLIProxyAPI&amp;rsquo;s Management API.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;USAGE_COLLECTOR_MODE: auto&lt;/code&gt;: lets the Manager Server automatically pick the best usage data collection method (RESP Pub/Sub, HTTP usage queue, or RESP pop) based on the internal network setup.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;depends_on: cli-proxy-api&lt;/code&gt;: guarantees CLIProxyAPI starts before the manager.&lt;/li&gt;
&lt;li&gt;Volume &lt;code&gt;cpa-manager-data:/data&lt;/code&gt;: persists the SQLite database and &lt;code&gt;data.key&lt;/code&gt; encryption file. &lt;strong&gt;Back this up regularly&lt;/strong&gt;, because if &lt;code&gt;data.key&lt;/code&gt; is lost, the CPA Management Keys stored in SQLite cannot be recovered. In this compose file the volume is declared as &lt;code&gt;external: true&lt;/code&gt; with name &lt;code&gt;cpa_cpa-manager-data&lt;/code&gt;, meaning the volume must be created beforehand (e.g. via &lt;code&gt;docker volume create cpa_cpa-manager-data&lt;/code&gt;) rather than being auto-created by Compose. This is useful when you want data to survive independently of the stack lifecycle, or when reusing the volume across multiple &lt;code&gt;docker compose up&lt;/code&gt;/&lt;code&gt;down&lt;/code&gt; cycles.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;required-configyaml-settings&#34;&gt;Required &lt;code&gt;config.yaml&lt;/code&gt; Settings&lt;/h3&gt;
&lt;p&gt;For CPA Manager Plus to connect and collect usage data, the &lt;code&gt;config/config.yaml&lt;/code&gt; of CLIProxyAPI must enable the Management API and allow remote access from the internal Docker network:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;color:#f92672&#34;&gt;remote-management&lt;/span&gt;:
  &lt;span style=&#34;color:#f92672&#34;&gt;secret-key&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;lt;match-CPA_MANAGEMENT_KEY-from-cpa-manager-plus-service&amp;gt;&amp;#34;&lt;/span&gt;
  &lt;span style=&#34;color:#f92672&#34;&gt;allow-remote&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;

&lt;span style=&#34;color:#f92672&#34;&gt;usage-statistics-enabled&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;secret-key&lt;/code&gt; here must exactly match the &lt;code&gt;CPA_MANAGEMENT_KEY&lt;/code&gt; environment variable in the &lt;code&gt;cpa-manager-plus&lt;/code&gt; service.&lt;/p&gt;
&lt;h3 id=&#34;deployment-steps&#34;&gt;Deployment Steps&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Create a project directory, for example &lt;code&gt;cliproxyapi-stack/&lt;/code&gt;. Inside it create &lt;code&gt;config/config.yaml&lt;/code&gt;, an empty &lt;code&gt;auths/&lt;/code&gt; directory, and an empty &lt;code&gt;logs/&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;Paste the Docker Compose content above into &lt;code&gt;docker-compose.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Configure &lt;code&gt;config.yaml&lt;/code&gt; with &lt;code&gt;remote-management&lt;/code&gt; and &lt;code&gt;usage-statistics-enabled&lt;/code&gt; as shown above, plus the list of &lt;code&gt;api-keys&lt;/code&gt; you want to use to authenticate clients calling CLIProxyAPI.&lt;/li&gt;
&lt;li&gt;Run the command:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;Visit &lt;code&gt;http://&amp;lt;host&amp;gt;:18317&lt;/code&gt; (or &lt;code&gt;/management.html&lt;/code&gt; depending on the version) to complete the initial setup for CPA Manager - enter the CPA internal URL (&lt;code&gt;http://cli-proxy-api:8317&lt;/code&gt;) and the Management Key.&lt;/li&gt;
&lt;li&gt;Because the &lt;code&gt;cpa-manager-data&lt;/code&gt; volume is declared &lt;code&gt;external: true&lt;/code&gt;, create it before running &lt;code&gt;docker compose up&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;docker volume create cpa_cpa-manager-data
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;Run &lt;code&gt;docker compose up -d&lt;/code&gt;, then check the logs to retrieve the Admin Key (if you did not already set &lt;code&gt;CPA_MANAGER_ADMIN_KEY&lt;/code&gt; yourself):&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;docker compose logs cpa-manager-plus
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;8&#34;&gt;
&lt;li&gt;Visit &lt;code&gt;http://&amp;lt;host&amp;gt;:18317/management.html&lt;/code&gt;, log in with the Admin Key, then register the CPA internal URL (&lt;code&gt;http://cli-proxy-api:8317&lt;/code&gt;) and CPA Management Key if not already configured via environment variables.&lt;/li&gt;
&lt;li&gt;In the CLIProxyAPI UI, perform OAuth login for each account (Claude Code, Codex, Gemini, etc.).&lt;/li&gt;
&lt;li&gt;Point your client/SDK (Claude Code, code using the OpenAI SDK, etc.) at the endpoint &lt;code&gt;http://&amp;lt;host&amp;gt;:8317&lt;/code&gt; using an API key declared in &lt;code&gt;config.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security note&lt;/strong&gt;: replace the &lt;code&gt;CPA_MANAGER_ADMIN_KEY&lt;/code&gt; and &lt;code&gt;CPA_MANAGEMENT_KEY&lt;/code&gt; values in the compose file with your own long random secrets. Do not reuse the example values, and do not commit a &lt;code&gt;.env&lt;/code&gt; or compose file containing these keys to a public repository.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;6-conclusion&#34;&gt;6. Conclusion&lt;/h2&gt;
&lt;p&gt;CLIProxyAPI solves the problem of &amp;ldquo;using your existing AI subscriptions as an API.&amp;rdquo; CPA Manager Plus solves the problem of &amp;ldquo;managing and observing&amp;rdquo; that system as usage scales up - multiple accounts, multiple models, multiple internal users. Combining both in a Docker Compose stack gives you a self-hosted AI gateway that is cost-efficient, easy to monitor, and easy to maintain, suitable for both individuals and development teams that rely on several AI agent tools daily.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>