콘텐츠로 이동
OmniRoute source

OmniRoute — Deployment Guide on VM with Cloudflare (한국어)

항목 최소 권장
CPU 1 vCPU 2 vCPU
RAM 1 GB 2 GB
디스크 10 GB SSD 25 GB SSD
OS Ubuntu 22.04 LTS Ubuntu 24.04 LTS
도메인 Cloudflare에 등록됨 —
Docker Docker Engine 24+ Docker 27+

테스트된 제공업체: Akamai (Linode), DigitalOcean, Vultr, Hetzner, AWS Lightsail.


선호하는 VPS 제공업체에서 다음을 수행합니다.

  • Ubuntu 24.04 LTS 선택
  • 최소 플랜(1 vCPU / 1 GB RAM) 선택
  • 강력한 root 비밀번호를 설정하거나 SSH 키 구성
  • 공인 IP 기록(예: 203.0.113.10)
터미널 창
ssh root@203.0.113.10
터미널 창
apt update && apt upgrade -y
터미널 창
# 종속성 설치
apt install -y ca-certificates curl gnupg
# 공식 Docker 저장소 추가
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $ (. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
터미널 창
apt install -y nginx
터미널 창
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp # SSH
ufw allow 80/tcp # HTTP(리디렉션)
ufw allow 443/tcp # HTTPS
ufw enable

팁: 보안을 극대화하려면 포트 80과 443을 Cloudflare IP로만 제한하세요. 고급 보안 섹션을 참조하세요.


터미널 창
mkdir -p /opt/omniroute
터미널 창
cat > /opt/omniroute/.env << 'EOF'
# === 보안 ===
JWT_SECRET=CHANGE-TO-A-UNIQUE-64-CHAR-SECRET-KEY
INITIAL_PASSWORD=YourSecurePassword123!
API_KEY_SECRET=REPLACE-WITH-ANOTHER-SECRET-KEY
STORAGE_ENCRYPTION_KEY=REPLACE-WITH-THIRD-SECRET-KEY
STORAGE_ENCRYPTION_KEY_VERSION=v1
MACHINE_ID_SALT=CHANGE-TO-A-UNIQUE-SALT
OMNIROUTE_WS_BRIDGE_SECRET=REPLACE-WITH-WS-BRIDGE-SECRET # 프로덕션 환경에서 필수: Codex Responses WS 브리지에서 사용
# === 앱 ===
PORT=20128
NODE_ENV=production
HOSTNAME=0.0.0.0
DATA_DIR=/app/data
APP_LOG_TO_FILE=true
AUTH_COOKIE_SECURE=true
REQUIRE_API_KEY=false
# === URL(사용할 도메인으로 변경) ===
# 예약 작업/자체 요청을 위한 내부 서버 간 기본 URL입니다.
BASE_URL=http://127.0.0.1:20128
# OAuth 콜백, 대시보드 링크 및 생성된 공개 URL에 사용되는 브라우저용 URL입니다.
NEXT_PUBLIC_BASE_URL=https://llms.seudominio.com
# 생성된 공개 자산 URL에 대한 선택적 명시적 공개 오리진 재정의입니다.
# OMNIROUTE_PUBLIC_BASE_URL=https://llms.seudominio.com
# === 클라우드 동기화(선택 사항) ===
# CLOUD_URL=https://cloud.omniroute.online
# NEXT_PUBLIC_CLOUD_URL=https://cloud.omniroute.online
EOF

⚠️ 중요: 고유한 비밀 키를 생성하세요! 각 키마다 openssl rand -hex 32를 사용하세요.

터미널 창
docker pull diegosouzapw/omniroute:latest
docker run -d \
--name omniroute \
--restart unless-stopped \
--env-file /opt/omniroute/.env \
-p 20128:20128 \
-v omniroute-data:/app/data \
diegosouzapw/omniroute:latest
터미널 창
docker ps | grep omniroute
docker logs omniroute --tail 20

다음이 표시되어야 합니다: [DB] SQLite database ready 및 listening on port 20128.


3.1 SSL 인증서 생성(Cloudflare Origin)

섹션 제목: “3.1 SSL 인증서 생성(Cloudflare Origin)”

Cloudflare 대시보드에서:

  1. SSL/TLS → Origin Server로 이동합니다
  2. Create Certificate를 클릭합니다
  3. 기본값(15년, *.yourdomain.com)을 유지합니다
  4. Origin Certificate와 Private Key를 복사합니다
터미널 창
mkdir -p /etc/nginx/ssl
# 인증서 붙여넣기
nano /etc/nginx/ssl/origin.crt
# 비공개 키 붙여넣기
nano /etc/nginx/ssl/origin.key
chmod 600 /etc/nginx/ssl/origin.key
터미널 창
cat > /etc/nginx/sites-available/omniroute << 'NGINX'
# 기본 서버 — IP를 통한 직접 접근 차단
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_certificate /etc/nginx/ssl/origin.crt;
ssl_certificate_key /etc/nginx/ssl/origin.key;
server_name _;
return 444;
}
# OmniRoute — HTTPS
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name llms.yourdomain.com; # 사용 중인 도메인으로 변경
ssl_certificate /etc/nginx/ssl/origin.crt;
ssl_certificate_key /etc/nginx/ssl/origin.key;
ssl_protocols TLSv1.2 TLSv1.3;
client_max_body_size 100M;
location / {
proxy_pass http://127.0.0.1:20128;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 지원
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# SSE(Server-Sent Events) — AI 응답 스트리밍
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
}
}
# HTTP → HTTPS 리디렉션
server {
listen 80;
listen [::]:80;
server_name llms.yourdomain.com;
return 301 https://$server_name$request_uri;
}
NGINX

