1. 개요

식품안전(Food Safety) 관련 QA 챗봇 + 관리자 백오피스 + 모바일 민원 웹앱의 통합 EC2. FINGU-GRINDA 그룹 운영. RAG 기반 챗봇 코어(Go) + Node Express 4종 + Docker 컨테이너 2종(MySQL·Qdrant)이 같은 인스턴스에서 PM2/systemd로 구동 중.

Uptime29일
Public IP (EIP)13.209.138.233
RepoFINGU-GRINDA/go-chatbot-server
최근 커밋feat(v5): gemini-1.5-flash
PM2 프로세스5개
Docker 컨테이너2개 (MySQL · Qdrant)
도메인없음 (IP 직접 접속)
HTTPS미적용 (nginx 비활성)

2. 토폴로지

┌─────────────────────────────────────────────────────────────────┐
│  EC2 chatbot-server (13.209.138.233 / t3.medium / AL2023)       │
│                                                                 │
│  ┌────────────┐   ┌────────────────────┐  ┌──────────────────┐  │
│  │ PM2 fork   │   │ go-chatbot-server  │  │ Docker            │ │
│  │            │   │ (Go 1.22 / Gin)    │  │                   │ │
│  │ :3000 admin-fe       │  :8080       │  │ mysql:latest      │ │
│  │ :3002 admin-be ──┐   │  /api/v1..v6 │  │   :3306 qcbot     │ │
│  │ :4000 web-fe     │   │  /chat/...   │  │                   │ │
│  │ :3001 web-be   ──┼──▶│              │  │ qdrant/qdrant     │ │
│  │ :1880 chatbot ───┘   │              │  │   :6333 :6334     │ │
│  └────────────┘   └──────┬─────────────┘  └──────┬────────────┘ │
│                          ↓                       ↓              │
│             Gemini API · OpenAI Embeddings · Qdrant Vectors     │
└─────────────────────────────────────────────────────────────────┘
        ↓ outbound
   Naver Cloud APIGW · Omni Alimtalk · AWS S3 (qc-aws-bucket, quality-admin-web-s3)

3. 컴포넌트 5종

① go-chatbot-server Go 1.22 · Gin

역할
RAG 챗봇 코어 — 식품안전 FAQ/시설/지역/회사/검사일정 질의응답
포트
:8080
실행
main 바이너리 (PID 4669) — PM2 외 직접 실행
핵심 의존
Gin · Qdrant SDK · LangChainGo · pgx (PostgreSQL) · gorilla/websocket · go-openai · Vertex AI · Gemini
경로
/home/ec2-user/app/go-chatbot-server

go-chatbot-server

API 6개 버전(v1~v6)이 동거 — v5가 최신(gemini-1.5-flash). cmd/api/main.go 에서 GPT-4o-mini 호출도 발견. Qdrant collections 5개(faq/faq_keywords/regional_data/company/inspection_schedules) 사용. Postgres(pgx) + sqlc 코드 생성기 사용. CORS는 AllowAllOrigins=true.

② quality-chatbot Node · Express

역할
카카오 챗봇 게이트웨이 — 사용자 카카오톡 입력을 go-chatbot-server로 라우팅 + 카드/이미지 응답 조립
포트
:1880
PM2
quality-chatbot (재시작 88회 · 117분 uptime — 크래시 루프 의심)
경로
/home/ec2-user/app/new/quality-chatbot

quality-chatbot 카테고리 8종

  • chatbot/faq/{enter,question} — FAQ 진입·질의
  • chatbot/fee — 검사 수수료
  • chatbot/food/{enter,result} — 식품 안전 조회
  • chatbot/livestock/{enter,result} — 축산물 조회
  • chatbot/institute — 검사 기관
  • chatbot/information — 일반 안내

③ quality-admin Next.js · MUI · Express

역할
관리자 백오피스 (PC) — FAQ/수수료/빈도/기관/알림/사용자 관리
포트
:3000(FE) · :3002(BE)
PM2
quality-admin-backend · quality-admin-frontend
경로
/home/ec2-user/app/new/quality-admin

페이지 8개

signin · index · chatbot/{faq,fee,frequency,institute} · notifications/{index,history} · users

④ quality-admin-web Next.js · MUI · Redux

역할
모바일 민원 웹앱 — 시민이 신청서 작성·OCR 촬영·검사기관 조회·알림 수신
포트
:4000(FE) · :3001(BE)
PM2
quality-admin-web-backend · quality-admin-web-frontend
경로
/home/ec2-user/app/new/quality-admin-web

모바일 페이지 14개

ocr/{photo,shoot} · webapp/{appform,application,fee,form,info,institute,privacy-policy,result,select,submit} · webapp/notifications/{auth,list}

⑤ 데이터 레이어 Docker

MySQL 8
컨테이너 mysql-qcbot · :3306 · 17개월 이미지
Qdrant
컨테이너 sleepy_bell · :6333(REST) :6334(gRPC) · 19개월 이미지
PostgreSQL
외부 (PG_URL .env로 주입 — 위치 미확인)

