diff --git a/argocd-apps/calink.yaml b/argocd-apps/calink.yaml new file mode 100644 index 0000000..b49c80d --- /dev/null +++ b/argocd-apps/calink.yaml @@ -0,0 +1,21 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: calink + namespace: argocd +spec: + project: my-apps + source: + repoURL: https://git.dvirlabs.com/dvirlabs/my-apps.git + targetRevision: HEAD + path: charts/calink-chart + helm: + valueFiles: + - ../../manifests/calink/values.yaml + destination: + server: https://kubernetes.default.svc + namespace: my-apps + syncPolicy: + automated: + prune: true + selfHeal: true diff --git a/charts/calink-chart/Chart.yaml b/charts/calink-chart/Chart.yaml new file mode 100644 index 0000000..d9406f7 --- /dev/null +++ b/charts/calink-chart/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: calink +description: Calink calendar event generator +type: application +version: 1.0.0 +appVersion: "1.0.0" diff --git a/charts/calink-chart/templates/NOTES.txt b/charts/calink-chart/templates/NOTES.txt new file mode 100644 index 0000000..566f866 --- /dev/null +++ b/charts/calink-chart/templates/NOTES.txt @@ -0,0 +1,29 @@ +Thank you for installing {{ .Chart.Name }}! + +Your release is named {{ .Release.Name }}. + +To learn more about the release, try: + + $ helm status {{ .Release.Name }} + $ helm get all {{ .Release.Name }} + +{{- if .Values.ingress.enabled }} + +Calink is accessible at: +{{- range .Values.ingress.hosts }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ .host }} +{{- end }} +{{- else }} + +To access Calink, forward the frontend port: + + kubectl port-forward svc/{{ include "calink.fullname" . }}-frontend 8080:80 + +Then visit http://localhost:8080 +{{- end }} + +Backend API documentation is available at: + /docs + +Health check endpoint: + /health diff --git a/charts/calink-chart/templates/_helpers.tpl b/charts/calink-chart/templates/_helpers.tpl new file mode 100644 index 0000000..75eb333 --- /dev/null +++ b/charts/calink-chart/templates/_helpers.tpl @@ -0,0 +1,84 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "calink.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +*/}} +{{- define "calink.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 "calink.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "calink.labels" -}} +helm.sh/chart: {{ include "calink.chart" . }} +{{ include "calink.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- with .Values.commonLabels }} +{{ toYaml . }} +{{- end }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "calink.selectorLabels" -}} +app.kubernetes.io/name: {{ include "calink.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Backend labels +*/}} +{{- define "calink.backend.labels" -}} +{{ include "calink.labels" . }} +app.kubernetes.io/component: backend +{{- end }} + +{{/* +Backend selector labels +*/}} +{{- define "calink.backend.selectorLabels" -}} +{{ include "calink.selectorLabels" . }} +app.kubernetes.io/component: backend +{{- end }} + +{{/* +Frontend labels +*/}} +{{- define "calink.frontend.labels" -}} +{{ include "calink.labels" . }} +app.kubernetes.io/component: frontend +{{- end }} + +{{/* +Frontend selector labels +*/}} +{{- define "calink.frontend.selectorLabels" -}} +{{ include "calink.selectorLabels" . }} +app.kubernetes.io/component: frontend +{{- end }} diff --git a/charts/calink-chart/templates/deployment-backend.yaml b/charts/calink-chart/templates/deployment-backend.yaml new file mode 100644 index 0000000..ef967eb --- /dev/null +++ b/charts/calink-chart/templates/deployment-backend.yaml @@ -0,0 +1,59 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "calink.fullname" . }}-backend + labels: + {{- include "calink.backend.labels" . | nindent 4 }} + {{- with .Values.commonAnnotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.backend.replicas }} + selector: + matchLabels: + {{- include "calink.backend.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "calink.backend.selectorLabels" . | nindent 8 }} + {{- with .Values.commonAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + containers: + - name: backend + image: "{{ .Values.backend.image.repository }}:{{ .Values.backend.image.tag }}" + imagePullPolicy: {{ .Values.backend.image.pullPolicy }} + ports: + - name: http + containerPort: 8000 + protocol: TCP + env: + {{- toYaml .Values.backend.env | nindent 12 }} + {{- if .Values.backend.persistence.enabled }} + volumeMounts: + - name: data + mountPath: {{ .Values.backend.persistence.mountPath }} + {{- end }} + livenessProbe: + httpGet: + path: {{ .Values.backend.healthCheck.path }} + port: http + initialDelaySeconds: {{ .Values.backend.healthCheck.initialDelaySeconds }} + periodSeconds: {{ .Values.backend.healthCheck.periodSeconds }} + readinessProbe: + httpGet: + path: {{ .Values.backend.healthCheck.path }} + port: http + initialDelaySeconds: {{ .Values.backend.healthCheck.initialDelaySeconds }} + periodSeconds: {{ .Values.backend.healthCheck.periodSeconds }} + resources: + {{- toYaml .Values.backend.resources | nindent 12 }} + {{- if .Values.backend.persistence.enabled }} + volumes: + - name: data + persistentVolumeClaim: + claimName: {{ include "calink.fullname" . }}-backend-data + {{- end }} diff --git a/charts/calink-chart/templates/deployment-frontend.yaml b/charts/calink-chart/templates/deployment-frontend.yaml new file mode 100644 index 0000000..af96fe3 --- /dev/null +++ b/charts/calink-chart/templates/deployment-frontend.yaml @@ -0,0 +1,46 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "calink.fullname" . }}-frontend + labels: + {{- include "calink.frontend.labels" . | nindent 4 }} + {{- with .Values.commonAnnotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.frontend.replicas }} + selector: + matchLabels: + {{- include "calink.frontend.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "calink.frontend.selectorLabels" . | nindent 8 }} + {{- with .Values.commonAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + containers: + - name: frontend + image: "{{ .Values.frontend.image.repository }}:{{ .Values.frontend.image.tag }}" + imagePullPolicy: {{ .Values.frontend.image.pullPolicy }} + ports: + - name: http + containerPort: 80 + protocol: TCP + livenessProbe: + httpGet: + path: {{ .Values.frontend.healthCheck.path }} + port: http + initialDelaySeconds: {{ .Values.frontend.healthCheck.initialDelaySeconds }} + periodSeconds: {{ .Values.frontend.healthCheck.periodSeconds }} + readinessProbe: + httpGet: + path: {{ .Values.frontend.healthCheck.path }} + port: http + initialDelaySeconds: {{ .Values.frontend.healthCheck.initialDelaySeconds }} + periodSeconds: {{ .Values.frontend.healthCheck.periodSeconds }} + resources: + {{- toYaml .Values.frontend.resources | nindent 12 }} diff --git a/charts/calink-chart/templates/ingress.yaml b/charts/calink-chart/templates/ingress.yaml new file mode 100644 index 0000000..29ab8d3 --- /dev/null +++ b/charts/calink-chart/templates/ingress.yaml @@ -0,0 +1,93 @@ +{{- if .Values.frontend.ingress.enabled }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ include "calink.fullname" . }}-frontend + labels: + {{- include "calink.labels" . | nindent 4 }} + component: frontend + {{- with .Values.frontend.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.commonAnnotations }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if .Values.frontend.ingress.className }} + ingressClassName: {{ .Values.frontend.ingress.className }} + {{- end }} + rules: + {{- range .Values.frontend.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + pathType: {{ .pathType }} + backend: + service: + name: {{ include "calink.fullname" $ }}-frontend + port: + number: {{ $.Values.frontend.service.port }} + {{- end }} + {{- end }} + {{- if .Values.frontend.ingress.tls }} + tls: + {{- range .Values.frontend.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} +{{- end }} + +--- + +{{- if .Values.backend.ingress.enabled }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ include "calink.fullname" . }}-backend + labels: + {{- include "calink.labels" . | nindent 4 }} + component: backend + {{- with .Values.backend.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- with .Values.commonAnnotations }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if .Values.backend.ingress.className }} + ingressClassName: {{ .Values.backend.ingress.className }} + {{- end }} + rules: + {{- range .Values.backend.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + pathType: {{ .pathType }} + backend: + service: + name: {{ include "calink.fullname" $ }}-backend + port: + number: {{ $.Values.backend.service.port }} + {{- end }} + {{- end }} + {{- if .Values.backend.ingress.tls }} + tls: + {{- range .Values.backend.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} +{{- end }} diff --git a/charts/calink-chart/templates/pvc.yaml b/charts/calink-chart/templates/pvc.yaml new file mode 100644 index 0000000..3844968 --- /dev/null +++ b/charts/calink-chart/templates/pvc.yaml @@ -0,0 +1,21 @@ +{{- if .Values.backend.persistence.enabled }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: {{ include "calink.fullname" . }}-backend-data + labels: + {{- include "calink.backend.labels" . | nindent 4 }} + {{- with .Values.commonAnnotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + accessModes: + - ReadWriteOnce + {{- if .Values.backend.persistence.storageClass }} + storageClassName: {{ .Values.backend.persistence.storageClass }} + {{- end }} + resources: + requests: + storage: {{ .Values.backend.persistence.size }} +{{- end }} diff --git a/charts/calink-chart/templates/service-backend.yaml b/charts/calink-chart/templates/service-backend.yaml new file mode 100644 index 0000000..70c0480 --- /dev/null +++ b/charts/calink-chart/templates/service-backend.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "calink.fullname" . }}-backend + labels: + {{- include "calink.backend.labels" . | nindent 4 }} + {{- with .Values.commonAnnotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.backend.service.type }} + ports: + - port: {{ .Values.backend.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "calink.backend.selectorLabels" . | nindent 4 }} diff --git a/charts/calink-chart/templates/service-frontend.yaml b/charts/calink-chart/templates/service-frontend.yaml new file mode 100644 index 0000000..eba6b45 --- /dev/null +++ b/charts/calink-chart/templates/service-frontend.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "calink.fullname" . }}-frontend + labels: + {{- include "calink.frontend.labels" . | nindent 4 }} + {{- with .Values.commonAnnotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.frontend.service.type }} + ports: + - port: {{ .Values.frontend.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "calink.frontend.selectorLabels" . | nindent 4 }} diff --git a/charts/calink-chart/values.yaml b/charts/calink-chart/values.yaml new file mode 100644 index 0000000..e77f3b3 --- /dev/null +++ b/charts/calink-chart/values.yaml @@ -0,0 +1,99 @@ +nameOverride: "" +fullnameOverride: "" + +commonLabels: {} +commonAnnotations: {} + +backend: + image: + repository: calink-backend + tag: latest + pullPolicy: IfNotPresent + + replicas: 1 + + resources: + limits: + cpu: 500m + memory: 512Mi + requests: + cpu: 250m + memory: 256Mi + + env: + - name: DATABASE_PATH + value: "/data/app.db" + + persistence: + enabled: true + storageClass: "" + size: 1Gi + mountPath: /data + + service: + type: ClusterIP + port: 8000 + + healthCheck: + path: /health + initialDelaySeconds: 10 + periodSeconds: 30 + + ingress: + enabled: true + className: "" + annotations: {} + # traefik.ingress.kubernetes.io/router.entrypoints: websecure + # traefik.ingress.kubernetes.io/router.tls: "true" + # cert-manager.io/cluster-issuer: letsencrypt-prod + hosts: + - host: api-calink.example.com + paths: + - path: / + pathType: Prefix + tls: [] + # - secretName: api-calink-tls + # hosts: + # - api-calink.example.com + +frontend: + image: + repository: calink-frontend + tag: latest + pullPolicy: IfNotPresent + + replicas: 1 + + resources: + limits: + cpu: 200m + memory: 256Mi + requests: + cpu: 100m + memory: 128Mi + + service: + type: ClusterIP + port: 80 + + healthCheck: + path: / + initialDelaySeconds: 5 + periodSeconds: 30 + + ingress: + enabled: true + className: "" + annotations: {} + # traefik.ingress.kubernetes.io/router.entrypoints: websecure + # traefik.ingress.kubernetes.io/router.tls: "true" + # cert-manager.io/cluster-issuer: letsencrypt-prod + hosts: + - host: calink.example.com + paths: + - path: / + pathType: Prefix + tls: [] + # - secretName: calink-tls + # hosts: + # - calink.example.com diff --git a/manifests/calink/values.yaml b/manifests/calink/values.yaml new file mode 100644 index 0000000..033f230 --- /dev/null +++ b/manifests/calink/values.yaml @@ -0,0 +1,99 @@ +nameOverride: "" +fullnameOverride: "" + +commonLabels: {} +commonAnnotations: {} + +backend: + image: + repository: harbor.dvirlabs.com/my-apps/calink-backend + tag: latest + pullPolicy: IfNotPresent + + replicas: 1 + + resources: + limits: + cpu: 500m + memory: 512Mi + requests: + cpu: 250m + memory: 256Mi + + env: + - name: DATABASE_PATH + value: "/data/app.db" + + persistence: + enabled: true + storageClass: "nfs-client" + size: 1Gi + mountPath: /data + + service: + type: ClusterIP + port: 8000 + + healthCheck: + path: /health + initialDelaySeconds: 10 + periodSeconds: 30 + + ingress: + enabled: true + className: "traefik" + annotations: + traefik.ingress.kubernetes.io/router.entrypoints: websecure + traefik.ingress.kubernetes.io/router.tls: "true" + cert-manager.io/cluster-issuer: "letsencrypt-prod" + hosts: + - host: api-calink.dvirlabs.com + paths: + - path: / + pathType: Prefix + tls: + - secretName: api-calink-tls + hosts: + - api-calink.dvirlabs.com + +frontend: + image: + repository: harbor.dvirlabs.com/my-apps/calink-frontend + tag: latest + pullPolicy: IfNotPresent + + replicas: 1 + + resources: + limits: + cpu: 200m + memory: 256Mi + requests: + cpu: 100m + memory: 128Mi + + service: + type: ClusterIP + port: 80 + + healthCheck: + path: / + initialDelaySeconds: 5 + periodSeconds: 30 + + ingress: + enabled: true + className: "traefik" + annotations: + traefik.ingress.kubernetes.io/router.entrypoints: websecure + traefik.ingress.kubernetes.io/router.tls: "true" + cert-manager.io/cluster-issuer: "letsencrypt-prod" + hosts: + - host: calink.dvirlabs.com + paths: + - path: / + pathType: Prefix + tls: + - secretName: calink-tls + hosts: + - calink.dvirlabs.com