stack.basicstack.de/apps/opencloud/backup-cronjob.yaml
CTO Agent 6cc1df6c66 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>
2026-07-12 09:19:28 +00:00

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