neue mantisbt helm chart

This commit is contained in:
titver968
2025-12-12 10:20:53 +01:00
parent dd8dbc1bad
commit 3b613196f5
17 changed files with 637 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

19
mantisbt/index.yaml Normal file
View File

@@ -0,0 +1,19 @@
apiVersion: v1
entries:
mantisbt:
- apiVersion: v2
appVersion: 2.27.0
created: "2025-12-12T10:19:45.381062+01:00"
dependencies:
- condition: postgresql.enabled
name: postgresql
repository: https://charts.bitnami.com/bitnami
version: 16.*.*
description: MantisBT Bug Tracker - A Helm chart for Kubernetes
digest: 14e0657e509b2e4545bde0678b88eb17f21d6c66c03110a38082820d3f952a61
name: mantisbt
type: application
urls:
- https://gitea.innovation-hub-niedersachsen.de/innohub/charts/raw/main/mantisbt/mantisbt-0.1.0.tgz
version: 0.1.0
generated: "2025-12-12T10:19:45.376611+01:00"

BIN
mantisbt/mantisbt-0.1.0.tgz Normal file

Binary file not shown.

View File

@@ -0,0 +1,6 @@
dependencies:
- name: postgresql
repository: https://charts.bitnami.com/bitnami
version: 16.7.27
digest: sha256:5dc0caa006210414bad6131a00cff7b8ccc86a675ee6fd19a8f003eb2083890c
generated: "2025-12-12T10:14:31.503437+01:00"

View File

@@ -0,0 +1,12 @@
apiVersion: v2
name: mantisbt
description: MantisBT Bug Tracker - A Helm chart for Kubernetes
type: application
version: "0.1.0"
appVersion: "2.27.0"
dependencies:
- name: postgresql
version: "16.*.*"
repository: "https://charts.bitnami.com/bitnami"
condition: postgresql.enabled

Binary file not shown.

View File

