개요
OpenClaw는 "채팅 앱(Discord 등) + LLM(API 키) + 내 서버의 파일/명령 실행/브라우저 제어"를 한 덩어리로 묶어, 계속 켜져 있는 개인 에이전트처럼 동작하게 만드는 오픈소스 런타임이다.1 메시지를 받으면 게이트웨이가 라우팅하고, 에이전트가 판단해 스킬(도구 호출, 파일 읽기/쓰기, 커맨드 실행 등)을 실행한다.
VPS에서 돌릴 때 핵심은 "에이전트는 사실상 고권한 자동화 레이어"라는 점이다. 토큰과 API 키를 쥐고 있고, 설정에 따라 서버에서 명령을 실행할 수 있으니, 운영 관점에서는 봇 앱이 아니라 '특권 인프라'로 취급해야 한다.3 특히 게이트웨이/대시보드 포트를 인터넷에 노출하면, 검색엔진(Shodan 등)으로 발견되고 설정 실수 하나로 원격 제어판이 될 수 있다는 경고가 반복된다.3
기대 결과: "이걸 외부 공개 서비스처럼 열어두면 위험하다"는 전제를 먼저 갖고, 이후 단계에서 포트를 닫은 채로 진행할 준비가 된다.
사양/요금제 가이드(Lightsail 플랜 추천)
설치 실패를 가장 많이 부르는 게 메모리 부족이다. Pulumi 배포 글에서는 t3.micro(1GB)는 설치에 부족하고, t3.medium(4GB) 이상을 쓰라고 명시한다.1 DigitalOcean의 Moltbot(OpenClaw 전 이름) 퀵스타트도 2GB RAM 플랜을 "추천"으로 잡는다.2
Lightsail 기준으로 정리하면 이렇다.
2GB RAM 플랜은 "최소(돌아가게는 하는 수준)", 4GB RAM 플랜은 "권장(설치/업데이트/브라우저 기능까지 고려한 실사용 안정선)"으로 잡는 게 안전하다.12 특히 브라우저 제어(18791)나 여러 스킬을 켜면 메모리가 더 흔들린다.
기대 결과: Lightsail에서 최소 2GB 이상(가능하면 4GB) 플랜으로 시작한다.
사전 준비물 체크리스트
AWS 계정과 Lightsail 접근 권한이 필요하다.
Lightsail 인스턴스는 Ubuntu 24.04 LTS를 권장한다.
로컬 SSH 키(없으면 생성)가 필요하다.
LLM API 키(Anthropic/OpenAI 등)를 준비한다.
Discord 서버(길드) 관리자 권한과 Discord Developer Portal 접근 권한이 필요하다.
기대 결과: "서버 접속(SSH) + LLM 호출(API 키) + Discord 봇 생성/초대" 3축이 모두 준비된다.
Lightsail에서 VPS 만들기(콘솔 클릭 흐름)
Lightsail 콘솔로 이동해 인스턴스를 만든다.
Create instance → Platform: Linux/Unix → Blueprint: Ubuntu 24.04 LTS를 선택한다.
SSH 키는 "기본 키 사용" 또는 "내 공개키 업로드" 중 하나를 택한다. 운영 편의상 내 키를 올리는 쪽이 보통 낫다.
Static IP를 생성해 인스턴스에 붙인다. 재부팅/교체 시 IP가 바뀌면 SSH/운영이 꼬이기 쉽다.
네트워킹 방화벽은 기본으로 22(SSH)만 허용한다. OpenClaw 포트 18789(게이트웨이)와 18791(브라우저/컨트롤)는 기본적으로 닫아둔다.13
기대 결과: 고정 IP가 붙은 Ubuntu 24.04 인스턴스가 생기고, 인바운드는 22만 열려 있다.
서버 초기 설정(SSH 접속 후)
먼저 SSH로 접속한다.
ssh ubuntu@YOUR_STATIC_IP
# 또는 Lightsail에서 제공하는 기본 사용자로 접속기대 결과: 터미널 프롬프트가 서버로 바뀐다.
패키지를 업데이트한다.
sudo apt update
sudo apt -y upgrade
sudo apt -y install curl ufw기대 결과: 에러 없이 패키지 업데이트가 끝난다.
새 사용자를 만들고 sudo를 부여한다(기본 사용자가 ubuntu가 아니라면 특히 권장).
sudo adduser clawd
sudo usermod -aG sudo clawd기대 결과: clawd 사용자 생성이 완료되고 비밀번호 설정 프롬프트를 통과한다.
SSH 키로 clawd 로그인까지 정리하고, root 로그인 비활성화를 권장한다.
# (서버에서) clawd 홈에 SSH 키 디렉터리 준비
sudo -u clawd mkdir -p /home/clawd/.ssh
sudo chmod 700 /home/clawd/.ssh
# (로컬에서) 공개키를 서버에 복사(예: macOS/Linux)
ssh-copy-id clawd@YOUR_STATIC_IP기대 결과: ssh clawd@YOUR_STATIC_IP로 비밀번호 없이 접속된다.
UFW는 22만 허용하고 활성화한다.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw enable
sudo ufw status verbose기대 결과: Status가 active이고, 22/tcp만 ALLOW로 보인다.
OpenClaw 설치
이 단계는 clawd 사용자로 진행하는 걸 권장한다.
su - clawd기대 결과: 현재 사용자가 clawd로 바뀐다.
공식 설치 스크립트를 실행한다.4
curl -fsSL https://openclaw.ai/install.sh | bash
exec bash기대 결과: 설치 로그가 흐르고, 셸을 재시작한 뒤 openclaw 명령이 인식된다.
온보딩을 실행해 데몬(systemd)으로 상시 실행되게 만든다.
openclaw onboard --install-daemon기대 결과: 마법사에서 LLM 제공자/API 키, 워크스페이스, 채널 등을 설정하고 종료 후 "daemon/service installed" 류의 메시지를 본다.
포트 개념을 정리해두면 이후 보안/장애 대응이 쉬워진다.
게이트웨이 기본 포트는 18789이며, 채널/세션/훅 등을 처리하는 중심(WebSocket)이다.1
브라우저 컨트롤(헤드리스 크롬) 기본 포트는 18791이며 웹 자동화 기능을 쓸 때 관여한다.1
둘 다 "외부 공개용 포트"가 아니라 "로컬/사설 접근"을 전제로 둔다.3
기대 결과: "18789/18791은 열어두면 편하지만, 기본은 닫아둬야 하는 관리 포트"로 이해한다.
상태/로그 확인은 설치된 CLI에 맞춰 실행한다. 문서나 글에 clawdbot/moltbot 명령이 섞여 있을 수 있는데, 지금 설치한 게 openclaw면 openclaw로, 만약 moltbot/clawdbot CLI가 설치됐다면 그 이름으로 바꿔 실행한다.2
# 상태(예시)
openclaw gateway status
# 재시작(예시)
openclaw gateway restart
# 로그 팔로우(예시)
openclaw logs --follow기대 결과: status가 Running으로 보이거나, 로그가 끊기지 않고 흘러나온다.
Discord로 연결(봇 방식)
Discord Developer Portal에서 봇을 만든다.
Discord Developer Portal → New Application → (이름 입력) Create
왼쪽 Bot → Add Bot
Token → Reset Token(필요 시) → 토큰을 복사해 안전한 곳에 저장한다(다시 전체 표시가 안 될 수 있다).
기대 결과: 봇 토큰을 확보한다(유출되면 즉시 재발급해야 하는 비밀번호급 비밀값).
OAuth2 → URL Generator에서 초대 URL을 만든다.
Scopes: bot, applications.commands
Bot Permissions(권장 최소): Send Messages, Read Message History, Embed Links
생성된 URL로 봇을 서버(길드)에 초대한다.
기대 결과: 서버 멤버 목록에 봇이 들어온다(오프라인이어도 멤버로는 보인다).
OpenClaw 쪽에 Discord 채널을 연결한다. 실제 UI/CLI 흐름은 버전에 따라 조금씩 달라질 수 있어 "온보딩에서 Discord 선택 → 토큰 입력 → 연결 확인"의 형태로 이해하면 안전하다.4
# 가장 먼저 시도: 온보딩을 다시 실행해 Discord 채널만 추가/수정
openclaw onboard온보딩에서 Discord를 선택할 때 보통 아래 값들을 넣는 흐름이 된다.
Bot Token: 방금 발급한 토큰
(선택) 허용할 서버/채널, 메시지 처리 방식(멘션만 반응 등)
설정 파일로 넣어야 하는 버전이라면 개념적으로는 channels.discord 아래에 토큰을 넣는 구조를 떠올리면 된다(정확한 경로/파일명은 설치 버전에 따라 다를 수 있다).
기대 결과: 온보딩 종료 후 로그에 "discord connected/ready" 류의 메시지가 보인다.
테스트는 가장 단순하게 한다.
서버의 특정 채널에서 @봇 Hello처럼 멘션한다.
또는 봇에게 DM을 보낸다(구성에 따라 DM만 받도록 해두는 편이 더 안전할 때가 많다).
기대 결과: 봇이 몇 초 내로 응답 메시지를 보낸다.
보안 운영 가이드(중요)
게이트웨이/대시보드를 인터넷에 직접 노출하지 않는다. 이 류의 에이전트는 '관리 UI가 노출되어 생기는 사고'가 반복되며, 취약점이 아니라 설정 실수/프록시 신뢰 경계 붕괴가 문제의 시작이 되는 경우가 많다.3
가장 안전한 기본값은 Lightsail 방화벽에서 18789/18791을 끝까지 닫아두는 것이다.13
원격에서 대시보드/게이트웨이를 보고 싶으면, 공개 포트가 아니라 "터널/사설망"으로 들어간다.
SSH 터널 방식(간단하고 즉시 가능).
# 로컬에서 실행: 로컬 18789 -> 서버 127.0.0.1:18789 로 터널
ssh -L 18789:127.0.0.1:18789 clawd@YOUR_STATIC_IP그 다음 로컬 브라우저에서 http://127.0.0.1:18789로 접속한다(대시보드가 그 포트에 매핑되는 구성일 때).
기대 결과: 서버 포트를 열지 않았는데도 로컬에서만 대시보드가 열린다.
Tailscale 방식(운영적으로 추천). Pulumi 글도 "공개 포트 최소화 + Tailscale로 접근"을 핵심으로 잡는다.1 개념은 간단히 "서버를 내 테일넷에 붙이고, 18789/18791은 테일넷에서만 접근"이다.
비밀값(LLM API 키, Discord 봇 토큰)은 파일 권한을 강하게 잠근다. 백업할 때도 토큰이 함께 들어갈 수 있으니, 백업본을 퍼블릭 저장소/공유 드라이브에 올리지 않는다.
기대 결과: "열린 포트는 22뿐이고, 나머지는 터널/사설망으로만 접속" 상태로 운영된다.
유지보수
업데이트는 설치 방식에 따라 달라진다. openclaw가 npm 기반으로 설치된 경우가 많으니, 보통은 아래 중 하나로 정리된다(정확한 명령은 openclaw --help나 설치 방식에 맞춘다).4
# (예시) npm 기반으로 설치된 경우
npm -g outdated | head
npm -g install openclaw@latest
# 업데이트 후 재시작(예시)
openclaw gateway restart기대 결과: 버전이 올라가고, 재시작 후에도 정상 응답한다.
워크스페이스(대화/메모리)가 보통 홈 디렉터리 아래(예: ~/clawd)에 쌓인다.2 정기 백업은 scp로 충분하다.
# 로컬에서 실행
scp -r clawd@YOUR_STATIC_IP:~/clawd ./clawd-backup-$(date +%Y%m%d)기대 결과: 로컬에 날짜가 붙은 백업 폴더가 생긴다.
장애가 나면 아래 순서로 본다.
포트 바인딩(로컬 바인딩인지, 이미 다른 프로세스가 잡았는지)
systemd 상태(죽었는지, 재시작 루프인지)
로그(Discord 인증 실패, LLM 인증 실패, 메모리 부족 OOM 등)
# 포트 점검
ss -ltnp | egrep '18789|18791' || true
# systemd 서비스명은 설치 환경에 따라 다를 수 있음(예: openclaw)
systemctl --user status openclaw 2>/dev/null || true
sudo systemctl status openclaw 2>/dev/null || true
# 로그(가능한 명령으로 실행)
openclaw logs --follow기대 결과: "어디서 막히는지(포트/서비스/토큰/메모리)"가 로그로 드러난다.
자주 겪는 문제/해결 6가지
권한 문제로 파일/설정 저장이 실패한다. root로 설치해놓고 일반 사용자로 실행하거나, 워크스페이스 권한이 꼬인 경우가 많다. OpenClaw를 돌릴 사용자(clawd)로 통일하고, 워크스페이스 소유자를 확인한다.
whoami
ls -ld ~/clawd
sudo chown -R clawd:clawd ~/clawd기대 결과: 워크스페이스가 clawd 소유로 바뀌고 오류가 줄어든다.
Node 버전이 안 맞아 실행이 실패한다. openclaw는 Node 런타임 요구사항이 있을 수 있으니(예: Node ≥ 22), 설치 스크립트가 깔아준 환경을 그대로 쓰고, 별도 Node를 덮어쓴 적이 있으면 먼저 의심한다.4
node -v
which node
openclaw --version기대 결과: Node 버전이 요구사항을 만족하고 CLI가 정상 실행된다.
포트가 안 열린 것처럼 보인다. 의도적으로 방화벽에서 18789/18791을 닫았기 때문에 외부에서 접속이 안 되는 게 정상이다. 대시보드가 필요하면 SSH 터널로만 접근한다.
ssh -L 18789:127.0.0.1:18789 clawd@YOUR_STATIC_IP기대 결과: 외부에서 직접 접속은 안 되지만, 로컬 127.0.0.1:18789는 열린다.
Discord 토큰이 잘못됐거나 유출돼 재발급을 해버렸다. 토큰이 바뀌면 기존 설정은 즉시 무효가 된다. Developer Portal에서 새 토큰을 다시 넣고, 서비스를 재시작한다.
openclaw onboard
openclaw gateway restart
openclaw logs --follow기대 결과: 로그에 Discord 로그인 성공(ready) 메시지가 나온다.
봇이 메시지를 못 읽거나 명령이 안 뜬다. 대개는 (1) 봇 권한이 부족하거나 (2) 서버에서 봇이 메시지를 볼 채널 권한이 없거나 (3) Developer Portal의 Privileged Gateway Intents 설정이 필요한 케이스다. 먼저 채널 권한에서 View Channel/Send Messages/Read Message History를 확인하고, 필요한 경우 Intents도 켠 뒤 재시작한다.
기대 결과: 멘션/슬래시 커맨드가 정상 동작한다.
메모리 부족(OOM)으로 설치/실행이 죽는다. 2GB 플랜에서 특히 잦고, 1GB는 설치부터 실패할 수 있다.12 Lightsail 플랜을 4GB로 올리는 게 가장 확실한 해결이다. 임시로는 스왑을 잡아 "죽는 빈도"만 낮출 수 있다.
free -h
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
swapon --show기대 결과: swap이 활성화되고, 갑작스런 종료가 덜해진다(근본 해결은 RAM 증설).
참고
1Deploy OpenClaw on AWS or Hetzner Securely with Pulumi and Tailscale
2Moltbot Quickstart Guide | DigitalOcean
3From Clawdbot to OpenClaw: When Automation Becomes a Digital Backdoor
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.
