·조회수 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"

김지식
웹, 앱 개발자입니다.