Supabase Disaster Recovery Backup #10
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Supabase Disaster Recovery Backup | |
| on: | |
| # Run daily at 02:00 IST (20:30 UTC previous day) | |
| schedule: | |
| - cron: '30 20 * * *' | |
| # Allow manual trigger | |
| workflow_dispatch: | |
| jobs: | |
| backup: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Install PostgreSQL 17 client tools | |
| run: | | |
| # Add PostgreSQL 17 repository | |
| sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' | |
| wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - | |
| sudo apt-get update | |
| # Install PostgreSQL 17 client tools | |
| sudo apt-get install -y postgresql-client-17 | |
| # Set up alternatives to use PostgreSQL 17 by default | |
| sudo update-alternatives --install /usr/bin/psql psql /usr/lib/postgresql/17/bin/psql 100 | |
| sudo update-alternatives --install /usr/bin/pg_dump pg_dump /usr/lib/postgresql/17/bin/pg_dump 100 | |
| sudo update-alternatives --install /usr/bin/pg_restore pg_restore /usr/lib/postgresql/17/bin/pg_restore 100 | |
| - name: Verify tools installation | |
| run: | | |
| psql --version | |
| pg_dump --version | |
| pg_restore --version | |
| - name: Create backup directory | |
| run: mkdir -p supabase_snapshot | |
| - name: Verify SUPABASE_DB_URL is set | |
| env: | |
| SUPABASE_DB_URL: ${{ secrets.SUPABASE_DB_URL }} | |
| run: | | |
| if [ -z "$SUPABASE_DB_URL" ]; then | |
| echo "❌ ERROR: SUPABASE_DB_URL is not set!" | |
| echo "Please add SUPABASE_DB_URL to your repository secrets." | |
| exit 1 | |
| else | |
| echo "✅ SUPABASE_DB_URL is set (length: ${#SUPABASE_DB_URL} characters)" | |
| fi | |
| - name: Run backup script | |
| env: | |
| SUPABASE_DB_URL: ${{ secrets.SUPABASE_DB_URL }} | |
| run: | | |
| chmod +x backup.sh | |
| # Explicitly export the environment variable | |
| export SUPABASE_DB_URL="${SUPABASE_DB_URL}" | |
| # Ensure PostgreSQL 17 binaries are in PATH | |
| export PATH="/usr/lib/postgresql/17/bin:$PATH" | |
| ./backup.sh | |
| - name: List backup files | |
| run: | | |
| echo "Backup files created:" | |
| ls -lh supabase_snapshot/ | |
| - name: Upload backup artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: supabase-backup-${{ github.run_number }}-${{ github.run_attempt }} | |
| path: supabase_snapshot/ | |
| retention-days: 30 | |
| compression-level: 9 | |
| - name: Generate job summary | |
| if: always() | |
| run: | | |
| echo "# Supabase Backup Summary" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "**Date:** $(date)" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| if [ -f supabase_snapshot/backup_info.txt ]; then | |
| echo "## Backup Information" >> $GITHUB_STEP_SUMMARY | |
| echo '```' >> $GITHUB_STEP_SUMMARY | |
| cat supabase_snapshot/backup_info.txt >> $GITHUB_STEP_SUMMARY | |
| echo '```' >> $GITHUB_STEP_SUMMARY | |
| fi | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "## Backup Files" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "| File | Size |" >> $GITHUB_STEP_SUMMARY | |
| echo "|------|------|" >> $GITHUB_STEP_SUMMARY | |
| for file in supabase_snapshot/*; do | |
| if [ -f "$file" ]; then | |
| filename=$(basename "$file") | |
| size=$(du -h "$file" | cut -f1) | |
| echo "| $filename | $size |" >> $GITHUB_STEP_SUMMARY | |
| fi | |
| done | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "✅ Backup completed successfully!" >> $GITHUB_STEP_SUMMARY |