Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

110 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๊ฐ€๊ฒฉ.kr โ€” ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋ฐ˜ ํ•œ๊ธ€ ๋‹จ์ถ• URL ์„œ๋น„์Šค

Community-driven Korean subdomain URL shortener. Type ๋งŒ๋‘.๊ฐ€๊ฒฉ.kr to find the best price for ๋งŒ๋‘ (dumplings).

ํ•œ๊ธ€ ํ‚ค์›Œ๋“œ๋กœ ์ตœ์ €๊ฐ€๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”. ๋งŒ๋‘.๊ฐ€๊ฒฉ.kr โ†’ ๋„ค์ด๋ฒ„ ์‡ผํ•‘ ์ตœ์ €๊ฐ€ ํŽ˜์ด์ง€๋กœ ๋ฐ”๋กœ ์ด๋™!

์ปค๋ฎค๋‹ˆํ‹ฐ ํˆฌํ‘œ๋กœ ๊ฐ ํ‚ค์›Œ๋“œ์˜ ๋ชฉ์ ์ง€ URL์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

License: MIT Node.js tests contributions welcome language

์‚ฌ์šฉ๋ฒ•

๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์— {ํ‚ค์›Œ๋“œ}.๊ฐ€๊ฒฉ.kr์„ ์ž…๋ ฅํ•˜์„ธ์š”.

๋งŒ๋‘.๊ฐ€๊ฒฉ.kr  โ†’ ๋งŒ๋‘ ์ตœ์ €๊ฐ€ ๊ฒ€์ƒ‰
๊ฐ€๋ฐฉ.๊ฐ€๊ฒฉ.kr  โ†’ ๊ฐ€๋ฐฉ ์ตœ์ €๊ฐ€ ๊ฒ€์ƒ‰
iphone.๊ฐ€๊ฒฉ.kr โ†’ iPhone ์ตœ์ €๊ฐ€ ๊ฒ€์ƒ‰

์ฐธ์—ฌํ•˜๊ธฐ

๋ˆ„๊ตฌ๋‚˜ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์•„๋ž˜ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์„ธ์š”.

๐Ÿ—ณ๏ธ ํ‚ค์›Œ๋“œ ์ œ์•ˆํ•˜๊ธฐ

์ƒˆ๋กœ์šด ํ‚ค์›Œ๋“œ-URL ๋งคํ•‘์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋‹จ์–ด ์ œ์•ˆํ•˜๊ธฐ โ†’

๐Ÿ‘ ํˆฌํ‘œ๋กœ ์ฐธ์—ฌํ•˜๊ธฐ

๋“ฑ๋ก ๋Œ€๊ธฐ ์ค‘์ธ ํ‚ค์›Œ๋“œ์— ํˆฌํ‘œํ•˜์„ธ์š”. ์—ด๋ฆฐ PR ๋ณด๊ธฐ โ†’

PR์—์„œ ๐Ÿ‘ ๋ฐ˜์‘์„ ๋‹ฌ๋ฉด ํˆฌํ‘œ ์™„๋ฃŒ! 3๊ฐœ ์ด์ƒ ๋ชจ์ด๋ฉด ์ž๋™ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ป ์ฝ”๋“œ ๊ธฐ์—ฌ

๋ฒ„๊ทธ ์ˆ˜์ •, ๊ธฐ๋Šฅ ๊ฐœ์„  ๋“ฑ ์ฝ”๋“œ๋กœ ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์—ฌ ๊ฐ€์ด๋“œ โ†’

ํ‚ค์›Œ๋“œ ๋“ฑ๋ก ํ”„๋กœ์„ธ์Šค

