2026: Docker 없이 Linux VPS에서 OpenClaw
Ubuntu 24.04, systemd, Cloudflare Tunnel로 루프백 Gateway

약 18분 읽기 · MACCOME

세 플랫폼 설치 글과 Docker 프로덕션 가이드를 읽은 뒤에도 공용 인터페이스에 Gateway를 열지 않으려면 Ubuntu 24.04 위에서 베어메탈 Node와 systemd로 OpenClaw Gateway를 두고 Cloudflare Tunnel로 인그레스를 받는 구성을 원할 수 있습니다. 본문에서는 Docker 글과의 범위, 통증 요소 분해, 표 두 개, systemd·터널 스니펫, 여섯 단계 런북, 당번 지표 세 가지를 정리하고, 재현 가능한 런칭을 위해 설치 후 트러블슈팅, Docker 프로덕션, 설치 가이드, Gateway 보안 고급 런북으로 연결합니다.

베어메탈의 여섯 가지 함정: “컨테이너만 안 쓴다” 이상의 문제

베어메탈은 Node 버전, 권한, 바인드 주소, 프로세스 감시를 다시 호스트에 되돌려 놓습니다. 노트북에서 Gateway를 전경으로만 돌리던 습관을 그대로 가져오면 재부팅 후 서비스가 사라지고 저널 구조가 흐트러지며 ufw와 클라우드 보안 그룹이 엇갈려 사고가 구두로만 남습니다. 설정을 복사하기 전에 아래 여섯 범주로 쪼갭니다.

  1. Node와 전역 CLI 드리프트: 반복적인 sudo npm i -g는 문서와 다른 프로덕션을 만듭니다. ExecStart를 고정된 Node 바이너리나 버전 관리자 심에 맞춥니다.
  2. 과도하게 넓은 바인드: 0.0.0.0에 방화벽 규칙 하나가 빠지면 제어 평면이 노출됩니다. 터널을 쓸 때는 127.0.0.1을 선호하고 인바운드는 터널이 받습니다.
  3. systemd 사용자와 WorkingDirectory 불일치: root 홈 아래 설정을 두고 유닛은 openclaw로 돌리면 수동으로는 되고 서비스로는 실패하는 패턴이 납니다.
  4. 터널 업스트림 포트 불일치: cloudflared가 잘못된 로컬 포트를 가리키면 모델 타임아웃과 무관한 외부 502가 납니다.
  5. 인바운드와 아웃바운드 혼동: 터널은 클라이언트 도달성만 해결하고, 모델 API·DNS·프록시·키는 여전히 아웃바운드 경로에 의존합니다. 설치 후 글에서 순서대로 분류합니다.
  6. 롤백 기준점 부재: OpenClaw나 Node를 올릴 때 마지막 정상 ExecStart와 설정 해시를 고정하지 않으면 빠른 롤백이 어렵습니다.

표 두 개로 Docker 대 베어메탈, 터널 대 직접 리버스 프록시를 압축해 리뷰 패킷에 넣을 수 있습니다.

Gateway 보안 고급 글에서는 토큰·노출·시크릿 로테이션을 다루고, 본 글은 Linux 호스트에서 루프백 바인드와 터널로 인그레스를 넘기는 부분을 다룹니다. 둘을 합치면 “엣지 인그레스, 저장소 평면의 시크릿, systemd 아래 프로세스”가 됩니다. 온보딩과 모델 키는 설치 가이드로 마친 뒤 본문의 프로덕션 하드닝을 적용합니다.

Docker Compose 대 베어메탈 systemd: 선택 기준

Docker 프로덕션 글은 이미지 핀, 볼륨, Compose 롤백을 다루고, 본 글은 호스트 유닛과 터널을 다룹니다. 표 1은 아키텍처 리뷰용이며 절대적 우열을 말하지 않습니다.

