PewDiePie의 Odysseus를 클라우드 메모리 스택에 연결하기 — API 비용 0원, 지속 가능한 메모리
요약
셀프 호스팅 AI 워크스페이스인 Odysseus를 클라우드 에이전트 레이어인 ClawBase와 연결하여 지속 가능한 메모리와 백그라운드 작업을 구현하는 방법을 설명합니다. 로컬 GPU를 활용해 API 비용을 0원으로 유지하면서도 클라우드의 스케줄링 기능을 결합한 하이브리드 아키텍처를 제안합니다.
핵심 포인트
- 로컬 모델 추론과 클라우드 에이전트 레이어의 하이브리드 구성
- API 비용 없이 로컬 GPU를 활용한 지속 가능한 AI 환경 구축
- ClawBase를 통한 6계층 지속 가능한 메모리 및 백그라운드 작업 구현
- 인증된 터널을 이용해 로컬 LLM과 클라우드 간의 통신 최적화
PewDiePie의 Odysseus가 출시 4일 만에 GitHub 별점(stars) 44,000개를 돌파했습니다. 핵심 컨셉은 간단합니다. 구독료 없이, 사용자의 하드웨어에서, 사용자의 데이터로 실행되는 셀프 호스팅(self-hosted) AI 워크스페이스입니다.
저는 출시 당일에 바로 설치해 보았습니다. 로컬 모델(local model) 설정 과정은 진정으로 인상적이었습니다. Cookbook이 GPU를 스캔하고 모델을 추천해주며, 단 몇 분 만에 채팅을 시작할 수 있습니다. API 키도 필요 없고, 월간 청구서도 없습니다.
하지만 이틀도 채 지나지 않아, 저는 셀프 호스팅 AI를 사용할 때 항상 마주치는 벽에 부딪혔습니다. 바로 메모리(memory) 문제입니다.
Odysseus는 기본적인 벡터 메모리(vector memory)를 위해 ChromaDB를 사용합니다. 이는 세션 내에서의 회상(recall)에는 효과적입니다. 하지만 몇 주에 걸친 대화 사이의 맥락을 연결하지는 못합니다. 제가 잠든 동안 백그라운드에서 에이전트(agents)를 실행하지도 않습니다. 그리고 노트북을 닫으면 모든 것이 중단됩니다.
그래서 저는 하이브리드 방식을 구축했습니다. Odysseus는 로컬 모델(무료 추론, inference)을 실행하고, 클라우드 에이전트 레이어(ClawBase를 통해)가 지속 가능한 메모리, 스케줄링 및 백그라운드 작업을 처리합니다. 두 시스템은 인증된 터널(authenticated tunnel)을 통해 동일한 로컬 LLM과 통신합니다.
전체 기술 설정은 다음과 같습니다.
아키텍처 (The architecture)
┌──────────────────────────┐ ┌───────────────────────────┐
│ YOUR MACHINE │ │ CLOUD (ClawBase) │
│ │ authenticated │ │
...
Ollama, vLLM, llama.cpp는 모두 OpenAI와 호환되는 /v1/chat/completions 엔드포인트(endpoint)를 노출합니다. OpenAI API 형식을 지원하는 모든 서비스는 사용자의 로컬 모델을 사용할 수 있습니다. 단지 모델에 도달할 방법만 있으면 됩니다.
터널은 로컬 모델 서버와 클라우드 에이전트를 연결합니다. 추론(inference)은 사용자의 GPU가 담당하고, 클라우드는 그 외의 모든 것을 처리합니다.
이를 통해 얻을 수 있는 이점은 다음과 같습니다:
- API 비용 0달러 (사용자의 GPU가 모델을 실행)
- 몇 주에 걸쳐 쌓이는 6계층 지속 가능한 메모리 (6-layer persistent memory)
- 사용자의 기기가 꺼져 있을 때도 정해진 일정에 따라 실행되는 에이전트 (재연결 시 대기열에 추가되어 실행됨)
- 채팅, 문서, 연구를 위한 로컬 워크스페이스로서의 Odysseus
- 어디서나 Telegram/WhatsApp/Slack을 통해 에이전트에 접속 가능
사전 요구 사항 (Prerequisites)
- Odysseus 설치 및 실행 중 (Quick Start)
- 모델을 서빙 중인 Ollama (Cookbook을 사용하면 간편하게 설정 가능)
- ClawBase 계정 (또는 모든 OpenClaw 인스턴스)
- 10~15분
1단계: 로컬 모델이 실행 중인지 확인하기
Odysseus를 설정하고 Cookbook을 통해 모델을 다운로드한 후, Ollama가 제대로 서빙되고 있는지 확인합니다:
curl http://localhost:11434/v1/models
모델 목록이 표시되어야 합니다. 텍스트 생성 (Completion)을 테스트해 보세요:
curl http://localhost:11434/v1/chat/completions \\n -H "Content-Type: application/json" \\n -d '{\n...
Ollama 대신 vLLM을 사용하는 경우, 기본 포트는 8000번입니다:
curl http://localhost:8000/v1/models
llama.cpp server의 경우, 기본 포트는 8080번입니다:
curl http://localhost:8080/v1/models
세 가지 방식 모두 동일한 OpenAI 호환 형식을 사용합니다. 이 가이드의 나머지 부분은 11434 포트의 Ollama를 기준으로 작성되었으나, 포트가 다르다면 본인의 포트로 대체하여 사용하세요.
2단계: 인증된 리버스 프록시 (Reverse Proxy) 설정하기
이 단계는 매우 중요합니다. 로컬 모델 서버는 기본적으로 인증 기능이 전혀 없습니다. 어떤 터널을 통해 노출하기 전에, Bearer 토큰을 강제하는 프록시(Proxy)가 반드시 필요합니다.
옵션 A: nginx (운영 환경 권장)
nginx가 설치되어 있지 않다면 설치하세요:
# Ubuntu/Debian
sudo apt install nginx
...
프록시 설정을 생성합니다:
sudo tee /etc/nginx/sites-available/llm-proxy << 'EOF'
server {
listen 11435;
...
강력한 토큰을 생성합니다:
# 무작위 토큰 생성
openssl rand -hex 32
# 출력 예시: a1b2c3d4e5f6... (이를 토큰으로 사용하세요)
인증된 엔드포인트를 테스트합니다:
# 실패해야 함 (토큰 없음)
curl http://localhost:11435/v1/models
# → 401 unauthorized
...
옵션 B: Caddy (더 간단한 설정)
# Caddyfile
:11435 {
@auth {
...
옵션 C: litellm 프록시 (모델 별칭(Aliasing)이 필요한 경우)
LiteLLM을 Ollama 앞에 배치하여 인증 및 모델 이름 매핑 기능을 추가할 수 있습니다:
# litellm_config.yaml
model_list:
- model_name: "gpt-4" # 로컬 모델을 gpt-4로 별칭(alias) 지정
...
litellm --config litellm_config.yaml --port 11435
이 방법은 클라우드 에이전트(cloud agent)가 gpt-4와 같은 특정 모델 이름을 기대할 때 유용합니다. 클라우드 설정을 변경하지 않고도 로컬 모델에 별칭을 부여할 수 있습니다.
3단계: 터널(Tunnel) 생성하기
클라우드 에이전트가 접근할 수 있도록 11435 포트(인증된 프록시)를 인터넷에 노출해야 합니다. 가장 쉬운 방법부터 제어 권한이 높은 방법까지 네 가지 옵션이 있습니다.
옵션 A: Cloudflare Tunnel (가장 쉬움, 무료)
# cloudflared 설치
# macOS: brew install cloudflare/cloudflare/cloudflared
# Linux: https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/
...
출력 결과:
Your quick Tunnel has been created! Visit it at:
해당 URL이 터널 엔드포인트(endpoint)가 됩니다. 지속적인 터널 (persistent tunnel) (재부팅 후에도 유지되며 안정적인 URL 제공)을 사용하려면 다음을 수행하세요:
cloudflared tunnel create llm-tunnel
cloudflared tunnel route dns llm-tunnel llm.yourdomain.com
...
옵션 B: Tailscale (기존 Tailscale 사용자에게 최적)
이미 Tailscale을 사용 중이라면, 해당 머신은 메시 네트워크(mesh network) 상에서 안정적인 IP를 가집니다. 별도의 터널이 필요하지 않습니다:
# 사용자의 Tailscale IP (예: 100.x.y.z)
tailscale ip -4
...
HTTPS를 사용하려면 Tailscale HTTPS를 사용하세요:
tailscale cert your-machine.tailnet-name.ts.net
옵션 C: SSH 리버스 터널 (SSH Reverse Tunnel) (빠르고 간편함)
VPS 또는 공인 IP가 있는 서버가 있는 경우:
# 로컬 머신에서 원격 서버의 9000번 포트로 11435번 포트를 터널링합니다.
ssh -R 9000:localhost:11435 user@your-vps.com -N
...
autossh를 사용하여 지속적으로 유지할 수 있습니다:
autossh -M 0 -f -R 9000:localhost:11435 user@your-vps.com -N \
-o "ServerAliveInterval 30" -o "ServerAliveCountMax 3"
옵션 D: NAT 포트 포워딩 (NAT Port Forward) (고전적인 방식, 의존성 없음)
사용 중인 라우터에서:
- 외부 포트 11435를 내부 IP:11435로 포워딩 (Forward external port 11435 → internal IP:11435)
- 고정 IP (Static IP)가 없는 경우 Dynamic DNS (예: noip.com, DuckDNS)를 설정합니다.
nginx에 Let's Encrypt + certbot을 사용하여 TLS를 추가하세요:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d llm.yourdomain.com
업데이트된 nginx 설정은 다음과 같습니다:
server {
listen 443 ssl;
server_name llm.yourdomain.com;
...
단계 4: ClawBase를 터널로 연결하기
이것이 ClawBase 측에서 수행할 유일한 변경 사항입니다. 에이전트를 열고, Model 탭으로 이동하여 다음을 수행하세요:
- AI Source 아래에서 "Use your own API key"를 선택합니다.
- Provider를 "Custom (OpenAI-compatible)"로 설정합니다.
- 나타나는 세 가지 필드를 채웁니다:
Base URL: https://your-tunnel-url.com/v1
Model: qwen2.5:14b (또는 현재 서빙 중인 모델)
API Key: sk-local-YOUR-SECRET-TOKEN-HERE
- Save Settings를 클릭합니다.
끝입니다. "Custom (OpenAI-compatible)" 프로바이더는 표준 /v1/chat/completions 형식을 따르는 모든 엔드포인트 — Ollama, vLLM, llama.cpp 또는 터널 뒤에 있는 무엇이든 — 를 수용합니다.
저장하기 전에 작동 여부를 확인하세요:
curl https://your-tunnel-url.com/v1/chat/completions \
-H "Authorization: Bearer sk-local-YOUR-SECRET-TOKEN-HERE" \
-H "Content-Type: application/json" \
...
로컬 모델로부터 응답을 받는다면 터널이 정상적으로 작동하는 것입니다.
단계 5: 하이브리드 설정 검증하기
이 시점에서 당신은 동일한 로컬 모델로 향하는 두 개의 병렬 경로를 갖게 됩니다:
| 인터페이스 | 경로 | 메모리 | 백그라운드 작업 |
|---|---|---|---|
| Odysseus (로컬 UI) | localhost의 Ollama로 직접 연결 | ChromaDB (기본 벡터) | 앱이 열려 있는 동안에만 |
| ... |
둘 다 추론 (Inference)을 위해 당신의 GPU를 사용합니다. 어느 쪽도 OpenAI나 Anthropic에 단 1센트도 지불하지 않습니다.
메모리를 테스트해 보세요:
- ClawBase에 무언가를 말합니다: "내 주요 프로젝트는 Next.js와 Supabase를 사용해. 짧고 간결한 답변을 선호해."
- 대화를 종료합니다.
- 몇 시간 후 새로운 대화를 엽니다: "내 프로젝트는 어떤 스택을 사용하고 있지?"
- 에이전트가 기억하고 있습니다.
Odysseus에서 동일하게 시도해 보세요. 모델과 ChromaDB 설정에 따라 이를 유지할 수도 있고 그렇지 않을 수도 있습니다. 6계층 스택(journal, DAG, QMD, Mem0, Cognee, Graphiti)이 차이를 만드는 핵심입니다. 각 계층이 컨텍스트를 서로 다른 방식으로 캡처하므로, 데이터가 단순히 벡터 저장소(vector store)에 밀어 넣어졌다가 잊혀지는 일이 발생하지 않습니다.
6단계: Systemd 서비스 (지속 실행 유지)
인증된 프록시(authenticated proxy)와 터널이 부팅 시 자동으로 시작되도록 설정합니다:
# /etc/systemd/system/llm-tunnel.service
[Unit]
Description=LLM Tunnel (Cloudflare)
...
sudo systemctl enable --now ll-tunnel
SSH 터널 변형의 경우:
# /etc/systemd/system/llm-ssh-tunnel.service
[Unit]
Description=LLM SSH Reverse Tunnel
...
보안 고려 사항
로컬 서비스를 인터넷에 노출하는 것입니다. 다음 사항을 엄격히 준수하세요:
- 항상 인증 프록시(auth proxy)를 사용하세요. 인증 없이 생(raw) Ollama/vLLM을 터널링하지 마세요.
- 토큰을 주기적으로 교체(Rotate)하세요. 토큰을 코드에 직접 입력(hardcoded)하지 말고 환경 변수로 저장하세요.
- TLS를 사용하세요. Cloudflare Tunnel이 이를 자동으로 처리합니다. NAT 포트 포워딩의 경우 Let's Encrypt를 사용하세요.
- 속도 제한(Rate limit). 토큰이 유출될 경우를 대비해 nginx에 속도 제한을 추가하여 남용을 방지하세요:
limit_req_zone $binary_remote_addr zone=llm:10m rate=10r/m;
location / {
limit_req zone=llm burst=5;
...
- 로그 모니터링. 예상치 못한 요청이 있는지 nginx 액세스 로그를 확인하세요:
tail -f /var/log/nginx/access.log | grep 11435
- IP 허용 목록(IP allowlist). 클라우드 에이전트가 고정 IP를 사용하는 경우, 접근을 제한하세요:
allow 1.2.3.4; # ClawBase IP
deny all;
성능 참고 사항
터널을 통한 로컬 모델 추론(inference)은 네트워크 지연 시간(latency)을 추가합니다. 다음을 예상하세요:
| 설정 | 첫 번째 토큰 생성 시간 (Time to first token) |
|---|---|
| Odysseus → Ollama (localhost) | ~50-200ms |
| ... |
터널은 일반적인 API 호출과 유사한 지연 시간을 추가합니다. 대부분의 사용 사례(에이전트 작업, 백그라운드 작업, Telegram 메시지)에서는 이를 체감할 수 없습니다. 실시간 스트리밍 채팅의 경우 지연이 느껴질 수 있으므로, 그런 용도로는 Odysseus를 로컬에서 사용하세요.
처리량 (Throughput)은 사용자의 GPU와 모델 크기에 따라 달라집니다. RTX 4090에서 14B 모델을 사용할 경우 초당 약 50개의 토큰 (tokens/sec)을 생성합니다. 터널 (tunnel)을 통할 경우, 병목 현상 (bottleneck)은 항상 네트워크가 아닌 추론 (inference) 속도에서 발생합니다.
다음 단계
이 방식은 두 프로젝트 모두 코드 변경 없이 현재 바로 작동합니다. 제가 주목하고 있는 몇 가지 사항은 다음과 같습니다:
- Odysseus API — Odysseus는 출시된 지 4일밖에 되지 않았습니다. 만약 외부 접속을 위한 API나 수신 메시지를 위한 웹훅 (webhooks)을 제공하게 된다면, 통합은 더욱 긴밀해질 것입니다. 즉, 대화 내용이 양쪽 모두에 저장되고 메모리가 양방향으로 동기화되는 방식입니다.
- MCP 브리지 (bridge) — Odysseus와 OpenClaw 모두 MCP를 지원합니다. 메모리를 위한 공유 MCP 서버를 구축한다면, 두 프론트엔드 (frontends)가 동일한 지식 베이스 (knowledge base)에 읽고 쓸 수 있게 될 것입니다.
어느 한 쪽을 선택할 필요는 없습니다. 모델은 로컬 (local)에 유지하여 추론 비용을 무료로 유지하면서, 메모리 레이어 (memory layer)는 귀하의 설정에 가장 적합한 곳에 둘 수 있습니다.
이 설정을 시도해보고 싶다면, Odysseus는 MIT 라이선스이며 무료입니다. ClawBase는 월 16달러부터 시작하는 7일 무료 체험을 제공합니다. 터널 설정에는 약 10분이 소요됩니다.
질문이 있으신가요? 댓글을 남기거나 Twitter/X에서 저를 찾아주세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기