@@ -0,0 +1,117 @@
{{/*
Expand the name of the chart.
*/}}
{{- define "mantisbt.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "mantisbt.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "mantisbt.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "mantisbt.labels" -}}
helm.sh/chart: {{ include "mantisbt.chart" . }}
{{ include "mantisbt.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "mantisbt.selectorLabels" -}}
app.kubernetes.io/name: {{ include "mantisbt.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Create the name of the service account to use
*/}}
{{- define "mantisbt.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "mantisbt.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
{{- end }}
{{/*
Create a default fully qualified database name.
*/}}
{{- define "mantisbt.databaseHost" -}}
{{- if .Values.postgresql.enabled }}
{{- printf "%s-postgresql" (include "mantisbt.fullname" .) }}
{{- else }}
{{- .Values.externalDatabase.host }}
{{- end }}
{{- end }}
{{/*
Get database port
*/}}
{{- define "mantisbt.databasePort" -}}
{{- if .Values.postgresql.enabled }}
{{- printf "5432" }}
{{- else }}
{{- .Values.externalDatabase.port | default "5432" }}
{{- end }}
{{- end }}
{{/*
Get database name
*/}}
{{- define "mantisbt.databaseName" -}}
{{- if .Values.postgresql.enabled }}
{{- .Values.postgresql.auth.database }}
{{- else }}
{{- .Values.externalDatabase.database }}
{{- end }}
{{- end }}
{{/*
Get database user
*/}}
{{- define "mantisbt.databaseUser" -}}
{{- if .Values.postgresql.enabled }}
{{- .Values.postgresql.auth.username }}
{{- else }}
{{- .Values.externalDatabase.username }}
{{- end }}
{{- end }}
{{/*
Get database password
*/}}
{{- define "mantisbt.databasePassword" -}}
{{- if .Values.postgresql.enabled }}
{{- .Values.postgresql.auth.password }}
{{- else }}
{{- .Values.externalDatabase.password }}
{{- end }}
{{- end }}

View File

@@ -0,0 +1,57 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ template "mantisbt.fullname" . }}-config
labels:
app: {{ template "mantisbt.name" . }}
chart: {{ template "mantisbt.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
data:
config_inc.php: |
<?php
# MantisBT Configuration - Generated by Helm
# Database settings
$g_hostname = '{{ include "mantisbt.databaseHost" . }}';
$g_db_type = 'pgsql';
$g_database_name = '{{ include "mantisbt.databaseName" . }}';
$g_db_username = '{{ include "mantisbt.databaseUser" . }}';
$g_db_password = getenv('MANTISBT_DATABASE_PASSWORD');
# Site settings
$g_window_title = '{{ .Values.mantisbt.siteName }}';
$g_path = '{{ .Values.mantisbt.siteUrl }}/';
# Anonymous access
$g_allow_anonymous_login = OFF;
$g_anonymous_account = '';
# Security
$g_crypto_master_salt = '{{ randAlphaNum 32 }}';
{{- if .Values.mantisbt.email.enabled }}
# Email settings
$g_phpMailer_method = PHPMAILER_METHOD_SMTP;
$g_smtp_host = '{{ .Values.mantisbt.email.smtpHost }}';
$g_smtp_port = {{ .Values.mantisbt.email.smtpPort }};
$g_from_email = '{{ .Values.mantisbt.email.fromAddress }}';
$g_from_name = '{{ .Values.mantisbt.email.fromName }}';
$g_enable_email_notification = ON;
{{- if .Values.mantisbt.email.smtpUsername }}
$g_smtp_username = '{{ .Values.mantisbt.email.smtpUsername }}';
$g_smtp_password = getenv('MANTISBT_SMTP_PASSWORD');
{{- end }}
{{- else }}
# Email disabled
$g_enable_email_notification = OFF;
{{- end }}
# Timezone
$g_default_timezone = 'Europe/Berlin';
# File uploads
$g_file_upload_method = DISK;
$g_absolute_path_default_upload_folder = '/var/www/html/uploads/';
$g_max_file_size = 10000000;
$g_allowed_files = 'png,gif,jpg,jpeg,pdf,doc,docx,xls,xlsx,ppt,pptx,txt,zip,rar,7z';

View File

@@ -0,0 +1,149 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ template "mantisbt.fullname" . }}
labels:
app: {{ template "mantisbt.name" . }}
chart: {{ template "mantisbt.chart" . }}
component: mantisbt
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
{{- if .Values.deploymentLabels }}
{{- toYaml .Values.deploymentLabels | nindent 4 }}
{{- end }}
spec:
strategy:
{{ toYaml .Values.updateStrategy | nindent 4 }}
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ template "mantisbt.name" . }}
component: mantisbt
release: {{ .Release.Name }}
template:
metadata:
annotations:
labels:
app: {{ template "mantisbt.name" . }}
component: mantisbt
release: {{ .Release.Name }}
{{- if .Values.podLabels }}
{{- toYaml .Values.podLabels | nindent 8 }}
{{- end }}
spec:
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
serviceAccountName: {{ template "mantisbt.serviceAccountName" . }}
initContainers:
- name: wait-for-db
image: busybox:1.36
command:
- sh
- -c
- |
until nc -z {{ include "mantisbt.databaseHost" . }} {{ include "mantisbt.databasePort" . }}; do
echo "Waiting for database..."
sleep 2
done
echo "Database is ready!"
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
terminationMessagePolicy: FallbackToLogsOnError
ports:
- name: http
containerPort: 80
env:
- name: MANTISBT_DATABASE_HOST
value: {{ include "mantisbt.databaseHost" . | quote }}
- name: MANTISBT_DATABASE_PORT
value: {{ include "mantisbt.databasePort" . | quote }}
- name: MANTISBT_DATABASE_NAME
value: {{ include "mantisbt.databaseName" . | quote }}
- name: MANTISBT_DATABASE_USER
value: {{ include "mantisbt.databaseUser" . | quote }}
- name: MANTISBT_DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: {{ template "mantisbt.fullname" . }}-secret
key: database-password
- name: MANTISBT_ADMIN_USER
value: {{ .Values.mantisbt.adminUser | quote }}
- name: MANTISBT_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: {{ template "mantisbt.fullname" . }}-secret
key: admin-password
- name: MANTISBT_ADMIN_EMAIL
value: {{ .Values.mantisbt.adminEmail | quote }}
{{- if .Values.mantisbt.email.enabled }}
- name: MANTISBT_SMTP_HOST
value: {{ .Values.mantisbt.email.smtpHost | quote }}
- name: MANTISBT_SMTP_PORT
value: {{ .Values.mantisbt.email.smtpPort | quote }}
{{- end }}
{{- range $key := .Values.env }}
{{- if .value }}
- name: {{ .name }}
value: {{ .value | quote }}
{{- end }}
{{- end }}
{{- range $key := .Values.secretEnv }}
- name: {{ .name }}
valueFrom:
secretKeyRef:
name: {{ template "mantisbt.fullname" $ }}-secret
key: {{ .name }}
{{- end }}
envFrom:
{{- with .Values.extraEnvFrom }}
{{- tpl . $ | nindent 10 }}
{{- end }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
resources:
{{ toYaml .Values.resources | indent 12 }}
{{- if .Values.persistence.enabled }}
volumeMounts:
- name: data
mountPath: {{ .Values.persistence.mountPath }}
- name: config
mountPath: /var/www/html/config/config_inc.php
subPath: config_inc.php
{{- end }}
livenessProbe:
httpGet:
path: /login_page.php
port: http
initialDelaySeconds: 60
periodSeconds: 10
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /login_page.php
port: http
initialDelaySeconds: 30
periodSeconds: 5
timeoutSeconds: 3
{{- with .Values.nodeSelector }}
nodeSelector:
{{ toYaml . | indent 8 }}
{{- end }}
{{- if .Values.affinity }}
affinity:
{{ toYaml .Values.affinity | indent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{ toYaml . | indent 8 }}
{{- end }}
volumes:
{{- if .Values.persistence.enabled }}
- name: data
persistentVolumeClaim:
claimName: {{ template "mantisbt.fullname" . }}-data
{{- end }}
- name: config
configMap:
name: {{ template "mantisbt.fullname" . }}-config

View File

@@ -0,0 +1,18 @@
{{- if .Values.autoscaling.enabled -}}
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: {{ template "mantisbt.fullname" . }}
labels:
app: {{ template "mantisbt.name" . }}
chart: {{ template "mantisbt.chart" . }}
component: mantisbt
heritage: {{ .Release.Service }}
release: {{ .Release.Name }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ template "mantisbt.fullname" . }}
{{ toYaml .Values.autoscaling.config | indent 2 }}
{{- end -}}

View File

@@ -0,0 +1,47 @@
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "mantisbt.fullname" . -}}
{{- $servicePort := .Values.service.port -}}
{{- $ingressPath := .Values.ingress.path -}}
{{- $ingressPathType := .Values.ingress.pathtype -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ $fullName }}
labels:
app: {{ template "mantisbt.name" . }}
chart: {{ template "mantisbt.chart" . }}
component: mantisbt
heritage: {{ .Release.Service }}
release: {{ .Release.Name }}
{{- with .Values.ingress.annotations }}
annotations:
{{ toYaml . | indent 4 }}
{{- end }}
spec:
{{- if .Values.ingress.className }}
ingressClassName: {{ .Values.ingress.className }}
{{- end }}
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.hosts }}
- host: {{ . }}
http:
paths:
- path: {{ $ingressPath }}
pathType: {{ $ingressPathType }}
backend:
service:
name: {{ $fullName }}
port:
number: {{ $servicePort }}
{{- end }}
{{- end }}

