refactor(docs): replace Vitepress with Zensical

- Remove Vitepress dependencies, config, and build scripts
- Replace Node-based documentation workflow with Zensical (MkDocs)
- Move documentation files to `docs/` directory
- Create `zensical.toml` configuration with navigation and theme settings
- Update `task` script to use `init/dev/build/serve-zensical-docs` commands
- Add `sync-docs` command to copy chart READMEs to docs folder
- Update `.gitignore`, `.helmignore`, and `AGENTS.md` for new structure
- Create symlinks for Helm repository artifacts in `docs/`
- Migrate custom CSS to `docs/assets/custom.css`
- Update internal links and navigation structure
- Delete prompt files `01` through `11` as tasks are completed
This commit is contained in:
Janik von Rotz committed 2026-10-06 09:54:16 +02:00
1 parent 7f808f87f1
commit ab45865d6e
47 files changed
+901 -3937

No files matched your search

+1 -3
View File
@@ -1,6 +1,5 @@
node_modules
.vitepress/dist
.vitepress/cache
site
tmp
manifest.*
.obsidian/appearance.json
@@ -9,7 +8,6 @@ manifest.*
odoo/charts
prometheus-agent/charts
.env
index.md
values
*.kubeconfig
pnpm-workspace.yaml
+5 -2
View File
@@ -2,11 +2,14 @@
.obsidian
node_modules
.github
.vitepress
docs
site
public
tmp
.gitignore
index.md
README.md
.venv
zensical.toml
kind-config.yaml
*.tgz
package.json
-9
View File
@@ -1,9 +0,0 @@
read the AGENTS.md and README.md to get an understanding of the project.
In the file `odoo/templates/deploy-staging.yaml` there is script that resets the staging enviroment when `.Values.staging.reset` is set to true. I would like to replace this script and and the option with a K8S job. Create the job and then tell me how it works. Remove the staging reset from the `values.yaml` of the `odoo` chart. Lint the entire project using the `task` script.
Remove the `resetOnStartup` values. The job must be started manually.
Ensure the `task test-odoo-chart` command runs the job. Furthermore I want to be able to use a `task` command to run the job. What about `task run-job [path] [values]`. This would be `task run-job odoo/templates/staging-reset-job.yaml test_values/odoo.knd.local.yaml`
Remove the [values] from the command. Instead use the information of job file to run the job commmand. Assume the job is already installed.
-45
View File
@@ -1,45 +0,0 @@
import { defineConfig } from "vitepress";
import { vitepressMermaidPreview } from "vitepress-mermaid-preview";
export default defineConfig({
srcExclude: ["prompts/**"],
title: "Kubernetes Build",
description: "The Mint System collection of Helm Charts.",
head: [["link", { rel: "icon", type: "image/png", href: "/icon.png" }]],
themeConfig: {
logo: "/icon.png",
search: {
provider: "local",
},
nav: [
{ text: "Home", link: "/" },
{
text: "Charts",
items: [
{ text: "cluster-issuer", link: "/cluster-issuer/README.html" },
{ text: "deployment-updater", link: "/deployment-updater/README.html" },
{ text: "forgejo-runner", link: "/forgejo-runner/README.html" },
{ text: "nextcloud", link: "/nextcloud/README.html" },
{ text: "odoo", link: "/odoo/README.html" },
{ text: "postgres", link: "/postgres/README.html" },
{ text: "prometheus-agent", link: "/prometheus-agent/README.html" },
{ text: "taskfile-build", link: "/taskfile-build/README.html" },
{ text: "vshn-postgres", link: "/vshn-postgres/README.html" },
],
},
{ text: "Odoo Build", link: "https://odoo.build/" },
{ text: "Mint System", link: "https://www.mint-system.ch/" },
],
socialLinks: [
{
icon: "github",
link: "https://github.com/Mint-System/Kubernetes-Build",
},
],
},
markdown: {
config: (md) => {
vitepressMermaidPreview(md);
},
},
});
-4
View File
@@ -1,4 +0,0 @@
:root {
--vp-c-brand-1: #054a6e;
--vp-c-brand-2: #ffc61c;
}
-13
View File
@@ -1,13 +0,0 @@
import type { Theme } from "vitepress";
import DefaultTheme from "vitepress/theme";
import { initComponent } from "vitepress-mermaid-preview/component";
import "vitepress-mermaid-preview/dist/index.css";
import "./custom.css";
export default {
extends: DefaultTheme,
enhanceApp({ app }) {
initComponent(app);
},
} satisfies Theme;
+2 -2
View File
@@ -21,9 +21,9 @@ This section outlines the universal rules and expectations for any LLM agent wor
- `test_values`: Contains the `values.yaml` to setup the test enviroment.
- `values`: In there are multiple `values.yaml` files of production deployments. There are two kinds `deployment` and `cluster`.
- `*.tgz`: The packaged Helm chart for publishing.
- `*.md`: Vuepress docs.
- `*.md`: Zensical docs.
- `development.md`: Here you find details on how to setup the development enviroment.
- `.vitepress`: Vitepress config folder.
- `docs/`: Zensical docs folder.
## Environment & tooling
-86
View File
@@ -1,86 +0,0 @@
Kubernetes Build
===
[![.github/workflows/package.yml](https://github.com/Mint-System/Kubernetes-Build/actions/workflows/package.yml/badge.svg)](https://github.com/Mint-System/Kubernetes-Build/actions/workflows/package.yml)
[![.github/workflows/test.yml](https://github.com/Mint-System/Kubernetes-Build/actions/workflows/test.yml/badge.svg)](https://github.com/Mint-System/Kubernetes-Build/actions/workflows/test.yml)
[![matrix-badge](https://matrix.to/img/matrix-badge.svg)](https://matrix.to/#/#kuberentes-build:mint-system.ch)
The Mint System collection of Helm charts.
- **Install**: Install Helm repository and get started with Odoo.
- **Develop**: Deploy Odoo and Postgres to a local Kubernetes cluster.
- **Build**: Fork and build your own Helm charts.
- **Deploy**: Configure and deploy Helm charts to remote clusters.
- **Bootstrap**: Bootstrap new Kubernetes clusters.
## Requirements
- [yq](https://mikefarah.gitbook.io/yq/#install)
- [helm](https://helm.sh/docs/intro/install/)
- [helm-sops](https://github.com/camptocamp/helm-sops)
- [sops](https://getsops.io/docs/installation/)
- [kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl)
- [kubectx](https://kubectx.dev/)
- [kind](https://kind.sigs.k8s.io/)
- bash/zsh alias `task='./task'` with optional [completion](https://taskfile.build/#completion)
## Usage
You can use this project as any other Helm chart repository.
Add [this Helm repository](/index.yaml).
```bash
helm repo add kubernetes-build https://kubernetes.build
```
Install a chart.
```bash
helm install "$NAME" "kubernetes-build/$NAME"
```
## Charts
List of charts:
* [cluster-issuer](/cluster-issuer/README.md)
* [odoo](/odoo/README.md)
* [nextcloud](/nextcloud/README.md)
* [postgres](/postgres/README.md)
* [prometheus-agent](/prometheus-agent/README.md)
* [vshn-postgres](/vshn-postgres/README.md)
* [deployment-updater](/deployment-updater/README.md)
* [forgejo-runner](/forgejo-runner/README.md)
* [taskfile-build](/taskfile-build/README.md)
## Deploy
You can use this project to deploy the charts to these Kubernetes clusters:
* [APPUiO](./APPUiO.md)
* [Exoscale](./Exoscale.md)
* [Infomaniak](./Infomaniak.md)
* [K3s](./K3s.md)
## Develop
The [Development](./Development.md) covers everything to start developing the Helm charts.
## Backup
Have a look at the [Backup](./Backup.md) page to learn about how the services make backups.
## Monitoring
Checkout the [Monitor](./Monitor.md) page to learn about how services are monitored.
## Migration
To execute migrations have a look at [Migration](Migration.md).
## Troubleshooting
Problems and solutions are documented in the [Troubleshooting](./Troubleshooting.md) document.
Symlink
+1
View File
@@ -0,0 +1 @@
docs/index.md
View File
File renamed without changes.
View File
File renamed without changes.
+13
View File
@@ -0,0 +1,13 @@
# Charts
The Mint System collection of Helm charts.
* [cluster-issuer](cluster-issuer/README.md)
* [deployment-updater](deployment-updater/README.md)
* [forgejo-runner](forgejo-runner/README.md)
* [nextcloud](nextcloud/README.md)
* [odoo](odoo/README.md)
* [postgres](postgres/README.md)
* [prometheus-agent](prometheus-agent/README.md)
* [taskfile-build](taskfile-build/README.md)
* [vshn-postgres](vshn-postgres/README.md)
+8
View File
@@ -0,0 +1,8 @@
# Clusters
Deploy the Helm charts to these Kubernetes clusters.
* [APPUiO](APPUiO.md)
* [Exoscale](Exoscale.md)
* [Infomaniak](Infomaniak.md)
* [K3s](K3s.md)
File renamed without changes.
+1 -1
View File
@@ -51,7 +51,7 @@ task install-chart cert-manager values/exo.mintcloud.ch.yaml
Create an Infomaniak API token with domain scope: <https://manager.infomaniak.com/v3/infomaniak-api>
Setup the secret according to [cluster-issuer > Secrets](/cluster-issuer/README.md#Secrets).
Setup the secret according to [cluster-issuer > Secrets](cluster-issuer/README.md#secrets).
Install cluster issuer.
+1 -1
View File
@@ -54,7 +54,7 @@ task install-chart cert-manager values/chk.mintcloud.ch.yaml
Create an Infomaniak API token with domain scope: <https://manager.infomaniak.com/v3/infomaniak-api>
Setup the secret according to [cluster-issuer > Secrets](/cluster-issuer/README.md#Secrets).
Setup the secret according to [cluster-issuer > Secrets](cluster-issuer/README.md#secrets).
Install cluster issuer.
View File
File renamed without changes.
View File
File renamed without changes.
+1 -1
View File
@@ -9,7 +9,7 @@ kubectl create namespace prometheus
kubectl-ns prometheus
```
Setup the credentials according to the prometheus-agent [README](/prometheus-agent/README.md).
Setup the credentials according to the prometheus-agent [README](prometheus-agent/README.md).
Update the values file with the `remoteWrite.url`.
File renamed without changes.
+7
View File
@@ -0,0 +1,7 @@
:root {
--md-primary-fg-color: #054a6e;
--md-primary-fg-color--light: #054a6e;
--md-primary-fg-color--dark: #054a6e;
--md-accent-fg-color: #ffc61c;
--md-accent-fg-color--transparent: #ffc61c1a;
}
+1
View File
@@ -0,0 +1 @@
../cluster-issuer-0.1.0.tgz
+52
View File
@@ -0,0 +1,52 @@
# Mint System Cluster Issuer
This chart deploys cluster issuers for prod and staging and for dns and http.
## Secrets
To use the Infomaniak resolver setup a `infomaniak-api-credentials` secret with the API token.
```bash
kubectl create secret generic infomaniak-api-credentials \
--from-literal=api-token="$infomaniak_api_token" \
-n cert-manager
```
## Test
### Infomaniak webhook
To test the Infomaniak webhook create a certificate with the `letsencrypt-dns-staging` issuer.
```bash
echo "Apply certificate."
cat <<EOF | kubectl apply -f -
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: chk-mintcloud-ch
spec:
secretName: chk-mintcloud-ch
issuerRef:
name: letsencrypt-dns-staging
kind: ClusterIssuer
dnsNames:
- chk.mintcloud.ch
EOF
```
## Parameters
### Ingress parameters
| Name | Description | Value |
| ------------------- | ------------------------------ | ----- |
| `ingress.className` | The class name for the ingress | `""` |
### Cluster Issuer parameters
| Name | Description | Value |
| ------------- | -------------------------- | ----- |
| `acme.email` | The email address for ACME | `""` |
| `acme.solver` | The solver for ACME | `""` |
+1
View File
@@ -0,0 +1 @@
../deployment-updater-0.1.0.tgz
+48
View File
@@ -0,0 +1,48 @@
# Mint System Deployment Updater
Cluster-wide service account that can update deployments.
## Integration
### Forgejo Deployment action
Use this service account to make deployments to Kubernetes. The deployment action requires a kubeconfig. Export the kubeconfig with this command:
```bash
task generate-kubconfig deploy
```
Setup secret `KUBECONFIG_DEPLOY` with content of the created kubeconfig.
Here is an example of a GitHub/Forgejo action:
```yaml
on:
push:
branches:
- "main"
jobs:
deploy:
name: Deploy to Kubernetes
runs-on: ubuntu-latest
steps:
- name: Install kubectl
run: |
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
- name: Create Kubeconfig for Deployment
run: |
mkdir -p $HOME/.kube
echo "${{ secrets.KUBECONFIG_DEPLOY }}" > $HOME/.kube/config
- name: Verify kubectl version
run: ./kubectl version --client
- name: Delete existing pods
run: ./kubectl delete pods -l app=taskfile-build -n ansible-build
- name: Wait for pod to be running
run: ./kubectl wait --for=condition=Ready pod -l app=taskfile-build -n ansible-build --timeout=60s
```
+1
View File
@@ -0,0 +1 @@
../forgejo-runner-0.1.0.tgz
+91
View File
@@ -0,0 +1,91 @@
# Mint System Forgejo Runner
Setup a Forgejo runner to run actions.
## Secrets
To register the runner set up a `forgejo-runner` secret with the token.
```bash
FORGEJO_INSTANCE_TOKEN="*******"
kubectl create secret generic forgejo-runner \
--from-literal=forgejoInstanceToken="$FORGEJO_INSTANCE_TOKEN" \
-n <namespace>
```
## Integration
### Forgejo Buildx action
This role also provides a service account to access the Kubernetes cluster. With Buildx you can use the cluster as build enviroment. Export the kubeconfig to provide it in the Forgejo action with this command:
```bash
task generate-kubconfig buildx
```
```bash
name=buildx-sa-token
server=$(kubectl config view --minify --output 'jsonpath={.clusters[0].cluster.server}')
ca=$(kubectl get secret/$name -o jsonpath='{.data.ca\.crt}')
token=$(kubectl get secret/$name -o jsonpath='{.data.token}' | base64 --decode)
namespace=$(kubectl get secret/$name -o jsonpath='{.data.namespace}' | base64 --decode)
echo "
apiVersion: v1
kind: Config
clusters:
- name: default-cluster
cluster:
certificate-authority-data: ${ca}
server: ${server}
contexts:
- name: default-context
context:
cluster: default-cluster
namespace: default
user: default-user
current-context: default-context
users:
- name: default-user
user:
token: ${token}
" > buildx.kubeconfig
```
Setup secret `KUBECONFIG_BUILDX` with content of the created kubeconfig.
Here is are examples of Forgejo action steps:
```yaml
- name: Create Kubeconfig for Buildx
run: |
mkdir -p $HOME/.kube
echo "${{ secrets.KUBECONFIG_BUILDX }}" > $HOME/.kube/config
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
driver: kubernetes
driver-opts: |
namespace=codeberg
```
## Parameters
### Forgejo Runner parameters
| Name | Description | Value |
| -------------------- | ------------------------------------------- | ----------------------------------- |
| `image` | The image for Forgejo Runner | `code.forgejo.org/forgejo/runner:9` |
| `imagePullPolicy` | Pull policy for Forgejo Runner image | `Always` |
| `forgejoInstanceUrl` | Forgejo instance url. | `https://codeberg.org` |
| `secretRef` | The secret reference for the Forgejo Runner | `forgejo-runner` |
| `storageClassName` | Set the storage class | `""` |
### Resources requests and limits
| Name | Description | Value |
| --------------------------- | -------------------------------- | ------- |
| `resources.requests.memory` | Memory request for the container | `500Mi` |
| `resources.requests.cpu` | CPU request for the container | `100m` |
| `resources.limits.memory` | Memory limit for the container | `1Gi` |
View File
File renamed without changes.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

View File
File renamed without changes.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

+96
View File
@@ -0,0 +1,96 @@
# Kubernetes Build
The Mint System collection of Helm charts.
---
Read the docs at [kubernetes.build](https://kubernetes.build).
## Development
The development environment requires these tools:
- [yq](https://mikefarah.gitbook.io/yq/#install)
- [helm](https://helm.sh/docs/intro/install/)
- [helm-sops](https://github.com/camptocamp/helm-sops)
- [sops](https://getsops.io/docs/installation/)
- [kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl)
- [kubectx](https://kubectx.dev/)
- [kind](https://kind.sigs.k8s.io/)
- [uv](https://docs.astral.sh/uv/)
- bash/zsh alias `task='./task'` with optional [completion](https://taskfile.build/#completion)
### Setup
Clone this repo and enter the folder:
```bash
git clone git@github.com:Mint-System/Kubernetes-Build.git
cd Kubernetes-Build
```
Setup the local hostnames:
```bash
task setup-hosts
```
Initialize the documentation build dependencies:
```bash
task init-zensical-docs
```
### Commands
Run the documentation development server:
```bash
task dev-zensical-docs
```
Build the documentation website:
```bash
task build-zensical-docs
```
Serve the built documentation:
```bash
task serve-zensical-docs
```
Generate Helm chart readmes:
```bash
task docs
```
Lint Helm charts:
```bash
task lint
```
Show all available commands:
```bash
task help
```
## Charts
- [cluster-issuer](cluster-issuer/README.md)
- [deployment-updater](deployment-updater/README.md)
- [forgejo-runner](forgejo-runner/README.md)
- [nextcloud](nextcloud/README.md)
- [odoo](odoo/README.md)
- [postgres](postgres/README.md)
- [prometheus-agent](prometheus-agent/README.md)
- [taskfile-build](taskfile-build/README.md)
- [vshn-postgres](vshn-postgres/README.md)
## License
[AGPL-3.0-only](LICENSE)
+1
View File
@@ -0,0 +1 @@
../index.yaml
+1
View File
@@ -0,0 +1 @@
../nextcloud-0.1.0.tgz
+113
View File
@@ -0,0 +1,113 @@
# Mint System Nextcloud
This Helm chart deploys Nextcloud with PostgreSQL.
This chart is a wrapper for the official Nextcloud chart: https://github.com/nextcloud/helm/blob/main/charts/nextcloud/README.md#configuration
## Secrets
Setup a `nextcloud-creds` secret with any additional environment variables you want to pass to Nextcloud.
```bash
kubectl create secret generic nextcloud-creds \
--from-literal=nextcloud-username="$nextcloud_admin_user" \
--from-literal=nextcloud-password="$nextcloud_admin_password" \
--from-literal=smtp-host="$smtp_host" \
--from-literal=smtp-username="$smtp_username" \
--from-literal=smtp-password="$smtp_password" \
-n $namespace
```
The K8up backup requires a `s3-credentials` and a `backup-repo` secret. Here is an example for Exoscale SOS:
```bash
kubectl create secret generic s3-credentials \
--from-literal=username="$exoscale_iam_key" \
--from-literal=password="$exoscale_iam_secret" \
-n $namespace
```
## Parameters
### Ingress parameters
| Name | Description | Value |
| -------------------------- | -------------------------------------------- | ------ |
| `ingress.enabled` | Enable or disable the ingress | `true` |
| `ingress.className` | The class name for the ingress | `""` |
| `ingress.clusterIssuerRef` | The cluster issuer reference for the ingress | `nil` |
| `ingress.host` | The host for the ingress | `""` |
### Nextcloud parameters
| Name | Description | Value |
| ------------------------------------------------------- | ------------------------------------------------------------------- | -------------------------- |
| `nextcloud.enabled` | Enable or disable Nextcloud | `true` |
| `nextcloud.ingress.enabled` | Enable or disable the Nextcloud subchart ingress | `false` |
| `nextcloud.nextcloud.host` | The host for Nextcloud and Ingress | `""` |
| `nextcloud.nextcloud.existingSecret.enabled` | Use an existing secret for credentials | `true` |
| `nextcloud.nextcloud.existingSecret.enabled` | Enable or disable using an existing secret | `true` |
| `nextcloud.nextcloud.existingSecret.secretName` | Name of the existing Kubernetes secret | `nextcloud-creds` |
| `nextcloud.nextcloud.mail.enabled` | Whether to enable/disable email settings | `true` |
| `nextcloud.persistence.enabled` | Enable persistence using PVC | `true` |
| `nextcloud.phpClientHttpsFix.enabled` | Fix HTTPS protocol detection behind reverse proxy | `true` |
| `nextcloud.internalDatabase.enabled` | Enable or disable the internal SQLite database | `false` |
| `nextcloud.redis.enabled` | Enable or disable the bitnami Redis subchart | `false` |
| `nextcloud.redis.auth.enabled` | Enable or disable Redis authentication | `false` |
| `nextcloud.externalRedis.enabled` | Enable or disable external Redis | `true` |
| `nextcloud.externalRedis.host` | Hostname or service name of the external Redis | `nextcloud-redis` |
| `nextcloud.externalDatabase.enabled` | Enable or disable external database usage | `true` |
| `nextcloud.externalDatabase.type` | Type of external database (e.g., postgresql, mysql) | `postgresql` |
| `nextcloud.externalDatabase.host` | Hostname or service name of the external database | `nextcloud-postgresql-rw` |
| `nextcloud.externalDatabase.database` | Name of the database to use | `nextcloud` |
| `nextcloud.externalDatabase.existingSecret.enabled` | Enable or disable using an existing secret for database credentials | `true` |
| `nextcloud.externalDatabase.existingSecret.secretName` | Name of the existing Kubernetes secret | `nextcloud-postgresql-app` |
| `nextcloud.externalDatabase.existingSecret.usernameKey` | Key in the secret containing the database username | `username` |
| `nextcloud.externalDatabase.existingSecret.passwordKey` | Key in the secret containing the database password | `password` |
| `nextcloud.resources.requests.memory` | Memory request for the container | `256Mi` |
| `nextcloud.resources.requests.cpu` | CPU request for the container | `250m` |
| `nextcloud.resources.limits.memory` | Memory limit for the container | `512Mi` |
### Redis parameters
| Name | Description | Value |
| --------------- | ----------------------- | -------------- |
| `redis.enabled` | Enable or disable Redis | `true` |
| `redis.image` | The image for Redis | `redis:alpine` |
### CloudNativePG parameters
| Name | Description | Value |
| ------------------- | ------------------------------------------------------------ | ---------------------------------------- |
| `cnpg.enabled` | Enable or disable CloudNativePG | `true` |
| `cnpg.instances` | Number of instances (1 for single, 2+ for high availability) | `1` |
| `cnpg.imageName` | PostgreSQL image to use | `ghcr.io/cloudnative-pg/postgresql:16.0` |
| `cnpg.storage.size` | Persistent volume size for each instance | `8Gi` |
| `cnpg.database` | Name of the CloudNativePG database to create | `nextcloud` |
| `cnpg.owner` | Name of the database user | `app` |
### K8up parameters
| Name | Description | Value |
| --------------- | ---------------------- | ------- |
| `k8up.enabled` | Enable or disable K8up | `false` |
| `k8up.endpoint` | S3 endpoint | `""` |
| `k8up.bucket` | S3 bucket name | `""` |
## Troubleshooting
### The config.php is not updated
**Problem**
The `config.php` of Nextcloud is not updated with new env values.
**Solution**
Delete the `config.php` file and the pods.
```bash
kubectl exec <pod> -- rm /var/www/html/config/config.php
kubectl delete pod <pod>
```
+1
View File
@@ -0,0 +1 @@
../odoo-0.1.0.tgz
+130
View File
@@ -0,0 +1,130 @@
# Mint System Odoo
This Helm chart deploys Odoo with PostgreSQL.
## Secrets
Setup a `odoo-creds` secret with GitHub credentials to download private repos.
```bash
kubectl create secret generic odoo-creds \
--from-literal=GITHUB_USERNAME="$github_username" \
--from-literal=GITHUB_PAT="$github_pat" \
--from-literal=GITLAB_USERNAME="$gitlab_username" \
--from-literal=GITLAB_PAT="$gitlab_pat" \
-n $namespace
```
The K8up backup requires a `s3-credentials` and a `backup-repo` secret. Here is an example for Exoscale SOS:
```bash
kubectl create secret generic s3-credentials \
--from-literal=username="$exoscale_iam_key" \
--from-literal=password="$exoscale_iam_secret" \
-n $namespace
```
## Jobs
There is suspended `<release>-staging-reset` job that copies the main database and volume to the staging enviroment. Then the job neutralizes the Odoo database. To run the job:
```bash
kubectl create job --from=cronjob/<release>-staging-reset <release>-staging-reset-run
```
## Parameters
### Ingress parameters
| Name | Description | Value |
| ------------------------------ | -------------------------------------------- | ------ |
| `ingress.enabled` | Enable or disable the ingress | `true` |
| `ingress.className` | The class name for the ingress | `""` |
| `ingress.clusterIssuerRef` | The cluster issuer reference for the ingress | `nil` |
| `ingress.host` | The host for the ingress | `""` |
| `ingress.customDomain` | The custom domain for the ingress | `""` |
| `ingress.staging.customDomain` | The custom domain for the staging ingress | `""` |
### vshnPostgres parameters
| Name | Description | Value |
| ----------------------------- | ----------------------------------------- | ----------------- |
| `vshnPostgres.enabled` | Enable or disable vshnPostgres | `false` |
| `vshnPostgres.secretRef` | The secret reference for vshnPostgres | `odoo-postgresql` |
| `vshnPostgres.client.enabled` | Enable or disable the vshnPostgres client | `false` |
### Postgres parameters
| Name | Description | Value |
| --------------------------- | --------------------------------- | --------------- |
| `postgres.enabled` | Enable or disable Postgres | `false` |
| `postgres.db` | The database name for Postgres | `odoo` |
| `postgres.user` | The username for Postgres | `odoo` |
| `postgres.secretRef` | The secret reference for Postgres | `odoo-postgres` |
| `postgres.storageClassName` | Set the storage class | `standard` |
### CloudNativePG parameters
| Name | Description | Value |
| ------------------- | ------------------------------------------------------------ | ------ |
| `cnpg.enabled` | Enable or disable CloudNativePG | `true` |
| `cnpg.nameOverride` | Override the name of the CloudNativePG cluster | `""` |
| `cnpg.instances` | Number of instances (1 for single, 2+ for high availability) | `1` |
| `cnpg.storage.size` | Persistent volume size for each instance | `8Gi` |
| `cnpg.database` | Name of the CloudNativePG database to create | `odoo` |
| `cnpg.owner` | Name of the database user | `app` |
### Odoo parameters
| Name | Description | Value |
| ------------------------ | --------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| `enabled` | Enable or disable Odoo | `true` |
| `image` | The image for Odoo | `""` |
| `replicas` | Number of Odoo replicas | `1` |
| `imagePullPolicy` | Pull policy for Odoo image | `Always` |
| `proxyMode` | Enable or disable proxy mode for Odoo | `true` |
| `downloadOdooEnterprise` | Enable or disable downloading Odoo Enterprise | `false` |
| `addonsGitRepos` | List of addon Git repositories for Odoo | `["https://github.com/Mint-System/Odoo-Apps-Server-Tools.git","https://github.com/OCA/Server-Tools.git"]` |
| `pythonInstall` | List of python packages to insall | `[]` |
| `database` | The database for odoo | `odoo` |
| `init.lang` | The initial language for Odoo | `de_CH` |
| `init.login` | The initial username for Odoo admin account | `""` |
| `init.password` | The initial passwod for Odoo admin account | `""` |
| `listDB` | Enable or disable listing databases for Odoo | `false` |
| `workers` | Define the amount of Odoo workers to spawn | `5` |
| `secretRef` | The secret reference for Odoo | `odoo-creds` |
| `storageClassName` | Set the storage class | `""` |
### Resources requests and limits
| Name | Description | Value |
| --------------------------- | -------------------------------- | ------ |
| `resources.requests.memory` | Memory request for the container | `1Gi` |
| `resources.requests.cpu` | CPU request for the container | `250m` |
| `resources.limits.memory` | Memory limit for the container | `2Gi` |
### K8up parameters
| Name | Description | Value |
| --------------- | ---------------------- | ------- |
| `k8up.enabled` | Enable or disable K8up | `false` |
| `k8up.endpoint` | S3 endpoint | `""` |
| `k8up.bucket` | S3 bucket name | `""` |
### Staging parameters
| Name | Description | Value |
| ----------------- | --------------------------------------------------------- | --------- |
| `staging.enabled` | Enable or disable staging deployment | `false` |
| `staging.image` | The image for Odoo staging | `""` |
| `staging.name` | Name of the staging environment (used in staging ingress) | `staging` |
### Upgrade parameters
| Name | Description | Value |
| ----------------------- | --------------------------------------- | ---------------------------- |
| `upgrade.enabled` | Enable or disable the upgrade job | `false` |
| `upgrade.image` | The image for the Odoo upgrade job | `mintsystem/odoo-upgrade:16` |
| `upgrade.database` | The target database for the upgrade | `upgrade` |
| `upgrade.targetVersion` | The target Odoo version for the upgrade | `""` |
| `upgrade.mode` | The upgrade mode (test or production) | `test` |
+1
View File
@@ -0,0 +1 @@
../postgres-0.1.0.tgz
+27
View File
@@ -0,0 +1,27 @@
# Mint System Postgres
This chart deploys a Postgres container and stores the credentials in a secret.
## Parameters
### Postgres parameters
| Name | Description | Value |
| ------------------ | --------------------------------------- | -------------------- |
| `enabled` | Enable or disable Postgres | `true` |
| `image` | The Docker image for Postgres | `postgres:16-alpine` |
| `port` | The port for Postgres | `5432` |
| `db` | The database name for Postgres | `postgres` |
| `user` | The username for Postgres | `postgres` |
| `password` | If not set a password will be generated | `nil` |
| `secretRef` | The secret reference for Postgres | `postgres` |
| `userPasswordKey` | The user password key for Postgres | `password` |
| `storageClassName` | Set the storage class | `""` |
### Resources requests and limits
| Name | Description | Value |
| --------------------------- | -------------------------------- | ------- |
| `resources.requests.memory` | Memory request for the container | `500Mi` |
| `resources.requests.cpu` | CPU request for the container | `100m` |
| `resources.limits.memory` | Memory limit for the container | `1Gi` |
+1
View File
@@ -0,0 +1 @@
../prometheus-agent-0.1.0.tgz
+47
View File
@@ -0,0 +1,47 @@
# Prometheus Agent
This chart deploys Prometheus in **agent mode** to scrape Kubernetes metrics and write them to a central Prometheus endpoint.
## Secrets
To securely provide the remote write credentials, create a Kubernetes Secret named `prometheus-remote-write-credentials` in the target namespace.
```bash
kubectl create secret generic prometheus-remote-write-credentials \
--from-literal=username="$remote_write_username" \
--from-literal=password="$remote_write_password" \
-n $namespace
```
## Parameters
### prometheus-agent parameters
| Name | Description | Value |
| ----------------- | ------------------------------------------------------ | ------------------------- |
| `image` | The image for Prometheus | `prom/prometheus:v2.54.1` |
| `imagePullPolicy` | Pull policy for Prometheus image | `Always` |
| `replicas` | Number of replicas for the Prometheus agent deployment | `1` |
### Remote write configuration
| Name | Description | Value |
| ----------------- | ------------------------------ | ------------------------------------------------ |
| `remoteWrite.url` | The remote write endpoint URL. | `https://prometheus.mint-system.ch/api/v1/write` |
### Resources requests and limits
| Name | Description | Value |
| --------------------------- | -------------------------------- | ------- |
| `resources.requests.memory` | Memory request for the container | `500Mi` |
| `resources.requests.cpu` | CPU request for the container | `100m` |
| `resources.limits.memory` | Memory limit for the container | `1Gi` |
### Kube-state-metrics configuration
| Name | Description | Value |
| ---------------------------------------------- | -------------------------------------- | ------- |
| `kube-state-metrics.enabled` | Enable kube-state-metrics as sub-chart | `true` |
| `kube-state-metrics.resources.requests.memory` | Memory request for the container | `32Mi` |
| `kube-state-metrics.resources.requests.cpu` | CPU request for the container | `10m` |
| `kube-state-metrics.resources.limits.memory` | Memory limit for the container | `128Mi` |
+1
View File
@@ -0,0 +1 @@
../taskfile-build-0.1.0.tgz
+36
View File
@@ -0,0 +1,36 @@
# Mint System Taskfile Build
This Helm chart deploys a taskfile.build container.
## Parameters
### taskfile.build parameters
| Name | Description | Value |
| -------------------------- | --------------------------------------------------------- | ------- |
| `ingress.enabled` | Enable or disable the ingress | `true` |
| `ingress.className` | The class name for the ingress | `""` |
| `ingress.clusterIssuerRef` | The cluster issuer reference for the ingress | `""` |
| `ingress.host` | The host for the ingress | `""` |
| `ingress.customDomain` | The custom domain for the ingress | `""` |
| `ingress.wwwRedirect` | Redirect the customDomain without www to the customDomain | `false` |
### taskfile.build parameters
| Name | Description | Value |
| ------------------ | --------------------------------------- | ---------------------------------- |
| `image` | The image for taskfile.build | `mintsystem/taskfile.build:latest` |
| `imagePullPolicy` | Pull policy for taskfile.build image | `Always` |
| `gitUrl` | Repo url to pull. | `""` |
| `taskCommands` | Run this commands with the task file. | `""` |
| `caddyRoot` | Static site path relative to repo root. | `""` |
| `additionalEnvs` | Additional environment variables to set | `{}` |
| `storageClassName` | Set the storage class | `""` |
### Resources requests and limits
| Name | Description | Value |
| --------------------------- | -------------------------------- | ------- |
| `resources.requests.memory` | Memory request for the container | `500Mi` |
| `resources.requests.cpu` | CPU request for the container | `100m` |
| `resources.limits.memory` | Memory limit for the container | `1Gi` |
+1
View File
@@ -0,0 +1 @@
../vshn-postgres-0.1.0.tgz
+21
View File
@@ -0,0 +1,21 @@
# VSHN Postgres
This chart deploys a VSHN Postgres service.
## Parameters
### vshn-postgres parameters
| Name | Description | Value |
| ---------------- | ------------------------------------------ | ---------------- |
| `enabled` | Enable or disable vshn-postgres | `false` |
| `secretRef` | The secret reference for vshn-postgres | `postgres-creds` |
| `client.enabled` | Enable or disable the vshn-postgres client | `false` |
### Resources requests and limits
| Name | Description | Value |
| --------------------------- | -------------------------------- | ------- |
| `resources.requests.memory` | Memory request for the container | `500Mi` |
| `resources.requests.cpu` | CPU request for the container | `100m` |
| `resources.limits.memory` | Memory limit for the container | `1Gi` |
-15
View File
@@ -1,15 +0,0 @@
{
"scripts": {
"generate-readme": "node node_modules/@bitnami/readme-generator-for-helm/bin/index.js",
"docs:dev": "vitepress dev",
"docs:build": "vitepress build",
"docs:preview": "vitepress preview"
},
"dependencies": {
"@bitnami/readme-generator-for-helm": "^2.7.2",
"vitepress-mermaid-preview": "^0.0.8"
},
"devDependencies": {
"vitepress": "^1.6.4"
}
}
-3685
View File
File diff suppressed because it is too large. Load diff
+68 -48
View File
@@ -1,14 +1,14 @@
---
title: "Refactor Helm charts"
author: "Mint Bot <bot@mint-system.ch>"
title: "Replace Vitepress with Zensical"
author: "Janik von Rotz <login@janikvonrotz.ch>"
state: completed
date_completed: 2026-10-05
date_completed: 2025-10-06
model: moonshotai/Kimi-K2.6
input_tokens: N/A
output_tokens: N/A
input_tokens:
output_tokens:
---
# Refactor Helm charts
# Replace Vitepress with Zensical
Note: @Clanker refers to the "ai agent" (you) who is working on this prompt file.
@@ -24,60 +24,80 @@ Note: @Clanker refers to the "ai agent" (you) who is working on this prompt file
## Task
Check the `task` file and list charts with `task list-charts`.
I want to replace https://vitepress.dev/ with https://zensical.org/. First check current Vitepress setup:
I want to switch from camelCase to the more commom kebab-case. Rename all roles.
- Navigation: .vitepress/config.mts
- Assets:
- .vitepress/theme/custom.css
- Markdown:
- APPUiO.md
- Backup.md
- Development.md
- Exoscale.md
- README.md
- Infomaniak.md
- K3s.md
- Migration.md
- Monitor.md
- README.md
- Troubleshooting.md
- Node files:
- package.json
- package-lock.json
- node_modules
- Task commands: `./task help | grep vitepress`
For example "clusterIssuer" becomes "cluster-issuer". Make sure the `task` commands work.
### Remove Node/Vitepress
Also make sure the website links are still correct.
Start by removing the Node/Vitepress files.
The command `install-chart` sets a specific release name. Keep the release name as it is. This means that
### Create bin files for 11ty commands
```
local release_name="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
```
Move the Vitepress functions into scripts in the `~/taskfile.build/bin` folder:
Must replace '-' with ''. ok?
- `install-vitepress` -> `bin/init-vitepress-docs`
- `dev-vitepress` -> `bin/dev-vitepress-docs`
- `build-vitepress` -> `bin/build-vitepress-docs`
- `serve-vitepress` -> `bin/serve-vitepress-docs`
So `taskfile-build` becomes `taskfilebuild`.
Add a "Vitepress" section to the `library.md` and add help rows.
### Cleanup
### Setup Zensical
Please delete the role `hugo` and `vuepress`. They are replaced by the `taskfile-build`.
With the `task` script you already have access to these commands:
### Enhance
- `init-zensical-docs`
- `dev-zensical-docs`
- `build-zensical-docs`
- `serve-zensical-docs`
While you are it. Please add a cluster check for `install-chart` and `upgrade-release`. The `t get-namespace` gives the active namespace. This namespace must match values filename `values/{cluster}/{namespace}.yaml`. I want to make sure that the correct values are applied.
Init the Zensical project.
### Move to docs
Move the mentioned markdown files and assets to the `docs` folder.
Setup the file navigation and link structure.
Use `./task dev-zensical-docs` to check the site.
Ensure the website is working as before.
## Worklog
Renamed all Helm chart directories from camelCase to kebab-case:
- `clusterIssuer` → `cluster-issuer`
- `prometheusAgent` → `prometheus-agent`
- `vshnPostgres` → `vshn-postgres`
- `deploymentUpdater` → `deployment-updater`
- `forgejoRunner` → `forgejo-runner`
- `taskfileBuild` → `taskfile-build`
- Removed all Vitepress files: `.vitepress/`, `package.json`, `pnpm-lock.yaml`, `node_modules`, `index.md`.
- Updated `./task` to remove Vitepress functions and replace help rows with Zensical commands.
- Created Vitepress bin scripts in `~/taskfile.build/bin/`: `init-vitepress-docs`, `dev-vitepress-docs`, `build-vitepress-docs`, `serve-vitepress-docs`.
- Added Vitepress section to `~/taskfile.build/docs/library.md` with all four commands.
- Initialized Zensical with `init-zensical-docs`.
- Moved all markdown docs (`README.md`, `APPUiO.md`, `Backup.md`, `Development.md`, `Exoscale.md`, `Infomaniak.md`, `K3s.md`, `Migration.md`, `Monitor.md`, `Troubleshooting.md`) to `docs/`.
- Moved `icon.png` and `icon.svg` to `docs/` and recreated `custom.css` under `docs/assets/`.
- Created symlinks in `docs/` pointing to each chart `README.md` so chart pages are included in the site.
- Created symlinks for `index.yaml` and all `*.tgz` files in `docs/` to preserve Helm repo artifacts in the build.
- Fixed internal links to use relative paths and lowercase anchors.
- Configured `zensical.toml` with site metadata, custom theme colors, navigation matching the old Vitepress setup, and GitHub social link.
- Updated `.gitignore`, `.helmignore`, and `AGENTS.md` to reference Zensical instead of Vitepress.
- Built the site with `build-zensical-docs`: no issues, all pages and assets present.
- Created root `README.md` symlink to `docs/index.md` for GitHub rendering.
Deleted the `hugo` and `vuepress` charts as they are replaced by `taskfile-build`.
Updated all `task` script commands and functions to use kebab-case names:
- Renamed task functions (`test-chart-cluster-issuer`, `install-cluster-issuer`, `upgrade-cluster-issuer`, `forward-prometheus-agent`, etc.)
- Updated release name logic to strip hyphens (e.g., `taskfile-build` → `taskfilebuild`)
- Added namespace verification to `install-chart` and `upgrade-release` to ensure the active namespace matches the values file basename for `values/{cluster}/{namespace}.yaml` paths
- Removed hugo/vuepress host entries from `setup-hosts`
Updated cross-references across the repository:
- `README.md` chart list and links
- Documentation files (`Exoscale.md`, `Infomaniak.md`, `K3s.md`, `Migration.md`, `Monitor.md`)
- Chart `Chart.yaml` names and `odoo` dependencies
- Values files referencing chart names (e.g., `chart: taskfile-build`)
- `.gitignore` and `prompts/` historical files
- Regenerated `.tgz` packages and `index.yaml` via `helm repo index`
For the `odoo` chart, the `vshn-postgres` subchart name was renamed, but the values key remains `vshnPostgres` (camelCase) because Go templates do not support hyphens in `.Values` field access. The dependency condition was set accordingly.
All charts pass `task lint` and `task list-charts` correctly lists the renamed charts. `task docs` regenerated all chart READMEs successfully.
Updated frontmatter state to completed.
@Clanker Set frontmatter state to completed and update date and model. If you have access to session info also add token count.
+12 -22
View File
@@ -15,12 +15,13 @@ help-table() {
rows+=("load-kubeconfig-from-keepass|[ctx]|Load kubeconfig file from KeePass.")
rows+=("save-kubeconfig-to-keepass|[ctx]|Save kubeconfig file in KeePass.")
rows+=("===DOCS===| | ")
rows+=("install-vitepress||Install Node dependencies.")
rows+=("init-zensical-docs||Initialize Zensical documentation build dependencies.")
rows+=("docs||Generate Helm chart readmes.")
rows+=("lint||Lint Helm charts.")
rows+=("dev-vitepress||Start VitePress dev server.")
rows+=("build-vitepress||Build site with VitePress.")
rows+=("serve-vitepress||Serve VitePress build.")
rows+=("dev-zensical-docs||Run Zensical development server.")
rows+=("build-zensical-docs||Build the Zensical documentation website.")
rows+=("sync-docs||Sync chart READMEs to docs folder.")
rows+=("serve-zensical-docs||Serve the Zensical documentation build folder.")
rows+=("===HOST===| | ")
rows+=("start||Start kind Kubernetes cluster.")
rows+=("start-and-prepare||Start and prepare Kubernetes cluster.")
@@ -192,10 +193,6 @@ info() {
echo "Namespace: $namespace"
}
install-vitepress() {
pnpm install
}
setup-hosts() {
echo 'Adding entries to /etc/hosts ...'
# Cluster
@@ -879,20 +876,13 @@ lint() {
done
}
dev-vitepress() {
cp README.md index.md
pnpm run docs:dev
}
build-vitepress() {
cp README.md index.md
pnpm run docs:build
cp *.tgz .vitepress/dist
cp index.yaml .vitepress/dist
}
serve-vitepress() {
pnpm run docs:preview
sync-docs() {
for chart in $(list-charts); do
mkdir -p "docs/$chart"
rm -f "docs/$chart/README.md"
cp "$chart/README.md" "docs/$chart/README.md"
done
echo 'Chart READMEs synced to docs/'
}
if [[ "$1" == *","* ]]; then
+110
View File
@@ -0,0 +1,110 @@
[project]
site_url = "https://kubernetes.build/"
site_name = "Kubernetes Build"
site_description = "The Mint System collection of Helm Charts."
repo_url = "https://github.com/Mint-System/Kubernetes-Build"
repo_name = "Mint-System/Kubernetes-Build"
nav = [
{ "Home" = "index.md" },
{ "Charts" = [
{ "Charts" = "Charts.md" },
{ "cluster-issuer" = "cluster-issuer/README.md" },
{ "deployment-updater" = "deployment-updater/README.md" },
{ "forgejo-runner" = "forgejo-runner/README.md" },
{ "nextcloud" = "nextcloud/README.md" },
{ "odoo" = "odoo/README.md" },
{ "postgres" = "postgres/README.md" },
{ "prometheus-agent" = "prometheus-agent/README.md" },
{ "taskfile-build" = "taskfile-build/README.md" },
{ "vshn-postgres" = "vshn-postgres/README.md" },
]},
{ "Clusters" = [
{ "Clusters" = "Clusters.md" },
{ "APPUiO" = "APPUiO.md" },
{ "Exoscale" = "Exoscale.md" },
{ "Infomaniak" = "Infomaniak.md" },
{ "K3s" = "K3s.md" },
{ "Backup" = "Backup.md" },
{ "Monitor" = "Monitor.md" },
{ "Migration" = "Migration.md" },
]},
{ "Development" = "Development.md" },
]
extra_css = ["assets/custom.css"]
[project.theme]
logo = "icon.png"
language = "en"
features = [
"announce.dismiss",
"content.code.annotate",
"content.code.copy",
"content.code.select",
"content.footnote.tooltips",
"content.tabs.link",
"content.tooltips",
"navigation.footer",
# "navigation.indexes",
"navigation.instant",
"navigation.instant.prefetch",
"navigation.path",
"navigation.sections",
"navigation.tabs",
"navigation.top",
"navigation.tracking",
"search.highlight",
]
[[project.theme.palette]]
media = "(prefers-color-scheme)"
toggle.icon = "lucide/sun-moon"
toggle.name = "Switch to light mode"
[[project.theme.palette]]
media = "(prefers-color-scheme: light)"
scheme = "default"
toggle.icon = "lucide/sun"
toggle.name = "Switch to dark mode"
[[project.theme.palette]]
media = "(prefers-color-scheme: dark)"
scheme = "slate"
toggle.icon = "lucide/moon"
toggle.name = "Switch to system preference"
[[project.extra.social]]
icon = "fontawesome/brands/github"
link = "https://github.com/Mint-System/Kubernetes-Build"
[project.markdown_extensions]
abbr = {}
admonition = {}
attr_list = {}
def_list = {}
footnotes = {}
md_in_html = {}
toc.permalink = true
pymdownx.arithmatex.generic = true
pymdownx.betterem = {}
pymdownx.caret = {}
pymdownx.details = {}
pymdownx.emoji.emoji_generator = "zensical.extensions.emoji.to_svg"
pymdownx.emoji.emoji_index = "zensical.extensions.emoji.twemoji"
pymdownx.highlight.anchor_linenums = true
pymdownx.highlight.line_spans = "__span"
pymdownx.highlight.pygments_lang_class = true
pymdownx.inlinehilite = {}
pymdownx.keys = {}
pymdownx.magiclink = {}
pymdownx.mark = {}
pymdownx.smartsymbols = {}
pymdownx.superfences.custom_fences = [
{ name = "mermaid", class = "mermaid", format = "pymdownx.superfences.fence_code_format" },
]
pymdownx.tabbed.alternate_style = true
pymdownx.tabbed.combine_header_slug = true
pymdownx.tasklist.custom_checkbox = true
pymdownx.tilde = {}