Docker, Traefik, SSE 스트리밍으로 50명의 고객을 확보한 호스팅 플랫폼 구축기

by DD
3개월 전
조회수 8

Docker 컨테이너(Container) 기반 호스팅 플랫폼 구축 과정에서 발생한 다양한 기술적 문제와 해결책 제시

Traefik을 활용한 동적 라우팅(Dynamic Routing) 설정 및 SSE 스트리밍(Streaming) 구현의 어려움 공유

Nginx 설정, IP 재활용 문제, 설정 관리 등 운영 과정에서 겪은 어려움과 교훈을 상세히 설명

50명의 유료 고객을 확보하기까지의 과정과, 운영상의 어려움을 극복한 경험을 공유

Docker 컨테이너(Container) 환경의 문제점과 해결

저자는 Docker 컨테이너를 사용하여 OpenClaw를 격리했지만, pnpm 심볼릭 링크(Symlink) 문제, mDNS/Bonjour 자동 검색 문제, 좀비 프로세스(Zombie Process) 문제 등 다양한 문제에 직면했다. 특히, 컨테이너 재 생성(Container Recreation) 시 고객 설치 패키지 및 런타임 데이터가 손실되는 문제를 해결하기 위해 `docker commit` 명령어를 사용하여 Writable Layer를 보존하는 전략을 사용했다. 또한, 설정 변경 시 핫 리로드(Hot Reload) 시스템을 구축하여 컨테이너 재시작 없이 변경 사항을 적용했다.

5-Layer 서브도메인(Subdomain) 라우팅 아키텍처

ClawHosters는 5-Layer 서브도메인 라우팅 아키텍처를 통해 트래픽을 관리한다. Cloudflare Wildcard DNS를 통해 모든 트래픽을 서버로 라우팅하고, Nginx를 사용하여 서브도메인을 매칭하고, Traefik을 통해 동적 라우팅을 구현한다. Traefik은 Redis를 백엔드로 사용하여 라우팅 규칙을 관리하며, VPS-Side Nginx를 통해 보안을 강화한다. 마지막으로, Hetzner 방화벽(Firewall)과 fail2ban을 통해 보안을 유지한다. 이러한 다층 구조는 유연성과 보안을 동시에 제공한다.

SSE 스트리밍(Streaming) 구현의 어려움

저자는 SSE 스트리밍 구현 과정에서 TCP 청크(Chunk) 단편화, Nginx 버퍼링(Buffering) 문제, 토큰 사용량(Token Usage) 측정의 어려움 등 여러 문제에 직면했다. 특히, Nginx 버퍼링 문제를 해결하기 위해 `proxy_buffering off`, `proxy_cache off`, `proxy_http_version 1.1`, `chunked_transfer_encoding off` 설정을 적용했다. 또한, 토큰 사용량 측정을 위해 링 버퍼(Ring Buffer)를 사용하여 마지막 SSE 데이터를 분석하고, 공급자별(Provider-Specific) 토큰 계산 방식의 차이를 해결하기 위해 공급자별 가격 테이블(Provider-Specific Pricing Table)을 구축했다.

IP 재활용(IP Recycling) 문제와 설정 관리

Hetzner의 IP 재활용으로 인해 발생한 SSH 연결 오류 및 데이터베이스(Database) 내 IP 정보 불일치 문제를 해결하기 위해, VPS 내부에서 Hetzner 메타데이터 서비스를 쿼리하여 IP를 검증하는 방법을 사용했다. 또한, OpenClaw 설정 파일(openclaw.json)의 유효성을 검사하고, 설정 마이그레이션(Config Migration)을 통해 호환성을 유지했다. 이러한 자동화된 설정 관리(Automated Configuration Management)는 운영 효율성을 높이는 데 기여했다.

제로티어(ZeroTier)를 활용한 로컬 LLM 연결

저자는 고객이 로컬 LLM에 접근할 수 있도록 ZeroTier를 활용한 원웨이 네트워킹(One-Way Networking)을 구현했다. ZeroTier 컨테이너를 Docker 브리지 네트워크에 추가하고, `nsenter`를 사용하여 OpenClaw의 네트워크 네임스페이스에 라우팅 규칙을 주입했다. 이로써 OpenClaw는 ZeroTier 네트워크에 접근할 수 있지만, ZeroTier 네트워크는 OpenClaw에 직접 접근할 수 없도록 설계하여 보안을 강화했다. 이 방식은 단순한 설정(Simple Configuration)으로 복잡한 네트워킹 문제를 해결하는 좋은 예시를 보여준다.

Docker, Traefik, and SSE streaming: A post-mortem on building a managed hosting platform