Skip to content

Latest commit

ย 

History

History
183 lines (132 loc) ยท 5.15 KB

File metadata and controls

183 lines (132 loc) ยท 5.15 KB

BackEnd

Repository of JobDri BackEnd

Docker

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

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

ํฌํ•จ ์„œ๋น„์Šค:

  • Spring Boot API: http://localhost:8080
  • FastAPI worker health: http://localhost:8000/health
  • RabbitMQ: amqp://localhost:5672
  • RabbitMQ management: http://localhost:15672

๋ฐฐํฌ ์„œ๋ฒ„ ์‹คํ–‰:

cp .env.production.example .env
docker compose -f docker-compose.prod.yml up -d

prod ํ”„๋กœํ•„์€ /actuator/health๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

Async Worker Architecture

ํ˜„์žฌ ๋น„๋™๊ธฐ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

  • API ์„œ๋ฒ„: task row ์ƒ์„ฑ, ์ƒํƒœ ์กฐํšŒ API ์ œ๊ณต, RabbitMQ publish, ์ตœ์ข… DB ์ €์žฅ
  • RabbitMQ: job posting ingest ์ž‘์—… ๋ฒ„ํผ๋ง๊ณผ ์žฌ์ „๋‹ฌ
  • FastAPI worker: MQ consume, OpenAI ๊ธฐ๋ฐ˜ ์ถ”์ถœ/๋ถ„๋ฅ˜/์ƒ์„ฑ ์ˆ˜ํ–‰, ๋‚ด๋ถ€ API callback

๋กœ์ปฌ์— ํ•„์š”ํ•œ ์ถ”๊ฐ€ env:

RABBITMQ_HOST=localhost
RABBITMQ_PORT=5672
RABBITMQ_USERNAME=guest
RABBITMQ_PASSWORD=guest
RABBITMQ_VHOST=/
APP_WORKER_INTERNAL_API_KEY=change-me-internal-worker-key
APP_WORKER_JOB_POSTING_EXCHANGE=jobdri.worker.exchange
APP_WORKER_JOB_POSTING_QUEUE=jobdri.job-posting.ingest
APP_WORKER_JOB_POSTING_ROUTING_KEY=job-posting.ingest
APP_WORKER_JOB_POSTING_DLQ=jobdri.job-posting.ingest.dlq
WORKER_MAX_RETRY_COUNT=3

์Šค๋ชจํฌ ํ…Œ์ŠคํŠธ:

  1. docker compose up --build
  2. ๋กœ๊ทธ์ธ ํ† ํฐ์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
  3. POST /api/job-postings/ingest ๋กœ rawText ๋˜๋Š” imageObjectKey๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  4. ์‘๋‹ต์˜ taskId๋กœ GET /api/job-postings/ingest/async/{taskId} ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
  5. worker๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด SUCCEEDED, ์‹คํŒจํ•˜๋ฉด FAILED ์™€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

worker ๋‹จ๋… ์‹คํ–‰:

python3 -m venv .venv
source .venv/bin/activate
pip install -r worker/requirements.txt
uvicorn worker.app.main:app --host 0.0.0.0 --port 8000

Corpus Import Script

๋Œ€์šฉ๋Ÿ‰ corpus ์—‘์…€ ์ ์žฌ๋Š” ๊ด€๋ฆฌ์ž API ๋Œ€์‹  Python ์Šคํฌ๋ฆฝํŠธ๋กœ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜:

python3 -m venv .venv
source .venv/bin/activate
pip install -r scripts/requirements-corpus-import.txt

์‹คํ–‰:

cp .env.example .env
python scripts/import_corpus.py /absolute/path/to/file.xlsx
  • .env์˜ DB_URL, DB_USERNAME, DB_PASSWORD๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ env ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๋ฐ”๊พธ๋ ค๋ฉด --env-file /path/to/.env ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—‘์…€ ์‹œํŠธ๋ช…์€ jd_embed_corpus, question_embed_corpus๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • source_analysis_id, source_question_id ๊ธฐ์ค€์œผ๋กœ INSERT ... ON CONFLICT DO UPDATE ๋ฐฉ์‹์œผ๋กœ ์ ์žฌํ•ฉ๋‹ˆ๋‹ค.

Corpus Embedding Sync Script

๊ด€๋ฆฌ์ž API ๋Œ€์‹  Python ์Šคํฌ๋ฆฝํŠธ๋กœ corpus ์ž„๋ฒ ๋”ฉ์„ ์ผ๊ด„ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹คํ–‰:

