backup.remote.cronjob.yaml 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: rclone-remote-backup-api-key
  5. type: Opaque
  6. data:
  7. backups.pem: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tDQpNSUlFdmdJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLZ3dnZ1NrQWdFQUFvSUJBUURjbXR3N0t1cnphMmJ1DQplQ3BQRU9PdlFRRmdKU2I1SjFCbUpNelc1a2pUKy9aekdscjNZT3d6ay9QMVM5UWNBNlZ2YzdPdzNnditSZlZ2DQpWQnd4dkozVVRsNGo0eGRnK2JBWnRrNVpGR0dLSnhIMWo4V1E3Q0RGdU14U3NiRFgzRWVhaWlCMmQrcHJLSlZKDQp2YUFva1JBeHJuTG9oS0tpbEo1OTdwTjd0SnVWY0FjbXFWQTdmNFArZEVTNzUzL3pDNDMzWnJCb2lDeVM5cnVMDQpjWTcvVVMySnlxRXNjcXNVK1l4MmxEV1ZxMHZEMVJEeFdUYUJCSGlWb09RbkMvVmZxcjgxTXVaM2loWmQ2cldpDQpxa1dBN3l6eEhhSzZpdmJHNUVVYzZBOTg5VDhEUi9mOU42MDBFb2ZucGNsMVFyQ0g3SlpYUDNzNkZ6WEZSNXl0DQplTzJ4a1dVL0FnTUJBQUVDZ2dFQVJ6eEFjbUMwOXI2UFFlRU90SEpkTzJuUDBtYWMwNmEweVE4SUVEclRlSlJyDQpyQlp1R21TelVTSnREQ0FjMGFFQnlsLy92ZFN0NWNGY2RFTWlTWk5CR2QzbWUwc284UGtmdXVYS0hleTlaSG1pDQpUSHZORGJPYUQ0N1JkOENHUE9ZV1B4cHNTaVVGenUyUGEzenVtenJna2xKbEs1MHMwVGdSaDlQQ3p4YnVpSTNIDQpURmtXOVUxMGhJdC9wZTBDaWFSeTYwOU9zN2x6NCszeTRKMlM2eTJFbTQraVZ3Z2hzVnEyUnloTjhSNUVWRVZ0DQp2UEJmWjZOb1psYk9YOWpwUnZ3bGVCd3E4STQxYmpSeG02elZ5NmZ5MDBSczZLaENwUjM5eERwdkpKMFg0SGU5DQpvRWlsUjNYWnVVRWFZNndvRGs3VzVxcHVCVzRYVUkwMDFGbHpCZFIzYlFLQmdRRDFHN2VzMXZMYnp0eFM1dW5yDQoxQm55U3RPMm16dmd5Z3hxQlZWdGhKY2EyalNJOGNxQ3VucndCYUw3WlZycitDUmt5ekFUM0dCR2tvUGVjQlBWDQo5VVd6MENKeUN4M3NJbDVrVWdrYVVDWkt0QmIvMGxWQUQ4QmlwZGlCZ1JpNHFGd0J5SVQ3eG81dlhDQXVON095DQpqNEM1VzNLQ29Lbk5peDl5ZzBQVldZaDlyUUtCZ1FEbWFHWk5oTFhEcWZpb0k0Y056U3RLa1VseDRBV3BPUFBSDQpHOWgwVlhnaEp4elFDSEw3cmcrWEtaZ04xSmZOQVhnOWpoYnYvay9MaDlIUVFiMjJJMGN6dkJmeXZJQ0RGMW1KDQppS0g1TisvaVgvaUMyVy8vdEEzSGJRazhUaUVleC9GK3MxbFZMb3pibXhNVDJ1SkRuK1hRdGhVWXJwSkRhaWd5DQpSbkFvMjlrMEd3S0JnUURWVlUrVGh1NlA5RWI5Zk8vaWk1UWR0NVQzbmJzTEZyQ2hZbzBOS2xjZVR3ZGtuaFpsDQpuQXMrZDVsNGQ2b2dNYlR6YVlvcDd5aDRwRE5VV25aWlJnWnB6K0Q3SThQaWI3TjZXNUNDcjNuMGtUUm5hdGs2DQpUYnRqNFBkRkdHaTg2QVJVcFFOaDVGcTZnQk9lUm1zSUlqQ21vL3BSeWFhaE9OS2hKN0RWcy96QmJRS0JnUUNnDQp0S3ErWU5VaXYxZ1hkb2hKZ1JRejgzaEZ2QnBXdU1tZXpZeEJRQ2dFLzdIaURES2ZCdjRLMGxFalBHZ1E3bmgrDQpmcS9TL3crTEI1VzVhMUUyVEE3cXI4UUlZNkJEVHpMOWNkWi83SnNkeXhDYnU2dVpyMjE0N3IxbFdaMVNTZVZRDQpHU295OXIvNm9JUkM4Z1dsWTA2NUwzY3hldm03bWJ5bHJHbW9wZ2N1aHdLQmdIWEg2anJvSm1GOXozV1J4dENTDQorREhOVGVtK3cxem91bWRnL201RGtsU1RrNzBvWHlDTWZXRHdPeGw1U2tRUC9CNUMzYVhZMzJyTEt2eWw5bVZNDQpWQkxWNkJ2WXRRVWxZTXJlVHJCaUNpdGErTHpGUmM1Z3NhWEJldi9NZEhtTHdlaUp0bS9zNWpOT2U0RUx5TWoyDQpjcnZqTTFpMTZ6K2JtdDkyV0ZhWkRRZXoNCi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KT0NJX0FQSV9LRVk=
  8. ---
  9. apiVersion: v1
  10. kind: ConfigMap
  11. metadata:
  12. name: rclone-config-oos
  13. data:
  14. rclone.conf: |
  15. [oos]
  16. type = oracleobjectstorage
  17. namespace = iddpv1jwk1nu
  18. region = us-ashburn-1
  19. compartment = ocid1.tenancy.oc1..aaaaaaaatqrfyvsvvwrz4p4y3fbaucueixpm6rg5r5ihpr2szat6cg2ek2aq
  20. provider = user_principal_auth
  21. config_file = /config/oci/config
  22. config_profile = DEFAULT
  23. oci.conf: |
  24. [DEFAULT]
  25. user=ocid1.user.oc1..aaaaaaaapeoqy5glmtljxh6bztwkbcrjk53ux7msfa6ifvxs2ygec364chha
  26. fingerprint=d6:06:e3:9c:59:ef:d6:ae:2a:21:6c:06:07:82:c4:70
  27. tenancy=ocid1.tenancy.oc1..aaaaaaaatqrfyvsvvwrz4p4y3fbaucueixpm6rg5r5ihpr2szat6cg2ek2aq
  28. region=us-ashburn-1
  29. key_file=/config/oci-keys/backups.pem
  30. ---
  31. apiVersion: batch/v1
  32. kind: CronJob
  33. metadata:
  34. name: backup-remote
  35. spec:
  36. schedule: "5 8 * * 0"
  37. jobTemplate:
  38. spec:
  39. template:
  40. spec:
  41. initContainers:
  42. - name: prepare-wrapper
  43. image: busybox
  44. command: ["/bin/sh", "-c"]
  45. args:
  46. - |
  47. cat > /shared/wrapper.sh << 'EOF'
  48. #!/bin/sh
  49. # Execute the original entrypoint with all arguments
  50. /usr/local/bin/rclone "$@"
  51. # Capture the exit code
  52. echo $? > /shared/exit-code
  53. EOF
  54. chmod +x /shared/wrapper.sh
  55. volumeMounts:
  56. - name: shared-data
  57. mountPath: /shared
  58. containers:
  59. - name: rclone
  60. image: rclone/rclone:1.68
  61. command: ["/shared/wrapper.sh"]
  62. args: ["sync", "--verbose", "--verbose", "--cache-workers", "4", "--transfers", "4", "--retries", "32", "--oos-attempt-resume-upload", "--oos-leave-parts-on-error", "/data/repo", "oos:backup"]
  63. imagePullPolicy: IfNotPresent
  64. volumeMounts:
  65. - name: restic-repo-vol
  66. mountPath: /data/repo
  67. - name: rclone-conf-vol
  68. mountPath: /config/rclone
  69. - name: oci-conf-vol
  70. mountPath: /config/oci
  71. - name: oci-api-key-vol
  72. mountPath: /config/oci-keys
  73. - name: shared-data
  74. mountPath: /shared
  75. - name: notify
  76. image: curlimages/curl
  77. command: ["/bin/sh"]
  78. args:
  79. - -c
  80. - |
  81. while [ ! -f /shared/exit-code ]; do sleep 1; done
  82. AUTH_HEADER="Authorization: Bearer tk_up3glyzhhojl1w5lt32jq5vqjzdgb"
  83. URL="http://ntfy/backup"
  84. MESSAGE="Remote restic backup"
  85. if [ "$(cat /shared/exit-code)" -eq 0 ]; then
  86. STATUS="was successful"
  87. else
  88. STATUS="FAILED"
  89. fi
  90. curl -X POST -H "$AUTH_HEADER" -d "${MESSAGE} ${STATUS}." "$URL"
  91. volumeMounts:
  92. - name: shared-data
  93. mountPath: /shared
  94. volumes:
  95. - name: restic-repo-vol
  96. hostPath:
  97. path: /data/backup
  98. type: Directory
  99. - name: rclone-conf-vol
  100. configMap:
  101. name: rclone-config-oos
  102. items:
  103. - key: rclone.conf
  104. path: rclone.conf
  105. - name: oci-conf-vol
  106. configMap:
  107. name: rclone-config-oos
  108. items:
  109. - key: oci.conf
  110. path: config
  111. - name: oci-api-key-vol
  112. secret:
  113. secretName: rclone-remote-backup-api-key
  114. - name: shared-data
  115. emptyDir: {}
  116. restartPolicy: Never
  117. nodeSelector:
  118. kubernetes.io/hostname: raspberrypi4