Files
cloud-host/backend/helm/cloudhost-app/templates/deployment.yaml
T
keyhan 695e05f948 Add managed databases and services with billing-aligned upgrades.
Introduce product types for managed PostgreSQL, Redis, and RabbitMQ with a dedicated dashboard, Helm-only deploy pipeline, external access, snapshots with progress, and prorated resource or storage upgrades matching application billing rules. PVCs use an expandable StorageClass with automatic migration when legacy disks cannot resize in place.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-23 19:00:09 +03:30

255 lines
9.8 KiB
YAML

{{- if .Values.app.enabled }}
{{- $name := include "cloudhost-app.name" . -}}
{{- $ns := include "cloudhost-app.namespace" . -}}
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ $name }}
namespace: {{ $ns }}
labels:
{{- include "cloudhost-app.labels" . | nindent 4 }}
annotations:
kubernetes.io/change-cause: {{ .Values.changeCause | default (printf "Deploy %s" .Values.app.image) | quote }}
spec:
revisionHistoryLimit: 10
replicas: {{ .Values.app.replicas }}
selector:
matchLabels:
{{- include "cloudhost-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "cloudhost-app.labels" . | nindent 8 }}
spec:
imagePullSecrets:
- name: registry-pull-secret
containers:
- name: {{ $name }}
image: {{ .Values.app.image | quote }}
imagePullPolicy: Always
ports:
- containerPort: {{ .Values.app.port }}
{{- if and .Values.envVars (gt (len .Values.envVars) 0) }}
envFrom:
- secretRef:
name: {{ $name }}-env
{{- end }}
env:
{{- if and .Values.database.enabled (eq .Values.database.type "postgresql") }}
- name: DB_HOST
value: {{ include "cloudhost-app.dbDeploymentName" . }}
- name: DB_PORT
value: "5432"
- name: DB_NAME
value: {{ include "cloudhost-app.dbName" . }}
- name: DB_USER
valueFrom:
secretKeyRef:
name: {{ $name }}-db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: {{ $name }}-db-secret
key: password
- name: DATABASE_URL
value: "postgresql://$(DB_USER):$(DB_PASSWORD)@{{ include "cloudhost-app.dbDeploymentName" . }}:5432/{{ include "cloudhost-app.dbName" . }}"
{{- if or (eq .Values.app.runtime "laravel") (eq .Values.app.runtime "php") }}
{{ include "cloudhost-app.laravelDbEnv" . }}
{{- end }}
{{- end }}
{{- if and .Values.database.enabled (eq .Values.database.type "mysql") }}
- name: DB_HOST
value: {{ include "cloudhost-app.dbDeploymentName" . }}
- name: DB_PORT
value: "3306"
- name: DB_NAME
value: {{ include "cloudhost-app.dbName" . }}
- name: DB_USER
valueFrom:
secretKeyRef:
name: {{ $name }}-db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: {{ $name }}-db-secret
key: password
- name: DATABASE_URL
value: "mysql://$(DB_USER):$(DB_PASSWORD)@{{ include "cloudhost-app.dbDeploymentName" . }}:3306/{{ include "cloudhost-app.dbName" . }}"
{{- if or (eq .Values.app.runtime "laravel") (eq .Values.app.runtime "php") }}
{{ include "cloudhost-app.laravelDbEnv" . }}
{{- end }}
{{- end }}
{{- if and .Values.database.enabled (eq .Values.database.type "mariadb") }}
- name: DB_HOST
value: {{ include "cloudhost-app.dbDeploymentName" . }}
- name: DB_PORT
value: "3306"
- name: DB_NAME
value: {{ include "cloudhost-app.dbName" . }}
- name: DB_USER
valueFrom:
secretKeyRef:
name: {{ $name }}-db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: {{ $name }}-db-secret
key: password
- name: DATABASE_URL
value: "mysql://$(DB_USER):$(DB_PASSWORD)@{{ include "cloudhost-app.dbDeploymentName" . }}:3306/{{ include "cloudhost-app.dbName" . }}"
{{- if or (eq .Values.app.runtime "laravel") (eq .Values.app.runtime "php") }}
{{ include "cloudhost-app.laravelDbEnv" . }}
{{- end }}
{{- end }}
{{- if and .Values.database.enabled (eq .Values.database.type "mongodb") }}
- name: DB_HOST
value: {{ include "cloudhost-app.dbDeploymentName" . }}
- name: DB_PORT
value: "27017"
- name: DB_NAME
value: {{ include "cloudhost-app.dbName" . }}
- name: DB_USER
valueFrom:
secretKeyRef:
name: {{ $name }}-db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: {{ $name }}-db-secret
key: password
- name: MONGODB_URI
value: "mongodb://$(DB_USER):$(DB_PASSWORD)@{{ include "cloudhost-app.dbDeploymentName" . }}:27017/{{ include "cloudhost-app.dbName" . }}?authSource=admin"
- name: DATABASE_URL
value: "mongodb://$(DB_USER):$(DB_PASSWORD)@{{ include "cloudhost-app.dbDeploymentName" . }}:27017/{{ include "cloudhost-app.dbName" . }}?authSource=admin"
{{- if or (eq .Values.app.runtime "laravel") (eq .Values.app.runtime "php") }}
{{ include "cloudhost-app.laravelDbEnv" . }}
{{- end }}
{{- end }}
{{- /* Redis connection env vars */}}
{{- if .Values.redis.enabled }}
- name: REDIS_HOST
value: {{ printf "%s-redis" $name }}
- name: REDIS_PORT
value: "6379"
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: {{ printf "%s-redis-secret" $name }}
key: password
- name: REDIS_URL
value: "redis://:$(REDIS_PASSWORD)@{{ printf "%s-redis" $name }}:6379"
{{- end }}
{{- /* RabbitMQ connection env vars */}}
{{- if .Values.rabbitmq.enabled }}
- name: RABBITMQ_HOST
value: {{ printf "%s-rabbitmq" $name }}
- name: RABBITMQ_PORT
value: "5672"
- name: RABBITMQ_MANAGEMENT_PORT
value: "15672"
- name: RABBITMQ_USER
valueFrom:
secretKeyRef:
name: {{ printf "%s-rabbitmq-secret" $name }}
key: username
- name: RABBITMQ_PASSWORD
valueFrom:
secretKeyRef:
name: {{ printf "%s-rabbitmq-secret" $name }}
key: password
- name: AMQP_URL
value: "amqp://$(RABBITMQ_USER):$(RABBITMQ_PASSWORD)@{{ printf "%s-rabbitmq" $name }}:5672"
{{- end }}
{{- /* WordPress-specific env vars (official image expects these) */}}
{{- if and .Values.wordpress.enabled .Values.database.enabled }}
- name: WORDPRESS_DB_HOST
value: "{{ include "cloudhost-app.dbDeploymentName" . }}:{{ include "cloudhost-app.dbPort" . }}"
- name: WORDPRESS_DB_NAME
value: {{ include "cloudhost-app.dbName" . }}
- name: WORDPRESS_DB_USER
valueFrom:
secretKeyRef:
name: {{ $name }}-db-secret
key: username
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: {{ $name }}-db-secret
key: password
- name: WORDPRESS_TABLE_PREFIX
value: "wp_"
{{- end }}
resources:
requests:
cpu: {{ .Values.resources.cpuRequest | quote }}
memory: {{ .Values.resources.memoryRequest | quote }}
limits:
cpu: {{ .Values.resources.cpuLimit | quote }}
memory: {{ .Values.resources.memoryLimit | quote }}
readinessProbe:
tcpSocket:
port: {{ .Values.app.port }}
initialDelaySeconds: 5
periodSeconds: 5
livenessProbe:
tcpSocket:
port: {{ .Values.app.port }}
initialDelaySeconds: 15
periodSeconds: 10
failureThreshold: 5
volumeMounts:
- name: app-storage
mountPath: {{ include "cloudhost-app.storageMountPath" . | trim }}
{{- if .Values.elasticsearch.enabled }}
- name: app-logs
mountPath: /var/log/app
{{- end }}
{{- if .Values.elasticsearch.enabled }}
- name: fluent-bit
image: fluent/fluent-bit:2.2
resources:
requests:
cpu: "10m"
memory: "32Mi"
limits:
cpu: "50m"
memory: "64Mi"
volumeMounts:
- name: app-logs
mountPath: /var/log/app
readOnly: true
- name: fluent-bit-config
mountPath: /fluent-bit/etc
env:
- name: APP_NAME
value: {{ $name }}
- name: APP_NAMESPACE
value: {{ $ns }}
- name: ES_HOST
value: "elasticsearch.logging.svc.cluster.local"
- name: ES_PORT
value: "9200"
- name: ES_PASSWORD
valueFrom:
secretKeyRef:
name: elasticsearch-credentials
key: ELASTIC_PASSWORD
optional: true
{{- end }}
volumes:
- name: app-storage
persistentVolumeClaim:
claimName: {{ $name }}-storage
{{- if .Values.elasticsearch.enabled }}
- name: app-logs
emptyDir: {}
- name: fluent-bit-config
configMap:
name: {{ $name }}-fluent-bit-config
{{- end }}
{{- end }}