apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }} spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ .Release.Name }} template: metadata: labels: app: {{ .Release.Name }} spec: containers: - name: actual-budget-exporter image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - name: metrics containerPort: {{ .Values.service.port }} env: {{- range $k, $v := .Values.env }} - name: {{ $k }} value: {{ $v | quote }} {{- end }} - name: ACTUAL_PASSWORD valueFrom: secretKeyRef: name: {{ .Values.secret.name }} key: ACTUAL_PASSWORD - name: ACTUAL_BUDGET_ID_1 valueFrom: secretKeyRef: name: {{ .Values.secret.name }} key: ACTUAL_BUDGET_ID_1 - name: ACTUAL_E2E_PASSWORD_1 valueFrom: secretKeyRef: name: {{ .Values.secret.name }} key: ACTUAL_E2E_PASSWORD_1 resources: {{- toYaml .Values.resources | nindent 12 }} # /metrics does a full login against actual_server on every hit # (see actual-api-service.js: initializeApi() runs per getMetrics() # call) — an httpGet probe against it every 10-20s was stacking on # top of Prometheus's own scrapes and tripped actual_server's # login-attempt rate limit ("too-many-requests"). Probe TCP only; # let Prometheus be the sole thing that ever calls /metrics. readinessProbe: tcpSocket: port: {{ .Values.service.port }} initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: tcpSocket: port: {{ .Values.service.port }} initialDelaySeconds: 15 periodSeconds: 20