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/