Skip to content

Installation

Warden is distributed as a Docker image and a Helm chart. It runs as a single binary with no external dependencies.

Pull and run the Warden image:

Terminal window
docker run -d \
-p 9090:9090 \
-v warden_data:/data \
ghcr.io/projecthelena/warden:latest

Warden is now running at http://localhost:9090.

Create a docker-compose.yml:

services:
warden:
image: ghcr.io/projecthelena/warden:latest
ports:
- "9090:9090"
volumes:
- warden_data:/data
volumes:
warden_data:
Terminal window
docker compose up -d

For larger deployments or high-availability setups:

services:
warden:
image: ghcr.io/projecthelena/warden:latest
ports:
- "9090:9090"
environment:
- DB_URL=postgres://warden:warden@db:5432/warden?sslmode=disable
depends_on:
db:
condition: service_healthy
db:
image: postgres:17
environment:
- POSTGRES_USER=warden
- POSTGRES_PASSWORD=warden
- POSTGRES_DB=warden
volumes:
- pg_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "warden"]
interval: 5s
retries: 5
volumes:
pg_data:
Terminal window
docker compose up -d

Warden has an official Helm chart for Kubernetes deployments. The chart supports SQLite, internal PostgreSQL (auto-deployed StatefulSet), or external PostgreSQL.

Source: github.com/projecthelena/helm-charts

Terminal window
helm repo add projecthelena https://charts.projecthelena.com
helm repo update
Terminal window
helm install warden projecthelena/warden \
--namespace warden \
--create-namespace

This deploys Warden with SQLite and a 1Gi PersistentVolumeClaim for data persistence.

Terminal window
helm install warden projecthelena/warden \
--namespace warden \
--create-namespace \
--set database.type=postgres \
--set database.postgres.enabled=true \
--set database.postgres.auth.password=your-secure-password

This deploys Warden alongside an internal PostgreSQL StatefulSet with 5Gi of persistent storage.

If you already have a PostgreSQL instance:

Terminal window
helm install warden projecthelena/warden \
--namespace warden \
--create-namespace \
--set database.type=postgres \
--set database.external.enabled=true \
--set database.external.url="postgres://user:pass@your-db-host:5432/warden?sslmode=require"
ValueDefaultDescription
replicaCount1Number of replicas
image.repositoryghcr.io/projecthelena/wardenContainer image
image.taglatestImage tag
service.typeClusterIPKubernetes service type
service.port9090Service port
config.cookieSecurefalseSet to true for HTTPS
config.trustProxyfalseSet to true behind a reverse proxy
database.typesqlitesqlite or postgres
database.sqlite.persistence.size1GiSQLite PVC size
database.postgres.enabledfalseDeploy internal PostgreSQL
database.postgres.auth.passwordAuto-generatedPostgreSQL password
database.postgres.persistence.size5GiPostgreSQL PVC size
database.external.enabledfalseUse external PostgreSQL
database.external.urlExternal PostgreSQL connection string
ingress.enabledfalseEnable Kubernetes Ingress
ingressRoute.enabledfalseEnable Traefik IngressRoute
resources.requests.cpu100mCPU request
resources.requests.memory128MiMemory request
resources.limits.cpu500mCPU limit
resources.limits.memory256MiMemory limit

Standard Kubernetes Ingress:

ingress:
enabled: true
className: nginx
annotations:
cert-manager.io/cluster-issuer: letsencrypt
hosts:
- host: status.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: warden-tls
hosts:
- status.example.com

Traefik IngressRoute:

ingressRoute:
enabled: true
entryPoints:
- websecure
routes:
- match: Host(`status.example.com`)
kind: Rule
tls:
certResolver: letsencrypt

Example: ArgoCD with Traefik and PostgreSQL

Section titled “Example: ArgoCD with Traefik and PostgreSQL”

Here’s a complete ArgoCD Application manifest deploying Warden on Kubernetes with Traefik and an internal PostgreSQL database:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: warden
namespace: argocd
spec:
project: default
source:
repoURL: https://charts.projecthelena.com
chart: warden
targetRevision: 0.2.4
helm:
values: |
database:
type: postgres
postgres:
enabled: true
auth:
username: warden
password: "" # auto-generated — see ignoreDifferences below
database: warden
persistence:
enabled: true
size: 10Gi
accessMode: ReadWriteOnce
storageClass: your-storage-class
ingressRoute:
enabled: true
entryPoints:
- websecure
routes:
- match: Host(`status.example.com`)
kind: Rule
tls:
certResolver: letsencrypt
ignoreDifferences:
- kind: Secret
name: warden-postgresql
jsonPointers:
- /data
destination:
server: https://kubernetes.default.svc
namespace: warden
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
- ServerSideApply=true
- RespectIgnoreDifferences=true

Requirements: Go 1.25+ and Node.js 22+

Terminal window
git clone https://github.com/projecthelena/warden.git
cd warden
make build
./bin/warden

This builds the React frontend, embeds it into the Go binary, and outputs a single executable at bin/warden.

VariableDefaultDescription
LISTEN_ADDR:9090Address and port to listen on
DB_PATH/data/warden.dbSQLite database file path
DB_URLPostgreSQL connection string (auto-switches from SQLite)
COOKIE_SECUREfalseSet to true when running behind HTTPS
TRUST_PROXYfalseSet to true when behind a reverse proxy for correct IP-based rate limiting
FeatureSQLite (Default)PostgreSQL
SetupZero configurationRequires running PostgreSQL
Best forSingle instance, low-to-medium trafficHigh availability, large-scale
BackupsCopy the database filepg_dump or existing pipeline
PerformanceGreat for most workloadsBetter under heavy concurrent writes

SQLite is the default and requires no setup. The database file is created automatically at the path specified by DB_PATH.

To use PostgreSQL, set the DB_URL environment variable. Warden auto-detects the database type from the connection string prefix.

Migrations run automatically on startup. Warden ships with embedded migration files for both SQLite and PostgreSQL — no manual migration steps required.

After starting Warden, open http://localhost:9090 in your browser (or your Ingress hostname for Kubernetes). You should see the setup page where you’ll create your first admin account.

You can also check the health endpoint:

Terminal window
curl http://localhost:9090/healthz