Multi-tenant agent factory on EKS — GitOps provision, in-cluster mesh, DNS at the edge.
Thousands
concurrent isolated agents
1 chart, N apps
Helm + Argo CD API
ExternalDNS
Cloudflare records, no tickets
HPA 5–50
control plane on the same cluster
Dotfun Agents Platforms let anyone create an AI agent from a persona, turn it on, and get a live instance with its own public URL. Agents could chat, post, and bind Twitter, Telegram, or Discord. Activation was credit-gated: pay to run, deactivate to tear the instance down.
Users did not wait on a ticket or a shared bot. Each request became an isolated Kubernetes workload. I designed and ran the path from “user clicked Create” to a healthy, addressable agent — and the reverse on deactivate. I sat with backend so the NestJS control plane could drive Argo CD as an API, not as a console. Control plane and agents ran on the same EKS cluster. The API talked to pods over ClusterIP. Public traffic went Ingress → Cloudflare.
Thousands of tenants only works if create and destroy are APIs, not git commits and DNS tickets. Without that, the factory becomes a queue.
Two planes, one cluster. The NestJS API is a GitOps app. Each agent is an Argo CD Application pointing at one shared Helm chart. No per-agent YAML in git. Desired state in Argo, cluster as the source of truth, APIs as the user-facing trigger.
Control
NestJS API — users, credits, character store, activate/deactivate. Kustomize, ECR, HPA 5–50
Data
One ElizaOS process per agent. Argo CD Application per tenant, same cluster
Provision
API POSTs an Argo Application with a service token; automated sync, prune, self-heal
Helm
Shared eliza-agent chart. Per-tenant name, id, image, backend URL. ClusterIP Service; Ingress is the only public door
Runtime
On the order of 2 CPU / 2–3Gi, probes on :3000, rolling update maxUnavailable: 0. Character JSON pulled on boot
DNS
Ingress host {slug}.<zone> → ExternalDNS → Cloudflare. Prune Ingress, record goes away
Edge
Wildcard TLS, nginx terminates HTTPS, Cloudflare in front
CI
OIDC → Secrets Manager → ECR → Argo image set. Same GitOps model as the agents
lifecycle.txt
Create (metadata + credits)
→ Activate
→ Argo Application (Helm)
→ Deployment + Service + Ingress
→ ExternalDNS → Cloudflare
→ Pod boot → pull character → POST runtime id
→ ACTIVE (in-cluster + public URL)
→ Live: chat, social bind, character patch via ClusterIP
→ Deactivate
→ DELETE Application
→ prune workload + Ingress
→ ExternalDNS drops Cloudflare recordHave a project in mind?
Let's build something together.