리버스 프록시의 스트림 타임아웃을 OmniRoute 타임아웃 환경 변수와 일치하도록 유지하세요. FETCH_TIMEOUT_MS / STREAM_IDLE_TIMEOUT_MS를 늘리는 경우 proxy_read_timeout / proxy_send_timeout도 동일한 임계값보다 높게 설정하세요.

OmniRoute는 OAuth 콜백과 생성된 공개 링크에 사용할 브라우저 대상의 표준 출처로 NEXT_PUBLIC_BASE_URL을 사용합니다. 인증된 대시보드 쓰기 작업은 동일 출처 요청과 세션 기반 CSRF 보호를 함께 사용하므로 정적인 공개 기본 URL이 필요하지 않습니다. 위의 X-Forwarded-* 헤더는 여전히 유용한 라우팅 메타데이터이지만, OAuth 또는 생성된 브라우저 링크에 명시적인 공개 URL이 필요한 경우 이를 설정하는 작업을 대신할 수는 없습니다. 클라이언트가 OmniRoute에 직접 접근할 수 없고 프록시가 수신된 전달 헤더를 제거하거나 재구성하는 경우에만 OMNIROUTE_TRUST_PROXY를 활성화하세요.

터미널 창
# 기본 구성 제거
rm -f /etc/nginx/sites-enabled/default
# OmniRoute 활성화
ln -sf /etc/nginx/sites-available/omniroute /etc/nginx/sites-enabled/omniroute
# 테스트 및 다시 로드
nginx -t && systemctl reload nginx

Cloudflare 대시보드 → DNS에서:

유형 이름 콘텐츠 프록시
A llms 203.0.113.10 (VM IP) ✅ 프록시됨

SSL/TLS → 개요에서:

  • 모드: 전체(엄격)

SSL/TLS → 에지 인증서에서:

  • 항상 HTTPS 사용: ✅ 켜짐
  • 최소 TLS 버전: TLS 1.2
  • 자동 HTTPS 재작성: ✅ 켜짐
터미널 창
curl -sI https://llms.seudominio.com/health
# HTTP/2 200을 반환해야 함

터미널 창
docker pull diegosouzapw/omniroute:latest
docker stop omniroute && docker rm omniroute
docker run -d --name omniroute --restart unless-stopped \
--env-file /opt/omniroute/.env \
-p 20128:20128 \
-v omniroute-data:/app/data \
diegosouzapw/omniroute:latest
터미널 창
docker logs -f omniroute # 실시간 스트림
docker logs omniroute --tail 50 # 최근 50줄
터미널 창
# 볼륨의 데이터를 호스트로 복사
docker cp omniroute:/app/data ./backup-$(date +%F)
# 또는 전체 볼륨 압축
docker run --rm -v omniroute-data:/data -v $(pwd):/backup \
alpine tar czf /backup/omniroute-data-$(date +%F).tar.gz /data
터미널 창
docker stop omniroute
docker run --rm -v omniroute-data:/data -v $(pwd):/backup \
alpine sh -c "rm -rf /data/* && tar xzf /backup/omniroute-data-YYYY-MM-DD.tar.gz -C /"
docker start omniroute

