diff --git a/argocd-apps/applications/studio/leantime.yaml b/argocd-apps/applications/studio/leantime.yaml new file mode 100644 index 0000000..4f24384 --- /dev/null +++ b/argocd-apps/applications/studio/leantime.yaml @@ -0,0 +1,18 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: leantime + namespace: argocd +spec: + project: studio + source: + repoURL: http://forgejo.forgejo.svc.cluster.local:3000/symcrest/k8s-platform.git + targetRevision: main + path: rendered/leantime + destination: + server: https://kubernetes.default.svc + namespace: leantime + syncPolicy: + automated: + prune: false + selfHeal: true diff --git a/charts/leantime/Chart.yaml b/charts/leantime/Chart.yaml new file mode 100644 index 0000000..f60d10f --- /dev/null +++ b/charts/leantime/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: leantime +description: Symcrest Studio Leantime deployment +type: application +version: 0.1.0 +appVersion: "3.9.8" diff --git a/charts/leantime/templates/deployment.yaml b/charts/leantime/templates/deployment.yaml new file mode 100644 index 0000000..f52c007 --- /dev/null +++ b/charts/leantime/templates/deployment.yaml @@ -0,0 +1,72 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: leantime + namespace: {{ .Values.namespace }} +spec: + replicas: 1 + selector: + matchLabels: + app: leantime + template: + metadata: + labels: + app: leantime + spec: + securityContext: + fsGroup: 1000 + fsGroupChangePolicy: OnRootMismatch + + nodeSelector: +{{ toYaml .Values.nodeSelector | indent 8 }} + + containers: + - name: leantime + image: "{{ .Values.image.repository }}@{{ .Values.image.digest }}" + imagePullPolicy: IfNotPresent + + ports: + - name: http + containerPort: 8080 + + env: + - name: LEAN_DB_HOST + value: {{ .Values.database.host | quote }} + - name: LEAN_DB_USER + value: {{ .Values.database.user | quote }} + - name: LEAN_DB_DATABASE + value: {{ .Values.database.name | quote }} + - name: LEAN_DB_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.database.secret }} + key: password + - name: LEAN_APP_URL + value: {{ .Values.app.url | quote }} + - name: LEAN_SESSION_SECURE + value: "true" + - name: LEAN_APP_DIR + value: "/services/studio/leantime" + + volumeMounts: + - name: userfiles + mountPath: /var/www/html/userfiles + - name: public-userfiles + mountPath: /var/www/html/public/userfiles + - name: plugins + mountPath: /var/www/html/app/Plugins + - name: logs + mountPath: /var/www/html/storage/logs + + volumes: + - name: userfiles + persistentVolumeClaim: + claimName: leantime-userfiles + - name: public-userfiles + persistentVolumeClaim: + claimName: leantime-public-userfiles + - name: plugins + persistentVolumeClaim: + claimName: leantime-plugins + - name: logs + emptyDir: {} diff --git a/charts/leantime/templates/pvc.yaml b/charts/leantime/templates/pvc.yaml new file mode 100644 index 0000000..d988071 --- /dev/null +++ b/charts/leantime/templates/pvc.yaml @@ -0,0 +1,38 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: leantime-userfiles + namespace: {{ .Values.namespace }} +spec: + accessModes: + - ReadWriteOnce + storageClassName: {{ .Values.storage.className }} + resources: + requests: + storage: {{ .Values.storage.userfilesSize }} +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: leantime-public-userfiles + namespace: {{ .Values.namespace }} +spec: + accessModes: + - ReadWriteOnce + storageClassName: {{ .Values.storage.className }} + resources: + requests: + storage: {{ .Values.storage.publicUserfilesSize }} +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: leantime-plugins + namespace: {{ .Values.namespace }} +spec: + accessModes: + - ReadWriteOnce + storageClassName: {{ .Values.storage.className }} + resources: + requests: + storage: {{ .Values.storage.pluginsSize }} diff --git a/charts/leantime/templates/service.yaml b/charts/leantime/templates/service.yaml new file mode 100644 index 0000000..76683a0 --- /dev/null +++ b/charts/leantime/templates/service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: leantime + namespace: {{ .Values.namespace }} +spec: + selector: + app: leantime + ports: + - name: http + port: 8080 + targetPort: http diff --git a/charts/leantime/values.yaml b/charts/leantime/values.yaml new file mode 100644 index 0000000..9fb855e --- /dev/null +++ b/charts/leantime/values.yaml @@ -0,0 +1,23 @@ +namespace: leantime + +image: + repository: docker.io/leantime/leantime + digest: sha256:6150dd3e8a1e17f1ead8d462d31e26177fe906ce3602dbbbf6af5417ef809de3 + +database: + host: platform-mysql.platform-services.svc.cluster.local + user: leantime + name: leantime + secret: leantime-mysql-secret + +app: + url: https://www.symcrest.com/services/studio/leantime + +storage: + className: longhorn + userfilesSize: 5Gi + publicUserfilesSize: 5Gi + pluginsSize: 2Gi + +nodeSelector: + workload: app diff --git a/rendered/leantime/leantime.yaml b/rendered/leantime/leantime.yaml new file mode 100644 index 0000000..5edf1ee --- /dev/null +++ b/rendered/leantime/leantime.yaml @@ -0,0 +1,130 @@ +--- +# Source: leantime/templates/pvc.yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: leantime-userfiles + namespace: leantime +spec: + accessModes: + - ReadWriteOnce + storageClassName: longhorn + resources: + requests: + storage: 5Gi +--- +# Source: leantime/templates/pvc.yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: leantime-public-userfiles + namespace: leantime +spec: + accessModes: + - ReadWriteOnce + storageClassName: longhorn + resources: + requests: + storage: 5Gi +--- +# Source: leantime/templates/pvc.yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: leantime-plugins + namespace: leantime +spec: + accessModes: + - ReadWriteOnce + storageClassName: longhorn + resources: + requests: + storage: 2Gi +--- +# Source: leantime/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: leantime + namespace: leantime +spec: + selector: + app: leantime + ports: + - name: http + port: 8080 + targetPort: http +--- +# Source: leantime/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: leantime + namespace: leantime +spec: + replicas: 1 + selector: + matchLabels: + app: leantime + template: + metadata: + labels: + app: leantime + spec: + securityContext: + fsGroup: 1000 + fsGroupChangePolicy: OnRootMismatch + + nodeSelector: + workload: app + + containers: + - name: leantime + image: "docker.io/leantime/leantime@sha256:6150dd3e8a1e17f1ead8d462d31e26177fe906ce3602dbbbf6af5417ef809de3" + imagePullPolicy: IfNotPresent + + ports: + - name: http + containerPort: 8080 + + env: + - name: LEAN_DB_HOST + value: "platform-mysql.platform-services.svc.cluster.local" + - name: LEAN_DB_USER + value: "leantime" + - name: LEAN_DB_DATABASE + value: "leantime" + - name: LEAN_DB_PASSWORD + valueFrom: + secretKeyRef: + name: leantime-mysql-secret + key: password + - name: LEAN_APP_URL + value: "https://www.symcrest.com/services/studio/leantime" + - name: LEAN_SESSION_SECURE + value: "true" + - name: LEAN_APP_DIR + value: "/services/studio/leantime" + + volumeMounts: + - name: userfiles + mountPath: /var/www/html/userfiles + - name: public-userfiles + mountPath: /var/www/html/public/userfiles + - name: plugins + mountPath: /var/www/html/app/Plugins + - name: logs + mountPath: /var/www/html/storage/logs + + volumes: + - name: userfiles + persistentVolumeClaim: + claimName: leantime-userfiles + - name: public-userfiles + persistentVolumeClaim: + claimName: leantime-public-userfiles + - name: plugins + persistentVolumeClaim: + claimName: leantime-plugins + - name: logs + emptyDir: {}