Open-source credential gateway and vault for AI agents. Store API keys once, inject them transparently when your agents make HTTP calls — they never see the real secrets.

OneCLI is the open-source credential gateway that sits between your AI agents and the services they call. Store real API keys once in OneCLI's encrypted vault, give your agents placeholder keys (e.g. FAKE_KEY), and OneCLI's gateway injects the real credentials transparently on outbound requests — agents never see the real secrets.
This template deploys a complete OneCLI instance with a single click.
[Zeabur LB] → OneCLI App (single image, two processes)
├─ :10254 → Next.js Web Dashboard (UI + API)
└─ :10255 → Rust Gateway (credential injection proxy)
[PostgreSQL] → OneCLI database (agents, secrets, audit logs)
The OneCLI app image (ghcr.io/onecli/onecli:latest) bundles:
/app/data/ (AES-256-GCM)By default this template deploys in single-user / local mode: the dashboard opens with no login. Anyone who can reach your dashboard domain can see and manage every stored API key. OneCLI is a credential vault — that makes the default unsafe to expose on the public internet.
Before storing any real secret, do ONE of the following:
onecli service in the Zeabur Dashboard, set NEXTAUTH_SECRET + GOOGLE_CLIENT_ID + GOOGLE_CLIENT_SECRET together (all three, then restart). See "Post-Deployment Configuration" below.The Gateway Domain (where agents send requests) is always public — that's fine, the gateway authenticates every call with a per-agent access token. The concern is only the Dashboard Domain in default local mode.
Why not just default to OAuth? OneCLI's auth is all-or-nothing:
NEXTAUTH_SECRETset without Google credentials makes the dashboard redirect to a setup-error page. So local mode is the only working zero-input default; securing it is a deliberate one-time step you take after deploy.
https://your-domain.zeabur.apphttps://your-gateway-domain.zeabur.app (the separate Gateway Domain auto-provisioned for the gateway port)Bearer FAKE_KEY) — when it makes a request, the gateway swaps it for the real credentialYour Agent → [FAKE_KEY] → OneCLI Gateway → [REAL_KEY] → External API (OpenAI, GitHub, etc.)
↓
Audit log + rate limit
After deployment completes (may take 2-3 minutes for initial startup + migrations):
https://your-domain.zeabur.app in your browserOnce you have an agent token and at least one secret stored, point your agent at the Gateway Domain (a separate subdomain that Zeabur auto-provisions for the gateway port — find it in the service's Domains tab):
# Example: route OpenAI calls through OneCLI
curl https://your-gateway-domain.zeabur.app/v1/chat/completions \
-H "Authorization: Bearer <your-agent-access-token>" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4","messages":[{"role":"user","content":"Hello!"}]}'
In your agent code, just use a placeholder like FAKE_OPENAI_KEY and OneCLI swaps it for the real key.
Customize these environment variables in the Zeabur Dashboard under the onecli service:
Set all three together (then restart), or leave all three empty for single-user mode:
NEXTAUTH_SECRET → your NextAuth secretGOOGLE_CLIENT_ID → your Google OAuth client IDGOOGLE_CLIENT_SECRET → your Google OAuth client secret⚠️ Auth is all-or-nothing: setting
NEXTAUTH_SECRETalone (without the Google credentials) makes the dashboard redirect to a setup-error page. Set all three together, or none.
GATEWAY_PORT → default 10255SECRET_ENCRYPTION_KEY) is auto-generated on first start and persisted to /app/data/. Don't lose this volume — without it, all stored secrets are unrecoverable.--insecure-skip-verify in development).Learn more: https://github.com/onecli/onecli
If you encounter any issues during deployment, please let me know via GitHub issues: https://github.com/glasschan/seafoodholdhand-zeabur-templates