Supabase 무료 플랜, 2주면 잠든다? GitHub Actions로 자동 깨우는 법

안녕하세요 하랑입니다.
저는 바이브 코딩을 할때 보통 제미나이와 클로드를 교차 사용하며 아이디어 정리와 PRD를 작성하고 커서를 활용해서 개발, git-hub을 사용한 개발 버전관리, vercel을 사용한 배포, supabase를 사용한 데이터 축적 하는 식으로 활용하고 있어요.
교육하면서 배운 툴이다 보니 아무래도 손이 먼저 가는 것 같아요. 이중에 백엔드를 담당하는 supabase는 무료 플랜도 훌륭해서 잘 쓰고 있지만 치명적인 단점이 하나있어요… 바로바로 자동 PAUSE (일시정지) ! 두둥

Supabase 무료 플랜, 2주면 잠든다? GitHub Actions로 자동 깨우는 법

Supabase 무료 플랜을 사용하다 갑자기 DB에 접속이 안 됐던 경험, 있으신가요?
알고 보면 이유는 단순합니다. Supabase는 무료 플랜 프로젝트가 7일 이상 비활성 상태이면 자동으로 휴면(Pause) 처리합니다. 오늘은 이 문제를 자동으로, 그리고 완전히 무료로 해결하는 방법을 알아보겠습니다.

⚠️ 💡26.04.20 업데이트 📌 해당 작업을 진행한 후 code 6 에러가 난 경우 해결방법 👉 바로 확인하세요!

🚨 문제 인식: 어느 날 갑자기 DB가 사라졌다?

사이드 프로젝트나 포트폴리오용 앱을 Supabase 무료 플랜으로 운영하는 개발자라면 한 번쯤 이런 경험을 해봤을 것입니다.

며칠 만에 앱에 접속했더니 “Database is paused” 라는 메시지와 함께 서비스가 완전히 먹통이 된 상황. 사용자가 로그인도 못 하고, 데이터도 불러오지 못합니다. 당황해서 대시보드에 들어가 보면 프로젝트 상태가 Paused(일시정지)로 표시되어 있습니다.

supabase database is paused

Supabase 무료 플랜의 휴면 정책

공식 문서에 따르면, 무료(Free) 플랜의 프로젝트는 다음 조건에 해당할 경우 자동으로 휴면 상태로 전환됩니다:

휴면 상태가 되면 어떻게 될까요?

  • 데이터베이스 연결이 완전히 차단됩니다
  • API 요청이 모두 실패합니다
  • 대시보드에서 수동으로 Restore 버튼을 눌러야 하며, 복구에 수 분이 소요됩니다
  • 복구 후에도 콜드 스타트로 인해 초기 응답이 느려집니다

매번 수동으로 복구하는 것은 번거롭고, 특히 운영 중인 서비스라면 사용자 경험에 치명적입니다. 개발자가 자리를 비운 사이 서비스가 멈춰버리는 상황은 반드시 방지해야 합니다.


💡 해결 방법 3가지

이 문제를 해결하는 방법은 크게 세 가지가 있다고 제미나이는 안내 하고 있습니다.
각각의 특징을 먼저 살펴보겠습니다.

방법 1. ✅ GitHub Actions 활용 (추천)

GitHub의 CI/CD 자동화 도구인 GitHub Actions를 활용해 주기적으로 Supabase DB에 쿼리를 날려 활성 상태를 유지하는 방법입니다. 완전 무료이며, 별도 서버 없이 코드 한 번으로 세팅이 완료됩니다. 이미 GitHub을 사용하는 개발자라면 가장 간편하게 적용할 수 있습니다.

방법 2. 외부 Cron Job 서비스 활용

Cron-job.org, UptimeRobot 등의 외부 서비스를 이용해 주기적으로 Supabase API 엔드포인트에 HTTP 요청을 보내는 방법입니다. 설정이 간단하지만, 외부 서비스에 의존해야 하고 무료 플랜에서는 요청 간격 제한이 있을 수 있습니다.

방법 3. Vercel / Render 등 플랫폼의 Cron 기능 활용

