Add initial Helm chart for BookStack deployment with configuration files
This commit is contained in:
parent
b62c4ac2ac
commit
a5a9f15a8f
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
bookstack/charts/
|
||||||
|
debug.yaml
|
||||||
|
*.bak
|
||||||
|
debug.yaml
|
||||||
|
values.test.yaml
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2025 Florian Weber <kosmos@morlana.net>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
23
bookstack/.helmignore
Normal file
23
bookstack/.helmignore
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# Patterns to ignore when building packages.
|
||||||
|
# This supports shell glob matching, relative path matching, and
|
||||||
|
# negation (prefixed with !). Only one pattern per line.
|
||||||
|
.DS_Store
|
||||||
|
# Common VCS dirs
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
.bzr/
|
||||||
|
.bzrignore
|
||||||
|
.hg/
|
||||||
|
.hgignore
|
||||||
|
.svn/
|
||||||
|
# Common backup files
|
||||||
|
*.swp
|
||||||
|
*.bak
|
||||||
|
*.tmp
|
||||||
|
*.orig
|
||||||
|
*~
|
||||||
|
# Various IDEs
|
||||||
|
.project
|
||||||
|
.idea/
|
||||||
|
*.tmproj
|
||||||
|
.vscode/
|
9
bookstack/Chart.lock
Normal file
9
bookstack/Chart.lock
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
dependencies:
|
||||||
|
- name: mariadb
|
||||||
|
repository: oci://registry-1.docker.io/bitnamicharts
|
||||||
|
version: 20.5.3
|
||||||
|
- name: redis
|
||||||
|
repository: oci://registry-1.docker.io/bitnamicharts
|
||||||
|
version: 21.0.0
|
||||||
|
digest: sha256:4faeead3c2e153b5cbf89d617d08907b6b0f5c323ade4ba71212b194e39e34e5
|
||||||
|
generated: "2025-05-07T11:19:02.950095915+02:00"
|
20
bookstack/Chart.yaml
Normal file
20
bookstack/Chart.yaml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
apiVersion: v2
|
||||||
|
name: bookstack
|
||||||
|
description: A Helm chart for Kubernetes
|
||||||
|
|
||||||
|
type: application
|
||||||
|
|
||||||
|
version: "0.1.0+up25.2.3"
|
||||||
|
|
||||||
|
appVersion: "25.2.3"
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
- name: mariadb
|
||||||
|
version: ">=20.0.0 <21.0.0"
|
||||||
|
repository: "oci://registry-1.docker.io/bitnamicharts"
|
||||||
|
alias: db
|
||||||
|
condition: db.enabled
|
||||||
|
- name: redis
|
||||||
|
version: ">=21.0.0 <22.0.0"
|
||||||
|
repository: "oci://registry-1.docker.io/bitnamicharts"
|
||||||
|
condition: redis.enabled
|
21
bookstack/templates/NOTES.txt
Normal file
21
bookstack/templates/NOTES.txt
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
BookStack was installed to namespace {{ .Release.Namespace }}.
|
||||||
|
|
||||||
|
{{- if .Values.ingress.enabled }}
|
||||||
|
Your BookStack instance is available under
|
||||||
|
|
||||||
|
{{ if .Values.ingress.tls }}https{{ else }}http{{ end }}://{{ .Values.ingress.hostname }}
|
||||||
|
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if .Values.db.enabled }}
|
||||||
|
|
||||||
|
You decided to also install a MariaDB, you can get the root password by executing the following command:
|
||||||
|
|
||||||
|
kubectl get secret {{ include "bookstack.db.secretName" . }} \
|
||||||
|
--namespace {{ .Release.Namespace }} \
|
||||||
|
-o jsonpath="{.data.mariadb-root-password}" | base64 -d && echo
|
||||||
|
|
||||||
|
{{- else }}
|
||||||
|
Note: BookStack is using **an external database**:
|
||||||
|
{{ printf "%s" .Values.bookstack.externalDatabase.host }}.
|
||||||
|
{{- end }}
|
72
bookstack/templates/_helpers.tpl
Normal file
72
bookstack/templates/_helpers.tpl
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
{{/*
|
||||||
|
Shared Labels
|
||||||
|
*/}}
|
||||||
|
{{- define "bookstack.labels" -}}
|
||||||
|
app.kubernetes.io/name: {{ include "bookstack.name" . | quote }}
|
||||||
|
app.kubernetes.io/instance: {{ .Release.Name | quote }}
|
||||||
|
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||||
|
app.kubernetes.io/part-of: {{ include "bookstack.name" . | quote }}
|
||||||
|
app.kubernetes.io/managed-by: {{ .Release.Service | default "Helm" | quote }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Basic Name
|
||||||
|
*/}}
|
||||||
|
{{- define "bookstack.name" -}}
|
||||||
|
{{ .Chart.Name }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- define "bookstack.fullname" -}}
|
||||||
|
{{ printf "%s-%s" .Release.Name (include "bookstack.name" .) }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Secret‑Name for database credentials
|
||||||
|
*/}}
|
||||||
|
{{- define "bookstack.db.secretName" -}}
|
||||||
|
{{ printf "%s" .Values.db.auth.existingSecret }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- define "bookstack.db.serviceName" -}}
|
||||||
|
{{ printf "%s-db-headless" .Release.Name }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- define "bookstack.redis.serviceName" -}}
|
||||||
|
{{ printf "%s-redis-headless" .Release.Name }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- define "bookstack.image.registry" -}}
|
||||||
|
{{- if .Values.bookstack.image.registry -}}
|
||||||
|
{{ printf "%s/" .Values.bookstack.image.registry }}
|
||||||
|
{{- else if .Values.global.imageRegistry -}}
|
||||||
|
{{ printf "%s/" .Values.global.imageRegistry }}
|
||||||
|
{{- else -}}
|
||||||
|
{{ print "" }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- define "bookstack.image" -}}
|
||||||
|
{{ printf "%s%s/%s:%s" (include "bookstack.image.registry" .) .Values.bookstack.image.repository .Values.bookstack.image.name (default .Chart.AppVersion .Values.bookstack.image.tag) }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- define "bookstack.app-key" -}}
|
||||||
|
{{ printf "%s-app-key" .Release.Name }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- define "bookstack.secret" -}}
|
||||||
|
{{ include "bookstack.fullname" . }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- define "bookstack.mailpit.name" -}}
|
||||||
|
{{ printf "%s-mailpit" (include "bookstack.fullname" .) }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- define "bookstack.persistence.storageclass" -}}
|
||||||
|
{{- if .Values.bookstack.persistence.storageClass -}}
|
||||||
|
{{ printf "%s" .Values.bookstack.persistence.storageClass }}
|
||||||
|
{{- else if .Values.global.defaultStorageClass -}}
|
||||||
|
{{ printf "%s" .Values.global.defaultStorageClass }}
|
||||||
|
{{- else -}}
|
||||||
|
{{ print "" }}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end }}
|
19
bookstack/templates/app-key.yaml
Normal file
19
bookstack/templates/app-key.yaml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{{- /*
|
||||||
|
Einmaliges Secret: wird nur angelegt, wenn es noch nicht existiert (lookup).
|
||||||
|
*/}}
|
||||||
|
{{- $secretName := include "bookstack.app-key" .}}
|
||||||
|
{{- if not (lookup "v1" "Secret" .Release.Namespace $secretName) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
type: Opaque
|
||||||
|
metadata:
|
||||||
|
name: {{ $secretName }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
annotations:
|
||||||
|
helm.sh/resource-policy: keep
|
||||||
|
labels:
|
||||||
|
{{- include "bookstack.labels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: bookstack-app
|
||||||
|
data:
|
||||||
|
app-key: {{ default (randAlphaNum 32) .Values.bookstack.config.app.key | b64enc | quote }}
|
||||||
|
{{- end }}
|
47
bookstack/templates/config.yaml
Normal file
47
bookstack/templates/config.yaml
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ include "bookstack.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
data:
|
||||||
|
{{- range $key, $value := .Values.bookstack.config.app }}
|
||||||
|
{{- if ne $key "key" }}
|
||||||
|
{{ printf "APP_%s" (upper ( replace "." "_" $key)) }}: {{ $value | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- /* -------------------------------------------------
|
||||||
|
Social‑Auth‑Sektionen
|
||||||
|
------------------------------------------------- */}}
|
||||||
|
{{- $providers := list
|
||||||
|
"oidc" "azure" "discord" "facebook" "github" "gitlab"
|
||||||
|
"google" "okta" "slack" "twitch" "twitter" "ldap" }}
|
||||||
|
{{- range $_, $p := $providers }}
|
||||||
|
{{- /* .Values.bookstack.auth.<provider> als Map holen */}}
|
||||||
|
{{- $conf := index $.Values.bookstack.auth $p | default dict }}
|
||||||
|
{{- if $conf.enabled }}
|
||||||
|
{{- range $key, $value := $conf }}
|
||||||
|
{{- if and (ne $key "clientId") (ne $key "clientSecret") (ne $key "dn") (ne $key "pass") (ne $key "existingSecret") }}
|
||||||
|
{{ printf "%s_%s" (upper $p) (upper (replace "." "_" $key)) }}: {{ $value | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- range $key, $value := .Values.bookstack.mail }}
|
||||||
|
{{- if and (ne $key "username") (ne $key "password") $value }}
|
||||||
|
{{ printf "MAIL_%s" (upper (replace "." "_" $key)) }}: {{ $value | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if not .Values.bookstack.mail.host }}
|
||||||
|
MAIL_HOST: {{ printf "%s.svc.%s.%s" (include "bookstack.mailpit.name" .) .Release.Namespace .Values.global.clusterDomain | quote }}
|
||||||
|
{{- end }}
|
||||||
|
AUTH_METHOD: {{ .Values.bookstack.auth.method | quote }}
|
||||||
|
AUTH_AUTO_INITIATE: {{ index .Values.bookstack.auth "auto.initiate" | quote }}
|
||||||
|
{{- range $key, $value := .Values.bookstack.config.additional }}
|
||||||
|
{{ $key | nospace | snakecase | upper }}: {{ $value | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.redis.enabled }}
|
||||||
|
REDIS_SERVERS: {{ printf "%s.svc.%s.%s:%.0f:0" (include "bookstack.redis.serviceName" .) .Release.Namespace .Values.global.clusterDomain .Values.redis.master.service.ports.redis | quote }}
|
||||||
|
{{- else if .Values.bookstack.externalRedis.servers }}
|
||||||
|
REDIS_SERVERS: {{ .Values.bookstack.externalRedis.servers | quote }}
|
||||||
|
{{- end }}
|
117
bookstack/templates/deployment.yaml
Normal file
117
bookstack/templates/deployment.yaml
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}
|
||||||
|
checksum/secret: {{ include (print $.Template.BasePath "/secret-bookstack.yaml") . | sha256sum }}
|
||||||
|
checksum/app-key: {{ include (print $.Template.BasePath "/app-key.yaml") . | sha256sum }}
|
||||||
|
labels:
|
||||||
|
{{- include "bookstack.labels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: bookstack-app
|
||||||
|
name: {{ include "bookstack.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
spec:
|
||||||
|
replicas: {{ .Values.bookstack.replicaCount | default 1 }}
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
{{- include "bookstack.labels" . | nindent 6 }}
|
||||||
|
app.kubernetes.io/component: bookstack-app
|
||||||
|
{{- if .Values.bookstack.updateStrategy }}
|
||||||
|
strategy:
|
||||||
|
{{- toYaml .Values.bookstack.updateStrategy | nindent 4 }}
|
||||||
|
{{- else }}
|
||||||
|
strategy:
|
||||||
|
rollingUpdate:
|
||||||
|
maxSurge: 25%
|
||||||
|
maxUnavailable: 25%
|
||||||
|
type: RollingUpdate
|
||||||
|
{{- end }}
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
{{- include "bookstack.labels" . | nindent 8 }}
|
||||||
|
app.kubernetes.io/component: bookstack-app
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: bookstack
|
||||||
|
image: {{ include "bookstack.image" . }}
|
||||||
|
imagePullPolicy: {{ .Values.bookstack.image.pullPolicy }}
|
||||||
|
env:
|
||||||
|
{{- if .Values.db.enabled }}
|
||||||
|
- name: DB_HOST
|
||||||
|
value: {{ include "bookstack.db.serviceName" . | quote }}
|
||||||
|
- name: DB_DATABASE
|
||||||
|
value: {{ .Values.db.auth.database | quote }}
|
||||||
|
- name: DB_USERNAME
|
||||||
|
value: {{ .Values.db.auth.username | quote }}
|
||||||
|
- name: DB_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "bookstack.db.secretName" . }}
|
||||||
|
key: mariadb-password
|
||||||
|
{{- else }}
|
||||||
|
- name: DB_HOST
|
||||||
|
value: {{ required "When you disable the onboard database you have to define bookstack.externalDatabase.host" .Values.bookstack.externalDatabase.host | quote }}
|
||||||
|
- name: DB_USERNAME
|
||||||
|
value: {{ required "When you disable the onboard database you have to define bookstack.externalDatabase.username" .Values.bookstack.externalDatabase.username | quote }}
|
||||||
|
- name: DB_DATABASE
|
||||||
|
value: {{ required "When you disable the onboard database you have to define bookstack.externalDatabase.database" .Values.bookstack.externalDatabase.database | quote }}
|
||||||
|
- name: DB_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "bookstack.secret" . }}
|
||||||
|
key: mariadb-password
|
||||||
|
{{- end }}
|
||||||
|
- name: APP_KEY
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ include "bookstack.app-key" . }}
|
||||||
|
key: app-key
|
||||||
|
{{- with .Values.bookstack.extraEnv }}
|
||||||
|
{{- range $key, $val := . }}
|
||||||
|
- name: {{ $key | upper | quote }}
|
||||||
|
{{- if kindIs "map" $val }}
|
||||||
|
{{ toYaml $val | nindent 14 }}
|
||||||
|
{{- else }}
|
||||||
|
value: {{ $val | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
envFrom:
|
||||||
|
- configMapRef:
|
||||||
|
name: {{ include "bookstack.fullname" . }}
|
||||||
|
{{- if or (not .Values.db.enabled) (not (.Values.bookstack.auth | default dict | len | eq 0)) }}
|
||||||
|
- secretRef:
|
||||||
|
name: {{ include "bookstack.secret" . }}
|
||||||
|
{{- end }}
|
||||||
|
ports:
|
||||||
|
- containerPort: 8080
|
||||||
|
name: bookstack-http
|
||||||
|
protocol: TCP
|
||||||
|
{{- if .Values.bookstack.persistence.enabled }}
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /var/www/bookstack/public/uploads
|
||||||
|
subPath: public-uploads
|
||||||
|
name: {{ include "bookstack.name" . }}
|
||||||
|
- mountPath: /var/www/bookstack/storage/uploads
|
||||||
|
subPath: storage-uploads
|
||||||
|
name: {{ include "bookstack.name" . }}
|
||||||
|
{{- end }}
|
||||||
|
securityContext:
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
privileged: false
|
||||||
|
securityContext: {}
|
||||||
|
serviceAccount: ""
|
||||||
|
serviceAccountName: ""
|
||||||
|
automountServiceAccountToken: false
|
||||||
|
terminationGracePeriodSeconds: 30
|
||||||
|
{{- with .Values.bookstack.image.imagePullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- toYaml . | nindent 8 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.bookstack.persistence.enabled }}
|
||||||
|
volumes:
|
||||||
|
- name: {{ include "bookstack.name" . }}
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: {{ include "bookstack.fullname" . }}
|
||||||
|
{{- end }}
|
42
bookstack/templates/ingress.yaml
Normal file
42
bookstack/templates/ingress.yaml
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
{{- if .Values.ingress.enabled }}
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
{{- with .Values.ingress.annotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
labels:
|
||||||
|
{{- include "bookstack.labels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: bookstack-app
|
||||||
|
name: {{ include "bookstack.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
spec:
|
||||||
|
{{- with .Values.ingress.class }}
|
||||||
|
ingressClassName: {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.ingress.tls }}
|
||||||
|
tls:
|
||||||
|
{{- toYaml . | nindent 4 }}
|
||||||
|
{{- end }}
|
||||||
|
rules:
|
||||||
|
- host: {{ required "Please provide a hostname for the ingress" .Values.ingress.hostname }}
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- backend:
|
||||||
|
service:
|
||||||
|
name: {{ include "bookstack.fullname" . }}
|
||||||
|
port:
|
||||||
|
number: {{ .Values.service.port | default 8080}}
|
||||||
|
path: {{ .Values.ingress.path | default "/" }}
|
||||||
|
pathType: {{ .Values.ingress.pathType | default "Prefix" }}
|
||||||
|
{{- if and (eq .Values.bookstack.mail.driver "smtp") (not .Values.bookstack.mail.host) }}
|
||||||
|
- backend:
|
||||||
|
service:
|
||||||
|
name: {{ include "bookstack.mailpit.name" . }}
|
||||||
|
port:
|
||||||
|
number: 8025
|
||||||
|
path: /mailpit
|
||||||
|
pathType: Prefix
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
78
bookstack/templates/mailpit.yaml
Normal file
78
bookstack/templates/mailpit.yaml
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
{{- $deploymentName := (include "bookstack.mailpit.name" .)}}
|
||||||
|
{{- if and (eq .Values.bookstack.mail.driver "smtp") (not .Values.bookstack.mail.host) }}
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
{{- include "bookstack.labels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: mailpit
|
||||||
|
name: {{ $deploymentName }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
{{- include "bookstack.labels" . | nindent 6 }}
|
||||||
|
app.kubernetes.io/component: mailpit
|
||||||
|
strategy:
|
||||||
|
type: Recreate
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
{{- include "bookstack.labels" . | nindent 8 }}
|
||||||
|
app.kubernetes.io/component: mailpit
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- env:
|
||||||
|
- name: MP_ALLOW_UNTRUSTED_TLS
|
||||||
|
value: 'true'
|
||||||
|
- name: MP_API_CORS
|
||||||
|
value: 'true'
|
||||||
|
- name: MP_MAX_MESSAGES
|
||||||
|
value: '100'
|
||||||
|
- name: MP_QUIET
|
||||||
|
value: 'true'
|
||||||
|
- name: MP_SMTP_AUTH
|
||||||
|
value: {{ printf "%s:%s" .Values.bookstack.mail.username .Values.bookstack.mail.password | quote }}
|
||||||
|
- name: MP_SMTP_AUTH_ALLOW_INSECURE
|
||||||
|
value: 'true'
|
||||||
|
- name: MP_UI_AUTH
|
||||||
|
value: {{ printf "%s:%s" .Values.bookstack.mail.username .Values.bookstack.mail.password | quote }}
|
||||||
|
image: axllent/mailpit:latest
|
||||||
|
imagePullPolicy: Always
|
||||||
|
name: mailpit
|
||||||
|
ports:
|
||||||
|
- containerPort: 8025
|
||||||
|
name: http
|
||||||
|
protocol: TCP
|
||||||
|
- containerPort: 1025
|
||||||
|
name: smtp
|
||||||
|
protocol: TCP
|
||||||
|
securityContext:
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
privileged: false
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
{{- include "bookstack.labels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: mailpit
|
||||||
|
name: {{ $deploymentName }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 8025
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: 8025
|
||||||
|
- name: smtp
|
||||||
|
port: 1025
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: 1025
|
||||||
|
selector:
|
||||||
|
{{- include "bookstack.labels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: mailpit
|
||||||
|
type: ClusterIP
|
||||||
|
clusterIP: None
|
||||||
|
{{- end }}
|
14
bookstack/templates/persistence.yaml
Normal file
14
bookstack/templates/persistence.yaml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{{- if .Values.bookstack.persistence.enabled }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: {{ include "bookstack.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- {{ required "You have to set the access mode for the volume" .Values.bookstack.persistence.accessMode }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ required "You have to set the storage size" .Values.bookstack.persistence.size }}
|
||||||
|
storageClassName: {{ include "bookstack.persistence.storageclass" . }}
|
||||||
|
{{- end }}
|
46
bookstack/templates/secret-bookstack.yaml
Normal file
46
bookstack/templates/secret-bookstack.yaml
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
{{- if or (not .Values.db.enabled) (not (.Values.bookstack.auth | default dict | len | eq 0)) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
type: Opaque
|
||||||
|
metadata:
|
||||||
|
name: {{ include "bookstack.secret" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
labels:
|
||||||
|
{{- include "bookstack.labels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: bookstack-app
|
||||||
|
data:
|
||||||
|
{{- if not .Values.db.enabled }}
|
||||||
|
DB_PASSWORD: {{ required
|
||||||
|
"When you disable the onboard database you have to define bookstack.externalDatabase.password"
|
||||||
|
.Values.bookstack.externalDatabase.password | b64enc | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- /* -------------------------------------------------
|
||||||
|
Social‑Auth‑Sektionen
|
||||||
|
------------------------------------------------- */}}
|
||||||
|
{{- $providers := list
|
||||||
|
"oidc" "azure" "discord" "facebook" "github" "gitlab"
|
||||||
|
"google" "okta" "slack" "twitch" "twitter" }}
|
||||||
|
{{- range $_, $p := $providers }}
|
||||||
|
{{- /* .Values.bookstack.auth.<provider> als Map holen */}}
|
||||||
|
{{- $conf := index $.Values.bookstack.auth $p | default dict }}
|
||||||
|
{{- if and ($conf.enabled) (not $conf.existingSecret) }}
|
||||||
|
{{ upper $p }}_CLIENT_ID: {{ required
|
||||||
|
(printf "You have to define a bookstack.auth.%s.clientId" $p)
|
||||||
|
$conf.clientId | b64enc | quote }}
|
||||||
|
{{ upper $p }}_CLIENT_SECRET: {{ required
|
||||||
|
(printf "You have to define a bookstack.auth.%s.clientSecret" $p)
|
||||||
|
$conf.clientSecret | b64enc | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.bookstack.auth.ldap.enabled }}
|
||||||
|
LDAP_SERVER: {{ required
|
||||||
|
"You have to define a bookstack.auth.ldap.server"
|
||||||
|
.Values.bookstack.auth.ldap.server | b64enc | quote }}
|
||||||
|
LDAP_DN: {{ required
|
||||||
|
"You have to define a bookstack.auth.ldap.dn"
|
||||||
|
.Values.bookstack.auth.ldap.dn | b64enc | quote }}
|
||||||
|
LDAP_PASS: {{ required
|
||||||
|
"You have to define a bookstack.auth.ldap.passw"
|
||||||
|
.Values.bookstack.auth.ldap.pass | b64enc | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
21
bookstack/templates/secret-db.yaml
Normal file
21
bookstack/templates/secret-db.yaml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{{- /*
|
||||||
|
Einmaliges Secret: wird nur angelegt, wenn es noch nicht existiert (lookup).
|
||||||
|
*/}}
|
||||||
|
{{- $secretName := include "bookstack.db.secretName" . }}
|
||||||
|
{{- if and (not (lookup "v1" "Secret" .Release.Namespace $secretName)) .Values.db.enabled }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Secret
|
||||||
|
type: Opaque
|
||||||
|
metadata:
|
||||||
|
name: {{ $secretName }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
annotations:
|
||||||
|
helm.sh/resource-policy: keep
|
||||||
|
labels:
|
||||||
|
{{- include "bookstack.labels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: database
|
||||||
|
data:
|
||||||
|
mariadb-root-password: {{ default (randAlphaNum 32) .Values.db.auth.rootPassword | b64enc | quote }}
|
||||||
|
mariadb-password: {{ default (randAlphaNum 32) .Values.db.auth.password | b64enc | quote }}
|
||||||
|
mariadb-replication-password: {{ default (randAlphaNum 32) .Values.db.auth.replicationPassword | b64enc | quote }}
|
||||||
|
{{- end }}
|
35
bookstack/templates/service.yaml
Normal file
35
bookstack/templates/service.yaml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
{{- include "bookstack.labels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: bookstack-app
|
||||||
|
name: {{ include "bookstack.fullname" . }}
|
||||||
|
namespace: {{ .Release.Namespace }}
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: {{ .Values.service.port | default 8080 }}
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: 8080
|
||||||
|
{{- if and (eq .Values.service.type "NodePort") .Values.service.nodePort }}
|
||||||
|
nodePort: {{ .Values.service.nodePort | quote }}
|
||||||
|
{{- end }}
|
||||||
|
selector:
|
||||||
|
{{- include "bookstack.labels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: bookstack-app
|
||||||
|
{{- if or (eq .Values.service.type "ClusterIP") (eq .Values.service.type "Headless") }}
|
||||||
|
type: ClusterIP
|
||||||
|
{{- else if eq .Values.service.type "NodePort" }}
|
||||||
|
type: NodePort
|
||||||
|
{{- else if eq .Values.service.type "LoadBalancer" }}
|
||||||
|
type: LoadBalancer
|
||||||
|
{{- with .Values.service.loadBalancerIP }}
|
||||||
|
loadBalancerIP: {{ . | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if or (eq .Values.service.type "Headless") }}
|
||||||
|
clusterIP: None
|
||||||
|
{{- else if .Values.service.clusterIP }}
|
||||||
|
clusterIP: {{ .Values.service.clusterIP | quote }}
|
||||||
|
{{- end }}
|
139
bookstack/values.yaml
Normal file
139
bookstack/values.yaml
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
global:
|
||||||
|
imageRegistry: ""
|
||||||
|
imagePullSecrets: []
|
||||||
|
defaultStorageClass: ""
|
||||||
|
clusterDomain: cluster.local
|
||||||
|
|
||||||
|
bookstack:
|
||||||
|
image:
|
||||||
|
registry: ""
|
||||||
|
repository: solidnerd
|
||||||
|
name: bookstack
|
||||||
|
tag: ""
|
||||||
|
pullPolicy: Always
|
||||||
|
imagePullSecrets: []
|
||||||
|
updateStrategy: {}
|
||||||
|
replicaCount: 1
|
||||||
|
config:
|
||||||
|
app:
|
||||||
|
key: ""
|
||||||
|
url: "https://example.com"
|
||||||
|
views.books: list
|
||||||
|
views.bookshelves: grid
|
||||||
|
views.bookshelf: grid
|
||||||
|
default.dark.mode: true
|
||||||
|
additional:
|
||||||
|
DISABLE_EXTERNAL_SERVICES: false
|
||||||
|
mail:
|
||||||
|
driver: "smtp"
|
||||||
|
host: ""
|
||||||
|
from: "bookstack@cluster.local"
|
||||||
|
from.name: "BookStack"
|
||||||
|
username: changeme
|
||||||
|
password: changeme
|
||||||
|
port: 1025
|
||||||
|
encryption: "null"
|
||||||
|
externalDatabase:
|
||||||
|
host: ""
|
||||||
|
database: ""
|
||||||
|
username: ""
|
||||||
|
password: ""
|
||||||
|
externalRedis:
|
||||||
|
servers: ""
|
||||||
|
auth:
|
||||||
|
method: standard
|
||||||
|
auto.initiate: false
|
||||||
|
oidc:
|
||||||
|
enabled: false
|
||||||
|
name: "Open ID Connect"
|
||||||
|
clientId: ""
|
||||||
|
clientSecret: ""
|
||||||
|
issuer: ""
|
||||||
|
azure:
|
||||||
|
enabled: false
|
||||||
|
appId: ""
|
||||||
|
appSecret: ""
|
||||||
|
discord:
|
||||||
|
enabled: false
|
||||||
|
appId: ""
|
||||||
|
appSecret: ""
|
||||||
|
facebook:
|
||||||
|
enabled: false
|
||||||
|
appId: ""
|
||||||
|
appSecret: ""
|
||||||
|
github:
|
||||||
|
enabled: false
|
||||||
|
appId: ""
|
||||||
|
appSecret: ""
|
||||||
|
gitlab:
|
||||||
|
enabled: false
|
||||||
|
appId: ""
|
||||||
|
appSecret: ""
|
||||||
|
google:
|
||||||
|
enabled: false
|
||||||
|
appId: ""
|
||||||
|
appSecret: ""
|
||||||
|
okta:
|
||||||
|
enabled: false
|
||||||
|
appId: ""
|
||||||
|
appSecret: ""
|
||||||
|
slack:
|
||||||
|
enabled: false
|
||||||
|
appId: ""
|
||||||
|
appSecret: ""
|
||||||
|
twitch:
|
||||||
|
enabled: false
|
||||||
|
appId: ""
|
||||||
|
appSecret: ""
|
||||||
|
twitter:
|
||||||
|
enabled: false
|
||||||
|
appId: ""
|
||||||
|
appSecret: ""
|
||||||
|
ldap:
|
||||||
|
enabled: false
|
||||||
|
server: ""
|
||||||
|
base.dn: ""
|
||||||
|
dn: ""
|
||||||
|
pass: ""
|
||||||
|
extraEnv: {}
|
||||||
|
persistence:
|
||||||
|
enabled: true
|
||||||
|
size: 10Gi
|
||||||
|
storageClass: ""
|
||||||
|
accessMode: "ReadWriteMany"
|
||||||
|
|
||||||
|
service:
|
||||||
|
port: 8080
|
||||||
|
type: ClusterIP
|
||||||
|
loadBalancerIP: ""
|
||||||
|
nodePort: ""
|
||||||
|
clusterIP: ""
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: false
|
||||||
|
annotations: []
|
||||||
|
tls: []
|
||||||
|
class: ""
|
||||||
|
hostname: ""
|
||||||
|
path: "/"
|
||||||
|
pathType: "Prefix"
|
||||||
|
|
||||||
|
db:
|
||||||
|
enabled: true
|
||||||
|
image:
|
||||||
|
pullPolicy: Always
|
||||||
|
architecture: standalone
|
||||||
|
auth:
|
||||||
|
database: "bookstack_app"
|
||||||
|
username: "bookstack"
|
||||||
|
rootPassword: ""
|
||||||
|
password: ""
|
||||||
|
replicationPassword: ""
|
||||||
|
existingSecret: "bookstack-database-credentials"
|
||||||
|
|
||||||
|
redis:
|
||||||
|
enabled: true
|
||||||
|
architecture: standalone
|
||||||
|
auth:
|
||||||
|
enabled: false
|
||||||
|
sentinel: false
|
Loading…
x
Reference in New Issue
Block a user