👻
Supabaseのバックアップをpsql経由で取る
こんにちは!
今回はSupabaseでバックアップを取る方法についてまとめます。
課金すればSupabase側でバックアップとってくれるみたいですが、できるなら無料でやりたいというモチベーションで行いました。
方針
postgresにcliで接続できるpsqlを用いる。
コード
postgresqlのバージョンに柔軟に対応できるようにdockerコンテナで行います。
環境変数は.envに作ってください。
パスワードの環境変数をPGPASSWORDにしとくとpsqlの接続時に自動で読み込んでくれます。
docker-compose.yml
version: '3'
services:
pg_dump:
image: postgres:${POSTGRES_VERSION}
environment:
POSTGRES_HOST: $POSTGRES_HOST
POSTGRES_PORT: $POSTGRES_PORT
POSTGRES_USER: $POSTGRES_USER
POSTGRES_DB: $POSTGRES_DB
PGPASSWORD: $POSTGRES_PASSWORD
volumes:
- .:/app
working_dir: /app
command: sh -c "chmod 777 -R /app && ./dump.sh"
Dump
dump.sh
#!/bin/bash
BACKUP_FILE="dump/backup_$(date +'%Y-%m-%d').sql"
pg_dump -h $POSTGRES_HOST -p $POSTGRES_PORT -U $POSTGRES_USER -d $POSTGRES_DB -v -f $BACKUP_FILE && ls $BACKUP_FILE
# 一週間以上前のやつ削除
ls ./dump | sort -r | sed -e '1,7d' | xargs -I {} rm "./dump/{}"
echo "Dump complete!"
docker-compose up
で./dump/YYYY-MM-DD.sqlにバックアップファイルが作成されるはず。
Restore
restore.sh
#!/bin/bash
# 最新のバックアップファイル取得
BACKUP_FILE=$(ls dump/backup_*.sql | sort -r | head -n 1)
until pg_isready -h $POSTGRES_HOST -p $POSTGRES_PORT; do
echo "Waiting for database to start..."
sleep 1
done
psql -h $POSTGRES_HOST -p $POSTGRES_PORT -U $POSTGRES_USER -d $POSTGRES_DB -f $BACKUP_FILE
echo "Restore complete!"
僕はcronとかで夜中に叩いてます。
サーバーはgceの無料枠で行いました!他に良い手法があれば教えてください!
参考
- pythonでやってる例
- スクラップ
Discussion