Configure OpenCloud daily backup to Hetzner Object Storage

- 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>
This commit is contained in:
CTO Agent 2026-07-11 14:09:21 +00:00
parent 5e02c64dc4
commit 6cc1df6c66

View file

@ -15,6 +15,17 @@ 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
@ -27,20 +38,21 @@ spec:
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://fsn1.your-objectstorage.com
region = fsn1
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:opencloud-backup/data-${DATE} \
rclone sync /data hetzner-s3:basicstack-backup/opencloud/data-${DATE} \
--progress \
--transfers 8 \
--checkers 8 \
@ -48,12 +60,12 @@ spec:
# Backup configuration
echo "Backing up configuration..."
rclone copy /config hetzner-s3:opencloud-backup/config-${DATE} \
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:opencloud-backup \
rclone delete hetzner-s3:basicstack-backup/opencloud \
--min-age 7d \
--rmdirs