From 2c709507a996e854342a3e0d5d8c429ae5b17f42 Mon Sep 17 00:00:00 2001 From: rohow Date: Thu, 17 Jul 2025 22:49:14 +0800 Subject: [PATCH] feat(helm): add initial Helm chart for RustDesk server deployment --- charts/rustdesk-server/Chart.yaml | 14 +++ .../rustdesk-server/templates/deployment.yml | 90 +++++++++++++++++++ charts/rustdesk-server/templates/ingress.yaml | 39 ++++++++ charts/rustdesk-server/templates/pvc.yml | 15 ++++ charts/rustdesk-server/templates/service.yml | 24 +++++ charts/rustdesk-server/values.yaml | 39 ++++++++ .../tailscale-derp/templates/deployment.yml | 16 ++-- 7 files changed, 230 insertions(+), 7 deletions(-) create mode 100644 charts/rustdesk-server/Chart.yaml create mode 100644 charts/rustdesk-server/templates/deployment.yml create mode 100644 charts/rustdesk-server/templates/ingress.yaml create mode 100644 charts/rustdesk-server/templates/pvc.yml create mode 100644 charts/rustdesk-server/templates/service.yml create mode 100644 charts/rustdesk-server/values.yaml diff --git a/charts/rustdesk-server/Chart.yaml b/charts/rustdesk-server/Chart.yaml new file mode 100644 index 0000000..a43b055 --- /dev/null +++ b/charts/rustdesk-server/Chart.yaml @@ -0,0 +1,14 @@ +apiVersion: v2 +name: rustdesk-server +description: RustDesk Server Helm Chart +home: https://rustdesk.com/ +sources: + - https://github.com/rustdesk/rustdesk-server +maintainers: + - name: dev.cm + email: admin@dev.cm + url: https://github.com/devcm-repo +icon: https://rustdesk.com/favicon.ico +version: 0.0.1 +appVersion: latest + diff --git a/charts/rustdesk-server/templates/deployment.yml b/charts/rustdesk-server/templates/deployment.yml new file mode 100644 index 0000000..2a5d3df --- /dev/null +++ b/charts/rustdesk-server/templates/deployment.yml @@ -0,0 +1,90 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: "{{ .Release.Name }}-{{ .Chart.Name }}" + template: + metadata: + labels: + app: "{{ .Release.Name }}-{{ .Chart.Name }}" + spec: + {{- if .Values.nodeSelector }} + nodeSelector: + {{- toYaml .Values.nodeSelector | nindent 8 }} + {{- end }} + {{- if .Values.affinity }} + affinity: + {{- toYaml .Values.affinity | nindent 8 }} + {{- end }} + containers: + - name: "{{ .Release.Name }}-{{ .Chart.Name }}" + image: "{{ .Values.image.name }}:{{ .Values.image.tag }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: api + containerPort: 21114 + protocol: TCP + - name: websocket-id + containerPort: 21118 + protocol: TCP + - name: websocket-relay + containerPort: 21119 + protocol: TCP + - name: signal + containerPort: 21115 + hostPort: {{ .Values.rustdeskServer.ports.signal }} + protocol: TCP + - name: id + containerPort: 21116 + hostPort: {{ .Values.rustdeskServer.ports.id }} + protocol: TCP + - name: id-udp + containerPort: 21116 + hostPort: {{ .Values.rustdeskServer.ports.id }} + protocol: UDP + - name: relay + containerPort: 21117 + hostPort: {{ .Values.rustdeskServer.ports.relay }} + protocol: TCP + env: + - name: ENCRYPTED_ONLY + value: "{{ if .Values.rustdeskServer.encryptedOnly }}1{{ else }}0{{ end }}" + - name: MUST_LOGIN + value: "{{ if .Values.rustdeskServer.mustLogin }}Y{{ else }}N{{ end }}" + - name: RELAY + value: "{{ .Values.rustdeskServer.server }}:{{ .Values.rustdeskServer.ports.relay }}" + - name: RUSTDESK_API_RUSTDESK_ID_SERVER + value: "{{ .Values.rustdeskApi.server }}" + - name: RUSTDESK_API_RUSTDESK_RELAY_SERVER + value: "{{ .Values.rustdeskApi.server }}" + - name: RUSTDESK_API_RUSTDESK_API_SERVER + value: "https://{{ .Values.rustdeskApi.server }}" + {{- if .Values.rustdeskServer.extraEnvs }} + {{- range .Values.rustdeskServer.extraEnvs }} + - name: {{ .name }} + value: "{{ .value }}" + {{- end }} + {{- end }} + volumeMounts: + - name: data + mountPath: /data + subPath: server + - name: data + mountPath: /app/data + subPath: api + + volumes: + - name: data + {{- if .Values.persistence.enabled }} + persistentVolumeClaim: + claimName: "{{ .Release.Name }}-{{ .Chart.Name }}-data" + {{- else }} + emptyDir: {} + {{- end }} + diff --git a/charts/rustdesk-server/templates/ingress.yaml b/charts/rustdesk-server/templates/ingress.yaml new file mode 100644 index 0000000..4f57faf --- /dev/null +++ b/charts/rustdesk-server/templates/ingress.yaml @@ -0,0 +1,39 @@ +{{- if .Values.rustdeskApi.ingress.enabled }} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + annotations: + {{- if .Values.rustdeskApi.ingress.annotations }} + {{- toYaml .Values.rustdeskApi.ingress.annotations | nindent 4 }} + {{- end }} +spec: + {{- if .Values.rustdeskApi.ingress.className }} + ingressClassName: {{ .Values.rustdeskApi.ingress.className }} + {{- end }} + rules: + - host: {{ .Values.rustdeskApi.ingress.host }} + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + port: + number: {{ .Values.rustdeskApi.ports.api }} + - path: /ws/id + pathType: Prefix + backend: + service: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + port: + number: {{ .Values.rustdeskApi.ports.websocketId }} + - path: /ws/relay + pathType: Prefix + backend: + service: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + port: + number: {{ .Values.rustdeskApi.ports.websocketRelay }} +{{- end }} diff --git a/charts/rustdesk-server/templates/pvc.yml b/charts/rustdesk-server/templates/pvc.yml new file mode 100644 index 0000000..df9131f --- /dev/null +++ b/charts/rustdesk-server/templates/pvc.yml @@ -0,0 +1,15 @@ +{{- if .Values.persistence.enabled }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: "{{ .Release.Name }}-{{ .Chart.Name }}-data" +spec: + accessModes: + - {{ .Values.persistence.data.accessMode }} + resources: + requests: + storage: {{ .Values.persistence.data.size }} + {{- if .Values.persistence.data.storageClass }} + storageClassName: {{ .Values.persistence.data.storageClass }} + {{- end }} +{{- end }} diff --git a/charts/rustdesk-server/templates/service.yml b/charts/rustdesk-server/templates/service.yml new file mode 100644 index 0000000..1148e37 --- /dev/null +++ b/charts/rustdesk-server/templates/service.yml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Service +metadata: + name: "{{ .Release.Name }}-{{ .Chart.Name }}" + {{- if not (empty .Values.rustdeskApi.service.annotations) }} + annotations: {{- toYaml .Values.rustdeskApi.service.annotations | nindent 4 }} + {{- end }} +spec: + type: "{{ .Values.rustdeskApi.service.type }}" + selector: + app: "{{ .Release.Name }}-{{ .Chart.Name }}" + ports: + - name: api + port: {{ .Values.rustdeskApi.ports.api }} + targetPort: 21114 + protocol: TCP + - name: websocket-id + port: {{ .Values.rustdeskApi.ports.websocketId }} + targetPort: 21118 + protocol: TCP + - name: websocket-relay + port: {{ .Values.rustdeskApi.ports.websocketRelay }} + targetPort: 21119 + protocol: TCP diff --git a/charts/rustdesk-server/values.yaml b/charts/rustdesk-server/values.yaml new file mode 100644 index 0000000..c547adc --- /dev/null +++ b/charts/rustdesk-server/values.yaml @@ -0,0 +1,39 @@ +image: + name: lejianwen/rustdesk-server-s6 + tag: latest + pullPolicy: IfNotPresent + +nodeSelector: {} + +affinity: {} + +persistence: + enabled: true + data: + storageClass: "" + size: 2Gi + accessMode: ReadWriteOnce + +rustdeskServer: + encryptedOnly: true + mustLogin: false + server: "rustdesk-relay.example.com" + ports: + signal: 21115 + id: 21116 + relay: 21117 + +rustdeskApi: + server: "rustdesk-api.example.com" + ports: + api: 21114 + websocketId: 21118 + websocketRelay: 21119 + service: + type: ClusterIP + annotations: {} + ingress: + enabled: true + className: "" + host: "rustdesk-api.example.com" + annotations: {} diff --git a/charts/tailscale-derp/templates/deployment.yml b/charts/tailscale-derp/templates/deployment.yml index 56d6ad7..9a169c9 100644 --- a/charts/tailscale-derp/templates/deployment.yml +++ b/charts/tailscale-derp/templates/deployment.yml @@ -14,12 +14,17 @@ spec: labels: app: "{{ .Release.Name }}-{{ .Chart.Name }}" spec: - {{- if not (empty .Values.nodeSelector) }} - nodeSelector: {{- toYaml .Values.nodeSelector | nindent 8 }} + {{- if .Values.nodeSelector }} + nodeSelector: + {{- toYaml .Values.nodeSelector | nindent 8 }} {{- end }} - {{- if not (empty .Values.affinity) }} - affinity: {{- toYaml .Values.affinity | nindent 8 }} + {{- if .Values.affinity }} + affinity: + {{- toYaml .Values.affinity | nindent 8 }} {{- end }} + {{ - if .Values.hostNetwork }} + hostNetwork: true + {{ - end }} containers: - name: "{{ .Release.Name }}-{{ .Chart.Name }}" image: "{{ .Values.image.name }}:v{{ .Chart.AppVersion }}" @@ -60,9 +65,6 @@ spec: - mountPath: /var/run/tailscale/tailscaled.sock name: tailscale-socket {{- end }} - {{- if .Values.hostNetwork }} - hostNetwork: true - {{- end }} volumes: {{- toYaml .Values.extraVolumes | nindent 8 }} {{- if .Values.derp.verify_clients }}