기역월드 K-POP 방송 운영 안내서
Cloudflare 통합판 · 시험 배포(gwkpop-test)부터 일상 운영까지
시험 배포 순서
이번 시험 배포는 새 프로젝트 gwkpop-test에만 올립니다. 지금 운영 중인 gwkpop.com 프로젝트, 가비아·Cloudflare DNS는 건드리지 않습니다.
1폴더 준비
giyeok-site.zip의 압축을 풀면 giyeok-site 폴더가 생깁니다.
노래-1.zip, 노래-2.zip을 풀어 나온 heal-01~14.m4a 14곡을 giyeok-site/music 폴더 안에 넣습니다.
- 확인:
giyeok-site 바로 안에 _worker.js, _routes.json, index.html, admin.html이 보이고, music 폴더에 14곡이 있어야 합니다.
2시험용 프로젝트 만들기
- dash.cloudflare.com 로그인 → 왼쪽 Workers & Pages → Create(생성).
- Pages 탭 → Upload assets(파일 업로드) 선택.
- 프로젝트 이름에
gwkpop-test 입력 → Create project.
giyeok-site 폴더 전체를 끌어다 놓고 → Deploy site.
- 완료되면
https://gwkpop-test.pages.dev 주소가 생깁니다. (이 상태에선 방송 화면만 되고, 관리자는 아직 안 됩니다.)
3데이터베이스(D1) 만들기 — 필수, 무료
- 왼쪽 Storage & Databases → D1 SQL Database → Create.
- 이름
gwkpop-db → Create. (표는 첫 접속 때 자동으로 만들어집니다. 따로 할 일 없음)
4파일 저장소(R2) 만들기 — 선택
- 왼쪽 R2 Object Storage → 처음이면 이용 신청 → Create bucket → 이름
gwkpop-media.
- R2는 처음 신청할 때 결제 카드 등록을 요구할 수 있습니다. 무료 한도(10GB 보관, 내려받기 무료) 안에서는 0원입니다.
- 카드 등록이 꺼려지면 건너뛰어도 됩니다. 이 경우 올린 사진·음원은 D1에 나눠 저장됩니다(5GB까지 무료). 영상은 유튜브 링크를 쓰므로 용량 걱정이 거의 없습니다.
5프로젝트에 연결(바인딩)
- Workers & Pages →
gwkpop-test → Settings(설정) → Bindings(바인딩) → Add.
- D1 database 선택 → 변수 이름
DB (대문자 그대로) → 데이터베이스 gwkpop-db → 저장.
- (R2를 만들었다면) R2 bucket 선택 → 변수 이름
MEDIA → 버킷 gwkpop-media → 저장.
6관리자 비밀번호 저장 — 서버에만 보관
- 같은 Settings → Variables and Secrets(변수 및 비밀) → Add.
- Type(유형): Secret(비밀) · 이름
ADMIN_PASSWORD · 값: 새 비밀번호 → 저장.
- 비밀번호는 10자 이상, 영문·숫자·기호 섞어서. 예전 임시 비밀번호(1005)는 쓰지 마세요.
- Secret으로 저장하면 Cloudflare 화면에서도 다시 보이지 않습니다. 따로 안전한 곳에 적어 두세요.
7한 번 더 올리기(설정 적용)
- 바인딩과 비밀번호는 다음 배포부터 적용됩니다.
gwkpop-test → Deployments(배포) → Create deployment(새 배포) → 같은 giyeok-site 폴더를 다시 끌어다 놓기 → Save and Deploy.
8관리자 첫 로그인
https://gwkpop-test.pages.dev/admin.html 접속 → 비밀번호 입력.
- 처음 로그인하면 기존 내용(뮤직비디오·노래 14곡·라이브·숏츠·홍보모델·공지·편성표)이 자동으로 서버에 옮겨집니다.
- 위에 “즉시 반영” 표시가 보이면 성공입니다. “비밀번호가 설정되지 않음”이 나오면 6·7단계를 다시 확인하세요.
확인 체크리스트 (PC · 모바일)
AI DJ 자동방송 (2차 업그레이드)
- 음원 채널 편성: 관리자 → 음원 → 수정 → 「AI DJ 라디오 채널 편성」에서 곡이 나올 채널을 체크합니다. 한 곡을 여러 채널에 넣을 수 있습니다.
- 방송 편성: 관리자 → 방송 편성 → 시작 시간·DJ·채널·요일·홍보 멘트 간격을 정합니다. 방송 화면 라디오의 「📅 편성대로」가 켜져 있으면 시간에 맞춰 DJ와 채널이 바뀝니다.
- 멘트: 관리자 → AI DJ 멘트 → 새로 추가 → 「기본 초안」 또는 「AI 초안」 → 읽고 고치기 → 상태 「승인」 → 저장. 승인한 멘트만 방송에 나갑니다.
- 음성: 「AI 음성 만들기」를 누르면 MP3로 저장해 계속 재사용합니다. 음성이 없는 멘트는 듣는 사람의 브라우저 음성으로 읽습니다(무료, 기기마다 목소리가 다름).
- 사람 DJ 편성: 방송 편성에서 DJ를 사람 DJ로 고르면 그 시간에 「생방송 시간」 안내가 나오고, ON AIR가 되면 LIVE ON AIR로 전환됩니다.
사람 DJ 생방송 (유튜브 라이브)
- 사람 DJ 명단: 관리자 → 더보기 → 사람 DJ 명단 → 이름·국가·방송 언어·정기 방송 시간·유튜브 링크·사진을 등록합니다.
- 생방송 등록: 유튜브 스튜디오에서 실시간 스트리밍(예약)을 만들고, 관리자 → 사람 DJ 생방송 → 새로 추가 → 그 주소(또는 영상 ID 11자리)를 붙여 넣습니다. 방송 시작 시각과 「방송이 끝나면(다시보기 / AI DJ 라디오)」을 고릅니다.
- 방송 시작: 유튜브에서 방송을 시작한 뒤 목록의 🔴 ON AIR를 누르면 방송국 LIVE ON AIR 화면에 유튜브 공식 플레이어와 실시간 채팅이 바로 나옵니다. 누구나 로그인 없이 무료로 볼 수 있습니다.
- 방송 종료: ■ 방송 종료를 누르면 설정에 따라 다시보기를 보여 주거나 AI DJ 라디오로 안내합니다.
- 라디오에서 「편성대로」로 듣는 사람은 ON AIR가 되면 생방송 화면으로 자동 안내되고, AI DJ 소리는 멈춰 겹치지 않습니다.
자동 감지 (선택 · 무료): Google Cloud에서 YouTube Data API v3를 사용 설정하고 API 키를 만든 뒤(키 제한: YouTube Data API v3만), Cloudflare에 비밀값 YOUTUBE_API_KEY로 넣고 다시 배포합니다. 생방송 항목에서 「유튜브 상태 자동 감지」를 체크하면 1분마다 실제 방송 상태를 확인해 ON AIR와 종료가 저절로 바뀝니다. 시청자가 많아도 확인은 1분에 한 번이라 하루 약 1,440 단위(무료 한도 10,000 단위)만 씁니다.
유튜브 실시간 채팅은 유튜브 정책상 방송국 주소(도메인)에서만 열리고, 글을 쓰려면 시청자의 유튜브 로그인이 필요합니다. 휴대폰 브라우저에서는 채팅 창이 보이지 않을 수 있어 「유튜브에서 보기 · 채팅 쓰기」 버튼을 함께 두었습니다. 방송에 쓰는 음악은 권리를 확인해 주세요(유튜브 저작권 정책).
AI 기능 연결 (선택)
A. AI 초안 — Cloudflare Workers AI (하루 10,000 뉴런 무료)
- gwkpop-test → Settings → Bindings → Add → Workers AI → 변수 이름
AI → 저장.
B. AI 음성 — Google Cloud Text-to-Speech (매월 무료 한도 안에서 0원)
- console.cloud.google.com → 새 프로젝트 만들기 (예: gwkpop-voice).
- 결제 계정 연결 (카드 등록 필요 · 무료 한도 안에서는 청구 없음). 예산 알림을 1,000원 정도로 걸어 두면 안심입니다.
- 「API 및 서비스」 → 라이브러리 → Cloud Text-to-Speech API → 사용.
- 「사용자 인증 정보」 → 사용자 인증 정보 만들기 → API 키 → 키 제한에서 Cloud Text-to-Speech API만 허용.
- Cloudflare → gwkpop-test → Variables and Secrets → Add → 유형 Secret · 이름
GOOGLE_TTS_KEY · 값: 방금 만든 키.
C. A·B 설정 후 한 번 더 배포(Create deployment)해야 적용됩니다. 관리자 → AI DJ 멘트 화면 위에 「연결됨」이 보이면 성공입니다.
| 서비스 | 무료 한도 | 넘으면 |
| Google 음성 Neural2 · Chirp3 HD | 매월 100만 자 | 100만 자당 $16 · $30 |
| Google 음성 WaveNet · Standard | 매월 400만 자 | 100만 자당 $4 |
| Workers AI (초안) | 하루 10,000 뉴런 | 무료 플랜은 그날만 멈춤 |
| 브라우저 음성 | 무제한 무료 | — |
멘트 1개를 100자로 잡으면 200개를 만들어도 2만 자로, 무료 한도의 2% 수준입니다. 음성은 한 번 만들면 다시 만들지 않으므로 청취자가 늘어도 음성 비용은 늘지 않습니다.
매일 운영하는 법
/admin.html 로그인 → 아이콘(뮤직비디오·라이브·쇼츠·드라마·음원·홍보모델) 선택.
- + 새로 추가 → 유튜브 주소 붙여넣기 → 저장. 저장 즉시 방송국에 반영됩니다.
- 여러 개 한꺼번에: 왼쪽 체크 → 아래 공개 / 숨김 / 삭제 버튼.
- 잘못 지웠으면 휴지통에서 복구. “영구 삭제”만 되돌릴 수 없습니다.
- 한 달에 한 번쯤 홈 화면의 백업(data.js) 받기를 눌러 보관하세요.
- 영상은 유튜브에 올리고 링크만 등록하세요. 저장 공간과 비용이 들지 않습니다.
무료 사용량과 비용
| 항목 | 무료 한도 | 넘으면 |
| Pages (화면 파일) | 방문 무제한, 대역폭 무제한 | — |
| 서버(API) 요청 | 하루 10만 회 | 그날만 일시 오류, 자동 과금 없음 |
| D1 데이터베이스 | 5GB, 하루 읽기 500만 · 쓰기 10만 | 그날만 멈춤, 자동 과금 없음 |
| R2 파일 저장(선택) | 10GB, 내려받기 무료 | 10GB 넘으면 GB당 월 약 $0.015 |
방송 화면은 1분 단위로 캐시하고, 사진·음악 파일은 서버를 거치지 않도록 해 두어 한도를 아낍니다. 한도는 매일 오전 9시(한국 시간)에 초기화됩니다. 유료 플랜(Workers Paid, 월 $5)은 지금 필요 없으며, 필요해지면 먼저 말씀드립니다.
비상시
- 서버에 문제가 생겨도 방송 화면은
data.js(비상 사본)로 계속 보입니다.
- 백업 ZIP(giyeok-backup-20261010.zip)은 그대로 보관하세요. 평소에는 ZIP을 다시 올릴 필요가 없습니다.
- 비밀번호를 바꾸려면 6단계에서 값을 바꾸고 7단계처럼 다시 배포하면 됩니다. 기존 로그인은 모두 풀립니다.