이미 Vercel이나 Render 같은 플랫폼에 앱을 배포하고 있다면, 해당 플랫폼에서 제공하는 Scheduled Functions(스케줄 함수)를 이용하는 방법입니다. 앱과 DB 관리를 한 곳에서 할 수 있다는 장점이 있지만, 플랫폼마다 설정 방식이 다르고 제약이 있을 수 있습니다.


아무래도 저는 익숙한 github Actions를 활용하는게 제일 간단 할 것 같네요. 그러므로 방법 1로 갑니다.

🔧 방법 1 상세 설명: GitHub Actions로 자동화하기

세 가지 방법 중 GitHub Actions를 선택한 이유는 명확합니다.

  • 완전 무료: GitHub Actions는 공개 저장소에서 무제한, 비공개 저장소에서도 월 2,000분의 무료 사용 시간을 제공합니다
  • 별도 서버 불필요: 인프라 관리 없이 YAML 파일 하나로 끝납니다
  • 안전한 시크릿 관리: DB URL과 API 키를 GitHub Secrets에 암호화하여 저장합니다
  • GitHub 생태계 통합: 이미 GitHub으로 프로젝트를 관리하고 있다면 추가 도구 없이 바로 적용 가능합니다

사전 준비물

시작하기 전에 아래 정보를 준비해 주세요.

  1. Supabase 프로젝트 URL: https://[프로젝트 ID].supabase.co
  2. Supabase anon 키 (공개 API 키): 대시보드 > Settings > API 에서 확인
  3. GitHub 저장소: 기존 프로젝트 저장소를 사용하거나, 이 용도만을 위한 새 저장소를 생성해도 됩니다

Step 1. GitHub Secrets에 환경변수 등록

먼저 Supabase 접속 정보를 코드에 직접 노출하지 않도록 GitHub Secrets에 등록합니다.

  1. GitHub 저장소 페이지로 이동합니다
  2. 상단 탭에서 Settings 클릭
  3. 왼쪽 사이드바에서 Secrets and variables > Actions 클릭
  4. New repository secret 버튼 클릭 후 아래 두 가지를 각각 등록
Secret 이름
SUPABASE_URLhttps://[프로젝트ID].supabase.co
SUPABASE_ANON_KEYSupabase 대시보드에서 복사한 anon 키

⚠️ 주의: anon 키는 공개 API 키이지만, 그래도 코드에 직접 하드코딩하지 않는 습관을 들이는 것이 좋습니다.

Step 2. GitHub Actions 워크플로우 파일 생성

저장소 루트 디렉토리에 .github/workflows/ 폴더를 생성하고, 그 안에 keep-alive.yml 파일을 만듭니다.

name: Supabase Keep Alive

on:
  schedule:
    # 매 5일마다 실행 (UTC 기준 오전 9시)
    # Supabase 휴면 기준인 7일보다 여유 있게 설정
    - cron: '0 0 */5 * *'
  workflow_dispatch: # 수동 실행도 가능하도록 설정

jobs:
  keep-alive:
    runs-on: ubuntu-latest

    steps:
      - name: Supabase DB에 Keep-Alive 쿼리 전송
        run: |
          curl -X POST '${{ secrets.SUPABASE_URL }}/rest/v1/rpc/ping' \
            -H 'apikey: ${{ secrets.SUPABASE_ANON_KEY }}' \
            -H 'Authorization: Bearer ${{ secrets.SUPABASE_ANON_KEY }}' \
            -H 'Content-Type: application/json' \
            --fail \
            --silent \
            --show-error
        continue-on-error: true

      - name: 단순 헬스체크 (RPC가 없을 경우 대비)
        run: |
          STATUS=$(curl -o /dev/null -s -w "%{http_code}" \
            '${{ secrets.SUPABASE_URL }}/rest/v1/' \
            -H 'apikey: ${{ secrets.SUPABASE_ANON_KEY }}')
          echo "Supabase 응답 상태 코드: $STATUS"
          if [ "$STATUS" -ge 200 ] && [ "$STATUS" -lt 400 ]; then
            echo "✅ Keep-alive 성공"
          else
            echo "⚠️ 응답 코드 확인 필요: $STATUS"
          fi