차원Docker / Compose베어 Node + systemd(본 글)
재현성이미지와 digest로 런타임을 고정호스트 스택은 들쭉날쭉하므로 구성 관리와 버전 핀으로 보완합니다
분석 깊이컨테이너 로그와 볼륨 권한을 먼저 봅니다정책이 허용하면 호스트 도구를 씁니다
기존 운영 도구컨테이너 모니터링과 레지스트리 흐름이 필요합니다journald, node_exporter, 백업 스크립트를 재사용합니다
업그레이드 경로이미지 태그를 바꾸고 볼륨은 명시합니다Node와 전역 패키지가 함께 움직이므로 롤백을 스크립트로 둡니다
전형적 적합이미 컨테이너 표준을 쓰는 팀메탈에서 돌려야 하거나 레거시 systemd 서비스와 강하게 엮여야 할 때

Cloudflare Tunnel과 호스트 리버스 프록시: 경계를 어디에 둘지

터널은 TLS와 공용 인그레스를 엣지로 넘기고, Nginx·Caddy는 보통 로컬에서 TLS를 종료한 뒤 루프백으로 프록시합니다. 조합은 가능하지만 리스닝 표면은 최소로 유지합니다. 표 2를 보안 그룹 규칙과 대조합니다.

패턴Gateway 바인드공용 표면운영 메모
터널 → 루프백127.0.0.1:PORT(OpenClaw 문서 기준)Gateway 포트를 직접 열지 않고 터널 프로세스 이그레스만 둡니다인그레스를 실제 로컬 서비스 포트와 맞춥니다
로컬 Nginx/Caddy대개 여전히 루프백 업스트림프록시에 443, 인증서와 레이트 리밋을 관리합니다ufw와 클라우드 SG를 이중 노출 없이 맞춥니다
비권장: Gateway를 0.0.0.0에모든 인터페이스제어 평면이 인터넷에 노출됩니다엄격한 토큰·허용 목록·WAF가 필요하며 기본값은 아닙니다
ini
# /etc/systemd/system/openclaw-gateway.service (골격; ExecStart는 공식 CLI 기준)
[Unit]
Description=OpenClaw Gateway (베어메탈)
After=network-online.target
Wants=network-online.target

[Service]
User=openclaw
Group=openclaw
WorkingDirectory=/var/lib/openclaw
Environment=NODE_ENV=production
ExecStart=/usr/bin/node /path/to/openclaw/cli.js gateway start --bind 127.0.0.1
Restart=on-failure
RestartSec=5
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
yaml
# cloudflared 조각: 호스트명 → 로컬 Gateway
tunnel: YOUR_TUNNEL_ID
credentials-file: /etc/cloudflared/YOUR_TUNNEL.json

ingress:
  - hostname: claw.example.com
    service: http://127.0.0.1:18789
  - service: http_status:404
warning

참고: 포트와 바이너리 경로는 예시입니다. 현행 OpenClaw 문서와 openclaw --help에 맞추고, 변경 티켓에 해시와 롤백 명령을 남깁니다.

여섯 단계: 깨끗한 Ubuntu 24.04에서 당번 systemd + 터널까지

  1. 기준선 고정: 커널, Node 마이너, OpenClaw 패키지 버전, OpenSSL을 설치 가이드의 최소 요구와 맞춥니다.
  2. 서비스 사용자와 디렉터리: 전용 사용자와 소유권을 명확히 하고, 다른 계정으로 돌리면서 개인 홈에 프로덕션 설정을 두지 않습니다.
  3. 루프백을 먼저 검증: 127.0.0.1에 바인드한 뒤 문서의 curl·헬스로 확인하고, 그다음 터널을 붙입니다.
  4. systemd 작성과 enable: daemon-reload && enable --nowjournalctl -u openclaw-gateway -f로 순서 오류를 봅니다.
  5. cloudflared 인그레스: 클라우드 DNS와 로컬 설정을 맞추고, 외부 502·525를 터널 문제인지 업스트림 문제인지 분류합니다.
  6. 업그레이드와 롤백 연습: 마지막 정상 ExecStart와 설정을 tarball로 보관하고, RTO 안에서만 전진 실패를 허용합니다.

