AWS EC2 인스턴스에 설치된 백엔드(Flask + Qdrant)와 프론트엔드(React serve)를 처음부터 올바르게 구동하는 순서를 상세히 정리합니다. 현재 구동 중인 프로세스를 확인하고 종료하는 단계부터 시작하겠습니다.
AWS EC2 인스턴스에서 애플리케이션 구동 순서 (단계별)
사전 준비물:
- AWS EC2 인스턴스에 SSH로 접속 가능한 터미널 창
- sudo 권한
- 각 애플리케이션의 파일 경로 (예: /home/ec2-user/flask, /home/ec2-user/front/build)
- Flask 앱 파일명 (예: chapter5-1-3_from_4-2_from_3-7_copy.py)
1단계: 현재 실행 중인 모든 관련 프로세스 확인 및 종료
이 단계에서는 Qdrant, Flask, serve 관련 프로세스가 현재 백그라운드에서 실행 중인지 확인하고 모두 종료합니다. 그래야 깨끗한 상태에서 다시 시작할 수 있습니다.
- Qdrant Docker 컨테이너 확인 및 중지:
Bash
sudo docker ps -a
- 결과 확인: qdrant/qdrant 이미지를 사용하는 컨테이너가 Up (실행 중) 상태이거나 Exited (종료됨) 상태로 보일 수 있습니다.
- 중지 명령어: 만약 Up 상태인 Qdrant 컨테이너가 있다면, 해당 CONTAINER ID 또는 NAMES를 사용하여 중지합니다.
Bash
sudo docker stop [QDRANT_CONTAINER_ID_OR_NAME]
(예: sudo docker stop 5f7287e6328c 또는 sudo docker stop xenodochial_mendeleev) - 삭제 (선택 사항): 완전히 제거하고 새로 시작하려면 중지 후 삭제합니다. 삭제해도 데이터 볼륨은 남습니다.
Bash
sudo docker rm [QDRANT_CONTAINER_ID_OR_NAME]
- Flask 백엔드 프로세스 확인 및 중지:
Bash
ps -ef | grep python | grep "chapter5-1-3_from_4-2_from_3-7_copy.py"
- 결과 확인: 이전에 nohup으로 실행한 Flask 앱 프로세스가 보일 수 있습니다.
(예시: ec2-user 12345 1 0 10:00 ? 00:00:00 python3 chapter5-1-3_from_4-2_from_3-7_copy.py) 여기서 12345가 PID입니다. - 중지 명령어: 해당 PID를 사용하여 프로세스를 종료합니다.
Bash
sudo kill [FLASK_APP_PID]
(예: sudo kill 12345)
만약 종료되지 않으면 sudo kill -9 [FLASK_APP_PID] (강제 종료)를 시도합니다.
- 프론트엔드 serve 프로세스 확인 및 중지:
Bash
ps -ef | grep serve
- 결과 확인: serve 명령어를 사용하여 구동한 프론트엔드 앱 프로세스가 보일 수 있습니다.
(예시: ec2-user 67890 1 0 10:00 ? 00:00:00 /usr/bin/node /usr/bin/serve ...) 여기서 67890이 PID입니다. - 중지 명령어: 해당 PID를 사용하여 프로세스를 종료합니다.
Bash
sudo kill [SERVE_PID]
(예: sudo kill 67890)
만약 종료되지 않으면 sudo kill -9 [SERVE_PID] (강제 종료)를 시도합니다.
2단계: Qdrant Docker 컨테이너 구동
Qdrant는 벡터 데이터베이스로, 백엔드 Flask 앱이 의존하므로 가장 먼저 실행해야 합니다.
- Qdrant 데이터 저장소 디렉토리로 이동 (또는 확인):
Flask 앱이 있는 디렉토리(/home/ec2-user/flask)에 qdrant_storage 폴더가 위치하는 것이 일반적입니다. 해당 디렉토리로 이동합니다.
Bash
cd /home/ec2-user/flask
- 중요: 만약 qdrant_storage 폴더가 손상되었거나, 잘못된 컬렉션 차원 문제(OutputTooSmall 에러)가 계속 발생한다면, 이 폴더의 내용을 완전히 비우거나 삭제한 후 Qdrant를 재실행하세요.
Bash
sudo rm -rf qdrant_storage/* # 폴더 안의 내용만 삭제
# 또는 sudo rm -rf qdrant_storage # 폴더 자체를 삭제 (docker run 시 다시 생성됨)
- Qdrant 컨테이너 실행:
Bash
sudo docker run -d -p 6333:6333 -p 6334:6334 -v "$(pwd)/qdrant_storage:/qdrant/storage:z" --name qdrant_server qdrant/qdrant
- -d: 컨테이너를 데몬(백그라운드) 모드로 실행합니다. (터미널이 바로 해방됩니다.)
- --name qdrant_server: 컨테이너에 qdrant_server라는 식별하기 쉬운 이름을 부여합니다. (선택 사항이지만 권장)
- qdrant/qdrant: 사용할 Docker 이미지입니다.
- Qdrant 컨테이너 실행 확인:
Bash
sudo docker ps
```qdrant_server` (또는 지정한 이름) 컨테이너가 `Up` 상태로 표시되는지 확인합니다.
3단계: Flask 백엔드 애플리케이션 구동
Qdrant가 실행 중이면, Qdrant를 사용하는 Flask 백엔드 앱을 구동합니다.
- Flask 앱 디렉토리로 이동:
Bash
cd /home/ec2-user/flask - Flask 앱 백그라운드 실행:
Bash
nohup python3 chapter5-1-3_from_4-2_from_3-7_copy.py &
- nohup: 터미널 세션이 끊어져도 Flask 앱이 계속 실행됩니다.
- &: 명령어를 백그라운드로 실행합니다.
- Flask 앱 실행 확인:
Bash
ps -ef | grep python | grep "chapter5-1-3_from_4-2_from_3-7_copy.py"
Flask 앱 프로세스가 백그라운드에서 잘 실행되고 있는지 확인합니다.
- 로그 확인: Flask 앱의 초기 구동 로그는 nohup.out 파일에 기록됩니다.
Bash
tail -f nohup.out
이 명령어로 Qdrant 연결 성공 메시지(Qdrant 클라이언트 연결 및 컬렉션 정보 가져오기 성공: ...)가 뜨는지 확인합니다. (Ctrl+C로 종료)
- 데이터 재삽입 (필수):
만약 2단계에서 qdrant_storage를 초기화했다면, Qdrant test3 컬렉션에 데이터가 없습니다. Flask 앱의 /upsertPoint 엔드포인트를 호출하여 데이터를 다시 삽입해야 합니다. (예: Postman 또는 프론트엔드를 통해)
4단계: React 프론트엔드 애플리케이션 구동
이제 백엔드와 Qdrant가 모두 실행 중이므로, 사용자 인터페이스를 제공하는 React 프론트엔드 앱을 구동합니다.
- 프론트엔드 build 디렉토리로 이동:
Bash
cd /home/ec2-user/front/build
- 중요: build 디렉토리 안에 .html, .js, .css 파일들이 있는지 ls -l로 다시 한번 확인하세요. 빌드가 제대로 안 되었다면 내용이 비어있을 수 있습니다.
- serve 백그라운드 실행:
Bash
nohup serve -s . -l 3000 &
- nohup: 터미널 세션이 끊어져도 serve 프로세스가 계속 실행됩니다.
- -s .: 현재 디렉토리(build)의 정적 파일들을 서빙합니다.
- -l 3000: 3000번 포트에서 리스닝합니다. (Flask 앱의 5500번과 충돌하지 않도록 다른 포트 사용)
- &: 명령어를 백그라운드로 실행합니다.
- serve 프로세스 실행 확인:
Bash
ps -ef | grep serve
```serve` 프로세스가 백그라운드에서 잘 실행되고 있는지 확인합니다.
5단계: 최종 확인 및 AWS 보안 그룹 점검 (매우 중요)
모든 서비스가 EC2 인스턴스 내에서 실행 중이지만, 외부에서 접근하려면 AWS 보안 그룹 설정이 올바른지 확인해야 합니다.
- 웹 브라우저에서 프론트엔드 접속 시도:
http://[YOUR_EC2_PUBLIC_IP]:3000
- [YOUR_EC2_PUBLIC_IP]는 당신의 AWS EC2 인스턴스의 퍼블릭 IP 주소입니다.
- AWS 보안 그룹 인바운드 규칙 최종 점검:
- 3000번 포트 (프론트엔드 serve): 당신의 로컬 PC IP 또는 0.0.0.0/0에서 3000번 포트로의 TCP 접근이 허용되어 있는지 확인.
- 5500번 포트 (Flask 백엔드): 당신의 로컬 PC IP 또는 0.0.0.0/0에서 5500번 포트로의 TCP 접근이 허용되어 있는지 확인.
- 6333번 포트 (Qdrant gRPC): 당신의 Flask 앱이 Qdrant와 같은 EC2 인스턴스에 있으므로 이 포트는 외부에서 직접 접근할 필요는 없지만, 만약 외부에서 Qdrant에 직접 연결하는 경우가 있다면 (예: Qdrant GUI) 이 포트도 열어야 합니다. 현재 구성에서는 Flask 앱이 localhost로 Qdrant에 접속하므로 보안 그룹과 무관합니다.
이 순서대로 진행하시면 모든 컴포넌트가 올바르게 구동되고 서로 통신하여 챗봇 서비스가 웹에서 정상적으로 작동할 것입니다.
반응형
'AI, 클라우드, 협업, 교육, 문서, 업무자동화' 카테고리의 다른 글
Address already in use" (이미 사용 중인 주소) 문제 (0) | 2025.07.25 |
---|---|
React 챗봇(ChatBot) 페이지 코드 정리 (0) | 2025.07.22 |
간단한 RAG(Retrieval Augmented Generation) 기반 챗봇 서비스 (0) | 2025.07.20 |
벡터DB, Qdrant를 활용한 벡터 검색 워크플로우 정리 (0) | 2025.07.20 |
벡터DB, Qdrant 컬렉션 검색 코드 설명 (0) | 2025.07.20 |