E.T Code
LLM Serving Infrastructure
웹에이전시 거인소프트가 제작한 한화로보틱스 홈페이지 프로젝트입니다.
"한화로보틱스"의 기업 브랜드 아이덴티티를 반영한 반응형 웹사이트로 제작되었으며
제품 정보 전달과 글로벌 기업 이미지를 강화하는 UI 구조로 설계되었습니다.
E.T Code
보안 환경을 위한 자체 LLM 서빙 · MCP 도구 · 운영 인프라
- vLLM
- OpenAI Compatible API
- GPU Inference
- MCP Server
- Caddy
- systemd
- Python
-
ProjectE.T Code
-
Release Date2026.04
-
TypeEnterprise / LLM Infrastructure
-
RoleLLM Serving & Infrastructure
- 고객사
- NineBell
- 프로젝트 유형
- Enterprise / LLM Serving Infrastructure
- 기술 스택
- vLLM, Python, OpenAI Compatible API, Caddy, systemd, MCP Protocol
- 인프라 구성
- GPU 추론 서버, Caddy Reverse Proxy, systemd 서비스, MCP 도구 서버
- 담당 역할
- LLM 서빙 인프라 설계 및 구축, MCP 도구 서버 개발, 운영 환경 구성
- 개발 기간
- 약 2주
- 핵심 성과
- vLLM 기반 GPU 추론 서버 구축, OpenAI Compatible API 제공, MCP 도구 서버 통합
Serving
Infrastructure
NineBell은 보안 정책상 외부 AI API(OpenAI, Claude 등)를 사용할 수 없었습니다. 고객사 코드가 외부 서버로 전송되는 것 자체가 금지되어 있었고, 토큰 과금 비용도 통제 불가능한 리스크였습니다.
이 제약 조건 아래에서 "사내 GPU만으로 AI 코딩 어시스턴트를 서빙할 수 있는 인프라"를 설계하고 납품했습니다. 외부 의존 없이 동작하는 자체 완결형 구조를 목표로, 추론 서버부터 프록시, 도구 서버, 프로세스 관리까지 전 스택을 직접 구성했습니다.
• vLLM — 사내 GPU에서 256K 컨텍스트 LLM을 직접 서빙, OpenAI 호환 API 제공
• Caddy — 자동 HTTPS + 와일드카드 서브도메인으로 원격 개발자 접근 지원
• systemd — DevOps 없이도 장애 자동 복구, 부팅 시 자동 시작
• MCP Server — AI가 웹 검색·크롤링을 직접 수행할 수 있는 13개 도구 제공
Key
Features
각 기능은 단순한 기술 구현이 아니라, 실제 운영에서 부딪힌 구체적인 필요에서 출발했습니다.
• vLLM 서빙 — 외부 API를 쓸 수 없으므로, 사내 GPU에서 256K 컨텍스트 LLM을 직접 추론하고 스트리밍 응답을 제공해야 했습니다
• OpenAI Compatible API — 개발자들이 기존 IDE 플러그인·도구를 코드 한 줄 안 바꾸고 연동할 수 있도록, /v1/chat/completions 표준 엔드포인트를 제공했습니다
• MCP 도구 서버 — AI가 코드만 쓰는 게 아니라 문서 검색·참고까지 해야 했기에, 웹 검색 6개 + 크롤링 7개 = 13개 도구를 FastMCP로 개발했습니다
• 로드밸런싱 — 검색 요청이 한 서버에 몰리면 타임아웃이 발생했고, 4대 백엔드 서버 풀로 분산 처리하여 안정성을 확보했습니다
• 보안 — 고객사 코드 유출 방지를 위해 프로젝트 경로를 제한하고 내부 네트워크로 격리했습니다
• 인프라 — 전담 DevOps 없이 1인 운영이 가능하도록 Caddy HTTPS + systemd 자동 재시작 + journalctl 중앙 로그 체계를 구성했습니다
Challenge 1 | vLLM GPU 추론 서버 구축
상황: NineBell의 고객사는 보안 정책상 소스코드가 외부 서버로 전송되는 것을 허용하지 않았습니다. OpenAI, Claude 등 외부 AI API는 사용 자체가 불가능했고, 동시에 256K 토큰 컨텍스트의 스트리밍 추론 성능이 필요했습니다.
판단: 외부 API를 프록시로 감싸는 우회 방식도 검토했지만, 데이터가 외부로 나가는 구조 자체가 보안 정책에 위배되었습니다. 사내 GPU에서 직접 LLM을 서빙하는 것만이 유일한 선택지였고, vLLM이 OpenAI 호환 API를 네이티브로 지원하여 기존 도구 생태계를 그대로 활용할 수 있다는 점에서 채택했습니다.
액션: vLLM으로 GPU 서버에 LLM을 배포하고, /v1/chat/completions 표준 엔드포인트를 제공했습니다. KV Cache 최적화로 반복 프롬프트 처리 효율을 높이고, Continuous Batching을 적용하여 동시 요청 처리량을 확보했습니다.
결과: 개발자들이 기존 IDE 플러그인(Continue, Copilot 등)을 엔드포인트 URL만 변경하여 즉시 사용할 수 있었고, 토큰 과금 비용이 제로가 되었으며 코드 유출 리스크를 원천 차단했습니다.
Challenge 2 | MCP 도구 서버 개발 및 통합
상황: AI 코딩 어시스턴트가 코드만 작성하는 것으로는 부족했습니다. 개발자들은 "이 라이브러리 최신 문서 찾아서 적용해줘"처럼 검색과 크롤링까지 AI에게 맡기길 원했고, AI가 외부 도구를 스스로 탐색하고 호출할 수 있는 표준 인터페이스가 필요했습니다.
판단: 자체 프로토콜을 설계하는 대신, Anthropic이 공개한 MCP(Model Context Protocol) 표준을 채택했습니다. 표준 기반이면 향후 다른 AI 모델로 교체하더라도 도구 서버를 재사용할 수 있고, 커뮤니티 도구와의 호환성도 확보할 수 있다고 판단했습니다.
액션: FastMCP로 Python 도구 서버를 개발하여 웹 검색 6개 + 웹 크롤링 7개 = 13개 도구를 stdio 트랜스포트로 연동했습니다. 검색 요청 집중 시 타임아웃을 방지하기 위해 4대 백엔드 서버 풀로 로드밸런싱을 구성했습니다.
결과: AI가 코드 작성 중 필요한 문서를 스스로 검색하고 참조할 수 있게 되어, 개발자가 별도로 문서를 찾아 붙여넣는 수작업이 크게 줄었습니다. MCP 표준 덕분에 도구 추가·교체가 서버 재배포 없이 가능해졌습니다.
Challenge 3 | Caddy + systemd 프로덕션 운영 환경
상황: 원격 근무 개발자들이 사내 AI 서비스에 접근해야 했지만, DevOps 전담 인력이 없었습니다. HTTPS 인증서 관리, 서비스 장애 복구, 로그 모니터링을 모두 1인이 운영해야 하는 상황이었습니다.
판단: Nginx + certbot 조합도 고려했지만, 인증서 갱신 자동화와 설정 복잡도를 감안하면 Caddy가 1인 운영에 훨씬 적합했습니다. "설정이 적을수록 장애 포인트도 적다"는 원칙으로, 최소 설정으로 최대 안정성을 확보하는 방향을 택했습니다.
액션: Caddy로 자동 HTTPS(Let's Encrypt) + 와일드카드 서브도메인({PORT}.code.etribe.cloud → localhost:{PORT}) 리버스 프록시를 구성했습니다. systemd로 전체 서비스를 등록하여 자동 재시작, 부팅 시 자동 시작, journalctl 중앙 로그 관리 체계를 확보했습니다.
결과: 인증서 갱신·서비스 재시작·로그 확인 등 운영 업무가 모두 자동화되어, 별도 관리 없이 안정적으로 서비스가 유지되었습니다. 장애 발생 시에도 systemd가 자동 복구하여 다운타임을 최소화했습니다.
What I Learned | 배운 점
이 프로젝트에서 가장 크게 배운 것은 "제약이 곧 설계를 만든다"는 점입니다. 외부 API를 쓸 수 없다는 제약이 vLLM 자체 서빙이라는 설계를 낳았고, DevOps 인력이 없다는 제약이 Caddy + systemd라는 최소 운영 구조를 낳았습니다.
• LLM 서빙: vLLM의 KV Cache 최적화, Continuous Batching 등 GPU 추론 서버를 실제 프로덕션에서 운영하며, 이론이 아닌 실전 튜닝 감각을 체득했습니다
• 표준의 힘: OpenAI Compatible API 덕분에 클라이언트 연동이 즉시 가능했고, MCP 표준 덕분에 도구 확장이 서버 재배포 없이 가능해졌습니다. "표준을 따르면 통합 비용이 급감한다"는 것을 몸으로 배웠습니다
• 1인 운영 설계: 사람이 개입하지 않아도 돌아가는 구조를 만드는 것이 인프라 설계의 핵심이라는 것을 경험했습니다. 자동 인증서 갱신, 자동 재시작, 중앙 로그 — 모두 "사람이 안 봐도 되는 구조"를 향한 선택이었습니다











