先日の記事に続き、GitHub Actionsネタです。

Gigalixirの無料枠のデータベースには

  • バックアップなし
  • 10000レコードの上限

という制約があります。商用には向かないものの、個人開発や小規模なCMSなどには十分に使えるレコード数ですね。

ただ、バックアップがないと心もとないので、GitHub Actionsからpg_dumpを実行し、バックアップファイルをS3に逃すworkflowを書いてみました。ニッチな用途ですが記事にしておきます。

GigalixirのデータベースURLの確認

Gigalixirのデータベースの接続情報はCLIからgigalixir configを打つと確認できます。

$ gigalixir config
{
  "DATABASE_URL": "ecto://<ユーザー名>:<パスワード>@<ホスト>:5432/<データベース名>"
}

これで確認した接続情報を使って、workflowを記述します。

.github/workflows/backup.yml

書いてみたymlファイルは以下の通りです。

name: backup postgresql database
on:
  schedule: ・・・(1)
    - cron: "0 17 * * 0"
jobs:
  setup:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: Set up Python 3.x
      uses: actions/setup-python@v1
      with:
        python-version: '3.x'
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip awscli  ・・・(2)
    - name: Install PostgreSQL
      run: |
        sudo apt-get install postgresql postgresql-contrib  ・・・(3)
    - name: Setup .pgpass   ・・・(4)
      run: |
        echo "${{ secrets.DB_HOST }}:5432:${{ secrets.DB_NAME }}:${{ secrets.DB_USER }}:${{ secrets.DB_PASS }}" > ~/.pgpass
        chmod 0600 ~/.pgpass
    - name: dump    ・・・(5)
      run: |
        pg_dump -U ${{ secrets.DB_USER }} -d ${{ secrets.DB_NAME }} -h ${{ secrets.DB_HOST }} > $(date +%a)_backup.sql
    - name: cp to s3
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      run: |
        aws s3 cp $(date +%a)_backup.sql s3://${{ secrets.BUCKUP_BUCKET }}/backup/  ・・・(6)

環境変数はそれぞれGitHubのSettings>Secretsから登録しておいてください。

  • (1) GitHub Actionsではcronのフォーマットを指定して定期実行が可能です。ドキュメントはこちらから。cronの設定はUTCなので注意。今回は試しに週1で日本時間の月曜AM2:00としてみました。
  • (2) ここまでは先日の記事と同様です。S3へのアップロードにawscliを使うので、インストールしておきます。
  • (3) pg_dumpコマンドを利用するために、postgresqlをインストールします。
  • (4) .pgpassをホームディレクトリに置き、パスワード入力なしでpg_dumpコマンドを実行できるようにします。
  • (5) 実際のバックアップ処理です。<曜日>_backup.sqlというファイル名にして、毎回上書きされるようにしました。この辺はスケジュール次第でお好きに設定してください。
  • (6) あとは吐き出されたsqlファイルをaws s3 cpでuploadすれば終わりです。

このymlをmasterにmerge後、cronで設定したタイミングでS3にsqlファイルが格納されていればOKです!

土曜日に動かしてみたので、Sat_backup.sqlというファイル名で出力されています。

s3格納結果

私の場合は100件程レコードを入れた状態で、およそ2分でworkflowが完了しました。2019/10/19時点でプライベートリポジトリだと2000分は無料でワークフローを実行できるので、dailyで実行しても全然余裕ですね!

GitHubAction料金

まとめ

GigalixirとGihub Actionsの組み合わせは個人開発者には救いですね。ありがたい限りです💸