Installation

Multiple ways to deploy Kubey depending on your environment.

Docker

The simplest deployment method. Perfect for local development or single-server deployments. Pull from Docker Hub:

Basic Docker Runbash
docker pull jboocodes/kubeydocker \  
docker run -d \
  --name kubey \
  -p 8080:8080 \
  -v ~/.kube:/root/.kube:ro \
  jboocodes/kubey

Docker Compose

Recommended for production deployments. Includes PostgreSQL for user data persistence.

docker-compose.ymlyaml
version: '3.8'

services:
  kubey:
    image: jboocodes/kubey:latest
    ports:
      - "8080:8080"
    environment:
      - AUTH_MODE=shared
      - DATABASE_URL=postgres://kubey:kubey@postgres:5432/kubey?sslmode=disable
      - JWT_SECRET=your-secret-key-change-me
      - ENCRYPTION_KEY=your-encryption-key-change-me
      - GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID}
      - GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}
    volumes:
      - ~/.kube:/root/.kube:ro
    depends_on:
      - postgres

  postgres:
    image: postgres:16-alpine
    environment:
      - POSTGRES_USER=kubey
      - POSTGRES_PASSWORD=kubey
      - POSTGRES_DB=kubey
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Run with:

docker compose up -d

Kubernetes

Deploy Kubey directly to your Kubernetes cluster. It will automatically discover the cluster it's running in.

kubey-deployment.yamlyaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kubey
  namespace: kubey
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kubey
  template:
    metadata:
      labels:
        app: kubey
    spec:
      serviceAccountName: kubey
      containers:
        - name: kubey
          image: jboocodes/kubey:latest
          ports:
            - containerPort: 8080
          env:
            - name: AUTH_MODE
              value: "shared"
            - name: DATABASE_URL
              valueFrom:
                secretKeyRef:
                  name: kubey-secrets
                  key: database-url
            - name: JWT_SECRET
              valueFrom:
                secretKeyRef:
                  name: kubey-secrets
                  key: jwt-secret
---
apiVersion: v1
kind: Service
metadata:
  name: kubey
  namespace: kubey
spec:
  selector:
    app: kubey
  ports:
    - port: 80
      targetPort: 8080
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kubey
  namespace: kubey
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kubey-reader
rules:
  - apiGroups: [""]
    resources: ["pods", "services", "nodes", "namespaces", "pods/log"]
    verbs: ["get", "list", "watch"]
  - apiGroups: ["apps"]
    resources: ["deployments", "replicasets"]
    verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubey-reader
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubey-reader
subjects:
  - kind: ServiceAccount
    name: kubey
    namespace: kubey

Apply with:

kubectl create namespace kubey
kubectl apply -f kubey-deployment.yaml

Helm Chart

The easiest way to deploy Kubey to Kubernetes with customizable values.

Install with Helmbash
helm repo add kubey https://charts.kubey.app
helm repo update

helm install kubey jboocodes/kubey \
  --namespace kubey \
  --create-namespace \
  --set auth.mode=shared \
  --set auth.github.clientId=YOUR_CLIENT_ID \
  --set auth.github.clientSecret=YOUR_CLIENT_SECRET

Monitoring Multiple Clusters

To monitor multiple clusters from a single Kubey instance, ensure your kubeconfig contains all the clusters you want to monitor:

Merge kubeconfigsbash
# Set KUBECONFIG to include multiple cluster configs
export KUBECONFIG=~/.kube/config:~/.kube/staging-config:~/.kube/prod-config

# Merge into a single file
kubectl config view --flatten > ~/.kube/merged-config

# Use the merged config with Kubey
docker run -d \
  -v ~/.kube/merged-config:/root/.kube/config:ro \
  -p 8080:8080 \
  jboocodes/kubey

All contexts in your kubeconfig will be automatically detected and available in Kubey.