본문 바로가기
AI, 클라우드, 협업, 교육, 문서, 업무자동화

AWS EC2 인스턴스에 설치된 백엔드(Flask + Qdrant)와 프론트엔드(React serve) 구동순서 정리

by 아톨 2025. 7. 25.

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 관련 프로세스가 현재 백그라운드에서 실행 중인지 확인하고 모두 종료합니다. 그래야 깨끗한 상태에서 다시 시작할 수 있습니다.

  1. 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]

  1. 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] (강제 종료)를 시도합니다.
  1. 프론트엔드 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 앱이 의존하므로 가장 먼저 실행해야 합니다.

  1. 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 시 다시 생성됨)

  1. 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 이미지입니다.
  1. Qdrant 컨테이너 실행 확인:
    Bash
    sudo docker ps
    ```qdrant_server` (또는 지정한 이름) 컨테이너가 `Up` 상태로 표시되는지 확인합니다.



3단계: Flask 백엔드 애플리케이션 구동

 

Qdrant가 실행 중이면, Qdrant를 사용하는 Flask 백엔드 앱을 구동합니다.

  1. Flask 앱 디렉토리로 이동:
    Bash
    cd /home/ec2-user/flask

  2. Flask 앱 백그라운드 실행:
    Bash
    nohup python3 chapter5-1-3_from_4-2_from_3-7_copy.py &

  • nohup: 터미널 세션이 끊어져도 Flask 앱이 계속 실행됩니다.
  • &: 명령어를 백그라운드로 실행합니다.
  1. 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로 종료)
  1. 데이터 재삽입 (필수):
    만약 2단계에서 qdrant_storage를 초기화했다면, Qdrant test3 컬렉션에 데이터가 없습니다. Flask 앱의 /upsertPoint 엔드포인트를 호출하여 데이터를 다시 삽입해야 합니다. (예: Postman 또는 프론트엔드를 통해)

4단계: React 프론트엔드 애플리케이션 구동

 

이제 백엔드와 Qdrant가 모두 실행 중이므로, 사용자 인터페이스를 제공하는 React 프론트엔드 앱을 구동합니다.

  1. 프론트엔드 build 디렉토리로 이동:
    Bash
    cd /home/ec2-user/front/build

  • 중요: build 디렉토리 안에 .html, .js, .css 파일들이 있는지 ls -l로 다시 한번 확인하세요. 빌드가 제대로 안 되었다면 내용이 비어있을 수 있습니다.
  1. serve 백그라운드 실행:
    Bash
    nohup serve -s . -l 3000 &

  • nohup: 터미널 세션이 끊어져도 serve 프로세스가 계속 실행됩니다.
  • -s .: 현재 디렉토리(build)의 정적 파일들을 서빙합니다.
  • -l 3000: 3000번 포트에서 리스닝합니다. (Flask 앱의 5500번과 충돌하지 않도록 다른 포트 사용)
  • &: 명령어를 백그라운드로 실행합니다.
  1. serve 프로세스 실행 확인:
    Bash
    ps -ef | grep serve
    ```serve` 프로세스가 백그라운드에서 잘 실행되고 있는지 확인합니다.



5단계: 최종 확인 및 AWS 보안 그룹 점검 (매우 중요)

 

모든 서비스가 EC2 인스턴스 내에서 실행 중이지만, 외부에서 접근하려면 AWS 보안 그룹 설정이 올바른지 확인해야 합니다.

  1. 웹 브라우저에서 프론트엔드 접속 시도:
    http://[YOUR_EC2_PUBLIC_IP]:3000
  • [YOUR_EC2_PUBLIC_IP]는 당신의 AWS EC2 인스턴스의 퍼블릭 IP 주소입니다.
  1. 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에 접속하므로 보안 그룹과 무관합니다.

이 순서대로 진행하시면 모든 컴포넌트가 올바르게 구동되고 서로 통신하여 챗봇 서비스가 웹에서 정상적으로 작동할 것입니다.



반응형