Issue ์ œ์•ˆ โ†’ ์ž๋™ ๊ฒ€์ฆ โ†’ PR ์ƒ์„ฑ โ†’ ์ปค๋ฎค๋‹ˆํ‹ฐ ํˆฌํ‘œ โ†’ ์ž๋™ ๋ณ‘ํ•ฉ โ†’ KV ๋™๊ธฐํ™”
   โ”Œโ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
   โ”‚ ์ œ์•ˆ โ”‚โ”€โ”€โ”€โ†’โ”‚ ๊ฒ€์ฆ โ”‚โ”€โ”€โ”€โ†’โ”‚  PR  โ”‚โ”€โ”€โ”€โ†’โ”‚ ๐Ÿ‘ ํˆฌํ‘œ  โ”‚โ”€โ”€โ”€โ†’โ”‚ ๋ณ‘ํ•ฉ  โ”‚โ”€โ”€โ”€โ†’โ”‚ KV ๋ฐ˜์˜โ”‚
   โ””โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
   Issue ์ž‘์„ฑ   ๋ธ”๋ก๋ฆฌ์ŠคํŠธ   ์ž๋™ ์ƒ์„ฑ   3+ ์ฐฌ์„ฑ        24์‹œ๊ฐ„     Cloudflare
               ๋น„์†์–ด ํ•„ํ„ฐ              (๋ณ€๊ฒฝ 5+)      ๋Œ€๊ธฐ ํ›„     ์ž๋™ ๋™๊ธฐํ™”
               ์ž๋ชจ ์šฐํšŒ ํƒ์ง€
               ๋„๋ฉ”์ธ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ
               Safe Browsing

admin-approved ๋ผ๋ฒจ์ด ์žˆ๋Š” PR์€ ํˆฌํ‘œ/๋Œ€๊ธฐ ์—†์ด ์ฆ‰์‹œ ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜

Cloudflare (๋ฆฌ๋‹ค์ด๋ ‰ํŠธ) + Vercel (์›น์•ฑ) ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ตฌ์กฐ๋กœ ์›” $0 ์šด์˜๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž โ†’ ๋งŒ๋‘.๊ฐ€๊ฒฉ.kr
         โ†“
  Cloudflare Workers (์™€์ผ๋“œ์นด๋“œ DNS)
    โ†’ Host ํ—ค๋”์—์„œ ์„œ๋ธŒ๋„๋ฉ”์ธ ์ถ”์ถœ
    โ†’ Punycode ๋””์ฝ”๋”ฉ (xn--hu1b07h โ†’ ๋งŒ๋‘)
    โ†’ KV ์กฐํšŒ โ†’ 302 ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
    โ†’ (KV ์‹คํŒจ ์‹œ) GitHub Raw Content ํด๋ฐฑ
    โ†’ (ํ‚ค์›Œ๋“œ ๋ฏธ๋“ฑ๋ก ์‹œ) Vercel ์›น์•ฑ์œผ๋กœ ์•ˆ๋‚ด

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

