👻

Supabaseのバックアップをpsql経由で取る

2023/03/05に公開

こんにちは!

今回は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でやってる例

https://qiita.com/rice_american/items/ceae28dad13c3977e3a8

  • スクラップ

https://zenn.dev/www_y/scraps/1f793e67e4d1cd

GitHubで編集を提案

Discussion