본문으로 건너뛰기
whywhyy
뒤로 가기

굴러다니는 라즈베리파이 오픈클로 구성하기 (3) — 구성하자

4 min read글 수정하기

오픈클로 설치

설치 자체는 문서를 따라가면 된다. 다만 라즈베리파이 문서는 꼭 읽어야 한다.

https://docs.openclaw.ai/install/raspberry-pi

특히 OS는 Raspberry Pi OS Lite (64-bit) 를 써야 한다. 나는 이걸 안 지키고 다른 버전으로 밀었다가 업데이트가 중간에 터졌다. ㅎㅎ;;

문서가 알려준 성능 팁

설치 문서인데 성능 팁이 꽤 자세히 적혀 있어서 놀랐다.

USB SSD 권장 SD 카드는 느리고 수명도 짧으니 USB SSD로 부팅하라고 한다. 나는 SSD가 없어서 이건 넘겼다.

모듈 컴파일 캐시 + 재시작 최적화 NODE_COMPILE_CACHE와 OPENCLAW_NO_RESPAWN=1을 설정하면, 재시작할 때 새 프로세스를 띄우지 않고 in-process로 처리한다. 작은 보드에서 프로세스 교체 비용을 줄이는 팁이다.

export NODE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache
export OPENCLAW_NO_RESPAWN=1

메모리 절약 headless 환경이니 GPU 메모리를 줄이고 안 쓰는 서비스를 끈다.

echo 'gpu_mem=16' | sudo tee -a /boot/config.txt
sudo systemctl disable bluetooth

로컬 LLM은 쓰지 말 것 Pi에서 모델을 직접 돌리지 말고 API 기반 모델을 쓰라고 명시돼 있다. 애초에 그렇게 쓸 생각은 없었지만, 근거를 적어둔 게 좋았다.

SSD를 제외한 나머지는 그대로 적용했다.

Tailscale 적용

Tailscale 구성은 아래 문서를 보고 진행했다.

https://docs.openclaw.ai/gateway/stable-https-url

보안을 기본값으로 강하게 잡는 프로젝트라 그런지, Tailscale 구성도 꽤 정교했다. OpenClaw는 자체적으로 openclaw gateway --tailscale serve 같은 명령을 제공해서, 문서에 나온 그대로 따라 하면 Serve 구성이 끝난다.

MagicDNS

Tailscale은 MagicDNS라는 이름으로 DNS도 제공한다.

https://tailscale.com/docs/features/magicdns

HTTPS 인증서

tailnet 안에서 각 기기의 HTTPS 인증서를 발급하는 절차도 지원한다. 덕분에 HTTPS도 Tailscale 선에서 해결된다.

https://tailscale.com/docs/how-to/set-up-https-certificates

ACL

tailnet 전체를 하나의 신뢰 구간으로 두지 않으려고 ACL을 걸었다. OpenClaw 노드를 목적지로 하는 트래픽에서 443 포트만 허용하는 설정이다.

결과적으로 tailnet의 다른 피어는 이 노드와 HTTPS로만 통신할 수 있다. SSH를 비롯한 다른 포트는 열려 있지 않으니, tailnet에 들어왔다고 해서 노드 전체에 접근할 수 있는 구조는 아니다.

정책은 이런 모양이다. Tailscale ACL은 명시적으로 허용한 것만 통과하므로, 아래 규칙에 없는 포트는 자동으로 막힌다.

{
  "action": "accept",
  "src": ["autogroup:member"],
  "dst": ["tag:openclaw"],
  "ip": ["tcp:443"],
}

tag:openclaw가 이 노드에 붙인 태그이고, ip에 tcp:443 하나만 적은 부분이 핵심이다. 목적지는 노드로 두고 포트를 따로 제한하면, 허용 범위가 눈에 바로 들어온다.

토큰 없이 컨트롤 UI 접근

원래 Control UI에 들어가려면 토큰이나 패스워드가 필요하다. 그런데 Tailscale로 구성하면, tailnet을 통해 들어온 요청은 Tailscale identity를 검증해서 자동으로 허용할 수 있다. 이 부분이 가장 인상적이었다.

포트 흐름은 이렇게 동작한다.

토큰리스 Control UI 접근 흐름: tailnet 기기 → Tailscale Serve → 전용 프록시 → Gateway, 프록시는 tailscaled에 whois 조회

  1. tailnet 기기에서 HTTPS로 접속하면 Tailscale Serve가 요청을 받는다.
  2. Serve는 x-forwarded-for, x-forwarded-proto, x-forwarded-host와 tailscale-user-login 헤더를 붙여, 전용 프록시(127.0.0.1의 임시 포트)로 넘긴다.
  3. 프록시는 x-forwarded-for를 로컬 tailscaled에 tailscale whois로 조회해 실제 사용자를 확인하고, 헤더의 로그인과 일치할 때만 통과시킨다.
  4. 통과한 요청만 Gateway(127.0.0.1:18789)가 처리한다.

Gateway는 loopback에 묶여 있고, 검증은 프록시가 담당한다.

조건은 두 가지다. gateway.tailscale.mode가 serve이고, gateway.auth.allowTailscale이 true여야 한다.

이 우회는 범위도 좁다. Control UI의 WebSocket 인증과 아바타용 GET/HEAD 요청에만 적용되고, /v1/* 같은 API 엔드포인트는 평소처럼 토큰 인증을 요구한다.

https://docs.openclaw.ai/gateway/tailscale#tailscale-identity-headers-(serve-only)

OpenRouter

오픈라우터는 카드 등록 후 충전식으로 쓴다. 충전해두면 사용할 때마다 실시간으로 잔액이 깎인다.

DeepSeek Flash 기준으로, 간단한 작업을 한 번 호출하면 $0.097(현재 환율 1달러 = 1,337원 기준 130원) 정도 나갔다. 생각보다 부담이 없어서 놀랐다.

참조



이전 글
굴러다니는 라즈베리파이 오픈클로 구성하기 (2) — 아키텍처 논의해보자