price.kr/
โ”œโ”€โ”€ LICENSE               # MIT ๋ผ์ด์„ ์Šค
โ”œโ”€โ”€ CODE_OF_CONDUCT.md    # ํ–‰๋™ ๊ฐ•๋ น
โ”œโ”€โ”€ CONTRIBUTING.md       # ๊ธฐ์—ฌ ๊ฐ€์ด๋“œ
โ”œโ”€โ”€ SECURITY.md           # ๋ณด์•ˆ ์ •์ฑ…
โ”œโ”€โ”€ CLAUDE.md             # Claude Code ์„ค์ •
โ”œโ”€โ”€ workers/              # Cloudflare Workers ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์—”์ง„
โ”‚   โ””โ”€โ”€ src/              #   subdomain.ts, fallback.ts, index.ts
โ”œโ”€โ”€ web/                  # Next.js 15 App Router (Vercel)
โ”‚   โ”œโ”€โ”€ app/              #   ๊ฒ€์ƒ‰ UI, [keyword] ํŽ˜์ด์ง€, ๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ๋ฐฉ์นจ
โ”‚   โ”œโ”€โ”€ components/       #   SearchBar (์ž๋™์™„์„ฑ, ์ดˆ์„ฑ ๊ฒ€์ƒ‰)
โ”‚   โ””โ”€โ”€ lib/              #   hangul.ts, keywords.ts
โ”œโ”€โ”€ scripts/              # ๊ณต์œ  ์œ ํ‹ธ๋ฆฌํ‹ฐ
โ”‚   โ”œโ”€โ”€ hangul-path.ts    #   ์ดˆ์„ฑ ์ถ”์ถœ, ํ‚ค์›Œ๋“œโ†’ํŒŒ์ผ ๊ฒฝ๋กœ ๊ณ„์‚ฐ
โ”‚   โ”œโ”€โ”€ validate-keyword.ts # ํ‚ค์›Œ๋“œ ๊ฒ€์ฆ (๋ธ”๋ก๋ฆฌ์ŠคํŠธ, ๋น„์†์–ด, ์ž๋ชจ ์šฐํšŒ ํƒ์ง€)
โ”‚   โ”œโ”€โ”€ sync-kv.ts        #   JSON โ†’ Cloudflare KV ๋™๊ธฐํ™”
โ”‚   โ”œโ”€โ”€ seed-data.ts      #   TSV โ†’ ํ‚ค์›Œ๋“œ JSON ์ผ๊ด„ ์ƒ์„ฑ
โ”‚   โ””โ”€โ”€ generate-top1000-tsv.ts  # Top 1000 ํ‚ค์›Œ๋“œ TSV ์ƒ์„ฑ
โ”œโ”€โ”€ data/                 # ํ‚ค์›Œ๋“œ ๋ฐ์ดํ„ฐ (3๋‹จ๊ณ„ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ)
โ”‚   โ”œโ”€โ”€ {์ดˆ์„ฑ}/{์ฒซ๊ธ€์ž}/{keyword}.json  # ํ•œ๊ธ€ ํ‚ค์›Œ๋“œ
โ”‚   โ”œโ”€โ”€ _en/{keyword}.json              # ์˜๋ฌธ ํ‚ค์›Œ๋“œ
โ”‚   โ”œโ”€โ”€ _num/{keyword}.json             # ์ˆซ์ž ์‹œ์ž‘ ํ‚ค์›Œ๋“œ
โ”‚   โ”œโ”€โ”€ blocklist.json        # ์ƒํ‘œ๋ช… ๋ธ”๋ก๋ฆฌ์ŠคํŠธ
โ”‚   โ”œโ”€โ”€ whitelist.json        # ํ—ˆ์šฉ ๋„๋ฉ”์ธ ๋ชฉ๋ก
โ”‚   โ””โ”€โ”€ profanity-blocklist.json  # ๋น„์†์–ด ๋ธ”๋ก๋ฆฌ์ŠคํŠธ
โ”œโ”€โ”€ .github/
โ”‚   โ”œโ”€โ”€ CODEOWNERS            # ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ทœ์น™
โ”‚   โ”œโ”€โ”€ PULL_REQUEST_TEMPLATE.md  # PR ์ฒดํฌ๋ฆฌ์ŠคํŠธ
โ”‚   โ”œโ”€โ”€ ISSUE_TEMPLATE/       # Issue ์–‘์‹ (์ œ์•ˆ/๋ณ€๊ฒฝ/์‚ญ์ œ/๋ฒ„๊ทธ/๊ธฐ๋Šฅ)
โ”‚   โ””โ”€โ”€ workflows/
โ”‚       โ”œโ”€โ”€ validate-issue.yml  # Issue โ†’ ํ‚ค์›Œ๋“œ/URL ๊ฒ€์ฆ โ†’ ์ž๋™ PR
โ”‚       โ”œโ”€โ”€ sync-kv.yml         # main push โ†’ KV ๋™๊ธฐํ™”
โ”‚       โ””โ”€โ”€ auto-merge.yml      # ์ปค๋ฎค๋‹ˆํ‹ฐ ํˆฌํ‘œ โ†’ ์ž๋™ ๋ณ‘ํ•ฉ
โ””โ”€โ”€ docs/
    โ”œโ”€โ”€ PRD.md              # ์ œํ’ˆ ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜์„œ
    โ”œโ”€โ”€ OPERATIONS.md       # ์šด์˜ ๊ฐ€์ด๋“œ
    โ”œโ”€โ”€ DEV_PROGRESS.md     # ๊ฐœ๋ฐœ ์ง„ํ–‰ ์ƒํ™ฉ
    โ”œโ”€โ”€ DEV_LOG.md          # ๊ธฐ์ˆ ์  ๊ฒฐ์ • ๊ธฐ๋ก
    โ”œโ”€โ”€ PLAN-top100-keywords.md  # ํ‚ค์›Œ๋“œ ํ™•์žฅ ๊ณ„ํš
    โ””โ”€โ”€ superpowers/        # ์„ค๊ณ„ ๋ฌธ์„œ ๋ฐ ๊ตฌํ˜„ ๊ณ„ํš

