Files
homelab/.gitea/workflows/backup-volumes.yml
2025-10-27 22:13:27 +01:00

115 lines
3.9 KiB
YAML

name: Backup Docker Volumes
on:
schedule:
- cron: '0 2 * * *' # Täglich um 2 Uhr nachts
workflow_dispatch: # Manueller Trigger
jobs:
backup:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Debug - List available volumes
run: |
echo "Available Docker volumes:"
docker volume ls
echo ""
echo "Looking for gitea-related volumes:"
docker volume ls | grep -i gitea || echo "No gitea volumes found with grep"
- name: Create backup directory
run: |
BACKUP_DATE=$(date +%Y%m%d_%H%M%S)
echo "BACKUP_DATE=$BACKUP_DATE" >> $GITHUB_ENV
mkdir -p backups/$BACKUP_DATE
echo "Backup directory created: $(pwd)/backups/$BACKUP_DATE"
- name: Backup Gitea Data Volume
run: |
# Finde den korrekten Volume-Namen
VOLUME_NAME=$(docker volume ls --format '{{.Name}}' | grep 'gitea-data$' | head -n1)
if [ -z "$VOLUME_NAME" ]; then
echo "ERROR: gitea-data volume not found!"
exit 1
fi
echo "Found volume: $VOLUME_NAME"
docker run --rm \
-v "$VOLUME_NAME":/source:ro \
-v $(pwd)/backups/$BACKUP_DATE:/backup \
alpine tar czf /backup/gitea-data.tar.gz -C /source .
ls -lh backups/$BACKUP_DATE/gitea-data.tar.gz
- name: Backup Gitea Database Volume
run: |
VOLUME_NAME=$(docker volume ls --format '{{.Name}}' | grep 'gitea-database$' | head -n1)
if [ -z "$VOLUME_NAME" ]; then
echo "ERROR: gitea-database volume not found!"
exit 1
fi
echo "Found volume: $VOLUME_NAME"
docker run --rm \
-v "$VOLUME_NAME":/source:ro \
-v $(pwd)/backups/$BACKUP_DATE:/backup \
alpine tar czf /backup/gitea-database.tar.gz -C /source .
ls -lh backups/$BACKUP_DATE/gitea-database.tar.gz
- name: Backup MinIO Data Volume
run: |
VOLUME_NAME=$(docker volume ls --format '{{.Name}}' | grep 'minio-data$' | head -n1)
if [ -z "$VOLUME_NAME" ]; then
echo "ERROR: minio-data volume not found!"
exit 1
fi
echo "Found volume: $VOLUME_NAME"
docker run --rm \
-v "$VOLUME_NAME":/source:ro \
-v $(pwd)/backups/$BACKUP_DATE:/backup \
alpine tar czf /backup/minio-data.tar.gz -C /source .
ls -lh backups/$BACKUP_DATE/minio-data.tar.gz
- name: Backup Gitea Runner Data Volume
run: |
VOLUME_NAME=$(docker volume ls --format '{{.Name}}' | grep 'gitea-runner-data$' | head -n1)
if [ -z "$VOLUME_NAME" ]; then
echo "ERROR: gitea-runner-data volume not found!"
exit 1
fi
echo "Found volume: $VOLUME_NAME"
docker run --rm \
-v "$VOLUME_NAME":/source:ro \
-v $(pwd)/backups/$BACKUP_DATE:/backup \
alpine tar czf /backup/gitea-runner-data.tar.gz -C /source .
ls -lh backups/$BACKUP_DATE/gitea-runner-data.tar.gz
- name: Create backup manifest
run: |
cd backups/$BACKUP_DATE
cat > manifest.txt << EOF
Backup created: $(date)
Backup date: $BACKUP_DATE
Files:
$(ls -lh)
Checksums (SHA256):
$(sha256sum *.tar.gz)
EOF
cat manifest.txt
- name: Upload backup artifacts
uses: actions/upload-artifact@v4
with:
name: docker-volumes-backup-${{ env.BACKUP_DATE }}
path: backups/${{ env.BACKUP_DATE }}/
retention-days: 30
- name: Cleanup and summary
run: |
echo "Backup completed successfully!"
echo "Total backup size: $(du -sh backups/$BACKUP_DATE)"
rm -rf backups/