π Render μ± λ°°ν¬ μμ κ°μ΄λ

π Render μ± λ°°ν¬ μμ κ°μ΄λ
π OpenAI API ν€ νλ λ°©λ²
1λ¨κ³: OpenAI κ³μ μμ±
OpenAI μΉμ¬μ΄νΈ μ μ
"Sign up" ν΄λ¦νμ¬ κ³μ μμ±
μ΄λ©μΌ μΈμ¦ μλ£
2λ¨κ³: API ν€ μμ±
OpenAI API ν€ νμ΄μ§ μ μ
"Create new secret key" ν΄λ¦
ν€ μ΄λ¦ μ λ ₯ (μ: "My Render App")
μμ±λ ν€ λ³΅μ¬ (sk-proj-... λλ sk-...λ‘ μμ)
β οΈ μ€μ: ν€λ ν λ²λ§ νμλλ―λ‘ μμ ν κ³³μ μ μ₯
3λ¨κ³: μ¬μ©λ λ° κ²°μ μ€μ
Billing νμ΄μ§ μ μ
κ²°μ λ°©λ² μΆκ° (μ μ©μΉ΄λ λ±)
μ¬μ©λ νλ μ€μ (κΆμ₯: μ $5-10)
4λ¨κ³: API ν€ ν μ€νΈ
# ν°λ―Έλμμ API ν€ ν
μ€νΈ
curl -X POST "https://api.openai.com/v1/chat/completions"
-H "Authorization: Bearer YOUR_API_KEY_HERE"
-H "Content-Type: application/json"
-d '{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "Hello!"}],
"max_tokens": 10
}'
π 보μ λͺ¨λ² μ¬λ‘
OpenAI API ν€ λ³΄μ
μ λ νλμ½λ© κΈμ§
render.yaml
νμΌμ μ§μ μ λ ₯ κΈμ§μ½λ νμΌμ νλμ½λ© κΈμ§
λ‘κ·Έ νμΌμ μΆλ ₯ κΈμ§
μμ ν μ€μ λ°©λ²
# β μ¬λ°λ₯Έ λ°©λ² - key: OPENAI_API_KEY sync: false # β μλͺ»λ λ°©λ² - key: OPENAI_API_KEY value: "sk-proj-actual-key-here"
API ν€ νμ (μ κΈ°μ κ°±μ )
3-6κ°μλ§λ€ μ ν€ μμ±
μ΄μ ν€ μμ
λͺ¨λ νκ²½μμ μ λ°μ΄νΈ
μ¬μ©λ λͺ¨λν°λ§
OpenAI λμ보λμμ μ¬μ©λ νμΈ
μ΄μ μ¬μ© ν¨ν΄ κ°μ§ μ μ¦μ ν€ κ΅μ²΄
νκ²½ λ³μ κ΄λ¦¬
κ°λ°/μ΄μ νκ²½ λΆλ¦¬
# κ°λ°μ© - key: OPENAI_API_KEY sync: false # κ°λ°μ© ν€ μ¬μ© # μ΄μμ© - key: OPENAI_API_KEY sync: false # μ΄μμ© ν€ μ¬μ© (λ³λ ν€ κΆμ₯)
μ κ·Ό κΆν κ΄λ¦¬
νμν νμλ§ API ν€ μ κ·Ό νμ©
Render νλ‘μ νΈ κΆν κ΄λ¦¬
π λͺ©μ°¨
π μ¬μ μ€λΉμ¬ν
νμ μ€λΉλ¬Ό
GitHub κ³μ (μ½λ μ μ₯μ)
λ°°ν¬ν μ±μ μμ€μ½λ
render.yaml
νμΌ (Blueprint μ€μ νμΌ)νμν API ν€λ€ (μ: OpenAI API ν€)
OpenAI κ³μ λ° μ ν¨ν API ν€ (sk-proj-... λλ sk-...λ‘ μμ)
νλ‘μ νΈ κ΅¬μ‘° νμΈ
your-project/
βββ render.yaml # Render λ°°ν¬ μ€μ νμΌ
βββ frontend/ # νλ‘ νΈμλ μ½λ
βββ backend/ # λ°±μλ μ½λ
βββ README.md
render.yaml νμΌ μμ
# render.yaml μμ
services:
# λ°±μλ μλΉμ€
- type: web
name: my-app-backend
runtime: python # λλ node, go λ±
plan: free
buildCommand: pip install -r requirements.txt
startCommand: python app.py
envVars:
# OpenAI API ν€ - 보μμ μν΄ sync: false μ¬μ©
- key: OPENAI_API_KEY
sync: false
# CORS μ€μ (λ°°ν¬ ν μ
λ°μ΄νΈ νμ)
- key: CORS_ORIGINS
value: "http://localhost:3000"
# κΈ°ν νκ²½ λ³μλ€
- key: PORT
value: "8000"
# νκ²½ κ·Έλ£Ή μ¬μ© (μ νμ¬ν)
- fromGroup: shared-secrets
# νλ‘ νΈμλ μλΉμ€
- type: web
name: my-app-frontend
runtime: static
plan: free
buildCommand: npm install && npm run build
staticPublishPath: ./build # λλ ./dist
# νκ²½ κ·Έλ£Ή μ μ (μ νμ¬ν)
envVarGroups:
- name: shared-secrets
envVars:
- key: JWT_SECRET
generateValue: true
- key: DATABASE_URL
fromDatabase:
name: mydb
property: connectionString
# λ°μ΄ν°λ² μ΄μ€ μ μ (νμμ)
databases:
- name: mydb
plan: starter
region: oregon
π§ κ³ κΈ νκ²½ λ³μ μ€μ
Environment Groups μ¬μ©
μ¬λ¬ μλΉμ€μμ 곡ν΅μΌλ‘ μ¬μ©νλ νκ²½ λ³μκ° μλ€λ©΄ Environment Groupsλ₯Ό νμ©νμΈμ:
# 1. νκ²½ κ·Έλ£Ή μ μ
envVarGroups:
- name: api-keys
envVars:
- key: OPENAI_API_KEY
sync: false
- key: JWT_SECRET
generateValue: true
# 2. μλΉμ€μμ κ·Έλ£Ή μ¬μ©
services:
- type: web
name: backend
envVars:
- fromGroup: api-keys # κ·Έλ£Ήμ λͺ¨λ λ³μ ν¬ν¨
- key: PORT
value: "8000"
λ°μ΄ν°λ² μ΄μ€ μ°κ²° μ°Έμ‘°
envVars:
- key: DATABASE_URL
fromDatabase:
name: mydb
property: connectionString
π Render κ³μ μμ±
1λ¨κ³: Render μΉμ¬μ΄νΈ μ μ
μΉλΈλΌμ°μ μμ render.com μ μ
μ°μΈ‘ μλ¨μ "Sign Up" λ²νΌ ν΄λ¦
2λ¨κ³: νμκ°μ
GitHub κ³μ μΌλ‘ κ°μ (κΆμ₯)
"Continue with GitHub" μ ν
GitHub λ‘κ·ΈμΈ ν κΆν μΉμΈ
λλ μ΄λ©μΌλ‘ κ°μ
μ΄λ©μΌ μ£Όμ μ λ ₯
λΉλ°λ²νΈ μ€μ
μ΄λ©μΌ μΈμ¦ μλ£
3λ¨κ³: κ³μ μ€μ
νλ‘ν μ 보 μ λ ₯
λ¬΄λ£ νλ μ ν (κ°μΈ νλ‘μ νΈμ©)
λμ보λ μ μ νμΈ
π― Blueprint μΈμ€ν΄μ€ μμ±
Renderμμ μ±μ λ°°ν¬νλ λ°©λ²μ λ κ°μ§κ° μμ΅λλ€:
π λ°©λ² 1: Blueprint μ¬μ© (κΆμ₯)
render.yaml νμΌμ μ¬μ©νμ¬ μλμΌλ‘ μ€μ νλ λ°©λ²
βοΈ λ°©λ² 2: μλ μ€μ
κ° μλΉμ€λ₯Ό κ°λ³μ μΌλ‘ μ€μ νλ λ°©λ²
π λ°©λ² 1: Blueprint μ¬μ© (μλ μ€μ )
1λ¨κ³: μ μλΉμ€ μμ±
Render λμ보λμμ "New +" λ²νΌ ν΄λ¦
λλ‘λ€μ΄ λ©λ΄μμ "Blueprint" μ ν
2λ¨κ³: GitHub μ°κ²°
"Connect GitHub" ν΄λ¦
GitHub κ³μ λ‘κ·ΈμΈ (μμ§ μ°κ²°λμ§ μμ κ²½μ°)
Renderμ μ μ₯μ μ κ·Ό κΆν λΆμ¬
3λ¨κ³: μ μ₯μ μ ν
λ°°ν¬ν νλ‘μ νΈ μ μ₯μ μ ν
μ:
your-username/pascal-docx
"Connect" λ²νΌ ν΄λ¦
4λ¨κ³: Blueprint κ°μ§ νμΈ
Renderκ° μλμΌλ‘
render.yaml
νμΌ κ°μ§μ€μ μ 보 νμΈ:
μλΉμ€ μ ν (Web Service, Static Site λ±)
λΉλ λͺ λ Ήμ΄
μμ λͺ λ Ήμ΄
νκ²½ λ³μ λͺ©λ‘
π§ λ°©λ² 2: μλ μ€μ (κ°λ³ μλΉμ€)
render.yaml νμΌμ΄ μκ±°λ λ μΈλ°ν μ μ΄κ° νμν κ²½μ° μ¬μ©νλ λ°©λ²μ λλ€.
1λ¨κ³: λ°±μλ μλΉμ€ μμ±
κΈ°λ³Έ μ€μ
Render λμ보λμμ "New +" β "Web Service" μ ν
GitHub μ μ₯μ μ°κ²°
λ€μ μ€μ κ° μ λ ₯:
μλΉμ€ κΈ°λ³Έ μ 보:
Name:
pascal-docx-backend
(λλyour-app-backend
)Region:
Oregon (US West)
Branch:
master
(λλmain
)Root Directory:
backend
β οΈ μ€μ: λͺ¨λ Έλ ν¬μ λ°±μλ ν΄λ μ§μ
λΉλ λ° μ€ν μ€μ :
Build Command:
pip install -r requirements.txt
Start Command:
uvicorn api_server:app --host 0.0.0.0 --port $PORT
Instance Type:
Free
νκ²½ λ³μ μ€μ
"Add Environment Variable" λ²νΌμ ν΄λ¦νμ¬ λ€μ λ³μλ€ μΆκ°:
Key: OPENAI_API_KEY
Value: sk-proj-your-actual-key-here
Key: PYTHON_VERSION
Value: 3.11.9
Key: OPENAI_API_BASE
Value: https://api.openai.com/v1
Key: DEBUG
Value: false
Key: CORS_ORIGINS
Value: http://localhost:3000 (μμκ°, λμ€μ μ
λ°μ΄νΈ)
"Create Web Service" ν΄λ¦
2λ¨κ³: νλ‘ νΈμλ μλΉμ€ μμ±
κΈ°λ³Έ μ€μ
λμ보λμμ "New +" β "Web Service" μ ν
κ°μ GitHub μ μ₯μ μ ν
λ€μ μ€μ κ° μ λ ₯:
μλΉμ€ κΈ°λ³Έ μ 보:
Name:
pascal-docx-frontend
(λλyour-app-frontend
)Region:
Oregon (US West)
Branch:
master
(λλmain
)Root Directory:
frontend
β οΈ μ€μ: λͺ¨λ Έλ ν¬μ νλ‘ νΈμλ ν΄λ μ§μ
λΉλ λ° μ€ν μ€μ :
Build Command:
npm install && npm run build
Start Command:
npx serve -s dist
Instance Type:
Free
νκ²½ λ³μ μ€μ
"Add Environment Variable" λ²νΌμ ν΄λ¦νμ¬ λ€μ λ³μ μΆκ°:
Key: VITE_API_URL
Value: [λ§ν¬ μμ΄μ½ ν΄λ¦ β pascal-docx-backend μλΉμ€ μ ν]
π‘ ν: λ§ν¬ μμ΄μ½μ μ¬μ©νλ©΄ λ°±μλ μλΉμ€μ λ΄λΆ URLμ΄ μλμΌλ‘ μ€μ λ©λλ€.
"Create Web Service" ν΄λ¦
3λ¨κ³: μλΉμ€ μ°κ²° μ€μ
λ°±μλ CORS μ λ°μ΄νΈ
νλ‘ νΈμλ λ°°ν¬ μλ£ ν URL νμΈ (μ:
https://pascal-docx-frontend.onrender.com
)λ°±μλ μλΉμ€ β Environment ν
CORS_ORIGINS
λ³μ κ°μ νλ‘ νΈμλ URLλ‘ μ λ°μ΄νΈ:λ³κ²½ μ : http://localhost:3000λ³κ²½ ν: https://pascal-docx-frontend.onrender.com
"Save Changes" ν΄λ¦
4λ¨κ³: λ°°ν¬ νμΈ
λ μλΉμ€ λͺ¨λ λ°°ν¬ μλ£ νμΈ
νλ‘ νΈμλ URL μ μ ν μ€νΈ
λ°±μλ API μ°κ²° ν μ€νΈ
π λ λ°©λ² λΉκ΅
κ΅¬λΆ | Blueprint λ°©μ | μλ μ€μ λ°©μ |
---|---|---|
μ€μ νμΌ | render.yaml νμ | λΆνμ |
μ€μ μλ | λΉ λ¦ (μΌκ΄ μ€μ ) | λλ¦Ό (κ°λ³ μ€μ ) |
μ μ§λ³΄μ | μ½λμ ν¨κ» λ²μ κ΄λ¦¬ | λμ보λμμλ§ κ΄λ¦¬ |
μ¬λ°°ν¬ | νμΌ μμ λ§μΌλ‘ κ°λ₯ | λμ보λμμ μλ λ³κ²½ |
볡μ‘λ | μ΄κΈ° μ€μ λ³΅μ‘ | λ¨μνκ³ μ§κ΄μ |
μΆμ² μν© | νλ‘λμ νκ²½ | ν μ€νΈ λλ κ°λ¨ν μ± |
π μλ μ€μ 체ν¬λ¦¬μ€νΈ
λ°±μλ μλΉμ€
μλΉμ€ μ΄λ¦ μ€μ
μ¬λ°λ₯Έ Root Directory μ§μ
λΉλ λͺ λ Ήμ΄ μ€μ
μμ λͺ λ Ήμ΄ μ€μ
λͺ¨λ νκ²½ λ³μ μΆκ°
λ°°ν¬ μλ£ νμΈ
νλ‘ νΈμλ μλΉμ€
μλΉμ€ μ΄λ¦ μ€μ
μ¬λ°λ₯Έ Root Directory μ§μ
λΉλ λͺ λ Ήμ΄ μ€μ
μμ λͺ λ Ήμ΄ μ€μ
λ°±μλ URL μ°κ²°
λ°°ν¬ μλ£ νμΈ
μ°κ²° μ€μ
λ°±μλ CORS μ€μ μ λ°μ΄νΈ
νλ‘ νΈμλ-λ°±μλ ν΅μ ν μ€νΈ
μ 체 κΈ°λ₯ ν μ€νΈ
βοΈ νκ²½ λ³μ μ€μ
νκ²½ λ³μ μ€μ λ°©λ²μ λ°°ν¬ λ°©μμ λ°λΌ λ€λ¦ λλ€.
π Blueprint λ°©μ νκ²½ λ³μ μ€μ
1λ¨κ³: νκ²½ λ³μ μλ³
render.yaml
νμΌμμ νμν νκ²½ λ³μ νμΈ:
envVars:
# OpenAI API ν€ - 보μμ μν΄ sync: false μ¬μ© (κΆμ₯)
- key: OPENAI_API_KEY
sync: false # λμ보λμμ μμ νκ² μ
λ ₯
# λλ μλ μμ± λ°©μ (λ κΆμ₯)
# - key: OPENAI_API_KEY
# generateValue: true
- key: CORS_ORIGINS
value: "http://localhost:3000" # λμ€μ μμ νμ
2λ¨κ³: OpenAI API ν€ μμ νκ² μ€μ νκΈ°
π λ°©λ² 1: sync: false μ¬μ© (κ°μ₯ μμ ν λ°©λ²)
envVars:
- key: OPENAI_API_KEY
sync: false
μ₯μ :
μ½λμ λ―Όκ°ν μ λ³΄κ° λ ΈμΆλμ§ μμ
GitHub μ μ₯μμ API ν€κ° μ μ₯λμ§ μμ
λ°°ν¬ μ Render λμ보λμμ μμ νκ² μ λ ₯
μ¬μ© λ°©λ²:
render.yaml
μsync: false
λ‘ μ€μ λ°°ν¬ μ Render λμ보λμμ ν둬ννΈ μ°½μ API ν€ μ λ ₯
μ λ ₯λ κ°μ μνΈνλμ΄ μ μ₯λ¨
π λ°©λ² 2: generateValue: true μ¬μ© (μλ μμ±)
envVars:
- key: OPENAI_API_KEY
generateValue: true
μ£Όμμ¬ν:
μ΄ λ°©λ²μ μμμ κ°μ μλ μμ±νλ―λ‘ μ€μ OpenAI API ν€κ° μλ
μ€μ νλ‘μ νΈμμλ λ°©λ² 1μ μ¬μ©νμΈμ
β λ°©λ² 3: νλμ½λ© (μ λ κΈμ§)
envVars:
- key: OPENAI_API_KEY
value: "sk-your-actual-api-key" # μ λ μ΄λ κ² νμ§ λ§μΈμ!
μνμ±:
GitHubμ API ν€κ° λ ΈμΆλ¨
보μ μ·¨μ½μ λ°μ
API ν€ λ¨μ© μν
3λ¨κ³: νκ²½ λ³μ μ λ ₯ κ³Όμ
sync: falseλ‘ μ€μ ν κ²½μ°:
Blueprint μμ± μ λ€μκ³Ό κ°μ ν둬ννΈ μ°½μ΄ λνλ¨:
Environment Variables βββββββββββββββββββββββββββββββββββββββ β OPENAI_API_KEY β β [ ] β β Enter your OpenAI API key β βββββββββββββββββββββββββββββββββββββββ
μ¬κΈ°μ μ€μ OpenAI API ν€ μ λ ₯ (μ: sk-proj-...)
μ λ ₯ν API ν€ μ€λΉ:
OpenAI κ³μ λ‘κ·ΈμΈ β API Keys νμ΄μ§
"Create new secret key" ν΄λ¦
μμ±λ ν€ λ³΅μ¬ (sk-proj-...λ‘ μμ)
β οΈ μ€μ: ν€λ ν λ²λ§ νμλλ―λ‘ μμ ν κ³³μ μ μ₯
βοΈ μλ μ€μ λ°©μ νκ²½ λ³μ μ€μ
λ°±μλ μλΉμ€ νκ²½ λ³μ
"Add Environment Variable" λ²νΌμ ν΄λ¦νμ¬ λ€μ λ³μλ€ μΆκ°:
Key: OPENAI_API_KEY
Value: sk-proj-your-actual-key-here
Key: PYTHON_VERSION
Value: 3.11.9
Key: OPENAI_API_BASE
Value: https://api.openai.com/v1
Key: DEBUG
Value: false
Key: CORS_ORIGINS
Value: http://localhost:3000 (μμκ°, λμ€μ μ
λ°μ΄νΈ)
νλ‘ νΈμλ μλΉμ€ νκ²½ λ³μ
Key: VITE_API_URL
Value: [λ§ν¬ μμ΄μ½ ν΄λ¦ β λ°±μλ μλΉμ€ μ ν]
π‘ ν: λ§ν¬ μμ΄μ½μ μ¬μ©νλ©΄ λ°±μλ μλΉμ€μ λ΄λΆ URLμ΄ μλμΌλ‘ μ€μ λ©λλ€.
μλ μ€μ μ 보μ κ³ λ €μ¬ν
β οΈ μ£Όμ: μλ μ€μ μμλ sync: false
μ΅μ
μ μ¬μ©ν μ μμΌλ―λ‘ λ€μ μ¬νμ μ€μνμΈμ:
API ν€ μ§μ μ λ ₯
λμ보λμμ μ§μ μ λ ₯
μ λ μ€ν¬λ¦°μ·μ΄λ λ‘κ·Έμ λ ΈμΆνμ§ μκΈ°
μ¦μ ν€ μμ
볡μ¬ν API ν€λ μ λ ₯ ν μ¦μ ν΄λ¦½λ³΄λμμ μμ
μμ νμΌμ΄λ λ©λͺ¨μ μ μ₯νμ§ μκΈ°
μ κ·Ό κΆν μ ν
Render νλ‘μ νΈ μ κ·Ό κΆνμ νμν μΈμμΌλ‘ μ ν
νμ μ΄λ μ μν κΆν μ€μ
3λ¨κ³: κΈ°ν νκ²½ λ³μ μ€μ
CORS_ORIGINS: μμλ‘ κΈ°λ³Έκ° μ μ§
PORT: μλ μ€μ (μμ λΆνμ)
κΈ°ν νμν λ³μλ€: νλ‘μ νΈλ³λ‘ μ€μ
π λ°°ν¬ μ€ν
1λ¨κ³: λ°°ν¬ μμ
λͺ¨λ μ€μ νμΈ ν "Create Blueprint Instance" ν΄λ¦
λ°°ν¬ νλ‘μΈμ€ μμ νμΈ
2λ¨κ³: λΉλ κ³Όμ λͺ¨λν°λ§
λ‘κ·Έ νμΈ:
κ° μλΉμ€λ³ λΉλ λ‘κ·Έ μ€μκ° νμΈ
μ€λ₯ λ°μ μ μ¦μ νμ κ°λ₯
λΉλ λ¨κ³:
μ’ μμ± μ€μΉ
μ ν리μΌμ΄μ λΉλ
λ°°ν¬ ν¨ν€μ§ μμ±
3λ¨κ³: λ°°ν¬ μλ£ νμΈ
μ±κ³΅ λ©μμ§ νμΈ
μλΉμ€ URL μμ± νμΈ:
νλ‘ νΈμλ:
https://your-app-name.onrender.com
λ°±μλ:
https://your-api-name.onrender.com
π§ λ°°ν¬ ν μ€μ
1λ¨κ³: CORS μ€μ μ λ°μ΄νΈ
λ°±μλ μλΉμ€ μ€μ νμ΄μ§λ‘ μ΄λ
Environment ν ν΄λ¦
CORS_ORIGINS λ³μ μμ :
λ³κ²½ μ : http://localhost:3000λ³κ²½ ν: https://your-app-name.onrender.com
"Save Changes" ν΄λ¦
2λ¨κ³: μλΉμ€ μ¬λ°°ν¬
μ€μ λ³κ²½ ν μλ μ¬λ°°ν¬ μμ
λ‘κ·Έμμ μ¬λ°°ν¬ μλ£ νμΈ
3λ¨κ³: μ΅μ’ ν μ€νΈ
νλ‘ νΈμλ URL μ μ ν μ€νΈ
λ°±μλ API μ°κ²° ν μ€νΈ
OpenAI API ν€ μλ νμΈ:
λ°±μλ λ‘κ·Έμμ OpenAI API νΈμΆ μ±κ³΅ νμΈ
μ ν리μΌμ΄μ μμ OpenAI κΈ°λ₯ ν μ€νΈ
λͺ¨λ κΈ°λ₯ μ μ μλ νμΈ
4λ¨κ³: νκ²½ λ³μ νμΈ λ°©λ²
Render λμ보λμμ νμΈ:
μλΉμ€ νμ΄μ§ β Environment ν
μ€μ λ νκ²½ λ³μ λͺ©λ‘ νμΈ
OPENAI_API_KEY
κ°[hidden]
λ‘ νμλλμ§ νμΈ
λ‘κ·Έμμ νμΈ:
μλΉμ€ λ‘κ·Έμμ νκ²½ λ³μ λ‘λ© νμΈ
β οΈ μ£Όμ: μ€μ API ν€ κ°μ΄ λ‘κ·Έμ λ ΈμΆλμ§ μλλ‘ μ£Όμ
π λ¬Έμ ν΄κ²° κ°μ΄λ
μΌλ°μ μΈ λ¬Έμ λ€
1. λΉλ μ€ν¨
μ¦μ: λΉλ κ³Όμ μμ μ€λ₯ λ°μ
Blueprint λ°©μ ν΄κ²°μ± :
λ‘κ·Έμμ ꡬ체μ μΈ μ€λ₯ λ©μμ§ νμΈ
package.json
μ’ μμ± νμΈλΉλ λͺ λ Ήμ΄ κ²μ¦
render.yaml
νμΌ κ΅¬λ¬Έ μ€λ₯ νμΈ
μλ μ€μ λ°©μ ν΄κ²°μ± :
Root Directory μ€μ νμΈ (μ:
backend
,frontend
)λΉλ λͺ λ Ήμ΄ μ νμ± νμΈ
λΈλμΉ μ ν νμΈ
1-1. λͺ¨λ Έλ ν¬ κ΄λ ¨ λΉλ μ€λ₯
μ¦μ: "package.json not found" λλ "No such file or directory"
ν΄κ²°μ± :
Root Directory μ€μ νμΈ
λ°±μλ:
backend
νλ‘ νΈμλ:
frontend
ν΄λ ꡬ쑰μ μΌμΉνλμ§ νμΈ:
your-project/βββ backend/β βββ requirements.txtβ βββ api_server.pyβββ frontend/β βββ package.jsonβ βββ src/βββ render.yaml
2. νκ²½ λ³μ μ€λ₯
μ¦μ: μ ν리μΌμ΄μ μ€ν μ μ€μ μ€λ₯
Blueprint λ°©μ ν΄κ²°μ± :
λͺ¨λ νμ νκ²½ λ³μ μ€μ νμΈ
λ³μλͺ μ€ν κ²μ¬
λ―Όκ°ν μ 보λ SecretμΌλ‘ μ€μ
μλ μ€μ λ°©μ ν΄κ²°μ± :
κ° μλΉμ€λ³λ‘ νκ²½ λ³μ κ°λ³ νμΈ
μλΉμ€ κ° μ°κ²° μ€μ νμΈ
νκ²½ λ³μ κ° νμ νμΈ
2-1. OpenAI API ν€ κ΄λ ¨ μ€λ₯
μ¦μ: Invalid API key
λλ Authentication failed
μ€λ₯
ν΄κ²°μ± :
OpenAI API ν€ νμ νμΈ (sk-proj-... λλ sk-...λ‘ μμ)
API ν€ λ§λ£ μ¬λΆ νμΈ
OpenAI κ³μ κ²°μ μ 보 νμΈ
νκ²½ λ³μλͺ νμΈ:
OPENAI_API_KEY
(λμλ¬Έμ μ£Όμ)
λλ²κΉ λ°©λ²:
# Python λ°±μλμμ νκ²½ λ³μ νμΈ (κ°λ° μμλ§)
import os
print(f"API Key exists: {bool(os.getenv('OPENAI_API_KEY'))}")
print(f"API Key length: {len(os.getenv('OPENAI_API_KEY', ''))}")
# μ λ μ€μ ν€ κ°μ μΆλ ₯νμ§ λ§μΈμ!
2-2. νκ²½ λ³μ μ λ°μ΄νΈ
κΈ°μ‘΄ μλΉμ€μ νκ²½ λ³μ μμ λ°©λ²:
Render λμ보λ β μλΉμ€ μ ν
Environment ν ν΄λ¦
νκ²½ λ³μ μΆκ°/μμ
"Save Changes" ν΄λ¦ β μλ μ¬λ°°ν¬
sync: false μ¬μ© μ μ£Όμμ¬ν:
μ΅μ΄ λ°°ν¬ μμλ§ κ°μ μ λ ₯ν μ μμ
κΈ°μ‘΄ Blueprint μ λ°μ΄νΈ μ
sync: false
λ³μλ 무μλ¨λ³κ²½μ΄ νμν κ²½μ° λμ보λμμ μ§μ μμ ν΄μΌ ν¨
2-3. Preview νκ²½ κ΄λ ¨
Preview νκ²½μμ sync: false λ³μ λλ½ λ¬Έμ :
Preview νκ²½μμλ
sync: false
λ³μκ° μλ ν¬ν¨λμ§ μμν΄κ²° λ°©λ²: Environment Groups μ¬μ© κΆμ₯
envVarGroups:
- name: secrets
envVars:
- key: OPENAI_API_KEY
sync: false
services:
- name: my-app
envVars:
- fromGroup: secrets
3. CORS μ€λ₯
μ¦μ: νλ‘ νΈμλμμ λ°±μλ API νΈμΆ μ€ν¨
Blueprint λ°©μ ν΄κ²°μ± :
CORS_ORIGINS
μ νλ‘ νΈμλ URL μΆκ°μμΌλμΉ΄λ
*
μ¬μ© μ 보μ μ£Όμ
μλ μ€μ λ°©μ ν΄κ²°μ± :
νλ‘ νΈμλ λ°°ν¬ μλ£ ν URL νμΈ
λ°±μλ μλΉμ€ β Environment ν
CORS_ORIGINS
μ λ°μ΄νΈ:λ³κ²½ μ : http://localhost:3000λ³κ²½ ν: https://your-frontend-url.onrender.com
3-1. μλΉμ€ κ° ν΅μ μ€λ₯
μ¦μ: νλ‘ νΈμλμμ λ°±μλ API νΈμΆ μ 404 λλ 500 μ€λ₯
μλ μ€μ λ°©μ ν΄κ²°μ± :
λ°±μλ μλΉμ€κ° μ μμ μΌλ‘ μ€νλλμ§ νμΈ
νλ‘ νΈμλμ
VITE_API_URL
μ€μ νμΈμλΉμ€ λ§ν¬ μ°κ²° μν νμΈ
4. λ°°ν¬ μκ° μ΄κ³Ό
μ¦μ: λ°°ν¬κ° λ무 μ€λ 걸리거λ μ€ν¨
ν΄κ²°μ± :
λΉλ μΊμ νμΈ
λΆνμν νμΌ
.gitignore
μ μΆκ°λΉλ μ€ν¬λ¦½νΈ μ΅μ ν
μ’ μμ± μ΅μ ν
5. μλ μ€μ νΉν λ¬Έμ λ€
5-1. μλΉμ€ μ°κ²° μ€ν¨
μ¦μ: νλ‘ νΈμλμμ λ°±μλ μλΉμ€λ₯Ό μ°Ύμ μ μμ
ν΄κ²°μ± :
μλΉμ€ μ΄λ¦ νμΈ (μ:
pascal-docx-backend
)μλΉμ€ λ§ν¬ μ€μ μ¬νμΈ
λ μλΉμ€κ° κ°μ 리μ μ λ°°ν¬λμλμ§ νμΈ
5-2. λΉλ λͺ λ Ήμ΄ μ€λ₯
μ¦μ: μλͺ»λ λΉλ λͺ λ Ήμ΄λ‘ μΈν μ€ν¨
μΌλ°μ μΈ μ¬λ°λ₯Έ μ€μ :
Python (λ°±μλ):
Build Command: pip install -r requirements.txt
Start Command: uvicorn api_server:app --host 0.0.0.0 --port $PORT
Node.js (νλ‘ νΈμλ):
Build Command: npm install && npm run build
Start Command: npx serve -s dist
5-3. Root Directory μ€μ μ€λ₯
μ¦μ: νμΌμ μ°Ύμ μ μλ€λ μ€λ₯
ν΄κ²°μ± :
μ μ₯μ ꡬ쑰 νμΈ
μ νν ν΄λ κ²½λ‘ μ€μ
λμλ¬Έμ κ΅¬λΆ μ£Όμ
β λ€λ₯Έ μ± λ°°ν¬ μ μ¬μ¬μ© 체ν¬λ¦¬μ€νΈ
μ¬μ μ€λΉ
μ GitHub μ μ₯μ μμ±
λ°°ν¬ λ°©μ κ²°μ (Blueprint vs μλ μ€μ )
render.yaml
νμΌ μμ± (Blueprint λ°©μ μ¬μ© μ)OpenAI API ν€ νλ λ° μ€λΉ
νμν API ν€λ€ μ€λΉ
νλ‘μ νΈ κ΅¬μ‘° μ 리
π Blueprint λ°©μ 체ν¬λ¦¬μ€νΈ
Render μ€μ
Render λμ보λ μ μ
"New +" β "Blueprint" μ ν
GitHub μ μ₯μ μ°κ²°
Blueprint μ€μ νμΈ
νκ²½ λ³μ μ€μ
λͺ¨λ νμ νκ²½ λ³μ μ λ ₯
OpenAI API ν€ μμ ν μ€μ (
sync: false
μ¬μ©)λ―Όκ°ν μ 보 SecretμΌλ‘ μ€μ
CORS μ€μ μμκ° μ λ ₯
λ°°ν¬ λ° ν μ€νΈ
"Create Blueprint Instance" ν΄λ¦
λΉλ λ‘κ·Έ λͺ¨λν°λ§
λ°°ν¬ μλ£ νμΈ
CORS μ€μ μ λ°μ΄νΈ
μ΅μ’ κΈ°λ₯ ν μ€νΈ
βοΈ μλ μ€μ λ°©μ 체ν¬λ¦¬μ€νΈ
λ°±μλ μλΉμ€ μ€μ
"New +" β "Web Service" μ ν
GitHub μ μ₯μ μ°κ²°
μλΉμ€ μ΄λ¦ μ€μ (μ:
your-app-backend
)Root Directory μ€μ (
backend
)λΉλ λͺ λ Ήμ΄ μ€μ
μμ λͺ λ Ήμ΄ μ€μ
νκ²½ λ³μ μΆκ°:
OPENAI_API_KEY
PYTHON_VERSION
OPENAI_API_BASE
DEBUG
CORS_ORIGINS
(μμκ°)
μλΉμ€ μμ± μλ£
νλ‘ νΈμλ μλΉμ€ μ€μ
"New +" β "Web Service" μ ν (λ λ²μ§Έ μλΉμ€)
κ°μ GitHub μ μ₯μ μ°κ²°
μλΉμ€ μ΄λ¦ μ€μ (μ:
your-app-frontend
)Root Directory μ€μ (
frontend
)λΉλ λͺ λ Ήμ΄ μ€μ
μμ λͺ λ Ήμ΄ μ€μ
νκ²½ λ³μ μΆκ°:
VITE_API_URL
(λ°±μλ μλΉμ€ λ§ν¬)
μλΉμ€ μμ± μλ£
μλΉμ€ μ°κ²° μ€μ
νλ‘ νΈμλ URL νμΈ
λ°±μλ
CORS_ORIGINS
μ λ°μ΄νΈμλΉμ€ κ° ν΅μ ν μ€νΈ
μ 체 κΈ°λ₯ ν μ€νΈ
μ¬ν κ΄λ¦¬ (곡ν΅)
λλ©μΈ μ€μ (νμμ)
λͺ¨λν°λ§ μ€μ
λ°±μ κ³ν μ립
λ¬Έμν μ λ°μ΄νΈ
νμ μ κ·Ό κΆν μ€μ
π― λ°©λ² μ ν κ°μ΄λ
Blueprint λ°©μμ μ ννλ κ²½μ°:
νλ‘λμ νκ²½ λ°°ν¬
ν νλ‘μ νΈ (μ€μ μ μ½λλ‘ κ΄λ¦¬)
볡μ‘ν νκ²½ λ³μ μ€μ
μλνλ λ°°ν¬ μν¨
μΈνλΌ as Code μ νΈ
μλ μ€μ λ°©μμ μ ννλ κ²½μ°:
νλ‘ν νμ λλ ν μ€νΈ νκ²½
κ°λ¨ν κ°μΈ νλ‘μ νΈ
λΉ λ₯Έ λ°°ν¬ νμ
μ§κ΄μ μΈ UI μ€μ μ νΈ
render.yaml νμΌ μμ± μ΄λ €μ
π μλ£!
μΆνν©λλ€! μ΄μ μ¬λ¬λΆμ μ±μ΄ μ μΈκ³μμ μ κ·Ό κ°λ₯ν μνμ λλ€.
π λ°°ν¬ μλ£ νμΈ
Blueprint λ°©μμΌλ‘ λ°°ν¬ν κ²½μ°:
β λͺ¨λ μλΉμ€κ°
render.yaml
μ€μ λλ‘ λ°°ν¬λ¨β νκ²½ λ³μκ° μμ νκ² μ€μ λ¨
β μλΉμ€ κ° μλ μ°κ²° μλ£
μλ μ€μ μΌλ‘ λ°°ν¬ν κ²½μ°:
β λ°±μλ μλΉμ€ μ μ μ€ν
β νλ‘ νΈμλ μλΉμ€ μ μ μ€ν
β μλΉμ€ κ° ν΅μ μ°κ²° μλ£
β CORS μ€μ μ λ°μ΄νΈ μλ£
π μ΅μ’ νμΈμ¬ν
1. μλΉμ€ μν νμΈ
λ°±μλ μλΉμ€:
https://your-backend.onrender.com
νλ‘ νΈμλ μλΉμ€:
https://your-frontend.onrender.com
λͺ¨λ μλΉμ€ μν:
Live
2. κΈ°λ₯ ν μ€νΈ
νλ‘ νΈμλ νμ΄μ§ λ‘λ© νμΈ
λ°±μλ API μλ΅ νμΈ
OpenAI API μ°λ ν μ€νΈ
μ 체 μν¬νλ‘μ° ν μ€νΈ
3. νκ²½ λ³μ νμΈ
OPENAI_API_KEY
: μ€μ μλ£ (κ°μ[hidden]
λ‘ νμ)CORS_ORIGINS
: νλ‘ νΈμλ URLλ‘ μ λ°μ΄νΈ μλ£κΈ°ν νμν νκ²½ λ³μ λͺ¨λ μ€μ μλ£
λ€μ λ¨κ³λ€
μ¬μ©μ νΌλλ°± μμ§
μ€μ μ¬μ©μλ€μ νΌλλ°± μμ§
μ±λ₯ λ° μ¬μ©μ± κ°μ μ νμ
μ±λ₯ λͺ¨λν°λ§
Render λμ보λμμ μ¬μ©λ λͺ¨λν°λ§
μλ΅ μκ° λ° μ€λ₯μ¨ μΆμ
μ§μμ μΈ μ λ°μ΄νΈ
μ½λ λ³κ²½ μ μλ λ°°ν¬ νμΈ
μλ‘μ΄ κΈ°λ₯ μΆκ° λ° λ°°ν¬
보μ κ΄λ¦¬
μ κΈ°μ μΈ API ν€ κ΅μ²΄ (3-6κ°μ)
μ κ·Ό κΆν κ΄λ¦¬
보μ μ λ°μ΄νΈ μ μ©
π κ³ κΈ νμ© ν
Blueprint λ°©μ μ¬μ©μλ₯Ό μν ν:
render.yaml
νμΌμ GitμΌλ‘ λ²μ κ΄λ¦¬νκ²½λ³ μ€μ νμΌ λΆλ¦¬ (dev, staging, prod)
Preview νκ²½ νμ©μΌλ‘ ν μ€νΈ μλν
μλ μ€μ μ¬μ©μλ₯Ό μν ν:
νκ²½ λ³μ λ°±μ λ° λ¬Έμν
μλΉμ€ μ€μ μ€ν¬λ¦°μ· μ μ₯
λ°°ν¬ κ³Όμ μλν μ€ν¬λ¦½νΈ μμ±
π μΆκ° νμ΅ λ¦¬μμ€
Render κ΄λ ¨:
λ°°ν¬ μλν:
λͺ¨λν°λ§ λ° λ‘κΉ :
π§ λ¬Έμμ¬νμ΄λ μΆκ° λμμ΄ νμνμλ©΄ μΈμ λ μ§ λ§μν΄ μ£ΌμΈμ!