Getting Started

Install Wardn and deploy your first application

Getting Started

This guide walks you through installing Wardn, creating your first App, and watching it sync.

Prerequisites

  • Docker with Docker Compose
  • kubectl installed (for the Kubernetes path)
  • Git repository with your application manifests (for Git-source apps)

Installation

Local Kubernetes (k3s)

docker-compose.k8s.yml layers a real test environment onto the core stack: a k3s cluster, a Gitea git server, an OpenBao dev server, and a plain-HTTP registry:

# Start k3s plus the core stack
docker compose -f docker-compose.yml -f docker-compose.k8s.yml up -d

# Export the k3s kubeconfig for kubectl / local runs
docker compose -f docker-compose.k8s.yml exec k3s \
  cat /etc/rancher/k3s/k3s.yaml > k3s.yaml
kubectl --kubeconfig k3s.yaml get nodes

The server connects to k3s at https://host.docker.internal:6443 via WARDN_MGMT_KUBECONFIG wiring in the k8s compose file. To run the operator on your host instead:

KUBECONFIG=k3s.yaml go run ./operator/cmd/operator

The App CRD manifest must exist in the cluster — generate/install it with controller-gen from operator/api/v1alpha1 (a checked-in config/crd bundle doesn't exist yet).

Your First Deployment

Step 1: Verify Installation

docker compose ps

Expected output:

NAME               STATUS
wardn-postgres-1   Up (healthy)
wardn-redis-1      Up (healthy)
wardn-server-1     Up (healthy)
wardn-operator-1   Up        # requires a kubeconfig; exits without one
wardn-platform-1   Up
wardn-docs-1       Up
wardn-website-1    Up

Step 2: Access the Dashboard

Open http://localhost:3002 and create an account. Auth runs on Better Auth inside the platform app — the Go API validates the session cookie, it doesn't issue logins.

Step 3: Create an App

You can create an App via the platform UI or directly as a CR:

Step 4: Watch the Sync

kubectl --kubeconfig k3s.yaml get app my-app -n org-my-org -w

The app transitions through sync states:

NAME     SYNC STATUS   HEALTH
my-app   OutOfSync     Unknown
my-app   Synced        Healthy

Step 5: Verify Resources

kubectl --kubeconfig k3s.yaml get all -n default

Understanding What Happened

  1. The Operator detected the new App CR
  2. It cloned the Git repository and rendered manifests from the path
  3. Manifests were applied to the destination cluster using server-side apply
  4. Health checks ran against the deployed resources
  5. Status was written back to the App CR (syncStatus, healthStatus, revision)
  6. The Server reads the CR status and shows it in the dashboard

Next Steps

On this page