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 ์ž‘์—… ์Šค์ผ€์ค„๋Ÿฌ

๋กœ์ปฌ ์‹คํ–‰

cp .env.example .env
docker compose up --build

์ ‘์† ์ฃผ์†Œ:

  • Streamlit ์•ฑ: http://localhost:8501
  • Airflow: http://localhost:8080
  • PostgreSQL: localhost:5432

Streamlit ํ™”๋ฉด๋งŒ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ๋•Œ๋Š” Docker ์—†์ด ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค๋ฉด ๊ฒ€์ฆ ๋ฆฌํฌํŠธ๋„ ํ•จ๊ป˜ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

python scripts/export_hf_seed.py

์ƒ์„ฑ ํŒŒ์ผ:

  • cert_study_app/demo_data/questions_seed.json
  • cert_study_app/demo_data/questions_seed.report.json

๋ฆฌํฌํŠธ์—์„œ๋Š” ์ „์ฒด ๋ฌธํ•ญ ์ˆ˜, ๊ณตํ†ต ์ง€๋ฌธ ํฌํ•จ ๋ฌธํ•ญ ์ˆ˜, ์œ ํ˜•๋ณ„ ๊ฐœ์ˆ˜, ์ค‘๋ณต ๋ฒˆํ˜ธ, ์ •๋‹ต ๋ˆ„๋ฝ, ์ด๋ฏธ์ง€ ๋ˆ„๋ฝ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜

๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์€ PostgreSQL์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

DATABASE_URL=postgresql+pg8000://cert_study:cert_study@postgres:5432/cert_study

LLM๊ณผ ์ž„๋ฒ ๋”ฉ ๊ด€๋ จ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์˜ˆ์‹œ:

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 ๋˜๋Š” ์„œ๋ฒ„ ๋น„๋ฐ€๊ฐ’ ๊ด€๋ฆฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฒ˜์Œ ์‹คํ–‰ํ•  ๋•Œ๋Š” ์˜ˆ์‹œ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

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 ๋ฐฐํฌ๋Š” ํ–ฅํ›„ ์ง„ํ–‰ํ•  ๊ณ„ํš์ด๋ฉฐ, ๋ฐฐํฌ ์ „์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜, ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ, ๋ณด์•ˆ ์„ค์ •์„ ๋” ์ •๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.