Skip to content

Commit b88d04d

Browse files
committed
Merge branch 'develop'
2 parents 226f6b9 + 274c3d2 commit b88d04d

5 files changed

Lines changed: 576 additions & 0 deletions

File tree

.github/workflows/build-push.yml

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
name: backend - build & push (multi-arch) + deploy
2+
3+
on:
4+
push:
5+
branches: [ "main" ]
6+
tags: [ "v*" ]
7+
8+
jobs:
9+
build-push:
10+
runs-on: ubuntu-latest
11+
env:
12+
IMAGE: ${{ vars.DOCKERHUB_USERNAME }}/winear-backend
13+
steps:
14+
- name: Checkout
15+
uses: actions/checkout@v4
16+
17+
# 멀티아치 빌드를 위한 QEMU/Buildx 설정
18+
- name: QEMU 설치
19+
uses: docker/setup-qemu-action@v3
20+
21+
- name: Buildx 설치
22+
uses: docker/setup-buildx-action@v3
23+
24+
- name: Docker Hub 로그인
25+
uses: docker/login-action@v3
26+
with:
27+
username: ${{ vars.DOCKERHUB_USERNAME }}
28+
password: ${{ secrets.DOCKERHUB_TOKEN }}
29+
30+
- name: Compute tags
31+
id: meta
32+
run: |
33+
SHA=${GITHUB_SHA::7}
34+
echo "sha=${SHA}" >> $GITHUB_OUTPUT
35+
if [[ "$GITHUB_REF" == refs/tags/v* ]]; then
36+
echo "is_tag=true" >> $GITHUB_OUTPUT
37+
echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
38+
else
39+
echo "is_tag=false" >> $GITHUB_OUTPUT
40+
fi
41+
42+
# 멀티아치 빌드 + 푸시 (amd64, arm64)
43+
- name: Build & Push (edge + sha; multi-arch)
44+
uses: docker/build-push-action@v6
45+
with:
46+
context: .
47+
file: ./Dockerfile
48+
push: true
49+
platforms: linux/amd64,linux/arm64
50+
tags: |
51+
${{ env.IMAGE }}:${{ steps.meta.outputs.sha }}
52+
${{ env.IMAGE }}:edge
53+
cache-from: type=registry,ref=${{ env.IMAGE }}:buildcache
54+
cache-to: type=registry,ref=${{ env.IMAGE }}:buildcache,mode=max
55+
56+
# 릴리스 태그(v*)면 version + latest로 멀티아치 매니페스트 승격
57+
- name: Promote for release (version + latest)
58+
if: steps.meta.outputs.is_tag == 'true'
59+
run: |
60+
docker buildx imagetools create \
61+
-t ${{ env.IMAGE }}:${{ steps.meta.outputs.version }} \
62+
-t ${{ env.IMAGE }}:latest \
63+
${{ env.IMAGE }}:${{ steps.meta.outputs.sha }}
64+
65+
deploy:
66+
needs: build-push
67+
runs-on: ubuntu-latest
68+
if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')
69+
steps:
70+
- name: SSH deploy (compose pull & up -d)
71+
uses: appleboy/ssh-action@v1.0.3
72+
with:
73+
host: ${{ vars.SSH_HOST }}
74+
username: ${{ vars.SSH_USER }}
75+
key: ${{ secrets.SSH_PRIVATE_KEY }}
76+
script: |
77+
set -e
78+
cd /home/ubuntu/stack
79+
docker compose pull
80+
docker compose up -d
81+
docker image prune -f

Dockerfile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@ RUN apt-get update && apt-get install -y --no-install-recommends curl \
2828

2929
# 앱 코드 복사
3030
COPY app/ ./app/
31+
COPY scripts/ ./scripts/
32+
COPY data/ ./data/
3133
COPY *.py ./
34+
COPY scripts/requirements.txt .
35+
36+
# Requirements.txt 설치
37+
RUN pip install --no-cache-dir -r requirements.txt
3238

3339
# 데이터/로그 디렉토리
3440
RUN mkdir -p faiss_user_profiles logs

