Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/pkg.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ jobs:
# name: docs
# path: docs
- name: Setup Go environment
uses: actions/setup-go@v6
uses: actions/setup-go@v7
- name: Generate index.html
run: |
go install github.com/halkeye/helm-repo-html@v0.2.1
Expand Down
1 change: 1 addition & 0 deletions .markdownlint-cli2.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
gitignore: true
ignores:
- "**/node_modules/**"
- "CLAUDE.md"
config:
default: true
MD013:
Expand Down
63 changes: 63 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# helm-charts: agent context

## What this is

A collection of Helm charts published as a chart repository at `https://devpro.github.io/helm-charts`, alongside a VitePress documentation site.
Charts cover both custom applications maintained by devpro and third-party applications packaged for convenience.

Target platform is Linux with Docker, including WSL2, and `bash`.

## Repository layout

- **`charts/`**: the source of every chart, one directory per chart.
[Helm Chart Releaser](https://github.com/helm/chart-releaser) supports neither multiple chart directories nor nested levels, so every chart lives directly under `charts/` and nowhere else.
- **`docs/`**: the VitePress site, with application guides in `docs/application-guides` and custom chart documentation in `docs/custom-charts`.
- **`samples/`**: example manifests and values.
- **`scripts/`**: helper scripts, including `add_helm_repo.sh` which adds the dependency repositories the charts need.

## Common commands

```bash
helm lint charts/<chart> # lint one chart
helm template myapp charts/<chart> -f values.yaml --namespace myns # render the manifests
helm upgrade --install myapp charts/<chart> -f values.yaml --namespace myns --create-namespace
kube-linter lint charts --config .kube-linter.yaml # the check CI runs
npm run docs:dev # serve the documentation site
```

## Releasing a chart

A chart is published when its `version` in `Chart.yaml` changes on `main`, so a change to any chart file needs a version bump in the same commit or nothing is released.
`version` is the chart's own version and `appVersion` is the version of the packaged application: they move independently.
Where a chart pins an image tag in `values.yaml`, that tag and `appVersion` must be updated together.

## Conventions

- Chart values are documented with `# --` comments above the key, which is the helm-docs annotation form.
- A chart that packages a devpro application keeps its values structure close to the application's configuration keys, so that a setting can be traced from `values.yaml` to the environment variable it becomes.
- CI runs `kube-linter` over `charts/` with `.kube-linter.yaml`, and `ct lint` over the charts changed against `main`.
Exclusions belong in `.kube-linter.yaml` with a comment saying why.
- Markdown and YAML are linted in CI through `.markdownlint-cli2.yaml` and `.yamllint.yaml`.
- Do not run markdownlint: linting is run manually by the maintainer and in CI.
- Files carrying real values for a local deployment are named `values.mine.yaml` and are gitignored, so they are never edited or committed.

## Working rules

- **Every command runs in the foreground, and the agent waits for it.**
No background commands, no subagents, no forks, no parallel tasks, even for a long commands.
- Headers stay: short documentation still has sections.
- Commit only when asked, and never push.
Shell scripts are `snake_case` and committed with the executable bit (`git update-index --chmod=+x`).
- Documentation is as short as possible.

## Writing style

Applies to Markdown, code comments, commit messages and prose in scripts.

- **A comment says why, not what, and the why is timeless.**
- **One thought per line.**
Every sentence starts on its own line, and there is no maximum line length.
- **No em dash, no en dash.**
A colon, a comma, or a full stop.
- **No second person.**
"The working tree", not "your working tree"; `<token>`, not `<your-token>`.
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
@AGENTS.md
13 changes: 8 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
# Kube Workload Toolkit
# Devpro Helm Charts

[![GitLab Pipeline Status](https://gitlab.com/devpro-labs/automation/helm-charts/badges/main/pipeline.svg)](https://gitlab.com/devpro-labs/automation/helm-charts/-/pipelines)
[![CI](https://github.com/devpro/helm-charts/actions/workflows/ci.yml/badge.svg)](https://github.com/devpro/helm-charts/actions/workflows/ci.yml)
[![PKG](https://github.com/devpro/helm-charts/actions/workflows/pkg.yml/badge.svg)](https://github.com/devpro/helm-charts/actions/workflows/pkg.yml)
[![GitLab Pipeline Status](https://gitlab.com/devpro-labs/automation/helm-charts/badges/main/pipeline.svg)](https://gitlab.com/devpro-labs/automation/helm-charts/-/pipelines)

Welcome! This project provides:

- **Curated guides**: Step-by-step instructions for installing popular applications using their official Helm charts in a Kubernetes cluster.
- **Custom Helm charts**: A collection of charts that were created for deploying unique workloads on Kubernetes.

Whether you're deploying custom solutions or setting up well-known applications like NGINX or Prometheus, this repository aims to simplify your Kubernetes journey with tested configurations and clear documentation.
Whether you're deploying custom solutions or setting up well-known applications like NGINX or Prometheus,
this repository aims to simplify your Kubernetes journey with tested configurations and clear documentation.

🚀 Get started with the [Kube Workload Toolkit](https://kwt.devpro.fr/)

Expand Down Expand Up @@ -80,5 +81,7 @@ helm:

## Samples

- [DevOpsDays Geneva 2023](samples/devopsdays-geneva-2023/README.md)
- [SUSE Exchange Paris 2023](samples/suse-exchange-paris-2023/README.md)
GitOps:

- [DevOpsDays Geneva 2023](samples/gitops/devopsdays-geneva-2023/README.md)
- [SUSE Exchange Paris 2023](samples/gitops/suse-exchange-paris-2023/README.md)
2 changes: 1 addition & 1 deletion charts/keeptrack/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name: keeptrack
description: Helm chart for Keeptrack
type: application
version: 0.2.5
version: 0.2.6
appVersion: "2.4.1"
home: https://github.com/devpro/keeptrack
sources:
Expand Down
4 changes: 2 additions & 2 deletions charts/keeptrack/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,12 @@ and the daily reference-data sync elects a single runner through a MongoDB lease

Just raise `webapi.replicaCount`.

**`blazorapp`** (Blazor Server): two settings make multiple replicas work, both on by the time you scale:
**`blazorapp`** (Blazor Server): two things make multiple replicas work:

1. `blazorapp.dataProtection.enabled: true` (plus its MongoDB connection, typically the same secret as `webapi.db`) - shares the cookie-encryption key ring across replicas.
Without it, a login cookie issued by one pod is unreadable by the others and users bounce between logged-in and logged-out.
Worth enabling even at 1 replica: sessions then survive pod restarts.
2. `blazorapp.webSocketsOnly: true` (the default) -
2. The application's WebSockets-only transport, on by default:
each Blazor circuit runs on one long-lived WebSocket and therefore naturally sticks to the pod that owns its in-memory state, with no load-balancer affinity needed.
Whatever sits in front only has to pass WebSockets through (Cloudflare tunnels and every mainstream ingress do).

Expand Down
8 changes: 3 additions & 5 deletions charts/keeptrack/templates/_helpers.tpl
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
{{/*
Recommended Kubernetes labels (https://helm.sh/docs/chart_best_practices/labels/), added on top of
the app-specific `app` / `app.kubernetes.io/name` labels every template already sets directly.
These are informational only - never add them to a Deployment's spec.selector.matchLabels, which
is immutable and would break `helm upgrade` for existing releases.
{{/*
Recommended Kubernetes labels (https://helm.sh/docs/chart_best_practices/labels/), added on top of the app-specific `app` / `app.kubernetes.io/name` labels every template already sets directly.
These are informational only: never add them to a Deployment's spec.selector.matchLabels, which is immutable and would break `helm upgrade` for existing releases.
Call with a dict: (dict "app" . "root" $) where "." is the current blazorapp/webapi values entry.
*/}}
{{- define "keeptrack.commonLabels" -}}
Expand Down
6 changes: 4 additions & 2 deletions charts/keeptrack/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,6 @@ spec:
{{- if eq .role "frontend" }}
- name: WebApi__BaseUrl
value: "http://{{ $.Values.webapi.name }}"
- name: Features__IsWebSocketsOnlyEnabled
value: {{ .webSocketsOnly | quote }}
{{- if .dataProtection.enabled }}
{{- if .dataProtection.connectionStringSecretKeyRef }}
- name: DataProtection__MongoDb__ConnectionString
Expand Down Expand Up @@ -215,6 +213,10 @@ spec:
- name: ReferenceData__BookProvider
value: {{ .referenceData.bookProvider | quote }}
{{- end }}
{{- if .referenceData.videoGameProvider }}
- name: ReferenceData__VideoGameProvider
value: {{ .referenceData.videoGameProvider | quote }}
{{- end }}
{{- if .referenceData.tmdb.apiKeySecretKeyRef }}
- name: Tmdb__ApiKey
valueFrom:
Expand Down
10 changes: 3 additions & 7 deletions charts/keeptrack/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,6 @@
# key: ""
# connectionString: ""
databaseName: "keeptrack"
# Forces the Blazor Server circuit onto a single WebSocket with no negotiate round-trip, so a circuit
# naturally sticks to the replica that owns its state -
# no load-balancer cookie affinity needed, which makes replicaCount > 1 work behind anything that passes WebSockets through (cloudflared, Traefik, plain Services).
# Only set to false if a proxy in front can't pass WebSockets;
# such a deployment must then stay at replicaCount 1.
webSocketsOnly: true

webapi:
enabled: true
Expand Down Expand Up @@ -72,8 +66,10 @@ webapi:
# optional: third-party providers used to enrich movies/TV shows/video games/books/albums with posters, synopsis, cast and episode data.
# Leaving a key empty just means that provider's enrichment silently fails (401/403 from the provider) - the rest of the app is unaffected.
referenceData:
# overrides the app's own default ("OpenLibrary") - see WebApi's AppConfiguration.BookReferenceProvider
# overrides the app's own default ("googlebooks", from its appsettings.json), see WebApi's AppConfiguration.BookReferenceProvider
bookProvider: ""
# overrides the app's own default ("igdb"), see WebApi's AppConfiguration.VideoGameReferenceProvider
videoGameProvider: ""
# periodic background re-sync of stale reference data (every 24h); matches the app's own default
isSyncEnabled: true
tmdb:
Expand Down
Loading
Loading