Supabase 무료 플랜 7일 일시정지, Workers Cron으로 막기
Supabase Free 프로젝트가 7일 비활동으로 잠드는 문제를 Cloudflare Workers Cron Trigger keepalive로 해결하는 방법을 정리했어요.
혹시 오랜만에 사이드 프로젝트에 접속했다가 "Project paused" 화면을 만난 적 없나요? Supabase 무료 플랜은 7일 동안 활동이 없으면 프로젝트를 자동으로 일시정지해요. 데이터가 사라지는 건 아니지만, 대시보드에서 복구 버튼을 눌러야 하고 그동안 API 요청은 전부 실패해요.
저는 라이프케어로그라는 이름으로 여러 서비스를 혼자 운영하는데, 플랜티(plan-t)처럼 아직 개발 중인 앱은 실사용 트래픽이 없어서 이 문제를 정확히 겪었어요. 그래서 Cloudflare Workers의 Cron Trigger로 keepalive를 만들었는데, 직접 만들어 보니 파일 2개에 10분 정도면 끝나는 작업이었어요.
왜 잠들고, 뭘 보내야 깨어 있나
일시정지 기준은 프로젝트에 들어오는 활동이에요. 테스트해 보면 REST API로 가벼운 조회 한 번만 보내도 활동으로 집계돼요. 무거운 쿼리 대신 keepalive 전용 테이블에서 행 하나만 읽는 요청이면 충분해요.
Workers Cron으로 만들기
wrangler.toml에 cron 한 줄을 추가해요. 매일 0시 UTC에 한 번 실행돼요.
[triggers]
crons = ["0 0 * * *"]Worker의 scheduled 핸들러에서 Supabase REST 엔드포인트를 호출해요.
export default {
async scheduled(event, env, ctx) {
const res = await fetch(
`${env.SUPABASE_URL}/rest/v1/keepalive?select=id&limit=1`,
{ headers: { apikey: env.SUPABASE_ANON_KEY } }
);
if (!res.ok) throw new Error(`keepalive failed: ${res.status}`);
},
};키는 코드에 넣지 말고 wrangler secret put으로 등록하세요. 여기서 쓰는 건 anon 키라 노출 위험이 낮지만, service_role 키는 어떤 경우에도 Worker에 두면 안 돼요. keepalive 테이블에 RLS를 켜고 읽기 정책 하나만 열어 두면 anon 키로도 조회가 돼요.
돌려 보니
하루 1번 스케줄로 적용해 봤더니 7일 한도 대비 여유가 커서, 실행이 한 번쯤 실패해도 안전했어요. Workers 무료 플랜은 하루 10만 요청까지 허용되니 keepalive 하루 1건은 부담이 없고요.
한 가지 주의할 점이 있어요. 응답 상태를 확인하지 않으면 프로젝트가 이미 잠들었는데도 cron 로그는 계속 성공으로 보여요. 그래서 res.ok 체크와 실패 시 throw를 꼭 넣었어요. 이게 있어야 Workers 대시보드에서 실패 기록을 발견할 수 있어요.
무료 인프라로 버티는 시기엔 이런 작은 도구 하나가 반복을 줄여줘요. 여러분의 잠든 프로젝트도 10분 투자로 깨워 두세요.
관련 글
댓글
아직 댓글이 없어요. 첫 댓글을 남겨주세요.