Step 3. (선택) Supabase에 ping 함수 만들기

위 워크플로우에서 /rpc/ping 엔드포인트를 호출하는 경우, Supabase SQL 에디터에서 아래 함수를 미리 생성해두면 더욱 명확한 활성화 신호를 줄 수 있습니다.

Supabase 대시보드 > SQL Editor로 이동하여 아래 SQL을 실행합니다.

-- ping 함수 생성
CREATE OR REPLACE FUNCTION ping()
RETURNS TEXT AS $$
BEGIN
  RETURN 'pong';
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

이렇게 하면 GitHub Actions가 실행될 때 ping() 함수를 호출하여 실제 DB 쿼리가 실행되고, Supabase 입장에서도 정상적인 활동으로 인식합니다.

supabase keep alive

Step 4. 워크플로우 동작 확인

파일을 저장소에 push한 후, GitHub 저장소의 Actions 탭으로 이동합니다.

  • Supabase Keep Alive 워크플로우가 목록에 표시되면 등록 성공입니다
  • 우측의 Run workflow 버튼을 눌러 수동으로 즉시 실행하여 정상 동작을 확인해 보세요
  • 각 스텝 옆에 ✅ 체크 표시가 뜨면 성공입니다
github workflows

cron 스케줄 설정 팁

# cron 표현식: 분 시 일 월 요일
'0 0 */5 * *'   → 5일마다 UTC 자정에 실행
'0 9 */3 * *'   → 3일마다 UTC 오전 9시에 실행 (한국 시간 오후 6시)
'0 0 * * 1'     → 매주 월요일 자정에 실행

Supabase 휴면 기준이 7일이므로, 5일 이하 간격으로 설정하는 것을 권장합니다.


✅ 마무리 및 주의사항

GitHub Actions를 활용하면 단 하나의 YAML 파일로 Supabase 무료 플랜의 휴면 전환을 완전 자동으로 방지할 수 있습니다.

이 방법을 사용할때에는 아래 내용을 주의 해 주세요.

  • 이 방법은 어디까지나 개발/사이드 프로젝트용입니다. 실제 서비스 운영 중이라면 Supabase Pro 플랜 전환을 강력히 권장합니다. 실제 고객이 서비스를 이용하던중에는 오류나지 않도록 하는게 최우선 이니까욥!
  • GitHub Actions의 schedule 트리거는 정확한 시간 보장이 되지 않습니다. 서버 부하에 따라 수분~수십 분 지연될 수 있습니다 중간중간 워크 플로우의 ping 진행 여부를 확인하는게 좋아요.
  • API 키를 코드에 절대 직접 넣지 마세요. 반드시 GitHub Secrets를 활용하세요 외부 해킹의 우려가 있습니다.
  • 오랫동안 사용하지 않을 프로젝트라면 Supabase 대시보드에서 직접 Pause를 걸어두는 것이 리소스 관리 측면에서 더 나을 수 있습니다

이제 주말 동안 손 놓고 있어도 Supabase DB가 조용히 꺼지는 걱정은 하지 않아도 됩니다. GitHub Actions가 알아서 5일마다 Supabase를 깨워줄 테니까요. 😊 저는 mvp를 개발하면서 여러 프로젝트를 하다보면 PAUSE 되는 일이 빈번하게 발생했는데요. 이 방법으로 도움을 받아 참 다행이에요. 같은 어려움을 겪는 여러분께도 도움을 드릴 수 있다면 좋겠네요.


저는 지금 제주도 워케이션 경험을 포스팅하고 있는데요. 오늘은 잠시 수파베이스를 깨운 이야기로 나왔네요. 다시 제주 워케이션 경험과 토이프로젝트 이야기로 돌아갈 예정이니 많은 관심 부탁드립니다.

[제주워케이션]2. 토이프로젝트-AI 바이브코딩으로 달러를 벌어볼까?

[제주워케이션]1. 바다보며 일하는 행복이란!

댓글 남기기