scripts/README.md

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# MongoDB 모킹 데이터 생성 스크립트
2+
3+
## 개요
4+
5+
`generate_mock_data.py`는 기존 CSV 데이터를 기반으로 MongoDB에 모킹 데이터를 자동으로 생성하는 스크립트입니다.
6+
7+
## 주요 기능
8+
9+
- **사용자 데이터 확장**: 기존 `User_1000_str.csv` 데이터에 이름, 성별, 나이(50세 이상) 정보 추가
10+
- **여행 데이터 삽입**: `final_travel.csv` 데이터를 MongoDB에 구조화하여 저장
11+
- **MongoDB 컬렉션 구성**:
12+
- `user_features`: 사용자 특성 및 프로필 정보
13+
- `user_profile`: 사용자 여행 성향 프로필
14+
- `user_summary`: 사용자 요약 정보
15+
- `user_recs`: 사용자 추천 데이터
16+
- `travel_info`: 여행 상품 정보
17+
- `travel_url`: 여행 상품 URL
18+
19+
## 설치 및 설정
20+
21+
### 1. 의존성 설치
22+
23+
```bash
24+
pip install -r requirements.txt
25+
```
26+
27+
### 2. MongoDB 설정
28+
29+
#### 로컬 MongoDB 사용
30+
```bash
31+
# MongoDB가 로컬에서 실행 중이어야 함 (기본 포트 27017)
32+
```
33+
34+
#### MongoDB Atlas 사용
35+
스크립트의 `main()` 함수에서 `mongodb_uri` 변수를 수정:
36+
```python
37+
mongodb_uri = "mongodb+srv://username:password@cluster.mongodb.net/"
38+
```
39+
40+
또는 환경변수 설정:
41+
```bash
42+
export MONGODB_URI="mongodb+srv://username:password@cluster.mongodb.net/"
43+
```
44+
45+
## 사용법
46+
47+
### 기본 실행
48+
```bash
49+
python generate_mock_data.py
50+
```
51+
52+
### 실행 과정
53+
1. 기존 사용자 데이터 삭제 (선택적)
54+
2. CSV 파일 로드
55+
3. 사용자별 랜덤 프로필 생성 (이름, 성별, 나이)
56+
4. MongoDB에 데이터 삽입
57+
5. 데이터 검증
58+
59+
## 생성되는 데이터 구조
60+
61+
### user_features 컬렉션
62+
```json
63+
{
64+
"ID": "1asd",
65+
"Features": {
66+
"예민함정도": "보통",
67+
"의견수용": "매우 수용적",
68+
// ... 기존 특성들
69+
"name": "김철수",
70+
"gender": "남성",
71+
"age": 65
72+
}
73+
}
74+
```
75+
76+
### travel_info 컬렉션
77+
```json
78+
{
79+
"product_code": "AAP202250902TWA",
80+
"title": "방콕/파타야 5일 #첫여행추천",
81+
"description": "방콕&파타야를 처음 방문하시거나...",
82+
"hashtags": ["#관광+자유", "#관광"],
83+
"features": ["3박 5일", "LCC", "쇼핑없음"],
84+
"price": "749,000"
85+
}
86+
```
87+
88+
## 로그 확인
89+
90+
스크립트 실행 시 상세한 로그가 출력됩니다:
91+
- MongoDB 연결 상태
92+
- 데이터 삽입 진행률
93+
- 최종 컬렉션별 문서 수
94+
- 샘플 데이터 확인
95+
96+
## 주의사항
97+
98+
- 스크립트 실행 시 기존 사용자 데이터가 모두 삭제됩니다
99+
- 여행 데이터도 기존 데이터가 삭제되고 새로 삽입됩니다
100+
- 1000명의 사용자 데이터 처리에 수 분이 소요될 수 있습니다
101+
102+
## 트러블슈팅
103+
104+
### MongoDB 연결 오류
105+
- MongoDB 서버가 실행 중인지 확인
106+
- 연결 URI가 올바른지 확인
107+
- 네트워크 방화벽 설정 확인
108+
109+
### CSV 파일 경로 오류
110+
- `data/` 디렉토리에 CSV 파일들이 존재하는지 확인
111+
- 파일 권한 확인
112+
113+
### 메모리 부족
114+
- 큰 데이터셋의 경우 배치 단위로 처리하도록 스크립트 수정 가능

0 commit comments

Comments
 (0)