·조회수 155

Github Actionsを使用したスケジューリング

DLogブログサービスを開始する際、最も心配だった部分はデータベースのバックアップだった。MongoDB Atlasなどのクラウドサービスを使用していれば自動バックアップが提供されるだろうが、私はオンプレミス環境でMongoDBを運用していたため直接バックアップシステムを構築しなければならなかった

最初は簡単にUbuntuのcronコマンドを使用して定期的にmongodumpを実行するように設定した。しかし、ある時点からこのスケジューリングがもはや機能しなくなり、それに気づかずにDBマイグレーションを進めているうちに一部のデータが失われる危険な状況に直面した

その後、「絶対に落ちないバックアップシステム」が必要だと判断した。悩んだ末に選択した方法はGitHub Actionsのスケジュール機能を利用することだった。この方法には以下の利点がある:

  • サーバーが落ちたり再起動しても影響を受けない

  • GitHub Actions自体が安定して動作する

  • バックアップログがGitHubに残るため、問題発生時に迅速に原因特定が可能

今では毎日決まった時間にmongodumpでバックアップしたアーカイブファイルを作成し、それをAWS S3にアップロードするように設定している。

不安だったバックアップが、今や信頼できる自動化されたシステムに変わった。

name: MongoDB Backup

on:
  schedule:
    - cron: "0 16 * * *" # 매일 KST 새벽 1시
  workflow_dispatch:

jobs:
  backup:
    runs-on: self-hosted

    env:
      CONTAINER_NAME: mongodb
      MONGO_URI: ${{ secrets.MONGO_URI }}
      AWS_BUCKET: danver-db-backup
      AWS_REGION: ap-northeast-2

    steps:
      - name: Set backup file path
        run: |
          DATE=$(date +'%Y%m%d_%H%M%S')
          FILENAME="mongo_backup_$DATE.gz"
          BACKUP_PATH="/tmp/$FILENAME"
          echo "BACKUP_PATH=$BACKUP_PATH" >> $GITHUB_ENV
          echo "FILENAME=$FILENAME" >> $GITHUB_ENV

      - name: Run mongodump
        run: |
          docker exec $CONTAINER_NAME mongodump \
            --uri="$MONGO_URI" \
            --archive \
            --gzip > "$BACKUP_PATH"

      - name: Upload to AWS S3
        run: |
          export AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}
          export AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws s3 cp "$BACKUP_PATH" "s3://$AWS_BUCKET/$FILENAME" --region $AWS_REGION

      - name: Cleanup
        run: rm -f "$BACKUP_PATH"
김지식
김지식
웹, 앱 개발자입니다.

댓글

댓글을 불러오는 중...