diff --git a/mollysocket/.helmignore b/mollysocket/.helmignore
new file mode 100644
index 0000000..0e8a0eb
--- /dev/null
+++ b/mollysocket/.helmignore
@@ -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/
diff --git a/mollysocket/Chart.yaml b/mollysocket/Chart.yaml
new file mode 100644
index 0000000..0b7d6d2
--- /dev/null
+++ b/mollysocket/Chart.yaml
@@ -0,0 +1,24 @@
+apiVersion: v2
+name: mollysocket
+description: Deploy mollysocket into kubernetes
+icon: "https://avatars.githubusercontent.com/u/58849401?s=200&v=4"
+type: application
+version: "0.1.0"
+# renovate: image=ghcr.io/mollyim/mollysocket
+appVersion: "1.6.0"
+
+home: "https://molly.im/"
+sources:
+ - "https://github.com/mollyim/mollyim-android"
+ - "https://github.com/mollyim/mollysocket"
+
+maintainers:
+ - name: WrenIX
+ url: https://wrenix.eu
+
+keywords:
+ - "unifiedpush"
+ - "mollysocket"
+ - "molly"
+ - "messenger"
+ - "signal"
diff --git a/mollysocket/README.md b/mollysocket/README.md
new file mode 100644
index 0000000..51daa47
--- /dev/null
+++ b/mollysocket/README.md
@@ -0,0 +1,106 @@
+---
+title: "mollysocket"
+
+description: "Deploy mollysocket into kubernetes"
+
+---
+
+# mollysocket
+
+  
+
+Deploy mollysocket into kubernetes
+
+**Homepage:**
+
+## Maintainers
+
+| Name | Email | Url |
+| ---- | ------ | --- |
+| WrenIX | | |
+
+## Source Code
+
+*
+*
+
+## Usage
+
+Helm must be installed and setup to your kubernetes cluster to use the charts.
+Refer to Helm's [documentation](https://helm.sh/docs) to get started.
+Once Helm has been set up correctly, fetch the charts as follows:
+
+```bash
+helm pull oci://codeberg.org/wrenix/helm-charts/mollysocket
+```
+
+You can install a chart release using the following command:
+
+```bash
+helm install mollysocket-release oci://codeberg.org/wrenix/helm-charts/mollysocket --values values.yaml
+```
+
+To uninstall a chart release use `helm`'s delete command:
+
+```bash
+helm uninstall mollysocket-release
+```
+
+## Values
+
+| Key | Type | Default | Description |
+|-----|------|---------|-------------|
+| affinity | object | `{}` | |
+| autoscaling.enabled | bool | `false` | |
+| autoscaling.maxReplicas | int | `100` | |
+| autoscaling.minReplicas | int | `1` | |
+| autoscaling.targetCPUUtilizationPercentage | int | `80` | |
+| fullnameOverride | string | `""` | |
+| global.image.pullPolicy | string | `nil` | if set it will overwrite all pullPolicy |
+| global.image.registry | string | `nil` | if set it will overwrite all registry entries |
+| grafana.dashboards.annotations | object | `{}` | |
+| grafana.dashboards.enabled | bool | `false` | |
+| grafana.dashboards.labels.grafana_dashboard | string | `"1"` | |
+| image.pullPolicy | string | `"IfNotPresent"` | This sets the pull policy for images. (could be overwritten by global.image.pullPolicy) |
+| image.registry | string | `"ghcr.io"` | image registry (could be overwritten by global.image.registry) |
+| image.repository | string | `"mollyim/mollysocket"` | image repository |
+| image.tag | string | `""` | image tag - Overrides the image tag whose default is the chart appVersion. |
+| imagePullSecrets | list | `[]` | |
+| ingress.annotations | object | `{}` | |
+| ingress.className | string | `""` | |
+| ingress.enabled | bool | `false` | |
+| ingress.hosts[0].host | string | `"chart-example.local"` | |
+| ingress.hosts[0].paths[0].path | string | `"/"` | |
+| ingress.hosts[0].paths[0].pathType | string | `"ImplementationSpecific"` | |
+| ingress.tls | list | `[]` | |
+| kubectl.image | object | `{"pullPolicy":"IfNotPresent","registry":"docker.io","repository":"bitnami/kubectl","tag":"1.32.3"}` | image needed for setup (store generated VAPID / WebPush keys) |
+| mollysocket.allowedEnpoints[0] | string | `"*"` | |
+| mollysocket.allowedUUIDs[0] | string | `"*"` | |
+| mollysocket.environment | string | `"Prod"` | |
+| mollysocket.log | string | `"info"` | |
+| mollysocket.vapidKey.create | bool | `true` | generate a vapid key |
+| mollysocket.vapidKey.key | string | `""` | use own vapid key |
+| nameOverride | string | `""` | |
+| nodeSelector | object | `{}` | |
+| persistence.accessMode | string | `"ReadWriteOnce"` | |
+| persistence.annotations | object | `{}` | |
+| persistence.enabled | bool | `true` | |
+| persistence.size | string | `"1Gi"` | |
+| podAnnotations | object | `{}` | |
+| podSecurityContext | object | `{}` | |
+| prometheus.rules.additionalRules | list | `[]` | |
+| prometheus.rules.enabled | bool | `false` | |
+| prometheus.rules.labels | object | `{}` | |
+| prometheus.servicemonitor.enabled | bool | `false` | |
+| prometheus.servicemonitor.labels | object | `{}` | |
+| replicaCount | int | `1` | replicas |
+| resources | object | `{}` | |
+| securityContext | object | `{}` | |
+| service.port | int | `80` | |
+| service.type | string | `"ClusterIP"` | |
+| serviceAccount.annotations | object | `{}` | |
+| serviceAccount.create | bool | `true` | |
+| serviceAccount.name | string | `""` | |
+| tolerations | list | `[]` | |
+
+Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs)
diff --git a/mollysocket/_docs.gotmpl b/mollysocket/_docs.gotmpl
new file mode 100644
index 0000000..e69de29
diff --git a/mollysocket/grafana_dashboards/mollysocket-default.json b/mollysocket/grafana_dashboards/mollysocket-default.json
new file mode 100644
index 0000000..1586058
--- /dev/null
+++ b/mollysocket/grafana_dashboards/mollysocket-default.json
@@ -0,0 +1,718 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": {
+ "type": "grafana",
+ "uid": "-- Grafana --"
+ },
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "target": {
+ "limit": 100,
+ "matchAny": false,
+ "tags": [],
+ "type": "dashboard"
+ },
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": false,
+ "fiscalYearStartMonth": 0,
+ "graphTooltip": 0,
+ "id": 42,
+ "links": [],
+ "liveNow": false,
+ "panels": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 5,
+ "x": 0,
+ "y": 0
+ },
+ "id": 5,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "sum(mollysocket_connections)",
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Connections",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "continuous-GrYlRd"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 5,
+ "x": 5,
+ "y": 0
+ },
+ "id": 8,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "sum(mollysocket_reconnections)",
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Reconnections",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 7,
+ "x": 10,
+ "y": 0
+ },
+ "id": 9,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "sum(mollysocket_pushs)by(type)",
+ "legendFormat": "{{type}}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Pushes",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 7,
+ "x": 17,
+ "y": 0
+ },
+ "id": 10,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "textMode": "auto"
+ },
+ "pluginVersion": "9.3.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "sum(mollysocket_messages)by(type)",
+ "legendFormat": "{{type}}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Messages",
+ "type": "stat"
+ },
+ {
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 6
+ },
+ "id": 7,
+ "title": "Graph",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 12,
+ "w": 12,
+ "x": 0,
+ "y": 7
+ },
+ "id": 2,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "mollysocket_connections",
+ "hide": false,
+ "legendFormat": "{{ namespace }}/{{ pod }}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Connections",
+ "transparent": true,
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 12,
+ "w": 12,
+ "x": 12,
+ "y": 7
+ },
+ "id": 11,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "irate(mollysocket_reconnections[$__interval])",
+ "hide": false,
+ "legendFormat": "{{ namespace }}/{{ pod }}",
+ "range": true,
+ "refId": "B"
+ }
+ ],
+ "title": "Reconnection (Rate)",
+ "transparent": true,
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 0,
+ "y": 19
+ },
+ "id": 3,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "irate(mollysocket_pushs[$__interval])",
+ "hide": false,
+ "legendFormat": "{{ namespace }}/{{ pod }}/{{ type }}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Push (Rate)",
+ "transparent": true,
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 11,
+ "w": 12,
+ "x": 12,
+ "y": 19
+ },
+ "id": 12,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "irate(mollysocket_messages[$__interval])",
+ "hide": false,
+ "legendFormat": "{{ namespace }}/{{ pod }}/{{ type }}",
+ "range": true,
+ "refId": "B"
+ }
+ ],
+ "title": "Messages (Rate)",
+ "transparent": true,
+ "type": "timeseries"
+ }
+ ],
+ "refresh": "1m",
+ "schemaVersion": 37,
+ "style": "dark",
+ "tags": [
+ "UnifiedPush",
+ "Apps",
+ "Signal",
+ "Molly"
+ ],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "selected": false,
+ "text": "Prometheus",
+ "value": "Prometheus"
+ },
+ "hide": 0,
+ "includeAll": false,
+ "label": "DataSource",
+ "multi": false,
+ "name": "DS_PROMETHEUS",
+ "options": [],
+ "query": "prometheus",
+ "refresh": 1,
+ "regex": "",
+ "skipUrlSync": false,
+ "type": "datasource"
+ }
+ ]
+ },
+ "time": {
+ "from": "now-6h",
+ "to": "now"
+ },
+ "timepicker": {},
+ "timezone": "",
+ "title": "MollySocket",
+ "uid": "mollysocket",
+ "version": 2,
+ "weekStart": ""
+}
diff --git a/mollysocket/templates/NOTES.txt b/mollysocket/templates/NOTES.txt
new file mode 100644
index 0000000..0451aef
--- /dev/null
+++ b/mollysocket/templates/NOTES.txt
@@ -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 "mollysocket.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 "mollysocket.fullname" . }}'
+ export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "mollysocket.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 "mollysocket.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 }}
diff --git a/mollysocket/templates/_helpers.tpl b/mollysocket/templates/_helpers.tpl
new file mode 100644
index 0000000..de18d3c
--- /dev/null
+++ b/mollysocket/templates/_helpers.tpl
@@ -0,0 +1,62 @@
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "mollysocket.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 "mollysocket.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 "mollysocket.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "mollysocket.labels" -}}
+helm.sh/chart: {{ include "mollysocket.chart" . }}
+{{ include "mollysocket.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "mollysocket.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "mollysocket.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "mollysocket.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create }}
+{{- default (include "mollysocket.fullname" .) .Values.serviceAccount.name }}
+{{- else }}
+{{- default "default" .Values.serviceAccount.name }}
+{{- end }}
+{{- end }}
diff --git a/mollysocket/templates/configmap.yaml b/mollysocket/templates/configmap.yaml
new file mode 100644
index 0000000..c8b00e6
--- /dev/null
+++ b/mollysocket/templates/configmap.yaml
@@ -0,0 +1,14 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ include "mollysocket.fullname" . }}
+ labels:
+ {{- include "mollysocket.labels" . | nindent 4 }}
+ annotations:
+ configmap-hash: {{ .Values.mollysocket | toYaml | sha256sum }}
+data:
+ molly.toml: |-
+ environment = "{{ .Values.mollysocket.environment }}"
+ allowed_uuids = {{ .Values.mollysocket.allowedUUIDs | toJson }}
+ allowed_endpoints = {{ .Values.mollysocket.allowedEnpoints | toJson }}
+ db = "/database/molly.sqlite"
diff --git a/mollysocket/templates/configmap_grafana_dashboards.yaml b/mollysocket/templates/configmap_grafana_dashboards.yaml
new file mode 100644
index 0000000..f887560
--- /dev/null
+++ b/mollysocket/templates/configmap_grafana_dashboards.yaml
@@ -0,0 +1,18 @@
+{{- if .Values.grafana.dashboards.enabled }}
+{{- range $path, $bytes := .Files.Glob "grafana_dashboards/*.json" }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ include "mollysocket.fullname" $ }}-grafana-dashboards-{{ base $path }}
+ labels:
+ {{- include "mollysocket.labels" $ | nindent 4 }}
+ {{- with $.Values.grafana.dashboards.labels }}
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+ annotations:
+ {{- toYaml $.Values.grafana.dashboards.annotations | nindent 4 }}
+data:
+ {{- ($.Files.Glob $path ).AsConfig | nindent 2 }}
+{{- end }}
+{{- end }}
diff --git a/mollysocket/templates/deployment.yaml b/mollysocket/templates/deployment.yaml
new file mode 100644
index 0000000..c9c1b30
--- /dev/null
+++ b/mollysocket/templates/deployment.yaml
@@ -0,0 +1,99 @@
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ include "mollysocket.fullname" . }}
+ labels:
+ {{- include "mollysocket.labels" . | nindent 4 }}
+spec:
+ {{- if not .Values.autoscaling.enabled }}
+ replicas: {{ .Values.replicaCount }}
+ {{- end }}
+ selector:
+ matchLabels:
+ {{- include "mollysocket.selectorLabels" . | nindent 6 }}
+ template:
+ metadata:
+ annotations:
+ configmap-hash: {{ .Values.mollysocket | toYaml | sha256sum }}
+ {{- with .Values.podAnnotations }}
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ labels:
+ {{- include "mollysocket.selectorLabels" . | nindent 8 }}
+ spec:
+ {{- with .Values.imagePullSecrets }}
+ imagePullSecrets:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ serviceAccountName: {{ include "mollysocket.serviceAccountName" . }}
+ securityContext:
+ {{- toYaml .Values.podSecurityContext | nindent 8 }}
+ containers:
+ - name: {{ .Chart.Name }}
+ securityContext:
+ {{- toYaml .Values.securityContext | nindent 12 }}
+ {{- with .Values.image }}
+ image: "{{ coalesce $.Values.global.image.registry .registry }}/{{ .repository }}:{{ .tag | default $.Chart.AppVersion }}"
+ imagePullPolicy: {{ coalesce $.Values.global.image.pullPolicy .pullPolicy }}
+ {{- end }}
+ args:
+ - "server"
+ ports:
+ - name: http
+ containerPort: 8020
+ protocol: TCP
+ livenessProbe:
+ httpGet:
+ path: /
+ port: http
+ readinessProbe:
+ httpGet:
+ path: /
+ port: http
+ resources:
+ {{- toYaml .Values.resources | nindent 12 }}
+ env:
+ - name: "RUST_LOG"
+ value: "{{ .Values.mollysocket.log }}"
+ - name: "ROCKET_ADDRESS"
+ value: "0.0.0.0"
+ - name: "ROCKET_PROMETHEUS_NAMESPACE"
+ value: "mollysocket"
+ - name: "MOLLY_VAPID_KEY_FILE"
+ value: "/secret/ms_vapid_key"
+ - name: "MOLLY_CONF"
+ value: "/config/molly.toml"
+ volumeMounts:
+ - mountPath: "/config"
+ name: "config"
+ - mountPath: "/secret"
+ name: "secret"
+ - mountPath: "/database"
+ name: "database"
+ volumes:
+ - name: "config"
+ configMap:
+ name: {{ include "mollysocket.fullname" . }}
+ - name: "secret"
+ secret:
+ secretName: {{ include "mollysocket.fullname" . }}
+ - name: "database"
+ {{- if .Values.persistence.enabled }}
+ persistentVolumeClaim:
+ claimName: {{ if .Values.persistence.existingClaim }}{{ .Values.persistence.existingClaim }}{{- else }}{{ template "mollysocket.fullname" . }}{{- end }}
+ {{- else }}
+ emptyDir: {}
+ {{- end }}
+ {{- with .Values.nodeSelector }}
+ nodeSelector:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ {{- with .Values.affinity }}
+ affinity:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ {{- with .Values.tolerations }}
+ tolerations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
diff --git a/mollysocket/templates/hpa.yaml b/mollysocket/templates/hpa.yaml
new file mode 100644
index 0000000..c6f5713
--- /dev/null
+++ b/mollysocket/templates/hpa.yaml
@@ -0,0 +1,28 @@
+{{- if .Values.autoscaling.enabled }}
+apiVersion: autoscaling/v2beta1
+kind: HorizontalPodAutoscaler
+metadata:
+ name: {{ include "mollysocket.fullname" . }}
+ labels:
+ {{- include "mollysocket.labels" . | nindent 4 }}
+spec:
+ scaleTargetRef:
+ apiVersion: apps/v1
+ kind: Deployment
+ name: {{ include "mollysocket.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 }}
diff --git a/mollysocket/templates/ingress.yaml b/mollysocket/templates/ingress.yaml
new file mode 100644
index 0000000..1423f89
--- /dev/null
+++ b/mollysocket/templates/ingress.yaml
@@ -0,0 +1,61 @@
+{{- if .Values.ingress.enabled -}}
+{{- $fullName := include "mollysocket.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 "mollysocket.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 }}
diff --git a/mollysocket/templates/prometheus-rules.yaml b/mollysocket/templates/prometheus-rules.yaml
new file mode 100644
index 0000000..ce9670d
--- /dev/null
+++ b/mollysocket/templates/prometheus-rules.yaml
@@ -0,0 +1,17 @@
+{{- if and .Values.prometheus.rules.enabled ( .Capabilities.APIVersions.Has "monitoring.coreos.com/v1" ) }}
+apiVersion: monitoring.coreos.com/v1
+kind: PrometheusRule
+metadata:
+ name: {{ include "mollysocket.fullname" . }}
+ labels:
+ {{- include "mollysocket.labels" . | nindent 4 }}
+ {{- with .Values.prometheus.rules.labels }}
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+ groups:
+ {{- if .Values.prometheus.rules.additionalRules }}
+ - name: {{ template "mollysocket.fullname" . }}-Additional
+ rules: {{- toYaml .Values.prometheus.rules.additionalRules | nindent 4 }}
+ {{- end }}
+{{- end }}
diff --git a/mollysocket/templates/pvc.yaml b/mollysocket/templates/pvc.yaml
new file mode 100644
index 0000000..9902d07
--- /dev/null
+++ b/mollysocket/templates/pvc.yaml
@@ -0,0 +1,50 @@
+{{- if and .Values.persistence.enabled ( not .Values.persistence.existingClaim) -}}
+---
+{{- if .Values.persistence.hostPath }}
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: {{ template "mollysocket.fullname" . }}
+ labels:
+ {{- include "mollysocket.labels" . | nindent 4 }}
+ {{- if .Values.persistence.annotations }}
+ annotations:
+ {{ toYaml .Values.persistence.annotations | indent 4 }}
+ {{- end }}
+spec:
+ storageClassName: manual
+ capacity:
+ storage: {{ .Values.persistence.size | quote }}
+ accessModes:
+ - {{ .Values.persistence.accessMode | quote }}
+ hostPath:
+ path: "{{ .Values.persistence.hostPath }}"
+---
+{{- end }}
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+ name: {{ template "mollysocket.fullname" . }}
+ labels:
+ {{- include "mollysocket.labels" . | nindent 4 }}
+ {{- if .Values.persistence.annotations }}
+ annotations:
+ {{ toYaml .Values.persistence.annotations | indent 4 }}
+ {{- end }}
+spec:
+ accessModes:
+ - {{ .Values.persistence.accessMode | quote }}
+ resources:
+ requests:
+ storage: {{ .Values.persistence.size | quote }}
+ {{- if .Values.persistence.storageClass }}
+ {{- if (eq "-" .Values.persistence.storageClass) }}
+ storageClassName: ""
+ {{- else }}
+ storageClassName: "{{ .Values.persistence.storageClass }}"
+ {{- end }}
+ {{- end }}
+ {{- if .Values.persistence.hostPath }}
+ volumeName: {{ template "mollysocket.fullname" . }}
+ {{- end }}
+{{- end -}}
\ No newline at end of file
diff --git a/mollysocket/templates/secret.yaml b/mollysocket/templates/secret.yaml
new file mode 100644
index 0000000..3ca341b
--- /dev/null
+++ b/mollysocket/templates/secret.yaml
@@ -0,0 +1,25 @@
+---
+{{- $fullname := include "mollysocket.fullname" . }}
+{{- $vapidKey := .Values.mollysocket.vapidKey.key }}
+{{- with (lookup "v1" "Secret" .Release.Namespace $fullname) }}
+{{- with get . "data" }}
+{{- $vapidKey = $vapidKey | default (get . "ms_vapid_key" | b64dec) }}
+{{- end }}
+{{- end }}
+
+
+apiVersion: v1
+kind: Secret
+metadata:
+ name: {{ $fullname }}
+ annotations:
+ "helm.sh/hook": pre-install,pre-upgrade
+ helm.sh/resource-policy: keep
+ "helm.sh/hook-weight": "5"
+ "helm.sh/hook-delete-policy": hook-failed
+ labels:
+ {{- include "mollysocket.labels" . | nindent 4 }}
+data:
+ {{- with $vapidKey }}
+ ms_vapid_key: {{ . | b64enc }}
+ {{- end }}
diff --git a/mollysocket/templates/service.yaml b/mollysocket/templates/service.yaml
new file mode 100644
index 0000000..24dc6d1
--- /dev/null
+++ b/mollysocket/templates/service.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ include "mollysocket.fullname" . }}
+ labels:
+ {{- include "mollysocket.labels" . | nindent 4 }}
+spec:
+ type: {{ .Values.service.type }}
+ ports:
+ - port: {{ .Values.service.port }}
+ targetPort: http
+ protocol: TCP
+ name: http
+ selector:
+ {{- include "mollysocket.selectorLabels" . | nindent 4 }}
diff --git a/mollysocket/templates/serviceaccount.yaml b/mollysocket/templates/serviceaccount.yaml
new file mode 100644
index 0000000..4abb43b
--- /dev/null
+++ b/mollysocket/templates/serviceaccount.yaml
@@ -0,0 +1,12 @@
+{{- if .Values.serviceAccount.create -}}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: {{ include "mollysocket.serviceAccountName" . }}
+ labels:
+ {{- include "mollysocket.labels" . | nindent 4 }}
+ {{- with .Values.serviceAccount.annotations }}
+ annotations:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+{{- end }}
diff --git a/mollysocket/templates/servicemonitor.yaml b/mollysocket/templates/servicemonitor.yaml
new file mode 100644
index 0000000..8e21a89
--- /dev/null
+++ b/mollysocket/templates/servicemonitor.yaml
@@ -0,0 +1,18 @@
+{{- if and .Values.prometheus.servicemonitor.enabled ( .Capabilities.APIVersions.Has "monitoring.coreos.com/v1" ) }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ name: {{ include "mollysocket.fullname" . }}
+ labels:
+ {{- include "mollysocket.labels" . | nindent 4 }}
+ {{- with .Values.prometheus.servicemonitor.labels }}
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+ endpoints:
+ - port: http
+ path: /metrics
+ selector:
+ matchLabels:
+ {{- include "mollysocket.selectorLabels" . | nindent 6 }}
+{{- end }}
diff --git a/mollysocket/templates/setup/job.yaml b/mollysocket/templates/setup/job.yaml
new file mode 100644
index 0000000..6b209e5
--- /dev/null
+++ b/mollysocket/templates/setup/job.yaml
@@ -0,0 +1,66 @@
+{{- if .Values.mollysocket.vapidKey.create }}
+---
+{{- $fullname := (include "mollysocket.fullname" .) }}
+apiVersion: batch/v1
+kind: Job
+metadata:
+ name: {{ $fullname }}-setup
+ labels:
+ {{- include "mollysocket.labels" . | nindent 4 }}
+ app.kubernetes.io/component: setup-job
+ annotations:
+ "helm.sh/hook": pre-install,pre-upgrade
+ "helm.sh/hook-weight": "5"
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
+spec:
+ template:
+ metadata:
+ labels:
+ {{- include "mollysocket.labels" . | nindent 8 }}
+ app.kubernetes.io/component: setup-job
+ spec:
+ restartPolicy: "Never"
+ serviceAccount: {{ $fullname }}-setup
+ initContainers:
+ - name: generate-config
+ {{- with $.Values.image }}
+ image: "{{ coalesce $.Values.global.image.registry .registry }}/{{ .repository }}:{{ .tag | default $.Chart.AppVersion }}"
+ imagePullPolicy: {{ coalesce $.Values.global.image.pullPolicy .pullPolicy }}
+ {{- end }}
+ command:
+ - sh
+ - -c
+ - mollysocket vapid generate > /data/output
+ volumeMounts:
+ - mountPath: /data/
+ name: data
+ containers:
+ - name: upload-config
+ {{- with $.Values.kubectl.image }}
+ image: "{{ coalesce $.Values.global.image.registry .registry }}/{{ .repository }}:{{ .tag }}"
+ imagePullPolicy: {{ coalesce $.Values.global.image.pullPolicy .pullPolicy }}
+ {{- end }}
+ command:
+ - sh
+ - -c
+ - |
+ # check if key already exists
+ key=$(kubectl get secret {{ $fullname }} -o jsonpath="{.data['ms_vapid_key']}" 2> /dev/null)
+ [ $? -ne 0 ] && echo "Failed to get existing secret" && exit 1
+ [ -n "$key" ] && echo "Config already created, exiting." && exit 0
+ # update secret
+ kubectl patch secret {{ $fullname }} -p '{"data":{"ms_vapid_key":"'$(cat /data/output | base64 -w 0)'"}}'
+ [ $? -ne 0 ] && echo "Failed to update secret." && exit 1
+ echo "VAPID successfully setup"
+ volumeMounts:
+ - mountPath: /data/
+ name: data
+ readOnly: true
+
+ volumes:
+ - name: data
+ emptyDir: {}
+ parallelism: 1
+ completions: 1
+ backoffLimit: 1
+{{- end }}
diff --git a/mollysocket/templates/setup/role.yaml b/mollysocket/templates/setup/role.yaml
new file mode 100644
index 0000000..7bed2d1
--- /dev/null
+++ b/mollysocket/templates/setup/role.yaml
@@ -0,0 +1,26 @@
+{{- if .Values.mollysocket.vapidKey.create }}
+---
+{{- $fullname := (include "mollysocket.fullname" .) }}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: Role
+metadata:
+ name: {{ $fullname }}-setup
+ labels:
+ {{- include "mollysocket.labels" . | nindent 4 }}
+ app.kubernetes.io/component: setup-job
+ annotations:
+ "helm.sh/hook": pre-install,pre-upgrade
+ "helm.sh/hook-weight": "5"
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
+rules:
+ - apiGroups:
+ - ""
+ resources:
+ - secrets
+ resourceNames:
+ - {{ $fullname }}
+ verbs:
+ - get
+ - update
+ - patch
+{{- end }}
diff --git a/mollysocket/templates/setup/rolebinding.yaml b/mollysocket/templates/setup/rolebinding.yaml
new file mode 100644
index 0000000..c356f0d
--- /dev/null
+++ b/mollysocket/templates/setup/rolebinding.yaml
@@ -0,0 +1,23 @@
+{{- if .Values.mollysocket.vapidKey.create }}
+---
+{{- $fullname := (include "mollysocket.fullname" .) }}
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+ name: {{ $fullname }}-setup
+ labels:
+ {{- include "mollysocket.labels" . | nindent 4 }}
+ app.kubernetes.io/component: setup-job
+ annotations:
+ "helm.sh/hook": pre-install,pre-upgrade
+ "helm.sh/hook-weight": "5"
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: Role
+ name: {{ $fullname }}-setup
+subjects:
+ - kind: ServiceAccount
+ name: {{ $fullname }}-setup
+ namespace: {{ .Release.Namespace }}
+{{- end }}
diff --git a/mollysocket/templates/setup/serviceaccount.yaml b/mollysocket/templates/setup/serviceaccount.yaml
new file mode 100644
index 0000000..be5fcc8
--- /dev/null
+++ b/mollysocket/templates/setup/serviceaccount.yaml
@@ -0,0 +1,13 @@
+{{- if .Values.mollysocket.vapidKey.create }}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: {{ include "mollysocket.fullname" . }}-setup
+ labels:
+ {{- include "mollysocket.labels" . | nindent 4 }}
+ app.kubernetes.io/component: setup-job
+ annotations:
+ "helm.sh/hook": pre-install,pre-upgrade
+ "helm.sh/hook-weight": "5"
+ "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
+{{- end }}
diff --git a/mollysocket/values.yaml b/mollysocket/values.yaml
new file mode 100644
index 0000000..966e509
--- /dev/null
+++ b/mollysocket/values.yaml
@@ -0,0 +1,156 @@
+global:
+ image:
+ # -- if set it will overwrite all registry entries
+ registry:
+ # -- if set it will overwrite all pullPolicy
+ pullPolicy:
+
+
+# -- replicas
+replicaCount: 1
+
+image:
+ # -- image registry (could be overwritten by global.image.registry)
+ registry: ghcr.io
+ # -- image repository
+ repository: mollyim/mollysocket
+ # -- This sets the pull policy for images. (could be overwritten by global.image.pullPolicy)
+ pullPolicy: IfNotPresent
+ # -- image tag - Overrides the image tag whose default is the chart appVersion.
+ tag: ""
+
+kubectl:
+ # -- image needed for setup (store generated VAPID / WebPush keys)
+ image:
+ registry: docker.io
+ repository: bitnami/kubectl
+ pullPolicy: IfNotPresent
+ tag: 1.32.3
+
+imagePullSecrets: []
+nameOverride: ""
+fullnameOverride: ""
+
+mollysocket:
+ log: "info"
+ environment: "Prod"
+ allowedUUIDs:
+ - "*"
+ allowedEnpoints:
+ - "*"
+ vapidKey:
+ # -- generate a vapid key
+ create: true
+ # -- use own vapid key
+ key: ""
+
+## Enable persistence using Persistent Volume Claims
+## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
+##
+persistence:
+ # Upload (/var/www/html)
+ enabled: true
+ annotations: {}
+ ## mobilizon data Persistent Volume Storage Class
+ ## If defined, storageClassName:
+ ## If set to "-", storageClassName: "", which disables dynamic provisioning
+ ## If undefined (the default) or set to null, no storageClassName spec is
+ ## set, choosing the default provisioner. (gp2 on AWS, standard on
+ ## GKE, AWS & OpenStack)
+ ##
+ # storageClass: "-"
+
+ ## A manually managed Persistent Volume and Claim
+ ## Requires persistence.enabled: true
+ ## If defined, PVC must be created manually before volume will be bound
+ # existingClaim:
+
+ ## Create a PV on Node with given hostPath
+ ## storageClass has to be manual
+ # hostPath:
+ accessMode: ReadWriteOnce
+ size: 1Gi
+
+prometheus:
+ servicemonitor:
+ enabled: false
+ labels: {}
+ rules:
+ enabled: false
+ labels: {}
+ # current no default alertrules are provided
+ additionalRules: []
+
+grafana:
+ dashboards:
+ enabled: false
+ labels:
+ grafana_dashboard: "1"
+ annotations: {}
+
+serviceAccount:
+ # Specifies whether a service account should be created
+ create: true
+ # Annotations to add to the service account
+ annotations: {}
+ # The name of the service account to use.
+ # If not set and create is true, a name is generated using the fullname template
+ name: ""
+
+podAnnotations: {}
+
+podSecurityContext: {}
+ # fsGroup: 2000
+
+securityContext: {}
+ # capabilities:
+ # drop:
+ # - ALL
+ # readOnlyRootFilesystem: true
+ # runAsNonRoot: true
+ # runAsUser: 1000
+
+service:
+ type: ClusterIP
+ port: 80
+
+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: {}
+ # We usually recommend not to specify default resources and to leave this as a conscious
+ # choice for the user. This also increases chances charts run on environments with little
+ # resources, such as Minikube. If you do want to specify resources, uncomment the following
+ # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
+ # limits:
+ # cpu: 100m
+ # memory: 128Mi
+ # requests:
+ # cpu: 100m
+ # memory: 128Mi
+
+autoscaling:
+ enabled: false
+ minReplicas: 1
+ maxReplicas: 100
+ targetCPUUtilizationPercentage: 80
+ # targetMemoryUtilizationPercentage: 80
+
+nodeSelector: {}
+
+tolerations: []
+
+affinity: {}