·조회수 153

Github Actions를 이용한 스케줄링

DLog 블로그 서비스를 시작하면서 가장 걱정됐던 부분은 바로 데이터베이스 백업이었다. MongoDB Atlas 같은 클라우드 서비스를 사용하고 있다면 자동 백업이 제공되겠지만, 나는 온프레미스 환경에서 MongoDB를 운영하고 있었기 때문에 직접 백업 시스템을 구축해야 했다.

처음에는 간단하게 Ubuntu의 cron 명령어를 이용해 정기적으로 mongodump를 실행하도록 설정했다. 하지만 어느 순간부터 이 스케줄링이 더 이상 작동하지 않았고, 이를 미처 파악하지 못한 채 DB 마이그레이션을 진행하다 보니 일부 데이터가 유실되는 아찔한 상황을 겪었다.

이후 “절대 꺼지지 않을 백업 시스템”이 필요하다고 판단했다. 고민 끝에 선택한 방법은 GitHub Actions의 schedule 기능을 이용하는 것이었다. 이 방식은 다음과 같은 장점이 있다:

  • 서버가 꺼지거나 재부팅되어도 영향을 받지 않는다

  • 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"
김지식
김지식
웹, 앱 개발자입니다.

댓글

댓글을 불러오는 중...