Qdrant 컬렉션 상태

컬렉션포인트차원거리
faq1293072Cosine
faq_keywords03072Cosine
regional_data03072Cosine
company03072Cosine
inspection_schedules03072Cosine

3072 dim → OpenAI text-embedding-3-large 추정

4. API 라우트 전수

go-chatbot-server (:8080) · 7 endpoints
MethodPathHandler설명
GET/api/v1/health(inline)헬스 체크 + 메모리 통계
POST/api/v1/chat/completionGetCompletionV1v1 (legacy)
POST/api/v2/chat/completionGetCompletionV2v2
POST/api/v3/chat/completionGetCompletionV3v3
POST/api/v4/chat/completionGetCompletionV4v4 prompt/query 개선
POST/api/v5/chat/completionGetCompletionV5v5 (최신) — Gemini 1.5 Flash
POST/api/v6/chat/completionGetCompletionV6v6 (실험)
quality-chatbot (:1880) · 카카오 챗봇 분기
Path역할외부 의존
/chatbot/faq/enterFAQ 카테고리 카드 표시S3 이미지
/chatbot/faq/questionFAQ 자유 질의 → RAG 호출go-chatbot-server /api/v5/chat/completion
/chatbot/fee검사 수수료 안내S3 · go-chatbot-server
/chatbot/food/enter식품 검사 진입S3
/chatbot/food/result식품 검사 결과 카드S3 · 외부 223.130.140.159 (네이버 클라우드)
/chatbot/livestock/enter축산물 진입S3
/chatbot/livestock/result축산물 결과S3
/chatbot/institute검사 기관 안내S3 · 외부 52.78.25.126
/chatbot/information일반 안내S3
quality-admin · quality-admin-web (Express)

