|
| 1 | +# openconcho Helm Chart |
| 2 | + |
| 3 | +Helm 3 chart for self-hosting the [openconcho](https://github.com/offendingcommit/openconcho) web UI on Kubernetes. |
| 4 | + |
| 5 | +The chart deploys a single nginx-unprivileged container (port 8080, UID 101) that serves the React SPA and reverse-proxies Honcho API calls under `/api` to avoid browser CORS issues. |
| 6 | + |
| 7 | +## Prerequisites |
| 8 | + |
| 9 | +- Kubernetes 1.25+ |
| 10 | +- Helm 3.10+ |
| 11 | +- A running [Honcho](https://github.com/plastic-labs/honcho) instance reachable from within the cluster (or via a configured ingress) |
| 12 | + |
| 13 | +## Installing |
| 14 | + |
| 15 | +Add the chart repository: |
| 16 | + |
| 17 | +```bash |
| 18 | +helm registry login ghcr.io --username <github-username> --password <github-token> |
| 19 | +``` |
| 20 | + |
| 21 | +Install the chart: |
| 22 | + |
| 23 | +```bash |
| 24 | +helm install openconcho oci://ghcr.io/offendingcommit/charts/openconcho \ |
| 25 | + --version 0.14.0 \ |
| 26 | + --set honcho.defaultUrl=https://honcho.example.com |
| 27 | +``` |
| 28 | + |
| 29 | +Or with a values file (recommended): |
| 30 | + |
| 31 | +```bash |
| 32 | +helm install openconcho oci://ghcr.io/offendingcommit/charts/openconcho \ |
| 33 | + --version 0.14.0 \ |
| 34 | + -f my-values.yaml |
| 35 | +``` |
| 36 | + |
| 37 | +## Upgrading |
| 38 | + |
| 39 | +```bash |
| 40 | +helm upgrade openconcho oci://ghcr.io/offendingcommit/charts/openconcho \ |
| 41 | + --version <new-version> \ |
| 42 | + -f my-values.yaml |
| 43 | +``` |
| 44 | + |
| 45 | +## Uninstalling |
| 46 | + |
| 47 | +```bash |
| 48 | +helm uninstall openconcho |
| 49 | +``` |
| 50 | + |
| 51 | +## Configuration |
| 52 | + |
| 53 | +All values with their defaults are documented in [`values.yaml`](values.yaml). Key options: |
| 54 | + |
| 55 | +| Value | Default | Description | |
| 56 | +|---|---|---| |
| 57 | +| `replicaCount` | `1` | Number of pod replicas | |
| 58 | +| `image.repository` | `ghcr.io/offendingcommit/openconcho-web` | Container image | |
| 59 | +| `image.tag` | `""` | Tag; defaults to chart `appVersion` | |
| 60 | +| `image.pullPolicy` | `IfNotPresent` | Image pull policy | |
| 61 | +| `honcho.defaultUrl` | `""` | Honcho URL pre-seeded in the UI | |
| 62 | +| `honcho.upstreamAllowlist` | `""` | SSRF guard (comma-separated host globs) | |
| 63 | +| `service.type` | `ClusterIP` | `ClusterIP` / `NodePort` / `LoadBalancer` | |
| 64 | +| `service.port` | `80` | Service port | |
| 65 | +| `ingress.enabled` | `false` | Enable Ingress resource | |
| 66 | +| `ingress.className` | `""` | IngressClass name | |
| 67 | +| `autoscaling.enabled` | `false` | Enable HorizontalPodAutoscaler | |
| 68 | +| `podDisruptionBudget.enabled` | `false` | Enable PodDisruptionBudget | |
| 69 | +| `networkPolicy.enabled` | `false` | Enable NetworkPolicy (same-namespace only) | |
| 70 | +| `resources.requests.memory` | `32Mi` | Memory request | |
| 71 | +| `resources.limits.memory` | `128Mi` | Memory limit | |
| 72 | + |
| 73 | +## Examples |
| 74 | + |
| 75 | +### Minimal (ClusterIP, no ingress) |
| 76 | + |
| 77 | +```yaml |
| 78 | +honcho: |
| 79 | + defaultUrl: http://honcho.honcho.svc.cluster.local:8000 |
| 80 | +``` |
| 81 | +
|
| 82 | +### With Ingress and TLS (cert-manager) |
| 83 | +
|
| 84 | +```yaml |
| 85 | +honcho: |
| 86 | + defaultUrl: https://honcho.example.com |
| 87 | + |
| 88 | +ingress: |
| 89 | + enabled: true |
| 90 | + className: nginx |
| 91 | + annotations: |
| 92 | + cert-manager.io/cluster-issuer: letsencrypt-prod |
| 93 | + hosts: |
| 94 | + - host: openconcho.example.com |
| 95 | + paths: |
| 96 | + - path: / |
| 97 | + pathType: Prefix |
| 98 | + tls: |
| 99 | + - secretName: openconcho-tls |
| 100 | + hosts: |
| 101 | + - openconcho.example.com |
| 102 | +``` |
| 103 | +
|
| 104 | +### With autoscaling and disruption budget |
| 105 | +
|
| 106 | +```yaml |
| 107 | +replicaCount: 2 |
| 108 | + |
| 109 | +autoscaling: |
| 110 | + enabled: true |
| 111 | + minReplicas: 2 |
| 112 | + maxReplicas: 10 |
| 113 | + targetCPUUtilizationPercentage: 70 |
| 114 | + |
| 115 | +podDisruptionBudget: |
| 116 | + enabled: true |
| 117 | + minAvailable: 1 |
| 118 | +``` |
| 119 | +
|
| 120 | +### With NetworkPolicy |
| 121 | +
|
| 122 | +> **Note:** When `networkPolicy.enabled=true` and `ingress.enabled=true`, you must add |
| 123 | +> a policy that allows traffic from the ingress-controller namespace. Run |
| 124 | +> `helm status <release>` for the exact `kubectl edit` command after install. |
| 125 | + |
| 126 | +```yaml |
| 127 | +networkPolicy: |
| 128 | + enabled: true |
| 129 | +
|
| 130 | +ingress: |
| 131 | + enabled: true |
| 132 | + className: nginx |
| 133 | + hosts: |
| 134 | + - host: openconcho.example.com |
| 135 | + paths: |
| 136 | + - path: / |
| 137 | + pathType: Prefix |
| 138 | +``` |
| 139 | + |
| 140 | +### Private registry |
| 141 | + |
| 142 | +```yaml |
| 143 | +image: |
| 144 | + repository: registry.example.com/myorg/openconcho-web |
| 145 | + tag: "0.14.0" |
| 146 | + pullPolicy: Always |
| 147 | +
|
| 148 | +imagePullSecrets: |
| 149 | + - name: registry-credentials |
| 150 | +``` |
| 151 | + |
| 152 | +## ArgoCD Application |
| 153 | + |
| 154 | +```yaml |
| 155 | +apiVersion: argoproj.io/v1alpha1 |
| 156 | +kind: Application |
| 157 | +metadata: |
| 158 | + name: openconcho |
| 159 | + namespace: argocd |
| 160 | +spec: |
| 161 | + project: default |
| 162 | + source: |
| 163 | + repoURL: ghcr.io/offendingcommit/charts |
| 164 | + chart: openconcho |
| 165 | + targetRevision: 0.14.0 |
| 166 | + helm: |
| 167 | + valuesObject: |
| 168 | + honcho: |
| 169 | + defaultUrl: https://honcho.example.com |
| 170 | + ingress: |
| 171 | + enabled: true |
| 172 | + className: nginx |
| 173 | + annotations: |
| 174 | + cert-manager.io/cluster-issuer: letsencrypt-prod |
| 175 | + hosts: |
| 176 | + - host: openconcho.example.com |
| 177 | + paths: |
| 178 | + - path: / |
| 179 | + pathType: Prefix |
| 180 | + tls: |
| 181 | + - secretName: openconcho-tls |
| 182 | + hosts: |
| 183 | + - openconcho.example.com |
| 184 | + destination: |
| 185 | + server: https://kubernetes.default.svc |
| 186 | + namespace: openconcho |
| 187 | + syncPolicy: |
| 188 | + automated: |
| 189 | + prune: true |
| 190 | + selfHeal: true |
| 191 | + syncOptions: |
| 192 | + - CreateNamespace=true |
| 193 | +``` |
| 194 | + |
| 195 | +> OCI chart sources require ArgoCD 2.10+ (OCI Helm support GA). |
| 196 | + |
| 197 | +## Helm tests |
| 198 | + |
| 199 | +After install, run the bundled tests to verify the deployment is healthy: |
| 200 | + |
| 201 | +```bash |
| 202 | +helm test openconcho |
| 203 | +``` |
| 204 | + |
| 205 | +Two test pods run and exit 0 on success: |
| 206 | + |
| 207 | +| Test | What it checks | |
| 208 | +|---|---| |
| 209 | +| `test-healthz` | `GET /healthz` body equals `ok` | |
| 210 | +| `test-spa-root` | `GET /` returns HTTP 200 | |
| 211 | + |
| 212 | +Pass `--logs` to see output from failing pods: |
| 213 | + |
| 214 | +```bash |
| 215 | +helm test openconcho --logs |
| 216 | +``` |
| 217 | + |
| 218 | +## Security posture |
| 219 | + |
| 220 | +| Control | Value | |
| 221 | +|---|---| |
| 222 | +| Run as UID/GID | 101 (nginx-unprivileged) | |
| 223 | +| `runAsNonRoot` | `true` | |
| 224 | +| `readOnlyRootFilesystem` | `true` | |
| 225 | +| Linux capabilities | all dropped | |
| 226 | +| `seccompProfile` | `RuntimeDefault` | |
| 227 | +| `allowPrivilegeEscalation` | `false` | |
| 228 | +| `automountServiceAccountToken` | `false` | |
| 229 | +| Writable paths | `/var/cache/nginx`, `/var/run`, `/tmp` (tmpfs) | |
0 commit comments