Hetzner에서 OpenClaw 실행 (Docker, 프로덕션 VPS 가이드)
목표
Docker를 사용하여 Hetzner VPS에서 지속적인 OpenClaw Gateway를 실행하며, 내구성 있는 상태, 내장된 바이너리 및 안전한 재시작 동작을 갖춥니다.
"월 ~$5로 OpenClaw 24/7"을 원한다면, 이것이 가장 간단하고 신뢰할 수 있는 설정입니다. Hetzner 가격은 변경됩니다; 가장 작은 Debian/Ubuntu VPS를 선택하고 OOM이 발생하면 확장하세요.
간단히 말하면 무엇을 하나요?
- 작은 Linux 서버 임대 (Hetzner VPS)
- Docker 설치 (격리된 앱 런타임)
- Docker에서 OpenClaw Gateway 시작
- 호스트에서 ~/.openclaw + ~/.openclaw/workspace 지속 (재시작/재빌드 후에도 유지)
- SSH 터널을 통해 노트북에서 Control UI 접근
Gateway는 다음을 통해 접근할 수 있습니다:
- 노트북에서 SSH 포트 포워딩
- 방화벽 및 token을 직접 관리하는 경우 직접 포트 노출
이 가이드는 Hetzner의 Ubuntu 또는 Debian을 가정합니다. 다른 Linux VPS를 사용하는 경우, 그에 맞게 패키지를 매핑하세요. 일반적인 Docker 흐름은 Docker를 참조하세요.
빠른 경로 (숙련된 운영자)
- Hetzner VPS 프로비저닝
- Docker 설치
- OpenClaw 레포지토리 클론
- 영구 호스트 디렉토리 생성
- .env 및 docker-compose.yml 구성
- 이미지에 필요한 바이너리 베이크
- docker compose up -d
- 지속성 및 Gateway 접근 확인
필요한 것
- root 접근 권한이 있는 Hetzner VPS
- 노트북에서 SSH 접근
- SSH + 복사/붙여넣기에 대한 기본적인 익숙함
- ~20분
- Docker 및 Docker Compose
- Model 인증 자격 증명
- 선택적 제공업체 자격 증명
- WhatsApp QR
- Telegram bot token
- Gmail OAuth
1) VPS 프로비저닝
Hetzner에서 Ubuntu 또는 Debian VPS를 생성합니다.
root로 연결:
ssh root@YOUR_VPS_IP
이 가이드는 VPS가 상태 저장형이라고 가정합니다. 일회성 인프라로 취급하지 마세요.
2) Docker 설치 (VPS에서)
apt-get update
apt-get install -y git curl ca-certificates
curl -fsSL https://get.docker.com | sh
확인:
docker --version
docker compose version
3) OpenClaw 레포지토리 클론
git clone https://github.com/openclaw/openclaw.git
cd openclaw
이 가이드는 바이너리 지속성을 보장하기 위해 사용자 지정 이미지를 빌드한다고 가정합니다.
4) 영구 호스트 디렉토리 생성
Docker 컨테이너는 임시적입니다. 모든 장기 상태는 호스트에 있어야 합니다.
mkdir -p /root/.openclaw
mkdir -p /root/.openclaw/workspace
# 컨테이너 사용자(uid 1000)에게 소유권 설정:
chown -R 1000:1000 /root/.openclaw
chown -R 1000:1000 /root/.openclaw/workspace
5) 환경 변수 구성
레포지토리 루트에 .env를 생성합니다.
OPENCLAW_IMAGE=openclaw:latest
OPENCLAW_GATEWAY_TOKEN=change-me-now
OPENCLAW_GATEWAY_BIND=lan
OPENCLAW_GATEWAY_PORT=18789
OPENCLAW_CONFIG_DIR=/root/.openclaw
OPENCLAW_WORKSPACE_DIR=/root/.openclaw/workspace
GOG_KEYRING_PASSWORD=change-me-now
XDG_CONFIG_HOME=/home/node/.openclaw
강력한 시크릿 생성:
openssl rand -hex 32
이 파일을 커밋하지 마세요.
6) Docker Compose 구성
docker-compose.yml을 생성하거나 업데이트합니다.
services:
openclaw-gateway:
image: ${OPENCLAW_IMAGE}
build: .
restart: unless-stopped
env_file:
- .env
environment:
- HOME=/home/node
- NODE_ENV=production
- TERM=xterm-256color
- OPENCLAW_GATEWAY_BIND=${OPENCLAW_GATEWAY_BIND}
- OPENCLAW_GATEWAY_PORT=${OPENCLAW_GATEWAY_PORT}
- OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
- GOG_KEYRING_PASSWORD=${GOG_KEYRING_PASSWORD}
- XDG_CONFIG_HOME=${XDG_CONFIG_HOME}
- PATH=/home/linuxbrew/.linuxbrew/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
volumes:
- ${OPENCLAW_CONFIG_DIR}:/home/node/.openclaw
- ${OPENCLAW_WORKSPACE_DIR}:/home/node/.openclaw/workspace
ports:
# 권장: VPS에서 Gateway를 loopback 전용으로 유지; SSH 터널을 통해 접근.
# 공개적으로 노출하려면, `127.0.0.1:` 접두사를 제거하고 적절히 방화벽을 설정하세요.
- "127.0.0.1:${OPENCLAW_GATEWAY_PORT}:18789"
# 선택사항: 이 VPS에 대해 iOS/Android nodes를 실행하고 Canvas host가 필요한 경우에만.
# 공개적으로 노출하는 경우, /gateway/security를 읽고 적절히 방화벽을 설정하세요.
# - "18793:18793"
command:
[
"node",
"dist/index.js",
"gateway",
"--bind",
"${OPENCLAW_GATEWAY_BIND}",
"--port",
"${OPENCLAW_GATEWAY_PORT}"
]
7) 이미지에 필요한 바이너리 베이크 (중요)
실행 중인 컨테이너 내부에 바이너리를 설치하는 것은 함정입니다. 런타임에 설치된 모든 것은 재시작 시 손실됩니다.
Skills에 필요한 모든 외부 바이너리는 이미지 빌드 시 설치해야 합니다.
아래 예시는 세 가지 일반적인 바이너리만 보여줍니다:
- Gmail 접근을 위한 gog
- Google Places를 위한 goplaces
- WhatsApp을 위한 wacli
이들은 예시이며 완전한 목록이 아닙니다. 동일한 패턴을 사용하여 필요한 만큼 많은 바이너리를 설치할 수 있습니다.
나중에 추가 바이너리에 의존하는 새 skills를 추가하는 경우:
- Dockerfile 업데이트
- 이미지 재빌드
- 컨테이너 재시작
Dockerfile 예시
FROM node:22-bookworm
RUN apt-get update && apt-get install -y socat && rm -rf /var/lib/apt/lists/*
# 예시 바이너리 1: Gmail CLI
RUN curl -L https://github.com/steipete/gog/releases/latest/download/gog_Linux_x86_64.tar.gz \
| tar -xz -C /usr/local/bin && chmod +x /usr/local/bin/gog
# 예시 바이너리 2: Google Places CLI
RUN curl -L https://github.com/steipete/goplaces/releases/latest/download/goplaces_Linux_x86_64.tar.gz \
| tar -xz -C /usr/local/bin && chmod +x /usr/local/bin/goplaces
# 예시 바이너리 3: WhatsApp CLI
RUN curl -L https://github.com/steipete/wacli/releases/latest/download/wacli_Linux_x86_64.tar.gz \
| tar -xz -C /usr/local/bin && chmod +x /usr/local/bin/wacli
# 동일한 패턴을 사용하여 아래에 더 많은 바이너리 추가
WORKDIR /app
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
COPY ui/package.json ./ui/package.json
COPY scripts ./scripts
RUN corepack enable
RUN pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
RUN pnpm ui:install
RUN pnpm ui:build
ENV NODE_ENV=production
CMD ["node","dist/index.js"]
8) 빌드 및 실행
docker compose build
docker compose up -d openclaw-gateway
바이너리 확인:
docker compose exec openclaw-gateway which gog
docker compose exec openclaw-gateway which goplaces
docker compose exec openclaw-gateway which wacli
예상 출력:
/usr/local/bin/gog
/usr/local/bin/goplaces
/usr/local/bin/wacli
9) Gateway 확인
docker compose logs -f openclaw-gateway
성공:
[gateway] listening on ws://0.0.0.0:18789
노트북에서:
ssh -N -L 18789:127.0.0.1:18789 root@YOUR_VPS_IP
열기:
http://127.0.0.1:18789/
Gateway token을 붙여넣습니다.
무엇이 어디에 지속되는가 (진실의 원천)
OpenClaw는 Docker에서 실행되지만, Docker는 진실의 원천이 아닙니다. 모든 장기 상태는 재시작, 재빌드 및 재부팅에서 살아남아야 합니다.
| 구성 요소 | 위치 | 지속성 메커니즘 | 비고 |
|---|---|---|---|
| Gateway 구성 | /home/node/.openclaw/ | 호스트 볼륨 마운트 | openclaw.json, token 포함 |
| Model 인증 프로필 | /home/node/.openclaw/ | 호스트 볼륨 마운트 | OAuth token, API 키 |
| Skill 구성 | /home/node/.openclaw/skills/ | 호스트 볼륨 마운트 | Skill 수준 상태 |
| Agent 작업 공간 | /home/node/.openclaw/workspace/ | 호스트 볼륨 마운트 | 코드 및 agent 아티팩트 |
| WhatsApp 세션 | /home/node/.openclaw/ | 호스트 볼륨 마운트 | QR 로그인 보존 |
| Gmail keyring | /home/node/.openclaw/ | 호스트 볼륨 + 비밀번호 | GOG_KEYRING_PASSWORD 필요 |
| 외부 바이너리 | /usr/local/bin/ | Docker 이미지 | 빌드 시 베이크해야 함 |
| Node 런타임 | 컨테이너 파일시스템 | Docker 이미지 | 모든 이미지 빌드마다 재빌드 |
| OS 패키지 | 컨테이너 파일시스템 | Docker 이미지 | 런타임에 설치하지 마세요 |
| Docker 컨테이너 | 임시 | 재시작 가능 | 안전하게 파괴 가능 |