로컬 헬스(프로세스와 루프백 포트)와 외부 헬스(DNS, 인증서 체인, 엣지 라우팅)를 릴리스 때마다 나눕니다. 한쪽만 갱신하면 “내부는 녹색, 외부는 적색” 같은 오판이 납니다. 티켓 템플릿에는 OpenClaw 버전, Node 마이너, cloudflared 버전과 감사용 저널 발췌를 넣습니다.

당번 지표 세 가지

  1. 리스닝 표면 개수: 프로덕션에서 열린 TCP 포트를 한 줄로 나열하고, WAF 없이 공용 Gateway 바인드가 있으면 긴급 결함으로 취급합니다.
  2. 터널 502 분류: 먼저 curl -v 127.0.0.1:PORT를 쓰고 이어서 터널 로그를 봅니다. 로컬 실패는 앱 층, 로컬 성공·원격 실패는 터널이나 DNS 쪽입니다.
  3. 아웃바운드 프로브 기준선: VPS에서 모델 벤더로 TLS·HTTP 점검을 자동화하고, 설치 후 닥터 단계와 임계값을 공유합니다.

보충: Gateway와 터널만 도는 작은 VPS에서 CPU는 한가한데 지연이 들쭉날쭉하면 vCPU 확장 전에 프로세스별 파일 디스크립터, 장수 WebSocket 수, 공급자까지의 TLS RTT를 확인합니다.

“아무 VPS”와 안정적인 실행층 사이의 간극

범용 Linux VPS는 데모에는 충분하지만 IO 편차와 헤드리스 제약이 장기 자동화에 영향을 줍니다. 프로덕션 OpenClaw에는 반복 가능한 감시, 감사 가능한 리스닝 표면, CI·시크릿 워크플로와의 정렬이 필요합니다.

iOS 빌드, 시뮬레이터, GUI 분석에는 Linux가 Apple Silicon을 대체하지 못하므로 많은 팀이 Linux 엣지에 Gateway를 두고 무거운 Xcode 작업은 원격 Mac으로 넘깁니다. 여분 노트북과 파편화된 데스크톱은 24/7 에이전트에 불리합니다. 절전과 대화상자가 자동화를 무작위 실패로 바꿉니다. MACCOME은 멀티리전 Mac Mini M4 / M4 Pro 베어메탈을 제공하며 빌드와 장시간 세션 백엔드로 쓰기에 적합하고, Linux 쪽에서 인그레스를 수렴할 때와 짝을 이룹니다. 먼저 고객 센터를 연 뒤 대여 요금과 권역 페이지를 맞춥니다.

짧은 대여로 “터널 + 원격 Mac 워크로드”의 종단 간 지연을 재고, 인그레스와 컴파일 역할을 한 호스트에 몰기 전에 측정합니다.

자주 묻는 질문

Docker만으로는 부족한가요?

대부분의 경우 Docker 프로덕션 글로 충분합니다. 베어 systemd는 기존 호스트 운영과의 밀착이나 호스트 단 분석이 필요할 때 맞습니다.

Gateway는 127.0.0.1과 0.0.0.0 중 어디에 바인드하나요?

터널이나 로컬 프록시 뒤에서는 루프백을 선호합니다. 넓히려면 방화벽·토큰·모니터링을 함께 둡니다. 검증 순서는 설치 후 트러블슈팅을 따릅니다.

설치 명령과 플랫폼 차이는 어디에 있나요?

설치·플랫폼 선택을 읽고, 요금은 대여 요금에서 비교합니다.

리전·연결은 어디서 확인하나요?

멀티리전 가이드와 SSH·VNC는 SSH/VNC 가이드, 세션·티켓은 고객 센터를 참고합니다.