Documentation

Quick Start

Get Vesta running on your Kubernetes cluster in under 5 minutes.

Prerequisites

  • Kubernetes 1.27+
  • kubectl and Helm 3
  • PostgreSQL — or let Vesta deploy one for you
  • (Optional) cert-manager for TLS, metrics-server for autoscaling

1. Install

curl -fsSL https://getvesta.sh/install.sh | sh

Checks your prerequisites, deploys Vesta with a bundled PostgreSQL, waits for it to come up, and prints the URL. Re-running it is also the upgrade path.

To point at a database you already run:

VESTA_DATABASE_URL="postgres://user:pass@db-host:5432/vesta?sslmode=disable" \
  sh -c "$(curl -fsSL https://getvesta.sh/install.sh)"

Other variables: VESTA_VERSION, VESTA_NAMESPACE, VESTA_RELEASE, VESTA_INGRESS_CLASS, and VESTA_DRY_RUN=1 to print the Helm command without running it.

With Helm directly

Create the namespace first, carrying the metadata Helm uses to recognise its own resources, then install:

kubectl create namespace vesta-system
kubectl annotate namespace vesta-system \
  meta.helm.sh/release-name=vesta \
  meta.helm.sh/release-namespace=vesta-system
kubectl label namespace vesta-system app.kubernetes.io/managed-by=Helm

helm install vesta oci://ghcr.io/vesta-infra/charts/vesta \
  -n vesta-system \
  --set postgres.enabled=true \
  --set config.ingressClassName=traefik

Not --create-namespace: that makes the namespace without the ownership metadata, and the chart’s own Namespace object then collides with it.

CRDs are applied by the chart — there is nothing to kubectl apply by hand, on install or on upgrade.

Set config.ingressClassName to match your ingress controller. Leaving it empty produces app ingresses with no class, which no controller claims, and every app URL returns 404.

2. Open the dashboard

kubectl port-forward -n vesta-system svc/vesta-ui 8080:80

Then visit http://localhost:8080/setup to create the first admin account.

To serve it on a real hostname, set that under Settings → SSL Certificates once you are in, or pass --set ui.ingress.enabled=true --set ui.ingress.host=vesta.example.com at install time.

3. Upgrading

helm upgrade vesta oci://ghcr.io/vesta-infra/charts/vesta \
  -n vesta-system --reset-then-reuse-values

CRDs come with it. --reset-then-reuse-values rather than --reuse-values: the latter carries your old values forward wholesale and silently drops new chart defaults.

An admin can also upgrade from Settings → System, where Vesta shows the running version and whether a newer release exists.

4. Deploy your first app

Create a project and an app in the web UI (or via the API), then ship it.

Build straight from a git branch:

vesta build my-app --environment production --branch main

Or roll out a pre-built image tag:

vesta deploy my-app --tag v1.2.3 --environment production

The same thing over the API — environment is required:

curl -X POST https://<api-host>/api/v1/apps/my-app/deploy \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"environment": "production", "tag": "v1.2.3"}'

Next steps