14 changed files with 547 additions and 0 deletions
@ -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/ |
|||
@ -0,0 +1,9 @@ |
|||
dependencies: |
|||
- name: mariadb |
|||
repository: https://charts.bitnami.com/bitnami |
|||
version: 11.4.0 |
|||
- name: redis |
|||
repository: https://charts.bitnami.com/bitnami |
|||
version: 17.3.11 |
|||
digest: sha256:d0306b0972bff1be59a35b88d107c2ae12984ef2a8715ad8d561f0f40b23114c |
|||
generated: "2022-11-29T11:06:02.773563459-03:00" |
|||
@ -0,0 +1,18 @@ |
|||
apiVersion: v2 |
|||
name: snappymail |
|||
description: Snappymail is a lightweight fork of Rainloop Webmail. |
|||
|
|||
type: application |
|||
|
|||
# Versions are expected to follow Semantic Versioning (https://semver.org/) |
|||
version: 0.2.0 |
|||
|
|||
appVersion: "2.38.2" |
|||
|
|||
dependencies: |
|||
- name: mariadb |
|||
version: 11.4.0 |
|||
repository: https://charts.bitnami.com/bitnami |
|||
- name: redis |
|||
version: 17.3.11 |
|||
repository: https://charts.bitnami.com/bitnami |
|||
@ -0,0 +1,75 @@ |
|||
# Snappy Mail Helm Chart |
|||
|
|||
This Helm chart installs and manages the Snappy Mail application in Kubernetes. |
|||
|
|||
## Prerequisites |
|||
|
|||
- Kubernetes cluster |
|||
- Helm 3 |
|||
|
|||
## Configuration |
|||
|
|||
The following table lists the configurable parameters for this chart and their default values. |
|||
|
|||
| Parameter | Description | Default | |
|||
| --------------------------------- | ---------------------------------------- | ---------------------------- | |
|||
| replicaCount | Number of replicas to run | `1` | |
|||
| image.repository | Snappy Mail image repository | `porto.interlegis.leg.br/library/docker-snappymail-il` | |
|||
| image.pullPolicy | Snappy Mail image pull policy | `IfNotPresent` | |
|||
| image.tag | Snappy Mail image tag | `""` | |
|||
| imagePullSecrets | Image pull secrets for private repos | `[]` | |
|||
| nameOverride | Override the name of the chart | `""` | |
|||
| fullnameOverride | Override the full name of the chart | `""` | |
|||
| podAnnotations | Annotations to add to the pod | `{}` | |
|||
| podSecurityContext | Security context for the pod | `{}` | |
|||
| securityContext | Security context for the container | `{}` | |
|||
| service.type | Type of service | `ClusterIP` | |
|||
| service.port | Port for the service | `80` | |
|||
| snappymail.uploadMaxSize | Maximum size of uploaded files | `25M` | |
|||
| snappymail.memoryLimit | Memory limit for Snappy Mail | `128M` | |
|||
| snappymail.secureCookies | Option to turn on secure cookies | `true` | |
|||
| snappymail.logToStderr | Option to log to stderr | `true` | |
|||
| ingress.enabled | Option to enable ingress | `false` | |
|||
| ingress.className | The ingress class for the service | `""` | |
|||
| ingress.annotations | Annotations for the ingress | `{}` | |
|||
| ingress.hosts[0].host | Host for ingress | `chart-example.local` | |
|||
| ingress.hosts[0].paths[0].path | Path for ingress | `/` | |
|||
| ingress.hosts[0].paths[0].pathType | Path type for ingress | `ImplementationSpecific` | |
|||
| ingress.tls | TLS settings for ingress | `[]` | |
|||
| resources.limits.cpu | CPU limit for resources | `1500m` | |
|||
| resources.limits.memory | Memory limit for resources | `1500Mi` | |
|||
| resources.requests.cpu | CPU request for resources | `500m` | |
|||
| resources.requests.memory | Memory request for resources | `700Mi` | |
|||
| autoscaling.enabled | Option to enable horizontal pod autoscaler | `false` | |
|||
| autoscaling.minReplicas | Minimum number of replicas | `2` | |
|||
| autoscaling.maxReplicas | Maximum number of replicas | `10` | |
|||
| autoscaling.targetCPUUtilizationPercentage | Target CPU utilization percentage | `70` | |
|||
| nodeSelector | Node labels for pod assignment | `{}` | |
|||
| tolerations | Toleration labels for pod assignment | `[]` | |
|||
| persistence.accessMode | Access mode for storage | `ReadWriteMany` | |
|||
| persistence.size | Size of the storage | `8Gi` | |
|||
| persistence.storageClass | Storage class | `""` | |
|||
| mariadb.auth.rootPassword | Root password for MariaDB | `changeme` | |
|||
| mariadb.auth.database | Database for MariaDB | `snappymail` | |
|||
| mariadb.auth.username | Username for MariaDB | `snappymail` | |
|||
| mariadb.auth.password | Password for MariaDB | `changeme` | |
|||
| mariadb.architecture | MariaDB architecture | `standalone` | |
|||
| mariadb.primary.resources.limits.cpu | CPU limit for primary container | `1500m` | |
|||
| mariadb.primary.resources.limits.memory | Memory limit for primary container | `768Mi` | |
|||
| mariadb.primary.resources.requests.cpu | CPU request for primary container | `500m` | |
|||
| mariadb.primary.resources.requests.memory | Memory request for primary container | `256Mi` | |
|||
| redis.architecture | Redis architecture | `standalone` | |
|||
| redis.auth.enabled | Option to enable authentication for Redis | `false` | |
|||
| redis.master.persistence.enabled | Option to enable persistence for Redis | `true` | |
|||
| redis.master.persistence.size | Size of the storage for Redis | `8Gi` | |
|||
| redis.master.persistence.storageClass | Storage class for Redis | `""` | |
|||
|
|||
Specify each parameter using the `--set key=value[,key=value]` argument to `helm install` or provide a values.yaml file in the command like `-f values.yaml`. |
|||
|
|||
## Uninstall |
|||
|
|||
To uninstall the chart, run: |
|||
|
|||
``` |
|||
helm delete snappymail |
|||
``` |
|||
Binary file not shown.
Binary file not shown.
@ -0,0 +1,22 @@ |
|||
1. Get the application URL by running these commands: |
|||
{{- if .Values.ingress.enabled }} |
|||
{{- range $host := .Values.ingress.hosts }} |
|||
{{- range .paths }} |
|||
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} |
|||
{{- end }} |
|||
{{- end }} |
|||
{{- else if contains "NodePort" .Values.service.type }} |
|||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "snappymail.fullname" . }}) |
|||
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") |
|||
echo http://$NODE_IP:$NODE_PORT |
|||
{{- else if contains "LoadBalancer" .Values.service.type }} |
|||
NOTE: It may take a few minutes for the LoadBalancer IP to be available. |
|||
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "snappymail.fullname" . }}' |
|||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "snappymail.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") |
|||
echo http://$SERVICE_IP:{{ .Values.service.port }} |
|||
{{- else if contains "ClusterIP" .Values.service.type }} |
|||
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "snappymail.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") |
|||
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") |
|||
echo "Visit http://127.0.0.1:8080 to use your application" |
|||
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT |
|||
{{- end }} |
|||
@ -0,0 +1,62 @@ |
|||
{{/* |
|||
Expand the name of the chart. |
|||
*/}} |
|||
{{- define "snappymail.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 "snappymail.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 "snappymail.chart" -}} |
|||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} |
|||
{{- end }} |
|||
|
|||
{{/* |
|||
Common labels |
|||
*/}} |
|||
{{- define "snappymail.labels" -}} |
|||
helm.sh/chart: {{ include "snappymail.chart" . }} |
|||
{{ include "snappymail.selectorLabels" . }} |
|||
{{- if .Chart.AppVersion }} |
|||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} |
|||
{{- end }} |
|||
app.kubernetes.io/managed-by: {{ .Release.Service }} |
|||
{{- end }} |
|||
|
|||
{{/* |
|||
Selector labels |
|||
*/}} |
|||
{{- define "snappymail.selectorLabels" -}} |
|||
app.kubernetes.io/name: {{ include "snappymail.name" . }} |
|||
app.kubernetes.io/instance: {{ .Release.Name }} |
|||
{{- end }} |
|||
|
|||
{{/* |
|||
Create the name of the service account to use |
|||
*/}} |
|||
{{- define "snappymail.serviceAccountName" -}} |
|||
{{- if .Values.serviceAccount.create }} |
|||
{{- default (include "snappymail.fullname" .) .Values.serviceAccount.name }} |
|||
{{- else }} |
|||
{{- default "default" .Values.serviceAccount.name }} |
|||
{{- end }} |
|||
{{- end }} |
|||
@ -0,0 +1,109 @@ |
|||
apiVersion: apps/v1 |
|||
kind: Deployment |
|||
metadata: |
|||
name: {{ include "snappymail.fullname" . }} |
|||
labels: |
|||
{{- include "snappymail.labels" . | nindent 4 }} |
|||
spec: |
|||
{{- if not .Values.autoscaling.enabled }} |
|||
replicas: {{ .Values.replicaCount }} |
|||
{{- end }} |
|||
selector: |
|||
matchLabels: |
|||
{{- include "snappymail.selectorLabels" . | nindent 6 }} |
|||
strategy: |
|||
type: Recreate |
|||
template: |
|||
metadata: |
|||
{{- with .Values.podAnnotations }} |
|||
annotations: |
|||
{{- toYaml . | nindent 8 }} |
|||
{{- end }} |
|||
labels: |
|||
{{- include "snappymail.selectorLabels" . | nindent 8 }} |
|||
spec: |
|||
{{- with .Values.imagePullSecrets }} |
|||
imagePullSecrets: |
|||
{{- toYaml . | nindent 8 }} |
|||
{{- end }} |
|||
securityContext: |
|||
{{- toYaml .Values.podSecurityContext | nindent 8 }} |
|||
initContainers: |
|||
- name: fix-volume-permissions |
|||
image: alpine:latest |
|||
command: ["sh", "-c", "chown -R 82:82 /snappymail/data"] |
|||
securityContext: |
|||
runAsUser: 0 # Força a execução como root temporariamente |
|||
volumeMounts: |
|||
- name: snappymaildata |
|||
mountPath: /snappymail/data |
|||
containers: |
|||
- name: {{ .Chart.Name }} |
|||
securityContext: |
|||
{{- toYaml .Values.securityContext | nindent 12 }} |
|||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" |
|||
imagePullPolicy: {{ .Values.image.pullPolicy }} |
|||
env: |
|||
- name: UPLOAD_MAX_SIZE |
|||
value: {{ .Values.snappymail.uploadMaxSize | quote }} |
|||
- name: LOG_TO_STDERR |
|||
value: {{ .Values.snappymail.logToStderr | quote }} |
|||
- name: MEMORY_LIMIT |
|||
value: {{ .Values.snappymail.memoryLimit | quote }} |
|||
- name: SECURE_COOKIES |
|||
value: {{ .Values.snappymail.secureCookies | quote }} |
|||
volumeMounts: |
|||
- mountPath: /snappymail/data |
|||
name: snappymaildata |
|||
ports: |
|||
- name: http |
|||
containerPort: 8888 |
|||
protocol: TCP |
|||
livenessProbe: |
|||
httpGet: |
|||
path: / |
|||
port: http |
|||
initialDelaySeconds: 60 |
|||
periodSeconds: 5 |
|||
successThreshold: 1 |
|||
failureThreshold: 3 |
|||
timeoutSeconds: 2 |
|||
readinessProbe: |
|||
httpGet: |
|||
path: / |
|||
port: http |
|||
initialDelaySeconds: 60 |
|||
periodSeconds: 5 |
|||
successThreshold: 2 |
|||
failureThreshold: 3 |
|||
timeoutSeconds: 2 |
|||
resources: |
|||
{{- toYaml .Values.resources | nindent 12 }} |
|||
{{- with .Values.nodeSelector }} |
|||
nodeSelector: |
|||
{{- toYaml . | nindent 8 }} |
|||
{{- end }} |
|||
affinity: |
|||
podAntiAffinity: |
|||
preferredDuringSchedulingIgnoredDuringExecution: |
|||
- weight: 100 |
|||
podAffinityTerm: |
|||
labelSelector: |
|||
matchExpressions: |
|||
- key: app.kubernetes.io/name |
|||
operator: In |
|||
values: |
|||
- {{ include "snappymail.name" . }} |
|||
- key: app.kubernetes.io/instance |
|||
operator: In |
|||
values: |
|||
- {{ .Release.Name }} |
|||
topologyKey: "kubernetes.io/hostname" |
|||
{{- with .Values.tolerations }} |
|||
tolerations: |
|||
{{- toYaml . | nindent 8 }} |
|||
{{- end }} |
|||
volumes: |
|||
- name: snappymaildata |
|||
persistentVolumeClaim: |
|||
claimName: {{ include "snappymail.fullname" . }}-data |
|||
@ -0,0 +1,28 @@ |
|||
{{- if .Values.autoscaling.enabled }} |
|||
apiVersion: autoscaling/v2beta1 |
|||
kind: HorizontalPodAutoscaler |
|||
metadata: |
|||
name: {{ include "snappymail.fullname" . }} |
|||
labels: |
|||
{{- include "snappymail.labels" . | nindent 4 }} |
|||
spec: |
|||
scaleTargetRef: |
|||
apiVersion: apps/v1 |
|||
kind: Deployment |
|||
name: {{ include "snappymail.fullname" . }} |
|||
minReplicas: {{ .Values.autoscaling.minReplicas }} |
|||
maxReplicas: {{ .Values.autoscaling.maxReplicas }} |
|||
metrics: |
|||
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }} |
|||
- type: Resource |
|||
resource: |
|||
name: cpu |
|||
targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} |
|||
{{- end }} |
|||
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} |
|||
- type: Resource |
|||
resource: |
|||
name: memory |
|||
targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} |
|||
{{- end }} |
|||
{{- end }} |
|||
@ -0,0 +1,61 @@ |
|||
{{- if .Values.ingress.enabled -}} |
|||
{{- $fullName := include "snappymail.fullname" . -}} |
|||
{{- $svcPort := .Values.service.port -}} |
|||
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} |
|||
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} |
|||
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} |
|||
{{- end }} |
|||
{{- end }} |
|||
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} |
|||
apiVersion: networking.k8s.io/v1 |
|||
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} |
|||
apiVersion: networking.k8s.io/v1beta1 |
|||
{{- else -}} |
|||
apiVersion: extensions/v1beta1 |
|||
{{- end }} |
|||
kind: Ingress |
|||
metadata: |
|||
name: {{ $fullName }} |
|||
labels: |
|||
{{- include "snappymail.labels" . | nindent 4 }} |
|||
{{- with .Values.ingress.annotations }} |
|||
annotations: |
|||
{{- toYaml . | nindent 4 }} |
|||
{{- end }} |
|||
spec: |
|||
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} |
|||
ingressClassName: {{ .Values.ingress.className }} |
|||
{{- end }} |
|||
{{- if .Values.ingress.tls }} |
|||
tls: |
|||
{{- range .Values.ingress.tls }} |
|||
- hosts: |
|||
{{- range .hosts }} |
|||
- {{ . | quote }} |
|||
{{- end }} |
|||
secretName: {{ .secretName }} |
|||
{{- end }} |
|||
{{- end }} |
|||
rules: |
|||
{{- range .Values.ingress.hosts }} |
|||
- host: {{ .host | quote }} |
|||
http: |
|||
paths: |
|||
{{- range .paths }} |
|||
- path: {{ .path }} |
|||
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} |
|||
pathType: {{ .pathType }} |
|||
{{- end }} |
|||
backend: |
|||
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} |
|||
service: |
|||
name: {{ $fullName }} |
|||
port: |
|||
number: {{ $svcPort }} |
|||
{{- else }} |
|||
serviceName: {{ $fullName }} |
|||
servicePort: {{ $svcPort }} |
|||
{{- end }} |
|||
{{- end }} |
|||
{{- end }} |
|||
{{- end }} |
|||
@ -0,0 +1,19 @@ |
|||
apiVersion: v1 |
|||
kind: PersistentVolumeClaim |
|||
metadata: |
|||
name: {{ include "snappymail.fullname" . }}-data |
|||
labels: |
|||
{{- include "snappymail.labels" . | nindent 4 }} |
|||
spec: |
|||
accessModes: |
|||
- {{ .Values.persistence.accessMode }} |
|||
resources: |
|||
requests: |
|||
storage: {{ .Values.persistence.size }} |
|||
{{- if .Values.persistence.storageClass }} |
|||
{{- if (eq "-" .Values.persistence.storageClass) }} |
|||
storageClassName: "" |
|||
{{- else }} |
|||
storageClassName: "{{ .Values.persistence.storageClass }}" |
|||
{{- end }} |
|||
{{- end }} |
|||
@ -0,0 +1,15 @@ |
|||
apiVersion: v1 |
|||
kind: Service |
|||
metadata: |
|||
name: {{ include "snappymail.fullname" . }} |
|||
labels: |
|||
{{- include "snappymail.labels" . | nindent 4 }} |
|||
spec: |
|||
type: {{ .Values.service.type }} |
|||
ports: |
|||
- port: {{ .Values.service.port }} |
|||
targetPort: http |
|||
protocol: TCP |
|||
name: http |
|||
selector: |
|||
{{- include "snappymail.selectorLabels" . | nindent 4 }} |
|||
@ -0,0 +1,106 @@ |
|||
# Default values for snappymail. |
|||
|
|||
replicaCount: 1 |
|||
|
|||
image: |
|||
repository: porto.interlegis.leg.br/library/docker-snappymail-il |
|||
pullPolicy: IfNotPresent |
|||
# Overrides the image tag whose default is the chart appVersion. |
|||
tag: "" |
|||
|
|||
imagePullSecrets: [] |
|||
nameOverride: "" |
|||
fullnameOverride: "" |
|||
|
|||
podAnnotations: {} |
|||
|
|||
podSecurityContext: {} |
|||
# fsGroup: 2000 |
|||
|
|||
securityContext: {} |
|||
# capabilities: |
|||
# drop: |
|||
# - ALL |
|||
# readOnlyRootFilesystem: true |
|||
# runAsNonRoot: true |
|||
# runAsUser: 1000 |
|||
|
|||
service: |
|||
type: ClusterIP |
|||
port: 80 |
|||
|
|||
snappymail: |
|||
uploadMaxSize: 25M |
|||
memoryLimit: 128M |
|||
secureCookies: true |
|||
logToStderr: true |
|||
|
|||
ingress: |
|||
enabled: false |
|||
className: "" |
|||
annotations: {} |
|||
# kubernetes.io/ingress.class: nginx |
|||
# kubernetes.io/tls-acme: "true" |
|||
hosts: |
|||
- host: chart-example.local |
|||
paths: |
|||
- path: / |
|||
pathType: ImplementationSpecific |
|||
tls: [] |
|||
# - secretName: chart-example-tls |
|||
# hosts: |
|||
# - chart-example.local |
|||
|
|||
resources: |
|||
limits: |
|||
cpu: 1500m |
|||
memory: 1500Mi |
|||
requests: |
|||
cpu: 500m |
|||
memory: 700Mi |
|||
|
|||
autoscaling: |
|||
enabled: false |
|||
minReplicas: 2 |
|||
maxReplicas: 10 |
|||
targetCPUUtilizationPercentage: 70 |
|||
# targetMemoryUtilizationPercentage: 80 |
|||
|
|||
nodeSelector: {} |
|||
|
|||
tolerations: [] |
|||
|
|||
persistence: |
|||
accessMode: ReadWriteMany |
|||
size: 8Gi |
|||
storageClass: "" |
|||
|
|||
|
|||
|
|||
# MariaDB configuration for storing contact information |
|||
mariadb: |
|||
auth: |
|||
rootPassword: changeme |
|||
database: snappymail |
|||
username: snappymail |
|||
password: changeme |
|||
architecture: standalone |
|||
primary: |
|||
resources: |
|||
limits: |
|||
cpu: 1500m |
|||
memory: 768Mi |
|||
requests: |
|||
cpu: 500m |
|||
memory: 256Mi |
|||
|
|||
# Redis configuration for caching |
|||
redis: |
|||
architecture: standalone |
|||
auth: |
|||
enabled: false |
|||
master: |
|||
persistence: |
|||
enabled: true |
|||
size: 8Gi |
|||
storageClass: "" |
|||
Loading…
Reference in new issue