Skip to main content

Deploying Kuploy to Kubernetes

Deploy Kuploy or Kuploy Cloud to an existing Kubernetes cluster using kuploy-k8s.

Prerequisites​

  • Kubernetes cluster (v1.23+) — no cluster? See Local Dev Cluster to set one up with k3d
  • kubectl configured with cluster access
  • PostgreSQL (running in cluster or external)
  • Redis (running in cluster or external)
  • nginx Ingress controller
  • A storage class for PVCs (--storage-class, default: longhorn)
  • Optional: cert-manager for automatic TLS

Quick Start​

git clone https://github.com/kuploy/kuploy-k8s.git
cd kuploy-k8s
pip install -r requirements.txt

# Check prerequisites
python deploy.py preflight

# Deploy OSS edition
python deploy.py

# Deploy Cloud edition (with billing & quotas)
python deploy.py --edition cloud

Editions​

EditionImageDescription
ossceduth/kuploy:latestOpen-source self-hosted version
cloudceduth/kuploy-cloud:latestMulti-tenant with billing, licensing & quotas

Cloud Edition Configuration​

When deploying Cloud edition, you'll be prompted for:

VariableRequiredDescription
STRIPE_SECRET_KEYYesStripe API secret key
STRIPE_WEBHOOK_SECRETYesStripe webhook signing secret
BETTER_AUTH_SECRETYesAuthentication secret (32+ chars)
LICENSE_KEYYesLicense key from kuploy.app
LICENSE_HUB_URLNoLicense Hub URL (default: https://kuploy.app)
PLATFORM_ADMIN_EMAILYesEmail of first platform admin

SMTP configuration is optional and prompted separately.

Example Cloud Deployment​

python deploy.py --edition cloud \
--domain console.example.com \
--cert-issuer letsencrypt-prod \
--db-namespace database \
--postgres-service postgresql \
--redis-service redis-master

CLI Options​

FlagDefaultDescription
--editionossEdition: oss or cloud
--domain(prompted)Domain for Kuploy dashboard
--db-namespacedatabaseNamespace where PostgreSQL/Redis run
--app-namespacekuployNamespace for Kuploy deployment
--postgres-servicepostgresqlPostgreSQL service name
--postgres-secret(none)Admin secret for creating user/db
--redis-serviceredis-masterRedis service name
--redis-secretredisRedis secret (for password)
--storage-classlonghornStorage class for PVCs
--ingress-classnginxIngress class
--ingress-ip(auto)LoadBalancer external IP
--cert-issuerletsencrypt-prodcert-manager ClusterIssuer
--replicas1Number of replicas

Ingress IP Configuration​

The deployer needs to know the external IP of your ingress controller for DNS setup.

By default, deploy.py auto-discovers LoadBalancer services in your cluster:

  1. Finds all services with type: LoadBalancer
  2. Lists their external IPs
  3. Prompts you to select one (or uses the first by default)

This works well for interactive deployments on most cloud providers.

Manual Override​

Use --ingress-ip when:

  • CI/CD automation - No interactive prompt available
  • LB provisioning delay - IP not yet assigned when deployer runs
  • Multiple LoadBalancers - Skip selection prompt
  • Bare-metal/MetalLB - Auto-discovery may be unreliable
python deploy.py --ingress-ip 203.0.113.50 --domain console.example.com
tip

For scripted/automated deployments, always use --ingress-ip to avoid interactive prompts.

What Gets Deployed​

kuploy/                          # namespace
├── kuploy (Deployment) # Kuploy server
├── kuploy (Service) # ClusterIP service
├── kuploy (Ingress) # nginx ingress + TLS
├── kuploy-data (PVC) # Persistent storage
├── kuploy-secrets (Secret) # DB/Redis credentials + edition secrets
├── kuploy (ServiceAccount) # With ClusterRole for deploying apps
└── buildkitd (StatefulSet) # Container image builder

Resource Requirements​

Kuploy Server​

ResourceRequestLimit
CPU100m2000m
Memory256Mi2Gi

Buildkit​

ResourceRequestLimit
CPU500m4000m
Memory1Gi8Gi
Storage20Gi cache + 10Gi workspace

Next Steps​

After deployment:

  1. Link your license — Required for Cloud edition
  2. Cloud Billing Setup — Configure Stripe and seed plans (Cloud edition)
  3. Configure the admin dashboard — Platform admin setup
  4. Deploy your first app — Start deploying applications
  5. Kubernetes Operations — Day-2 operations and troubleshooting