View File

@@ -0,0 +1,28 @@
{{- if .Values.persistence.enabled -}}
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ template "mantisbt.fullname" . }}-data
labels:
app: {{ template "mantisbt.name" . }}
chart: {{ template "mantisbt.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
{{- with .Values.persistence.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
accessModes:
- {{ .Values.persistence.accessMode | quote }}
{{- if .Values.persistence.storageClass }}
{{- if (eq "-" .Values.persistence.storageClass) }}
storageClassName: ""
{{- else }}
storageClassName: {{ .Values.persistence.storageClass | quote }}
{{- end }}
{{- end }}
resources:
requests:
storage: {{ .Values.persistence.size | quote }}
{{- end -}}

View File

@@ -0,0 +1,19 @@
apiVersion: v1
kind: Secret
metadata:
name: {{ template "mantisbt.fullname" . }}-secret
labels:
app: {{ template "mantisbt.name" . }}
chart: {{ template "mantisbt.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
type: Opaque
stringData:
database-password: {{ include "mantisbt.databasePassword" . | quote }}
admin-password: {{ .Values.mantisbt.adminPassword | quote }}
{{- if .Values.mantisbt.email.smtpPassword }}
smtp-password: {{ .Values.mantisbt.email.smtpPassword | quote }}
{{- end }}
{{- range .Values.secretEnv }}
{{ .name }}: {{ .value | quote }}
{{- end }}

View File

@@ -0,0 +1,25 @@
apiVersion: v1
kind: Service
metadata:
{{- if .Values.service.annotations }}
annotations:
{{ toYaml .Values.service.annotations | indent 4 }}
{{- end }}
name: {{ template "mantisbt.fullname" . }}
labels:
app: {{ template "mantisbt.name" . }}
chart: {{ template "mantisbt.chart" . }}
component: mantisbt
heritage: {{ .Release.Service }}
release: {{ .Release.Name }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: 80
protocol: TCP
name: http
selector:
app: {{ template "mantisbt.name" . }}
component: mantisbt
release: {{ .Release.Name }}

View File

@@ -0,0 +1,13 @@
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "mantisbt.serviceAccountName" . }}
labels:
{{- include "mantisbt.labels" . | nindent 4 }}
{{- with .Values.serviceAccount.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
automountServiceAccountToken: {{ .Values.serviceAccount.automount }}
{{- end }}

View File

@@ -0,0 +1,127 @@
platform: kubernetes
serviceAccount:
create: true
name: ""
annotations: {}
automount: false
image:
repository: vimagick/mantisbt
tag: latest
pullPolicy: IfNotPresent
replicaCount: 1
service:
type: ClusterIP
port: 80
annotations: {}
ingress:
enabled: false
className: traefik
annotations: {}
path: /
pathtype: Prefix
hosts:
- mantisbt.local
tls: []
# - secretName: mantisbt-tls
# hosts:
# - mantisbt.local
resources:
requests:
memory: 128Mi
cpu: 100m
limits:
memory: 512Mi
cpu: 500m
nodeSelector: {}
tolerations: []
affinity: {}
autoscaling:
enabled: false
config:
minReplicas: 1
maxReplicas: 5
targetCPUUtilizationPercentage: 80
deploymentLabels: {}
podLabels: {}
persistence:
enabled: true
mountPath: /var/www/html
accessMode: ReadWriteOnce
size: 5Gi
storageClass: ""
annotations: {}
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
podSecurityContext: {}
securityContext: {}
# MantisBT specific configuration
mantisbt:
# Admin credentials (change these!)
adminUser: administrator
adminPassword: "admin123"
adminEmail: "admin@example.com"
# Site configuration
siteName: "MantisBT"
siteUrl: "https://mantisbt.local"
# Email configuration (optional)
email:
enabled: false
smtpHost: ""
smtpPort: 25
smtpUsername: ""
smtpPassword: ""
fromAddress: "mantisbt@example.com"
fromName: "MantisBT"
# Environment variables
env: []
# - name: TZ
# value: "Europe/Berlin"
secretEnv: []
extraEnvFrom: []
extraDeploy: []
# PostgreSQL subchart configuration
postgresql:
enabled: true
auth:
database: mantisbt
username: mantisbt
password: "mantisbt123"
postgresPassword: "rootpassword123"
primary:
persistence:
enabled: true
size: 8Gi
storageClass: ""
# External database (if postgresql.enabled=false)
externalDatabase:
host: ""
port: 5432
database: mantisbt
username: mantisbt
password: ""
existingSecret: ""
existingSecretPasswordKey: ""

BIN
praktikum/.DS_Store vendored Normal file

Binary file not shown.