source .venv/bin/activate
pip install -r scripts/requirements-corpus-import.txt
python scripts/sync_corpus_embeddings.py --env-file .env

์˜ต์…˜ ์˜ˆ์‹œ:

python scripts/sync_corpus_embeddings.py --env-file .env --limit 100
python scripts/sync_corpus_embeddings.py --env-file .env --job-only
python scripts/sync_corpus_embeddings.py --env-file .env --question-only --batch-size 16
  • .env์˜ DB_URL, DB_USERNAME, DB_PASSWORD, COHERE_API_KEY๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ๋ชจ๋ธ์€ embed-v4.0, ๊ธฐ๋ณธ ๋ฐฐ์น˜ ํฌ๊ธฐ๋Š” 32์ž…๋‹ˆ๋‹ค.
  • mock_job_posting_embeddings, mock_question_embeddings ํ…Œ์ด๋ธ”์— INSERT ... ON CONFLICT DO UPDATE ๋ฐฉ์‹์œผ๋กœ ์ ์žฌํ•ฉ๋‹ˆ๋‹ค.

CI/CD

  • CI: main, develop ๋ธŒ๋žœ์น˜ push ๋ฐ PR์—์„œ ํ…Œ์ŠคํŠธ์™€ Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • Deploy: main ๋ธŒ๋žœ์น˜ push ๋˜๋Š” ์ˆ˜๋™ ์‹คํ–‰ ์‹œ GHCR์— ์ด๋ฏธ์ง€๋ฅผ ํ‘ธ์‹œํ•˜๊ณ , ๋ฐฐํฌ ์„œ๋ฒ„ secret์ด ์žˆ์œผ๋ฉด SSH๋กœ docker-compose.prod.yml์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

GitHub Actions ๋ฐฐํฌ secret:

  • DEPLOY_HOST
  • DEPLOY_USER
  • DEPLOY_PORT optional, default 22
  • DEPLOY_SSH_KEY
  • DEPLOY_PATH
  • GHCR_USERNAME
  • GHCR_TOKEN

๋ฐฐํฌ ํ™˜๊ฒฝ

๋ฐฑ์—”๋“œ API๋Š” Docker ์ด๋ฏธ์ง€๋กœ ๋นŒ๋“œ๋˜์–ด GHCR์— ์—…๋กœ๋“œ๋˜๊ณ , GitHub Actions๋ฅผ ํ†ตํ•ด EC2 ์„œ๋ฒ„์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

์ธํ”„๋ผ

  • ์„œ๋ฒ„: AWS EC2 t3.small
  • OS: Amazon Linux 2023
  • DB: AWS RDS PostgreSQL db.t3.micro
  • Redis: Upstash Redis
  • ์›น ์„œ๋ฒ„: Nginx
  • ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„: Docker, Docker Compose

๋ฐฐํฌ ํ๋ฆ„

  1. main ๋ธŒ๋žœ์น˜์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
  2. GitHub Actions๊ฐ€ Docker ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.
  3. ์ด๋ฏธ์ง€๋ฅผ GHCR์— ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.
  4. GitHub Actions๊ฐ€ EC2์— SSH๋กœ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.
  5. EC2์—์„œ docker-compose.prod.yml์„ ์‚ฌ์šฉํ•ด ์ตœ์‹  ์ด๋ฏธ์ง€๋ฅผ pullํ•˜๊ณ  API ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์žฌ๊ธฐ๋™ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ ๋ฐฐํฌ ๊ฒฝ๋กœ

/opt/jobdri-api

์„œ๋ฒ„์—๋Š” ์•„๋ž˜ ํŒŒ์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

docker-compose.prod.yml
.env

์šด์˜ API ๋„๋ฉ”์ธ

์šด์˜ API๋Š” Nginx reverse proxy์™€ Let's Encrypt ์ธ์ฆ์„œ๋ฅผ ํ†ตํ•ด HTTPS๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

https://api.jobdri.site
  • Nginx๋Š” 80/443 ์š”์ฒญ์„ Spring Boot API ์ปจํ…Œ์ด๋„ˆ์˜ 8080 ํฌํŠธ๋กœ ํ”„๋ก์‹œํ•ฉ๋‹ˆ๋‹ค.
  • SSL ์ธ์ฆ์„œ๋Š” Certbot์œผ๋กœ ๋ฐœ๊ธ‰ํ–ˆ์œผ๋ฉฐ ์ž๋™ ๊ฐฑ์‹ ์ด ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒํƒœ ํ™•์ธ: https://api.jobdri.site/actuator/health

์ •์ƒ ์‘๋‹ต:

{"status":"UP","groups":["liveness","readiness"]}