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+)
  • kubectl configured with cluster access
  • PostgreSQL (running in cluster or external)
  • Redis (running in cluster or external)
  • nginx Ingress controller
  • Storage class (default: openebs.io/local)
  • Optional: cert-manager for automatic TLS

Quick Start

git clone https://github.com/ceduth/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-classopenebs.io/localStorage 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 Platform Admin - First admin setup
  4. Deploy Your First App - Start deploying applications
  5. Kubernetes Operations - Day-2 operations and troubleshooting