Express는 마운트만 담당하고 실질 비즈니스 로직은 Next.js API 라우트(routes/v1/*, routes/webapp/*) 안에 있음. 기본 라우트:

  • GET / — Next.js 정적 페이지로 위임
  • /users · /v1/* · /webapp/* 하위 분기

5. 페이지·기능 매트릭스

quality-admin (관리자 PC · :3000)

경로기능
/signin관리자 로그인
/대시보드 (메인)
/chatbot/faqFAQ CRUD (Qdrant faq 컬렉션 관리)
/chatbot/fee검사 수수료 관리
/chatbot/frequency질문 빈도 분석
/chatbot/institute검사 기관 관리
/notifications알림 발송 (Omni Alimtalk 연동)
/notifications/history알림 발송 이력
/users사용자 관리

quality-admin-web (모바일 웹앱 · :4000)

경로기능
/웹앱 메인
/webapp/appform신청서 양식
/webapp/application신청 진행
/webapp/fee수수료 안내
/webapp/form입력 폼
/webapp/info안내 정보
/webapp/institute검사 기관 조회
/webapp/privacy-policy개인정보 처리방침
/webapp/result결과 조회
/webapp/select옵션 선택
/webapp/submit제출 완료
/webapp/notifications/auth알림 수신 인증 (omni.ibapi.kr 호출)
/webapp/notifications/list받은 알림 목록
/ocr/photoOCR 사진 업로드
/ocr/shootOCR 즉시 촬영

인프라 직접 노출 포트

포트서비스링크
8080go-chatbot-server/api/v1/health
6333Qdrant REST/collections
6334Qdrant gRPCgRPC 전용
3306MySQL 외부 노출TCP
1880quality-chatbot루트
22SSHkey auth

6. 외부 연동 (Outbound)

도메인 / IP용도호출 컴포넌트
generativelanguage.googleapis.com Gemini 1.5 Flash · 1.5 Pro 호출 (RAG 답변 생성) go-chatbot-server
api.openai.com Embedding (3072 dim) · GPT-4o-mini go-chatbot-server
aiplatform.googleapis.com Vertex AI (cloud.google.com/go/vertexai) go-chatbot-server
omni.ibapi.kr Omni 알림톡 인증 토큰 + /v1/send/alimtalk 발송 quality-admin-web
wbw909a6fc.apigw.ntruss.com Naver Cloud APIGW custom (식약처 OpenAPI 추정) quality-admin-web
qc-aws-bucket.s3.ap-northeast-2.amazonaws.com 챗봇 카드 이미지 (faq.png, category.png, info.png, livestock.png, ...) quality-chatbot
quality-admin-web-s3.s3.ap-northeast-2.amazonaws.com 웹앱 카드 이미지 (card_3, card_6, card_7, card_8-1, card_8-2) quality-chatbot
http://52.78.25.126 외부 EC2 (분리된 검사기관 API 서버 추정) quality-chatbot /chatbot/fee, /chatbot/institute
http://223.130.140.159 네이버 클라우드 정적 IP (식품 검사 결과 API 추정) quality-chatbot /chatbot/food/result

7. 데이터 스토리지

Qdrant Vector DB (:6333)

컬렉션포인트차원거리상태
faq1293072Cosinegreen
faq_keywords03072Cosinegreen
regional_data03072Cosinegreen
company03072Cosinegreen
inspection_schedules03072Cosinegreen

faq 외 4개 컬렉션은 임베딩 데이터 미적재 — 챗봇 v5 응답이 faq 컬렉션만 사용한다는 의미.

MySQL — qcbot (:3306)

컨테이너 mysql-qcbot · 백업본 /home/ec2-user/qcbot_backup.sql (708KB, 2025-03-19) 존재. 스키마는 root 비밀번호 없이 접근 불가 — quality-admin 비즈니스 데이터(사용자, 알림 이력, 검사 수수료 마스터) 저장 추정.

S3 버킷

8. 인프라 & 보안

EC2

Instance ID
i-0caef5df631fec53e
Type
t3.medium (2 vCPU · 4GB)
EIP
eipalloc-0fa4bf7bd0c1d53cd → 13.209.138.233
VPC / Subnet
vpc-0829a07387435254e / subnet-089177e6e6317168a
Key Pair
chatbot-key.pem
OS
Amazon Linux 2023 · Node v22.11.0 · Go 1.22.5

Security Group launch-wizard-14 — Inbound

PortSource비고
220.0.0.0/0SSH 전세계 오픈
80 / 443-미허용 (HTTPS 불가)
880.0.0.0/0용도 미상
18800.0.0.0/0quality-chatbot
30000.0.0.0/0quality-admin FE
30010.0.0.0/0quality-admin-web BE
30020.0.0.0/0quality-admin BE
33060.0.0.0/0MySQL 전세계 노출
40000.0.0.0/0quality-admin-web FE
63330.0.0.0/0Qdrant REST
63340.0.0.0/0Qdrant gRPC
80000.0.0.0/0용도 미상
80800.0.0.0/0go-chatbot-server

Route53

호스팅 영역 없음 → 도메인 미연결. 챗봇/웹앱 모두 IP 직접 접근.

.env 키 (값은 마스킹)

go-chatbot-server

DB_HOST · DB_NAME · DB_PASS · DB_PORT · DB_USER
PG_URL
GEMINI_API_KEY · OPENAI_API_KEY
QDRANT_URL · QDRANT_API_KEY · QDRANT_COLLECTION_NAME

9. 리스크 & 권장 조치

  1. CRITICAL · MySQL :3306 · Qdrant :6333 · API :8080 모두 0.0.0.0/0 노출
    → SG 인바운드를 사내 IP/내부 VPC로 제한. nginx reverse proxy + Cloudflare로 통합.
  2. HIGH · quality-chatbot 88회 재시작 (uptime 117분)
    pm2 logs quality-chatbot --lines 200 즉시 확인. OOM·DB 연결 끊김 우선 의심.
  3. HIGH · HTTPS 없음 + 도메인 없음
    → Route53 zone + ACM 인증서 또는 Cloudflare proxy. 챗봇이 IP 직접 호출은 카카오톡 등록 시 차단될 수 있음.
  4. MEDIUM · Docker 이미지 17~19개월 미갱신 (mysql:latest, qdrant/qdrant)
    → 백업 → docker pull → 컨테이너 교체. Qdrant는 마이너 버전 변경 시 snapshot 필요.
  5. MEDIUM · faq 외 4개 Qdrant 컬렉션 비어있음 (regional_data, company, inspection_schedules, faq_keywords)
    → 의도된 비활성인지 확인. v5 답변 다양성 저하 가능.
  6. MEDIUM · CORS AllowAllOrigins=true on go-chatbot-server
    → 운영 환경은 quality-admin/admin-web 오리진 화이트리스트로 제한.
  7. LOW · /home/ec2-user/qcbot_backup.sql, qdrant_backup.tar.gz 홈 디렉토리 방치
    → S3 Glacier로 이관. 사용자 홈 디스크 절약.
  8. LOW · quality-admin-web · quality-chatbot 디렉토리 .git 없음
    → 코드 변경 추적 불가. GitHub Repo 연결 + CI 배포 권장.
  9. LOW · go-chatbot-server 마지막 커밋 6~7개월 전
    → 유지보수 중단 상태. v6 실험 흔적 정리 + v1~v3 제거 가능.

.env 환경변수 키 인벤토리

go-chatbot-server

  • DB_HOST · DB_NAME · DB_USER · DB_PASS · DB_PORT
  • PG_URL — PostgreSQL connection string
  • GEMINI_API_KEY — Google AI Studio
  • OPENAI_API_KEY — Embedding + GPT-4o-mini
  • QDRANT_URL · QDRANT_API_KEY · QDRANT_COLLECTION_NAME

quality-admin · quality-admin-web

.env 파일 없음 (Next.js 빌드 산출물에 인라인된 것으로 추정)