Skip to content

Database Backup

Database Backup #91

Workflow file for this run

name: Database Backup
on:
schedule:
- cron: "20 * * * *" # Run every hour at 20 minutes past the hour
workflow_dispatch: # Allow manual triggering
env:
STORE_NUMBER_OF_DAYS_BACKUP: 7 # Default value, can be overridden in repository secrets
POSTGRES_CONTAINER: postgres_db # New environment variable for the container name
jobs:
backup:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Run backup script
uses: appleboy/[email protected]
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USER }}
key: ${{ secrets.SSH_KEY }}
script: |
set -e
TIMESTAMP=$(date +"%Y%m%d%H%M")
BACKUP_DIR="$HOME/pg_snapshots"
BACKUP_FILENAME="postgres_backup_${TIMESTAMP}.sql"
BACKUP_FILE="$BACKUP_DIR/$BACKUP_FILENAME"
STORE_NUMBER_OF_DAYS_BACKUP=${STORE_NUMBER_OF_DAYS_BACKUP:-3}
mkdir -p $BACKUP_DIR
if ! docker exec -t ${{ env.POSTGRES_CONTAINER }} pg_dump ${{ secrets.POSTGRES_DB }} -a -U "${{ secrets.POSTGRES_USER }}" | bzip2 | openssl smime -encrypt -aes256 -binary -outform DEM -out "$BACKUP_FILE" ${{ secrets.BACKUP_PUBLIC_KEY }}; then
echo "Database backup failed. Please check the logs for more information."
exit 1
fi
./b2 file upload ${{ secrets.BACKBLAZE_BUCKET }} "$BACKUP_FILE" "$BACKUP_FILENAME"
find $BACKUP_DIR -type f -name "*.sql" -mtime "+$STORE_NUMBER_OF_DAYS_BACKUP" -delete
echo "Backup completed at $TIMESTAMP"