Admiral

Install Server

Deploy the Admiral control plane in demo or production mode

This guide walks through deploying the Admiral server using the official Helm chart. Start with demo mode to get a working instance in minutes, then see Server Deployment for production planning.

Architecture overview

An Admiral deployment consists of these components:

ComponentRoleDemo modeProduction
Admiral ServerAPI, console, and orchestration engineHelm-managedHelm-managed
PostgreSQLPlatform state and metadataBuilt-in subchartExternal managed instance
Object StorageArtifact and bundle persistenceBuilt-in MinIO subchartExternal S3, S3-compatible, or GCS
DexOIDC authentication providerBuilt-in (bundled templates)External IdP (Okta, Azure AD, etc.)
IngressHTTP routing and TLS terminationNGINX via KinDYour cluster's ingress or Gateway API

Demo mode deployment

Demo mode provisions all dependencies as in-cluster services using a single demo-values.yaml file. It's designed for evaluation, local development, and learning the platform.

What you'll get

  • A single-node Kubernetes cluster via KinD
  • Admiral Server with debug logging and profiling enabled
  • PostgreSQL and MinIO running as Helm subcharts
  • Dex configured with a static demo user
  • NGINX ingress routing everything through http://admiral.127.0.0.1.nip.io

Automated setup

The fastest path is the included make dev target, which runs the full setup script:

git clone https://github.com/admiral-platform/admiral-helm.git
cd admiral-helm
make dev

This single command:

  1. Creates a KinD cluster named admiral (or reuses an existing one)
  2. Installs the NGINX ingress controller
  3. Builds Helm chart dependencies (PostgreSQL, MinIO)
  4. Installs Admiral with demo-values.yaml

When it completes, you'll see:

===========================================
  Admiral is ready!
===========================================

  URL: http://admiral.127.0.0.1.nip.io

  Demo credentials:
    Email:    admin@example.com
    Password: shipitnow

The ingress controller may take 1–2 minutes to become fully ready after the script completes. If the URL doesn't load immediately, wait and retry.

Manual setup

If you prefer to run each step yourself or need to customize the process:

Create the KinD cluster

kind create cluster --name admiral --config kind/cluster.yaml

The cluster config maps ports 80 and 443 from the container to your host and labels the node as ingress-ready:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
    image: kindest/node:v1.32.3
    labels:
      ingress-ready: "true"
    extraPortMappings:
      - containerPort: 80
        hostPort: 80
        protocol: TCP
      - containerPort: 443
        hostPort: 443
        protocol: TCP

Install the NGINX ingress controller

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml

kubectl rollout status deployment ingress-nginx-controller \
  --namespace ingress-nginx \
  --timeout=120s

Build chart dependencies

helm dependency build charts/admiral

This pulls the PostgreSQL and MinIO subcharts into charts/admiral/charts/.

Install Admiral

helm upgrade --install admiral charts/admiral \
  -f charts/admiral/demo-values.yaml \
  --namespace default \
  --wait \
  --timeout 5m

Demo values explained

The demo-values.yaml file enables all built-in components with lightweight resource limits:

# Ingress: routes traffic through NGINX on a nip.io hostname
ingress:
  enabled: true
  className: nginx
  host: admiral.127.0.0.1.nip.io

# Server: debug logging and profiling for development
server:
  logLevel: debug
  enablePprof: true

# Database: built-in PostgreSQL with minimal storage
postgresql:
  enabled: true
  auth:
    password: "shipitnow"
  persistence: 512Mi

# Object storage: built-in MinIO with minimal storage
minio:
  enabled: true
  rootPassword: "shipitnow"
  persistence: 512Mi

# Authentication: Dex with a static demo user
oauth2:
  demoPassword: "shipitnow"

dex:
  enabled: true
  resources:
    requests:
      cpu: 25m
      memory: 32Mi

# Server resource limits
admiral:
  resources:
    requests:
      cpu: 50m
      memory: 64Mi
    limits:
      memory: 256Mi

Sign in

  1. Open http://admiral.127.0.0.1.nip.io in your browser
  2. Click Log in with Email
  3. Enter the demo credentials:
    • Email: admin@example.com
    • Password: shipitnow

If you didn't set oauth2.demoPassword explicitly, the chart auto-generates a random password. Retrieve it with:

kubectl get secret admiral-oauth2 \
  -o jsonpath='{.data.dex-demo-password}' | base64 -d; echo

Verify the deployment

Check that all pods are running:

kubectl get pods

You should see pods for Admiral Server, PostgreSQL, MinIO, and Dex, all in Running status.

Verify the API is responding:

curl -s http://admiral.127.0.0.1.nip.io/healthz

Tear down

When you're done evaluating:

make dev-down

Or manually:

kind delete cluster --name admiral

What's next

On this page