Helm chart for deploying the XBoard panel (web + horizon + ws-server) on Kubernetes.
Chart: 0.2.0 · App: latest · Kubernetes: ≥ 1.29 · Helm: ≥ 3.14
This chart deploys three components of XBoard:
| Component | Description | Resources |
|---|---|---|
| web | HTTP server (Laravel app) | Deployment + Service + HTTPRoutes + HPA + PDB |
| horizon | Queue worker (Laravel Horizon) | Deployment + HPA + PDB |
| ws-server | WebSocket server | Deployment + Service + HTTPRoute + HPA + PDB |
Out of scope (manage separately): PostgreSQL database (CNPG), Redis (Bitnami chart), TLS certificate (cert-manager), and ArgoCD Application resources.
- Kubernetes >= 1.29
- Helm >= 3.14
- Gateway API v1 CRDs installed in cluster
- CNPG Cluster
xboard-app-dbdeployed and ready (providesxboard-app-db-rwservice) - Bitnami Redis release
redisdeployed (providesredis-masterservice) - Stakater Reloader operator (optional, required when
reloader.enabled=true)
helm repo add xboard https://ah-dark.github.io/xboard-helm-chart
helm repo update
helm install xboard xboard/xboard \
--namespace xboard \
--create-namespacegit clone https://github.com/AH-dark/xboard-helm-chart.git
helm install xboard ./xboard-helm-chart/charts/xboard \
--namespace xboard \
--create-namespaceThe chart auto-generates APP_KEY when it is left empty and no config.existingSecret is set. On helm upgrade the existing in-cluster value is reused via helm lookup, so pods are not invalidated.
For reproducible output (e.g. GitOps with helm template, dry-runs, or fully deterministic installs), set the key explicitly:
helm install xboard xboard/xboard \
--namespace xboard \
--create-namespace \
--set config.values.APP_KEY="base64:$(openssl rand -base64 32)"| Key | Default | Description |
|---|---|---|
image.repository |
ghcr.io/cedar2025/xboard |
Container image repository |
image.tag |
"" (uses appVersion: latest) |
Image tag override |
image.pullPolicy |
"" (auto: Always for latest/empty, else IfNotPresent) |
Pull policy override |
image.pullSecrets |
[] |
Image pull secrets |
| Key | Default | Description |
|---|---|---|
config.existingSecret |
"" |
Reference an existing Secret (bypasses config.values and APP_KEY generation) |
config.values.APP_KEY |
"" |
Laravel encryption key. Empty = auto-generated at render time (reused via helm lookup on upgrade). Set explicitly for reproducible renders. |
config.values.APP_URL |
https://panel.example.com |
Application URL |
config.values.DB_HOST |
xboard-app-db-rw |
PostgreSQL hostname (CNPG read-write service) |
config.values.REDIS_HOST |
redis-master |
Redis hostname |
config.extraValues |
{} |
Additional env vars to merge into the Secret |
| Key | Default | Description |
|---|---|---|
web.hpa.enabled |
true |
Enable HPA for web |
web.hpa.minReplicas |
2 |
Minimum replicas |
web.hpa.maxReplicas |
8 |
Maximum replicas |
horizon.hpa.minReplicas |
2 |
Horizon min replicas |
horizon.hpa.maxReplicas |
4 |
Horizon max replicas |
ws.hpa.minReplicas |
2 |
WS-server min replicas |
ws.hpa.maxReplicas |
4 |
WS-server max replicas |
web.pdb.enabled |
true |
Enable PDB for web |
web.pdb.minAvailable |
"25%" |
Minimum available pods |
This chart only renders HTTPRoutes; the referenced Gateway must be provisioned out of band (for example via xboard/cert/gateway.yaml or a shared cluster-level gateway).
| Key | Default | Description |
|---|---|---|
ingress.hostname |
panel.example.com |
Single public hostname. Used as fallback when ingress.hostnames is empty. |
ingress.hostnames |
[] |
List of public hostnames applied to every HTTPRoute. Overrides hostname when set. |
ingress.hsts.enabled |
true |
Add HSTS response header |
ingress.redirectHttpToHttps |
true |
Render HTTP to HTTPS redirect HTTPRoute |
ingress.parentRefs.https |
[{name: xboard-gateway, sectionName: https}] |
HTTPS listener parentRef |
ingress.parentRefs.http |
[{name: xboard-gateway, sectionName: http}] |
HTTP listener parentRef |
Set ingress.hostnames to expose the panel under multiple FQDNs (e.g. a primary domain and a vanity alias). Every HTTPRoute (web, redirect, ws) is rendered with the full list:
# values-override.yaml
ingress:
hostnames:
- panel.example.com
- panel.alt.example.comWhen hostnames is empty (the default), the chart falls back to the legacy single hostname field, preserving the behaviour of chart 0.1.x.
The chart renders a Secret from config.values. APP_KEY is auto-generated when empty; pass it explicitly only when you need a stable, externally-known value:
helm install xboard xboard/xboard \
--namespace xboard \
--set config.values.APP_KEY="base64:$(openssl rand -base64 32)" \
--set config.values.DB_PASSWORD="my-db-password" \
--set config.values.REDIS_PASSWORD="my-redis-password"Pre-create the Secret externally, then reference it:
# Create secret beforehand (e.g. via Sealed Secrets, External Secrets, etc.)
kubectl create secret generic my-xboard-config \
--namespace xboard \
--from-env-file=config.env
# Install chart pointing to existing secret
helm install xboard xboard/xboard \
--namespace xboard \
--set config.existingSecret=my-xboard-configWhen config.existingSecret is set, config.values is completely ignored and no Secret is rendered by this chart.
This chart does not render a Gateway resource. It assumes an external Gateway named xboard-gateway already exists in the namespace (e.g. deployed from xboard/cert/gateway.yaml).
To point HTTPRoutes at a different Gateway (e.g. shared cluster-level gateway):
# values-override.yaml
ingress:
parentRefs:
https:
- name: shared-gateway
namespace: gateway-system
sectionName: https
http:
- name: shared-gateway
namespace: gateway-system
sectionName: httphelm upgrade xboard xboard/xboard \
--namespace xboardThe auto-generated APP_KEY is preserved across upgrades via helm lookup. To rotate it, pass --set config.values.APP_KEY="base64:$(openssl rand -base64 32)" (note: pods using the previous key will need to re-encrypt any APP_KEY-encrypted data).
Important: Selector labels are immutable. If you need to change selector labels, you must uninstall and reinstall (with downtime).
helm uninstall xboard --namespace xboardNote: PVCs (if any) and Secrets created outside this chart are NOT deleted by helm uninstall.
This chart is distributed under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later).