cert-study-app / docs /05_deployment.md
Kentlo's picture
Sync from GitHub f8e98d3f03952efd3d7c1b217df60c77c3992aec
87b5875 verified
|
Raw
History Blame Contribute Delete
5.66 kB
# 05. ๋ฐฐํฌ ๊ณ„ํš
## ํ˜„์žฌ ์‹คํ–‰ ๋ฐฉ์‹
ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋Š” Docker Compose๋กœ ๋กœ์ปฌ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋งž์ถ”๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
์ฃผ์š” ์„œ๋น„์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
- `postgres`: PostgreSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
- `cert-study-app`: Streamlit ์›น ์•ฑ
- `airflow-init`: Airflow ์ดˆ๊ธฐํ™”
- `airflow-webserver`: Airflow ์›น ํ™”๋ฉด
- `airflow-scheduler`: Airflow ์ž‘์—… ์Šค์ผ€์ค„๋Ÿฌ
## ๋กœ์ปฌ ์‹คํ–‰
```bash
cp .env.example .env
docker compose up --build
```
์ ‘์† ์ฃผ์†Œ:
- Streamlit ์•ฑ: `http://localhost:8501`
- Airflow: `http://localhost:8080`
- PostgreSQL: `localhost:5432`
Streamlit ํ™”๋ฉด๋งŒ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ๋•Œ๋Š” Docker ์—†์ด ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
```bash
DATABASE_URL=sqlite:////tmp/cert-study-local-check.db \
python -m streamlit run streamlit_app.py
```
์ด ๋ฐฉ์‹์€ ์ž„์‹œ SQLite DB๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋กœ์ปฌ ํ™”๋ฉด ํ™•์ธ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด `data/questions.db` ํŒŒ์ผ ๊ถŒํ•œ์ด ๊ผฌ์˜€๊ฑฐ๋‚˜ ์ฝ๊ธฐ ์ „์šฉ ์ƒํƒœ์ผ ๋•Œ๋„ ์ƒˆ DB๋กœ ๋ฌธ์ œ seed ๋™์ž‘์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## Docker๋ฅผ ์“ฐ๋Š” ์ด์œ 
์ด ํ”„๋กœ์ ํŠธ๋Š” Streamlit, PostgreSQL, Airflow, PDF ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, Chroma ๋“ฑ ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ PC์—์„œ ์ง์ ‘ ๋ชจ๋‘ ์„ค์น˜ํ•˜๋ฉด ๋ฒ„์ „ ์ถฉ๋Œ์ด ์ƒ๊ธฐ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. Docker๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์ฝ”๋“œ๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค๋ฅธ PC๋‚˜ ์„œ๋ฒ„์—์„œ๋„ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Docker๋ฅผ ์“ฐ๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
- ์‹คํ–‰ ํ™˜๊ฒฝ์„ ํ†ต์ผํ•  ์ˆ˜ ์žˆ๋‹ค.
- PostgreSQL๊ณผ Airflow๋ฅผ ํ•จ๊ป˜ ๋„์šฐ๊ธฐ ์‰ฝ๋‹ค.
- ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ์„œ๋ฒ„ ํ™˜๊ฒฝ ์ฐจ์ด๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
- ๋ฐฐํฌํ•  ๋•Œ ํ•„์š”ํ•œ ๋ช…๋ น์„ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
## Docker Compose ๋ณผ๋ฅจ
ํ˜„์žฌ Compose์—์„œ๋Š” ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ณผ๋ฅจ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ์‹œ:
- `postgres_data`: PostgreSQL ๋ฐ์ดํ„ฐ
- `./data`: ์—…๋กœ๋“œ PDF, ํŒŒ์‹ฑ ๊ฒฐ๊ณผ ๋“ฑ ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ
- `./chroma_db`: Chroma ์ธ๋ฑ์Šค
- `./airflow_logs`: Airflow ๋กœ๊ทธ
- `./airflow_db`: Airflow ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
์ด๋Ÿฐ ํŒŒ์ผ์€ ์‹คํ–‰ ์ค‘ ์ƒ์„ฑ๋˜๋Š” ๋ฐ์ดํ„ฐ์ด๋ฏ€๋กœ ๋ณดํ†ต Git์— ์˜ฌ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
## Hugging Face Space ๋ฐฐํฌ
Hugging Face Space๋Š” GitHub Actions๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์Šค๋ƒ…์ƒท์„ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
Space์—๋Š” ์•„๋ž˜ ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ๋Š” ์˜ฌ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
- ์—…๋กœ๋“œ PDF ์›๋ณธ
- ๋กœ์ปฌ PostgreSQL/SQLite DB
- Chroma ์ธ๋ฑ์Šค
- Airflow ๋กœ๊ทธ์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
๋Œ€์‹  `cert_study_app/demo_data/questions_seed.json`๊ณผ `static/question_assets/`๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์•ฑ ์‹œ์ž‘ ์‹œ DB๊ฐ€ ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ๊ธฐ์กด seed๊ฐ€ ์˜ค๋ž˜๋œ ๊ฒฝ์šฐ seed ๊ธฐ์ค€์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ถ”๊ฐ€/๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ seed์—๋Š” 321๋ฌธํ•ญ, ๊ณตํ†ต ์ง€๋ฌธ ํฌํ•จ 36๋ฌธํ•ญ, ์›๋ฌธ ์ด๋ฏธ์ง€, Yes/No ์ง„์ˆ ํ˜• ๋ฌธ์ œ ๊ตฌ์กฐ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
seed๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค๋ฉด ๊ฒ€์ฆ ๋ฆฌํฌํŠธ๋„ ํ•จ๊ป˜ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
```bash
python scripts/export_hf_seed.py
```
์ƒ์„ฑ ํŒŒ์ผ:
- `cert_study_app/demo_data/questions_seed.json`
- `cert_study_app/demo_data/questions_seed.report.json`
๋ฆฌํฌํŠธ์—์„œ๋Š” ์ „์ฒด ๋ฌธํ•ญ ์ˆ˜, ๊ณตํ†ต ์ง€๋ฌธ ํฌํ•จ ๋ฌธํ•ญ ์ˆ˜, ์œ ํ˜•๋ณ„ ๊ฐœ์ˆ˜, ์ค‘๋ณต ๋ฒˆํ˜ธ, ์ •๋‹ต ๋ˆ„๋ฝ, ์ด๋ฏธ์ง€ ๋ˆ„๋ฝ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ํ™˜๊ฒฝ ๋ณ€์ˆ˜
๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์€ PostgreSQL์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
```env
DATABASE_URL=postgresql+pg8000://cert_study:cert_study@postgres:5432/cert_study
```
LLM๊ณผ ์ž„๋ฒ ๋”ฉ ๊ด€๋ จ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์˜ˆ์‹œ:
```env
CERT_STUDY_LLM_PROVIDER=ollama
OLLAMA_MODEL=qwen2.5:14b
OLLAMA_FAST_MODEL=qwen3.5:9b
OLLAMA_VISUAL_MODEL=qwen3-vl:8b-instruct-q4_K_M
EMBEDDING_MODEL=BAAI/bge-m3
OLLAMA_BASE_URL=http://host.docker.internal:11434
```
์šด์˜ ๋ฐฐํฌ์—์„œ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ API ์ •๋ณด๊ฐ€ ์ฝ”๋“œ์— ์ง์ ‘ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋„๋ก `.env` ๋˜๋Š” ์„œ๋ฒ„ ๋น„๋ฐ€๊ฐ’ ๊ด€๋ฆฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ฒ˜์Œ ์‹คํ–‰ํ•  ๋•Œ๋Š” ์˜ˆ์‹œ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
```bash
cp .env.example .env
```
์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ตœ์†Œํ•œ ์•„๋ž˜ ๊ฐ’์€ ๊ธฐ๋ณธ๊ฐ’์—์„œ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
- `POSTGRES_PASSWORD`
- `DATABASE_URL`
- `AIRFLOW_API_PASSWORD`
- `AIRFLOW_ADMIN_PASSWORD`
## Oracle Cloud Ubuntu์— ๋ฐฐํฌํ•˜๋ ค๋Š” ์ด์œ 
ํ–ฅํ›„ ๋ฐฐํฌ ๋Œ€์ƒ์€ Oracle Cloud Ubuntu ์„œ๋ฒ„๋ฅผ ๊ณ„ํšํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
- ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์™ธ๋ถ€์—์„œ ์ ‘์† ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์šด์˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
- Ubuntu ์„œ๋ฒ„๋Š” Docker ๊ธฐ๋ฐ˜ ๋ฐฐํฌ ์ž๋ฃŒ๊ฐ€ ๋งŽ์•„ ํ•™์Šตํ•˜๊ธฐ ์ข‹๋‹ค.
- Streamlit, PostgreSQL, Airflow ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ•œ ์„œ๋ฒ„์—์„œ ์‹คํ—˜ํ•˜๊ธฐ ์‰ฝ๋‹ค.
- ํฌํŠธํด๋ฆฌ์˜ค ํ”„๋กœ์ ํŠธ๋กœ ์‹ค์ œ ๋ฐฐํฌ ๊ฒฝํ—˜์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
## ์˜ˆ์ƒ ๋ฐฐํฌ ํ๋ฆ„
1. Oracle Cloud์—์„œ Ubuntu ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
2. ์„œ๋ฒ„์— Docker์™€ Docker Compose๋ฅผ ์„ค์น˜ํ•œ๋‹ค.
3. GitHub ์ €์žฅ์†Œ๋ฅผ ์„œ๋ฒ„์— cloneํ•œ๋‹ค.
4. `.env` ํŒŒ์ผ์„ ์„œ๋ฒ„ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ž‘์„ฑํ•œ๋‹ค.
5. `docker compose up -d --build`๋กœ ์‹คํ–‰ํ•œ๋‹ค.
6. ๋ฐฉํ™”๋ฒฝ๊ณผ ๋ณด์•ˆ ๋ชฉ๋ก์—์„œ ํ•„์š”ํ•œ ํฌํŠธ๋ฅผ ์—ฐ๋‹ค.
7. ์ ‘์† ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•œ๋‹ค.
8. ํ•„์š”ํ•˜๋ฉด Nginx์™€ HTTPS๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
## ๋ฐฐํฌ ์ „์— ์ •๋ฆฌํ•  ๊ฒƒ
- ์šด์˜์šฉ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ `.env`๋กœ ๋ถ„๋ฆฌ
- PostgreSQL ๋ฐ์ดํ„ฐ ๋ฐฑ์—… ๋ฐฉ์‹
- Chroma ์ธ๋ฑ์Šค ์žฌ์ƒ์„ฑ ๋ฐฉ์‹
- Airflow ๊ด€๋ฆฌ์ž ๊ณ„์ • ์„ค์ •
- ์—…๋กœ๋“œ ํŒŒ์ผ ์ €์žฅ ์œ„์น˜
- ๋กœ๊ทธ ๊ด€๋ฆฌ
- HTTPS ์ ์šฉ ์—ฌ๋ถ€
- `python scripts/check_quality.py` ํ†ต๊ณผ ์—ฌ๋ถ€
## ํ˜„์žฌ ์ƒํƒœ
ํ˜„์žฌ๋Š” Docker Compose ๊ธฐ๋ฐ˜ ๋กœ์ปฌ ์‹คํ–‰ ๊ตฌ์กฐ๊ฐ€ ์ค‘์‹ฌ์ž…๋‹ˆ๋‹ค. Oracle Cloud ๋ฐฐํฌ๋Š” ํ–ฅํ›„ ์ง„ํ–‰ํ•  ๊ณ„ํš์ด๋ฉฐ, ๋ฐฐํฌ ์ „์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜, ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ, ๋ณด์•ˆ ์„ค์ •์„ ๋” ์ •๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.