Configuration

Uncloud is configured through environment variables and a config.yaml file.

Environment Variables

VariableDefaultDescription
HTTP_PORT8080Port for the API server
DB_PATHdata/nebula.dbSQLite database file path
KUBECONFIGAuto-detectedKubernetes configuration file
PROMETHEUS_URLhttp://localhost:30090Prometheus server endpoint
BUILD_CONTEXT_PATHShared PVC path for build contexts
REGISTRY_URLDocker registry for built images
REGISTRY_SECRET_NAMEK8s secret for registry auth
VULTR_KEYVultr API key (for cloud provider integration)
ENVdevelopmentEnvironment (development or production)

Frontend

VariableDefaultDescription
VITE_API_URLhttp://localhost:8080Backend API endpoint

config.yaml

The main configuration file lives at the project root:
apps:
  # Base domain for app subdomains
  # Apps are accessible at <slug>.<base_domain>
  base_domain: go4.site

  # Kubernetes Secret containing the wildcard TLS certificate
  default_tls_secret_name: wildcard-cert

  # cert-manager ClusterIssuer for custom domain certificates
  cert_manager_cluster_issuer: letsencrypt-prod

storage:
  # StorageClass for block volumes (PVCs)
  block_class: ceph-rbd

  # S3-compatible object storage configuration
  object:
    endpoint: http://127.0.0.1:9000
    region: us-east-1
    access_key: minioadmin
    secret_key: minioadmin
    bucket_prefix: nebula

App Platform Configuration

Base Domain

The base_domain setting controls how apps get their default URLs:
<app-slug>.<base_domain>
Example with base_domain: go4.site:
  • App “my-api” → my-api.go4.site
  • App “dashboard” → dashboard.go4.site

TLS Setup

For HTTPS on the default domain, you need a wildcard TLS certificate:
# Create a wildcard cert Secret (if using cert-manager)
kubectl create secret tls wildcard-cert \
  --cert=fullchain.pem \
  --key=privkey.pem \
  -n default
For custom domains, configure a cert-manager ClusterIssuer:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: admin@example.com
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: traefik

Storage Configuration

Block Storage

Set the block_class to match your cluster’s StorageClass:
# Check available StorageClasses
kubectl get storageclass
ProviderStorageClass
Rook/Cephceph-rbd
Longhornlonghorn
Local Pathlocal-path

Object Storage

Configure S3-compatible storage credentials:
storage:
  object:
    endpoint: http://minio.storage.svc:9000
    region: us-east-1
    access_key: YOUR_ACCESS_KEY
    secret_key: YOUR_SECRET_KEY
    bucket_prefix: dkc

Kubernetes Auto-Detection

Uncloud automatically detects the Kubernetes configuration:
  1. KUBECONFIG environment variable (highest priority)
  2. /etc/rancher/k3s/k3s.yaml (K3s default)
  3. /var/snap/microk8s/current/credentials/client.config (MicroK8s)
  4. ~/.kube/config (standard kubectl config)

Database

The SQLite database is created automatically at the DB_PATH location. No configuration needed.
For production, store the database on persistent storage and include it in your backup strategy.

Sync Loop

The reconciliation loop between SQLite and Kubernetes runs every 15 seconds. This interval is not currently configurable but handles:
  • Creating K8s resources for new SQLite records
  • Pulling runtime status (IPs, phases, ready counts) back to SQLite
  • Updating resource statuses across the system