Installation¶
Version placeholder
Throughout this guide, vX.Y.Z represents the version provided by your Valuematic representative. Replace it with the actual version tag (e.g., v1.2.0).
Quick Install¶
# Step 1: Make the installer executable (provided by your Valuematic representative)
chmod +x slopilot-install.sh
# Step 2: Install
./slopilot-install.sh \
--username <ghcr-username> \
--password <ghcr-token> \
--license-key "SLOPILOT-XXXX" \
--tag vX.Y.Z
# Step 3: Verify
kubectl get pods -n slopilot -w
Installer Reference¶
Required flags (install/upgrade mode)¶
| Flag | Description |
|---|---|
--username USERNAME |
GHCR username for image and chart pull |
--password PASSWORD |
GHCR token/password |
--license-key KEY |
SLOpilot license key |
--tag TAG |
Image tag to deploy (e.g., v1.2.0) |
Required flags (template mode)¶
| Flag | Description |
|---|---|
--username USERNAME |
GHCR username for chart pull |
--password PASSWORD |
GHCR token/password |
--tag TAG |
Image tag to render |
Note: --license-key is not required in template mode.
Optional flags¶
| Flag | Default | Description |
|---|---|---|
--namespace NAME |
slopilot |
Target Kubernetes namespace |
--release-name NAME |
slopilot-rightsizing |
Helm release name |
--values FILE |
— | Extra Helm values file (repeatable) |
--admin-password PW |
Auto-generated | Initial admin password |
--password-file FILE |
— | Read GHCR password from file (mutually exclusive with --password) |
--license-key-file FILE |
— | Read license key from file (mutually exclusive with --license-key) |
--template |
— | Render manifests to stdout; do not deploy |
--yes |
— | Skip confirmation prompt |
--help, -h |
— | Show help |
Verifying the Installation¶
After a successful install, confirm all pods are running and access the UI:
# Watch pods come up
kubectl get pods -n slopilot -w
# Port-forward to access the UI
kubectl port-forward -n slopilot svc/slopilot-rightsizing 8080:80
# Open in browser
open http://localhost:8080
Template Mode¶
Template mode renders the full set of Kubernetes manifests to stdout without deploying anything to a cluster. This is useful for reviewing what will be applied, auditing changes before rollout, or feeding output into a GitOps pipeline.
./slopilot-install.sh \
--username <ghcr-username> \
--password <ghcr-token> \
--tag vX.Y.Z \
--template > manifests.yaml
--license-key is not required in template mode. The rendered output can be piped directly to kubectl apply -f - or committed to a GitOps repository.
Using Custom Values Files¶
Pass --values one or more times to layer additional Helm values on top of the defaults:
./slopilot-install.sh \
--username myuser \
--password ghp_xxxx \
--license-key "SLOPILOT-XXXX" \
--tag vX.Y.Z \
--values my-overrides.yaml
Restricted overrides
Values files must not contain nameOverride or fullnameOverride. These keys break secret name resolution and the installer will reject them with an error.
Reading Credentials from Files¶
For automation and CI/CD pipelines, credentials can be read from files instead of being passed on the command line:
./slopilot-install.sh \
--username myuser \
--password-file ./secrets/ghcr-token \
--license-key-file ./secrets/license-key \
--tag vX.Y.Z
--password and --password-file are mutually exclusive. The same applies to --license-key and --license-key-file.
What the Installer Does¶
The installer performs five steps in order:
-
Validates inputs — checks that all required flags are present, verifies that
helmandkubectlare available inPATH, tests connectivity to the target cluster, and performs RBAC preflight checks to confirm the calling user has sufficient permissions. -
Creates the namespace — applies
kubectl create namespace <namespace>using--dry-run=client | kubectl apply -f -, making the operation idempotent. -
Creates Kubernetes secrets:
{release}-license— stores the license key supplied via--license-key(or--license-key-file).{release}-users— stores internal authentication credentials and the initial admin password (auto-generated or provided via--admin-password). All values are read from an existing secret if one already exists, so they are preserved across upgrades.registry-pull-secret— Docker registry credentials for pulling images fromghcr.io.
-
Authenticates to the Helm OCI registry — logs into
ghcr.iousing the supplied credentials to pull the Helm chart. -
Runs
helm upgrade --install— deploys the chart with--atomic, which automatically rolls back to the previous revision if the new release fails its health checks.
Upgrading¶
Re-run the installer with the new version tag. Existing secrets and data are preserved automatically.
./slopilot-install.sh \
--username <ghcr-username> \
--password <ghcr-token> \
--license-key "SLOPILOT-XXXX" \
--tag vNEW.VERSION
Key points:
- Authentication credentials and admin password are read from the existing Kubernetes secret and preserved unchanged.
- The
--atomicflag ensures the cluster is automatically restored to the previous revision if the new release fails health checks. - Downtime is limited to the pod restart; the chart uses a Recreate deployment strategy.
Rolling Back¶
# View release history
helm history slopilot-rightsizing -n slopilot
# Roll back to the previous revision
helm rollback slopilot-rightsizing -n slopilot
Migration from Static Manifests¶
If you previously deployed SLOpilot using a generated YAML manifest (kubectl apply), follow these steps to migrate to a Helm-managed deployment.
Back up your data before migration
-
Identify your namespace and release name from the existing manifest metadata.
-
Remove
NamespaceandPersistentVolumeClaimobjects from your manifest to preserve your data: -
Delete the old resources (this preserves the namespace and PVCs):
-
Clean up cluster-scoped resources:
-
Install via Helm:
Your data (user accounts, monitoring configuration) is preserved in the existing PersistentVolumeClaim.
Uninstalling¶
PersistentVolumeClaims are retained
Both the application data PVC and the Prometheus data PVC are annotated with helm.sh/resource-policy: keep. They are not deleted when you uninstall the Helm release. To remove them manually:
To also remove the namespace: