job-restore.yaml 4.31 KB
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: {{ include "postgresql-rclone.fullname" . }}-restores
spec:
  {{- if .Values.backup.pvc.storageClassName }}
  storageClassName: {{ .Values.restore.pvc.storageClassName }}
  {{- end }}
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: {{ .Values.restore.pvc.size }}
---
apiVersion: batch/v1
kind: Job
metadata:
  name: {{ include "postgresql-rclone.fullname" . }}-restore
  labels:
    {{- include "postgresql-rclone.labels" . | nindent 4 }}
spec:
  ttlSecondsAfterFinished: {{ .Values.restore.job.ttlSecondsAfterFinished }}
  template:
    spec:
      restartPolicy: OnFailure
      imagePullSecrets:
        {{- toYaml .Values.imagePullSecrets | nindent 12 }}
      volumes:
        - name: restores
          persistentVolumeClaim:
            claimName: {{ include "postgresql-rclone.fullname" . }}-restores
        {{- if .Values.rclone.enabled }}
        - name: rclone-auth
          secret:
            secretName: {{ include "postgresql-rclone.fullname" . }}-rclone
        - name: rclone-config
          configMap:
            name: {{ include "postgresql-rclone.fullname" . }}-rclone
        {{- end }}
      initContainers:
      - name: cleanup-pvc
        image: "{{ .Values.bash.image.repository }}:{{ .Values.bash.image.tag }}"
        imagePullPolicy: {{ .Values.bash.image.pullPolicy }}
        volumeMounts:
          - name: restores
            mountPath: /restores
        command:
          - bash
          - -cx
          - |-
            find /restores -delete
      {{- if .Values.rclone.enabled }}
      - name: rclone
        image: "{{ .Values.rclone.image.repository }}:{{ .Values.rclone.image.tag }}"
        imagePullPolicy: {{ .Values.rclone.image.pullPolicy }}
        volumeMounts:
          - name: restores
            mountPath: /restores
          - name: rclone-config
            mountPath: /config
          - name: rclone-auth
            mountPath: /secret
        envFrom:
          - configMapRef:
              name: {{ include "postgresql-rclone.fullname" . }}-rclone
          - secretRef:
              name: {{ include "postgresql-rclone.fullname" . }}-rclone
        env:
        {{- if .Values.rclone.crypt.enabled }}
          - name: RCLONE_CRYPT_REMOTE
        {{-   if .Values.restore.url }}
            value: ":{{ .Values.restore.url }}"
        {{-   else }}
            value: ":s3:$(S3_BUCKET)/$(S3_PREFIX)/last/"
        {{-   end }}
        {{- end }}
        {{- if .Values.rclone.crypt.enabled }}
        args: ["copy", ":crypt:", "/restores/.work/"]
        {{- else }}
        {{-   if .Values.restore.url }}
        args: ["-v", "copy", ":s3:{{ .Values.restore.url }}", "/restores/.work/"]
        {{-   else }}
        args: ["-v", "copy", ":s3:$(S3_BUCKET)/$(S3_PREFIX)/last/", "/restores/.work/"]
        {{-   end }}
        {{- end }}
      {{- end }}
      - name: link-latest
        image: "{{ .Values.bash.image.repository }}:{{ .Values.bash.image.tag }}"
        imagePullPolicy: {{ .Values.bash.image.pullPolicy }}
        volumeMounts:
          - name: restores
            mountPath: /restores
        command:
          - bash
          - -cx
          - |-
        {{- if .Values.restore.url }}
            find /restores/.work -maxdepth 1 -mindepth 1 | \
        {{- else }}
            find /restores/.work -maxdepth 1 -mindepth 1 -name '*.sql.gz' | \
            sort | \
            awk '{split($1, a, /-([^-]*)-([^-]*)$/)} !uniq[a[1] a[2] a[3]]++' | \
        {{- end }}
            while read file; do \
              ln -f "$file" "/restores/"
            done
      - name: show-restores
        image: "{{ .Values.bash.image.repository }}:{{ .Values.bash.image.tag }}"
        imagePullPolicy: {{ .Values.bash.image.pullPolicy }}
        volumeMounts:
          - name: restores
            mountPath: /restores
        command: ["ls"]
        args: ["-alR", "/restores"]

      containers:
      - name: ready
        image: "{{ .Values.bash.image.repository }}:{{ .Values.bash.image.tag }}"
        imagePullPolicy: {{ .Values.bash.image.pullPolicy }}
        volumeMounts:
          - name: restores
            mountPath: /restores
        command:
          - bash
          - -cx
          - |-
            set -- /restores/*
            [[ -e $1 ]] || touch /restores/.error
            touch /restores/.restored