๊ธฐ์ˆ  ์Šคํƒ

์˜์—ญ ๊ธฐ์ˆ 
๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์—”์ง„ Cloudflare Workers + KV + Cache API
์›น ์•ฑ Next.js 15 App Router (Vercel Free)
์ž๋™ํ™” GitHub Actions (Issue ๊ฒ€์ฆ, KV ๋™๊ธฐํ™”, ์ž๋™ ๋ณ‘ํ•ฉ)
๋ฐ์ดํ„ฐ GitHub ์ €์žฅ์†Œ (JSON ํŒŒ์ผ, 3๋‹จ๊ณ„ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ)
ํ…Œ์ŠคํŠธ Vitest 2.x
๋ณด์•ˆ Open redirect ๋ฐฉ์ง€, Script injection ๋ฐฉ์ง€, Google Safe Browsing
์…‹์—… ๊ฐ€์ด๋“œ (ํฌํฌ/์ž์ฒด ์šด์˜ ์‹œ)

1. ์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ

  • Node.js 20+
  • Cloudflare ๊ณ„์ • (Workers + KV ๋ฌด๋ฃŒ ํ”Œ๋žœ)
  • Vercel ๊ณ„์ • (์›น์•ฑ ๋ฐฐํฌ์šฉ, ๋ฌด๋ฃŒ ํ”Œ๋žœ)
  • ๋„๋ฉ”์ธ (๊ฐ€๊ฒฉ.kr / xn--o39aom.kr) โ€” Cloudflare DNS์— ๋“ฑ๋ก

2. ์˜์กด์„ฑ ์„ค์น˜

git clone https://github.com/price-kr/price.kr.git
cd price.kr
npm install

3. Cloudflare ๋„๋ฉ”์ธ & DNS ์„ค์ •

๋„๋ฉ”์ธ ๋“ฑ๋ก

  1. Cloudflare ๋Œ€์‹œ๋ณด๋“œ์—์„œ ๋„๋ฉ”์ธ ์ถ”๊ฐ€: xn--o39aom.kr (๊ฐ€๊ฒฉ.kr์˜ punycode)
  2. ๋„๋ฉ”์ธ ๋“ฑ๋ก๊ธฐ๊ด€(์˜ˆ: ๊ฐ€๋น„์•„, ํ›„์ด์ฆˆ ๋“ฑ)์—์„œ ๋„ค์ž„์„œ๋ฒ„๋ฅผ Cloudflare๊ฐ€ ์ œ๊ณตํ•˜๋Š” NS๋กœ ๋ณ€๊ฒฝ

DNS ๋ ˆ์ฝ”๋“œ ์„ค์ •

Cloudflare DNS ํƒญ์—์„œ ๋‹ค์Œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:

