먼저 완성 구조부터

프로그램 판매·관리 웹에서 말하는 server는 별도 Windows Server PC를 하나 사는 뜻이 아닙니다. Cloudflare에서는 공개 화면은 Pages가 전달하고, 저장·로그인·문의·upload 같은 backend logic은 Pages Functions 또는 Worker가 실행합니다. data는 D1, 큰 프로그램 파일은 R2에 둡니다.

WEBPages카드·상세·관리자 UI
SERVERFunctions / Workerlogin·API·권한
DATAD1 + R2DB·EXE·ZIP
NOTICETelegram문의·운영 알림
MYWEB 실제 사례

오늘 이 구조로 프로그램 판매·관리 웹의 GitHub 자동배포와 Cloudflare backend resource를 연결했습니다. 이 글은 그 실제 작업 순서를 독자용 가상 값으로 바꿔 정리한 것입니다.

오늘 실제로 진행한 순서

  1. GitHub에 빈 repository를 만들고 main branch를 준비
  2. ChatGPT의 GitHub 연결에서 현재 제공된 write action을 확인
  3. AI가 기존 repository에 source file·branch·commit을 작성
  4. Cloudflare Pages에서 GitHub repository를 처음 한 번 승인·연결
  5. main을 production branch로 지정해 자동 배포 연결
  6. 관리자·문의 저장용 D1 Database를 만들고 binding 이름을 DB로 연결
  7. 이미지·EXE·ZIP용 private R2 bucket을 만들고 binding 이름을 FILES로 연결
  8. Telegram Bot token 같은 민감값은 source가 아니라 Secret으로 등록
  9. /api/health, 관리자 login, CRUD, upload, 문의 저장을 실제 확인
  10. 그다음부터는 GitHub production branch가 바뀌면 Cloudflare가 자동 재배포
중요

GitHub app을 연결했다고 모든 action이 생기는 것은 아닙니다. create_repository가 없으면 새 repository 생성은 계정 소유자가 한 번 처리하고, create_file·create_commit·update_ref 같은 write action이 있으면 그다음 source 작업은 AI가 이어갈 수 있습니다.

정적 웹과 server가 필요한 웹 구분

기능Pages만Functions/Worker + D1/R2
프로그램 소개 카드가능선택
상세 설명·공지가능선택
관리자 login불충분필요
프로그램 등록·수정불충분D1 필요
EXE·ZIP upload부적합private R2 권장
구매 문의 저장불충분D1 + Worker
Telegram 자동 알림불충분Worker + Secret
결제·license불충분server-side 검증 필요

GitHub 자동배포를 유지하는 Dashboard 설정

GitHub push마다 자동으로 다시 배포하려면 Pages project를 Git integration으로 만드는 방식이 가장 단순합니다.

  1. Cloudflare → Workers 및 Pages애플리케이션 만들기Pages
  2. Git에 연결 → GitHub 승인 → 본인 repository 선택
  3. Production branch는 main
  4. 순수 HTML이면 output directory는 실제 index.html이 있는 folder, 이 guide 예시는 public
  5. project 생성 후 Settings/Bindings에서 D1 DB, R2 FILES 연결
  6. Variables and Secrets에서 Telegram token·session secret 같은 비밀값 등록
Git 자동배포와 Direct Upload를 섞지 마세요

처음부터 GitHub 자동배포가 목표라면 Git integration project로 시작합니다. 별도 Direct Upload project를 만든 뒤 같은 project를 Git integration으로 바꾸는 흐름에 의존하지 않습니다.

server resource를 빠르게 만드는 Wrangler 명령

Cloudflare CLI인 Wrangler를 사용하면 D1, R2, Secret을 command로 만들 수 있습니다. 아래 이름은 모두 가상 예시이므로 본인 project 이름으로 바꿉니다.

npx wrangler login

# Pages project를 CLI-only 방식으로 만들 때
npx wrangler pages project create sample-program-store --production-branch main

# Database
npx wrangler d1 create sample-program-store-db

# 프로그램 파일 저장소
npx wrangler r2 bucket create sample-program-store-files

# Pages Secret — 실행 후 값은 terminal prompt에서 입력
npx wrangler pages secret put TELEGRAM_BOT_TOKEN --project-name sample-program-store

단, GitHub 자동배포 project를 원한다면 Pages project 자체는 위 Dashboard의 Git integration으로 연결하고, Wrangler 명령은 D1·R2·Secret 생성/관리용으로 사용하는 편이 이해하기 쉽습니다. D1과 R2를 만든 뒤에는 Pages Functions가 사용할 수 있도록 binding을 연결합니다.

Cloudflare 공식: Pages Git integration ↗ · Pages Wrangler commands ↗ · D1 commands ↗ · R2 commands ↗

Telegram까지 붙이는 위치

Telegram Bot token은 JavaScript source나 GitHub repository에 넣지 않습니다. Cloudflare Secret으로 저장하고 Functions/Worker에서만 읽습니다.

TELEGRAM_BOT_TOKEN = Secret
TELEGRAM_CHAT_ID    = Secret 또는 비공개 environment variable

문의 form
→ Worker API
→ D1 inquiries 저장
→ Telegram Bot API 알림
→ 관리자 페이지에서 같은 문의 확인

Telegram 전송이 실패해도 문의 Database 저장까지 같이 rollback할지, 문의는 저장하고 알림만 retry할지는 business rule로 명시합니다. 일반적으로 고객 문의 자체는 보존하고 Telegram 알림 실패를 별도 log/retry하는 편이 안전합니다.

배포 완료라고 말하기 전 검사

  • production URL이 200으로 열림
  • Cloudflare deployment commit SHA와 GitHub production commit이 일치
  • /api/health에서 backend 상태 확인
  • D1 DB binding 실제 query 성공
  • R2 FILES upload/read/delete 권한 검사
  • 관리자 login → program 생성 → 수정 → 공개가 실제 저장됨
  • 문의 form → D1 저장 → Telegram 알림 확인
  • Secret이 GitHub file·build log·브라우저 JavaScript에 노출되지 않음
  • 큰 프로그램 파일은 public Git repository에 직접 넣지 않음
  • rollback할 이전 commit/deployment 기록

최초 연결 후에는 자동입니다

1code 수정AI/Codex/Cursor
2GitHub commitproduction branch
3Cloudflare build자동 실행
4production새 version 반영

즉, 처음 계정 승인·Git 연결·D1/R2/Secret binding만 끝나면 일상적인 웹 수정은 GitHub source 수정 → commit → Cloudflare 자동 재배포로 반복됩니다.

한방배포 기준

“server를 만들었다”의 완료 기준은 Cloudflare resource 이름이 생긴 것이 아니라, 실제 production URL에서 login·Database·upload·알림까지 끝까지 통과한 상태입니다.

이전 guide← 예시값을 내 계정 값으로 바꾸기