터미널 창
cat > /etc/nginx/cloudflare-ips.conf << 'CF'
# Cloudflare IPv4 범위 — 주기적으로 업데이트
# https://www.cloudflare.com/ips-v4/
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
real_ip_header CF-Connecting-IP;
CF

nginx.conf의 http {} 블록 안에 다음을 추가합니다:

include /etc/nginx/cloudflare-ips.conf;
터미널 창
apt install -y fail2ban
systemctl enable fail2ban
systemctl start fail2ban
# 상태 확인
fail2ban-client status sshd

Docker 포트에 대한 직접 접근 차단

섹션 제목: “Docker 포트에 대한 직접 접근 차단”
터미널 창
# 포트 20128에 대한 외부 직접 접근 방지
iptables -I DOCKER-USER -p tcp --dport 20128 -j DROP
iptables -I DOCKER-USER -i lo -p tcp --dport 20128 -j ACCEPT
# 규칙 영구 저장
apt install -y iptables-persistent
netfilter-persistent save

7. Cloudflare Workers에 배포(선택 사항)

섹션 제목: “7. Cloudflare Workers에 배포(선택 사항)”

VM을 직접 노출하지 않고 Cloudflare Workers를 통해 원격으로 접근하려면:

터미널 창
# 로컬 저장소에서
cd omnirouteCloud
npm install
npx wrangler login
npx wrangler deploy

저장소 내 Cloudflare Tunnel 안내는 TUNNELS_GUIDE.md도 참조하세요. 독립 실행형 omnirouteCloud/ 워커는 별도의 연동 저장소에 있습니다.


포트 서비스 접근
22 SSH 공개(fail2ban 적용)
80 nginx HTTP HTTPS로 리디렉션
443 nginx HTTPS Cloudflare Proxy를 통해 접근
20128 OmniRoute 로컬호스트 전용(nginx를 통해 접근)

소형 VPS 인스턴스(1 GB RAM 이하)에 배포하는 경우:

  • 백그라운드 서비스 비활성화 — 스케줄러, MCP 서버 및 주기적인 유지 관리 작업을 건너뛰려면 OMNIROUTE_DISABLE_BACKGROUND_SERVICES=1로 설정하세요. docs/reference/ENVIRONMENT.md를 참조하세요.
  • SQLite WAL 모드 사용 — 기본적으로 활성화되어 있으며, 동시 읽기 작업 중 최대 메모리 사용량을 줄입니다.
  • V8 힙 제한 — 런타임에서 VM보다 큰 상한을 산정하지 않도록 OMNIROUTE_MEMORY_MB(예: 512)를 설정하세요. docs/reference/ENVIRONMENT.md를 참조하세요.
  • 고부하 요청 허용 한도가 힙 제한에 따라 자동으로 조정됨 – 위에서 OMNIROUTE_MEMORY_MB를 설정하면 수신 바이트 예산(OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES)이 동일한 상한에서 자동으로 산정됩니다. 따라서 메모리가 제한된 VM에는 추가 조정 없이 더 작은 동시 요청 예산이 적용되며, 초과 요청은 메모리 확보 경쟁을 유발하는 대신 Retry-After가 포함된 재시도 가능한 503 응답을 받습니다. 이와 별도로 엄격한 상한이 필요한 경우에만 기존 OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT 요청 수 제한을 설정하세요.
  • VPS에서 next build 실행 지양 — 로컬에서 빌드하고 독립 실행형 출력(.next/standalone/)을 배포하세요.
  • top / free -m으로 모니터링 — OmniRoute는 일반적으로 1 GB VM에서 유휴 상태일 때 200-400 MB의 RSS를 사용합니다.

OmniRoute 소스 코드 (a58000c7685f)

HagiCode

HagiCode는 구조화된 워크플로, 다중 에이전트 실행, Hero Dungeon 뷰를 갖춘 에이전트 코딩 작업 공간입니다.

더 스마트하고 빠르며 즐거운 에이전트 워크플로로 유용한 소프트웨어를 만드세요.

HagiCode 라이트 테마 메인 화면
  • Smart구조화된 워크플로는 의도를 아이디어부터 배포까지 실행 가능한 경로로 바꿉니다.
  • Efficient다중 에이전트 워크플로로 조사, 구현, 검토를 병렬로 진행합니다.
  • FunHero Dungeon은 긴 코딩 세션을 시각적이고 협업적인 경험으로 만듭니다.
HagiCode 방문