ํƒ€์ž… ์ด๋ฆ„ ๊ฐ’ ํ”„๋ก์‹œ ์šฉ๋„
A @ (๋ฃจํŠธ) 76.76.21.21 OFF (DNS only) bare domain โ†’ Vercel ์›น์•ฑ
CNAME www Vercel ๋Œ€์‹œ๋ณด๋“œ์—์„œ ํ™•์ธ OFF (DNS only) www โ†’ Vercel ์›น์•ฑ (bare domain์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ)
A * (์™€์ผ๋“œ์นด๋“œ) 192.0.2.1 ON (Proxied) *.๊ฐ€๊ฒฉ.kr โ†’ Cloudflare Workers
AAAA * (์™€์ผ๋“œ์นด๋“œ) 100:: ON (Proxied) IPv6 ์™€์ผ๋“œ์นด๋“œ โ†’ Cloudflare Workers

ํ•ต์‹ฌ ๊ตฌ์กฐ: ๊ฐ€๊ฒฉ.kr (bare domain)์€ Vercel์ด ์ฒ˜๋ฆฌํ•˜๊ณ , ๋งŒ๋‘.๊ฐ€๊ฒฉ.kr ๋“ฑ ์™€์ผ๋“œ์นด๋“œ ์„œ๋ธŒ๋„๋ฉ”์ธ์€ Cloudflare Workers๊ฐ€ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฃจํŠธ ๋„๋ฉ”์ธ (@): Vercel์˜ A ๋ ˆ์ฝ”๋“œ IP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, Cloudflare ํ”„๋ก์‹œ๋ฅผ ๋•๋‹ˆ๋‹ค (ํšŒ์ƒ‰ ๊ตฌ๋ฆ„). Vercel์ด ์ง์ ‘ SSL๊ณผ ๋ผ์šฐํŒ…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • www: Vercel ํ”„๋กœ์ ํŠธ๋ณ„ CNAME ๊ฐ’(Vercel ๋Œ€์‹œ๋ณด๋“œ โ†’ Domains์—์„œ ํ™•์ธ, ํ˜•์‹: <hash>.vercel-dns.com)์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋ฉฐ, ํ”„๋ก์‹œ๋ฅผ ๋•๋‹ˆ๋‹ค. Vercel์ด ์ž๋™์œผ๋กœ bare domain์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ฉ๋‹ˆ๋‹ค.
  • ์™€์ผ๋“œ์นด๋“œ (*): dummy IP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, Cloudflare ํ”„๋ก์‹œ๋ฅผ ์ผญ๋‹ˆ๋‹ค (์ฃผํ™ฉ ๊ตฌ๋ฆ„). ์‹ค์ œ ํŠธ๋ž˜ํ”ฝ์€ Workers route(*.xn--o39aom.kr/*)๊ฐ€ ๊ฐ€๋กœ์ฑ„์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

192.0.2.1์€ RFC 5737 ๋ฌธ์„œ์šฉ IP์ด๋ฉฐ, origin ์„œ๋ฒ„๊ฐ€ ํ•„์š” ์—†๋Š” Cloudflare Workers ์„ค์ •์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ‘œ์ค€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. 100::์€ RFC 6666 discard prefix์ž…๋‹ˆ๋‹ค. Cloudflare DNS๋Š” ๊ตฌ์ฒด์ ์ธ ๋ ˆ์ฝ”๋“œ(@, www)๋ฅผ ์™€์ผ๋“œ์นด๋“œ(*)๋ณด๋‹ค ์šฐ์„  ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

SSL/TLS ์„ค์ •

Cloudflare ๋Œ€์‹œ๋ณด๋“œ โ†’ SSL/TLS์—์„œ Full ๋ชจ๋“œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

SSL/TLS ๋ชจ๋“œ๋Š” ํ”„๋ก์‹œ๋œ(์ฃผํ™ฉ ๊ตฌ๋ฆ„) ํŠธ๋ž˜ํ”ฝ์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. bare domain๊ณผ www๋Š” DNS only(ํšŒ์ƒ‰ ๊ตฌ๋ฆ„)์ด๋ฏ€๋กœ Vercel์ด SSL ์ธ์ฆ์„œ๋ฅผ ์ง์ ‘ ๋ฐœ๊ธ‰ยท๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ ์„œ๋ธŒ๋„๋ฉ”์ธ์€ Cloudflare Universal SSL(๋ฌด๋ฃŒ)์ด ์ž๋™์œผ๋กœ edge ์ธ์ฆ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

4. Cloudflare Workers ์„ค์ •

# Wrangler CLI ์„ค์น˜ (์ „์—ญ)
npm install -g wrangler

# Cloudflare ๋กœ๊ทธ์ธ
wrangler login

# KV ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ
wrangler kv namespace create KEYWORDS
wrangler kv namespace create KEYWORDS --preview

์ƒ์„ฑ๋œ ID๋ฅผ workers/wrangler.toml์— ๋ฐ˜์˜:

[[kv_namespaces]]
binding = "KEYWORDS"
id = "<์œ„์—์„œ ์ƒ์„ฑ๋œ KV namespace ID>"
preview_id = "<์œ„์—์„œ ์ƒ์„ฑ๋œ preview ID>"

Workers route ์„ค์ • (workers/wrangler.toml์— ์ด๋ฏธ ํฌํ•จ):

routes = [
  { pattern = "*.xn--o39aom.kr/*", zone_name = "xn--o39aom.kr" }
]

์ด route๋Š” ์™€์ผ๋“œ์นด๋“œ ์„œ๋ธŒ๋„๋ฉ”์ธ์˜ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ Workers๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. KV ์กฐํšŒ ์‹คํŒจ ์‹œ GitHub Raw Content ํด๋ฐฑ์„ ์‹œ๋„ํ•˜๊ณ , ๊ทธ๋งˆ์ €๋„ ํ‚ค์›Œ๋“œ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด WEB_APP_ORIGIN์„ ํ†ตํ•ด Vercel ์›น์•ฑ์˜ ํ‚ค์›Œ๋“œ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฉ๋‹ˆ๋‹ค.

(์„ ํƒ) GitHub Raw Content ํด๋ฐฑ์˜ rate limit์„ ํ™•์žฅํ•˜๋ ค๋ฉด (60 โ†’ 5,000 req/hr):

wrangler secret put GITHUB_TOKEN
# GitHub Personal Access Token ์ž…๋ ฅ (public repo read ๊ถŒํ•œ)

5. GitHub Repository Secrets

GitHub repo โ†’ Settings โ†’ Secrets and variables โ†’ Actions์—์„œ ์„ค์ •:

Secret ์šฉ๋„ ํ•„์ˆ˜ ์—ฌ๋ถ€
CLOUDFLARE_API_TOKEN Wrangler๊ฐ€ KV์— writeํ•˜๊ธฐ ์œ„ํ•œ Cloudflare API ํ† ํฐ ํ•„์ˆ˜
CF_KV_NAMESPACE_ID 4๋‹จ๊ณ„์—์„œ ์ƒ์„ฑํ•œ KV namespace ID ํ•„์ˆ˜
GOOGLE_SAFE_BROWSING_API_KEY Issue ๋“ฑ๋ก ์‹œ URL ์•ˆ์ „์„ฑ ๊ฒ€์ฆ (๋ฐœ๊ธ‰) ์„ ํƒ (์—†์œผ๋ฉด ๊ฒ€์ฆ skip)

Cloudflare API ํ† ํฐ ์ƒ์„ฑ:

  1. Cloudflare API Tokens ํŽ˜์ด์ง€
  2. "Create Token" โ†’ "Edit Cloudflare Workers" ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ
  3. ๊ถŒํ•œ์— Account - Workers KV Storage - Edit ์ถ”๊ฐ€
  4. ์ƒ์„ฑ๋œ ํ† ํฐ์„ CLOUDFLARE_API_TOKEN ์‹œํฌ๋ฆฟ์— ์ €์žฅ

6. Vercel ๋ฐฐํฌ

# Vercel CLI ์„ค์น˜ ๋ฐ ํ”„๋กœ์ ํŠธ ์—ฐ๊ฒฐ
npm install -g vercel
cd web
vercel link

Vercel ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์„ค์ •:

  • Framework Preset: Next.js
  • Root Directory: web
  • Build Command: (๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ)

Vercel ์›น์•ฑ์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ๋นŒ๋“œ ์‹œ ํŒŒ์ผ์‹œ์Šคํ…œ์—์„œ ์ง์ ‘ ์ฝ์Šต๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ

  1. Vercel ๋Œ€์‹œ๋ณด๋“œ โ†’ ํ”„๋กœ์ ํŠธ โ†’ Settings โ†’ Domains
  2. xn--o39aom.kr (๊ฐ€๊ฒฉ.kr) ๋„๋ฉ”์ธ ์ถ”๊ฐ€
  3. www.xn--o39aom.kr ๋„๋ฉ”์ธ ์ถ”๊ฐ€ โ†’ Vercel์ด ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์„ ๋ฌป๋Š”๋‹ค๋ฉด xn--o39aom.kr (bare domain)์„ ์„ ํƒํ•˜์—ฌ www๊ฐ€ bare domain์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋˜๋„๋ก ์„ค์ •
  4. Vercel์ด ์•ˆ๋‚ดํ•˜๋Š” DNS ์„ค์ •์ด 3๋‹จ๊ณ„์—์„œ ์„ค์ •ํ•œ A ๋ ˆ์ฝ”๋“œ(76.76.21.21) ๋ฐ www CNAME(Vercel ๋Œ€์‹œ๋ณด๋“œ์— ํ‘œ์‹œ๋œ ํ”„๋กœ์ ํŠธ๋ณ„ ๊ฐ’)๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ
  5. SSL ์ธ์ฆ์„œ๊ฐ€ ์ž๋™ ๋ฐœ๊ธ‰๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ (๋ณดํ†ต ์ˆ˜ ๋ถ„ ์ด๋‚ด)

bare domain(๊ฐ€๊ฒฉ.kr)๊ณผ www.๊ฐ€๊ฒฉ.kr์€ Vercel์˜ Next.js ์›น์•ฑ์ด ์‘๋‹ตํ•˜๊ณ , ์„œ๋ธŒ๋„๋ฉ”์ธ(๋งŒ๋‘.๊ฐ€๊ฒฉ.kr)์œผ๋กœ ์ ‘์†ํ•˜๋ฉด Cloudflare Workers๊ฐ€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. vercel.json์€ ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

7. ๋กœ์ปฌ ๊ฐœ๋ฐœ

# Workers ๋กœ์ปฌ ๊ฐœ๋ฐœ (wrangler dev)
cd workers && npm run dev

# Web ๋กœ์ปฌ ๊ฐœ๋ฐœ (Next.js dev server)
cd web && npm run dev

# ์ „์ฒด ํ…Œ์ŠคํŠธ
npm test

8. ๋ฐฐํฌ

# Workers ๋ฐฐํฌ
cd workers && npm run deploy

# Web์€ git push ์‹œ Vercel์—์„œ ์ž๋™ ๋ฐฐํฌ
# KV ๋™๊ธฐํ™”๋Š” main push ์‹œ GitHub Actions๊ฐ€ ์ž๋™ ์‹คํ–‰

๋„๋ฉ”์ธ ์„ค์ • ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

์ฆ์ƒ ์›์ธ ํ•ด๊ฒฐ
*.๊ฐ€๊ฒฉ.kr ์ ‘์† ์‹œ ์—ฐ๊ฒฐ ๊ฑฐ๋ถ€ ์™€์ผ๋“œ์นด๋“œ DNS ๋ ˆ์ฝ”๋“œ์˜ ํ”„๋ก์‹œ๊ฐ€ ๊บผ์ ธ ์žˆ์Œ (ํšŒ์ƒ‰ ๊ตฌ๋ฆ„) Cloudflare DNS์—์„œ * ๋ ˆ์ฝ”๋“œ๋ฅผ Proxied (์ฃผํ™ฉ ๊ตฌ๋ฆ„)๋กœ ๋ณ€๊ฒฝ
๊ฐ€๊ฒฉ.kr ์ ‘์† ์‹œ SSL ์˜ค๋ฅ˜ ๋ฃจํŠธ ๋„๋ฉ”์ธ DNS ํ”„๋ก์‹œ๊ฐ€ ์ผœ์ ธ ์žˆ์Œ (์ฃผํ™ฉ ๊ตฌ๋ฆ„) @ ๋ ˆ์ฝ”๋“œ๋ฅผ DNS only (ํšŒ์ƒ‰ ๊ตฌ๋ฆ„)๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ Vercel์ด SSL ์ฒ˜๋ฆฌ
์„ค์ • ํ›„ ๋„๋ฉ”์ธ์ด ๋™์ž‘ํ•˜์ง€ ์•Š์Œ DNS ์ „ํŒŒ ์ง€์—ฐ (๋„ค์ž„์„œ๋ฒ„ ๋ณ€๊ฒฝ ํ›„ ์ตœ๋Œ€ 48์‹œ๊ฐ„) dig xn--o39aom.kr ๋˜๋Š” nslookup์œผ๋กœ ์ „ํŒŒ ์ƒํƒœ ํ™•์ธ ํ›„ ๋Œ€๊ธฐ
curl๋กœ ํ…Œ์ŠคํŠธ ์‹œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์•ˆ ๋จ Host ํ—ค๋”์— ํ•œ๊ธ€ ๋Œ€์‹  punycode ์‚ฌ์šฉ ํ•„์š” curl -I https://xn--hu1b07h.xn--o39aom.kr (๋งŒ๋‘.๊ฐ€๊ฒฉ.kr)
์ƒˆ ํ‚ค์›Œ๋“œ ๋“ฑ๋ก ํ›„ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์•ˆ ๋จ KV ์ „ํŒŒ ์ง€์—ฐ (์ตœ๋Œ€ 60์ดˆ) ๋˜๋Š” Workers ์—ฃ์ง€ ์บ์‹œ (์ตœ๋Œ€ 1์‹œ๊ฐ„ TTL) KV ํ™•์ธ: wrangler kv key get, ์บ์‹œ ๋ฌธ์ œ ์‹œ Cloudflare ๋Œ€์‹œ๋ณด๋“œ์—์„œ Purge Cache ์‹คํ–‰

๋ผ์ด์„ ์Šค

MIT

์ด ํ”„๋กœ์ ํŠธ์˜ ์†Œ์Šค ์ฝ”๋“œ๋Š” MIT ๋ผ์ด์„ ์Šค๋กœ ๊ณต๊ฐœ๋ฉ๋‹ˆ๋‹ค. ๋‹จ, ๊ฐ€๊ฒฉ.kr ๋„๋ฉ”์ธ ๋ฐ ์„œ๋น„์Šค ์ธํ”„๋ผ(Cloudflare, Vercel ์„ค์ • ๋“ฑ)์˜ ์†Œ์œ ๊ถŒ๊ณผ ์šด์˜ ๊ถŒํ•œ์€ ๋ผ์ด์„ ์Šค ๋ฒ”์œ„์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

About

Resources

Code of conduct

Contributing

Security policy

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages