- Use existing basicstack-backup bucket with opencloud/ prefix - Configure endpoint: https://hel1.your-objectstorage.com - Add pod affinity to run on same node as OpenCloud (RWO volume requirement) - Schedule: daily at 2:00 AM UTC - Retention: last 7 days - First backup verified successful: 110.611 MiB transferred Co-Authored-By: Paperclip <noreply@paperclip.ing>
104 lines
3.4 KiB
YAML
104 lines
3.4 KiB
YAML
---
|
|
# OpenCloud Daily Backup to Hetzner Object Storage
|
|
apiVersion: batch/v1
|
|
kind: CronJob
|
|
metadata:
|
|
name: opencloud-backup
|
|
namespace: opencloud
|
|
spec:
|
|
schedule: "0 2 * * *" # Daily at 2 AM UTC
|
|
concurrencyPolicy: Forbid
|
|
successfulJobsHistoryLimit: 3
|
|
failedJobsHistoryLimit: 3
|
|
jobTemplate:
|
|
spec:
|
|
template:
|
|
spec:
|
|
restartPolicy: OnFailure
|
|
# Run on same node as OpenCloud to allow volume attachment
|
|
affinity:
|
|
podAffinity:
|
|
requiredDuringSchedulingIgnoredDuringExecution:
|
|
- labelSelector:
|
|
matchExpressions:
|
|
- key: app
|
|
operator: In
|
|
values:
|
|
- opencloud
|
|
topologyKey: kubernetes.io/hostname
|
|
containers:
|
|
- name: backup
|
|
image: rclone/rclone:latest
|
|
command:
|
|
- /bin/sh
|
|
- -c
|
|
- |
|
|
set -e
|
|
DATE=$(date +%Y%m%d-%H%M%S)
|
|
echo "Starting OpenCloud backup at $DATE"
|
|
|
|
# Configure rclone for Hetzner S3
|
|
mkdir -p /root/.config/rclone
|
|
cat > /root/.config/rclone/rclone.conf <<EOC
|
|
[hetzner-s3]
|
|
type = s3
|
|
provider = Other
|
|
access_key_id = ${S3_ACCESS_KEY}
|
|
secret_access_key = ${S3_SECRET_KEY}
|
|
endpoint = https://hel1.your-objectstorage.com
|
|
region = hel1
|
|
acl = private
|
|
EOC
|
|
|
|
# Backup OpenCloud data directory
|
|
echo "Backing up data directory..."
|
|
rclone sync /data hetzner-s3:basicstack-backup/opencloud/data-${DATE} \
|
|
--progress \
|
|
--transfers 8 \
|
|
--checkers 8 \
|
|
--stats 1m
|
|
|
|
# Backup configuration
|
|
echo "Backing up configuration..."
|
|
rclone copy /config hetzner-s3:basicstack-backup/opencloud/config-${DATE} \
|
|
--progress
|
|
|
|
# Keep only last 7 days of backups
|
|
echo "Cleaning old backups (keeping last 7 days)..."
|
|
rclone delete hetzner-s3:basicstack-backup/opencloud \
|
|
--min-age 7d \
|
|
--rmdirs
|
|
|
|
echo "Backup completed successfully at $(date)"
|
|
env:
|
|
- name: S3_ACCESS_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: hetzner-s3-credentials
|
|
key: access-key
|
|
- name: S3_SECRET_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: hetzner-s3-credentials
|
|
key: secret-key
|
|
volumeMounts:
|
|
- name: opencloud-data
|
|
mountPath: /data
|
|
readOnly: true
|
|
- name: opencloud-config
|
|
mountPath: /config
|
|
readOnly: true
|
|
resources:
|
|
requests:
|
|
memory: "256Mi"
|
|
cpu: "100m"
|
|
limits:
|
|
memory: "512Mi"
|
|
cpu: "500m"
|
|
volumes:
|
|
- name: opencloud-data
|
|
persistentVolumeClaim:
|
|
claimName: opencloud-data
|
|
- name: opencloud-config
|
|
configMap:
|
|
name: opencloud-config
|