Skip to main content
Summary

한 줄 요약

opencode serve(또는 opencode web)로 작업 머신에 OpenCode 백엔드(세션/도구/프로젝트)를 켜 두고, 다른 기기에서 접속해 같은 일을 그대로 이어가는 방식입니다. 원격 조종 리모컨처럼 쓰시면 됩니다.

먼저: opencode web(모바일 브라우저로 바로 이어서 작업)

opencode web은 API 서버에 더해 웹 UI까지 함께 띄워주는 모드입니다.1 그래서 별도 툴(SSH/TUI/앱) 없이도 모바일 브라우저만 있으면 접속해서 작업을 이어가실 수 있습니다.

무거운 연산과 레포 접근은 서버 머신이 처리하고, 폰/태블릿은 화면과 입력만 담당하는 컨트롤러가 됩니다. 키 조합 제약, 화면 가독성, 복붙 스트레스가 크게 줄어드는 게 체감 포인트입니다.

서버 머신에서 웹 UI를 띄우려면 아래처럼 실행하시면 됩니다.

opencode web --hostname 0.0.0.0 --port 4096

외부에서 접속하실 때는 보안 설정이 거의 필수라서, 아래의 보안 섹션(Tailscale + Password)까지 함께 보시는 걸 권장드립니다.

web과 serve의 역할은 아래처럼 정리하시면 헷갈리지 않습니다.

  • web: API + 웹 UI(브라우저로 바로 사용)

  • serve: API 중심(headless) 서버, 클라이언트가 API로 접속

  • 둘 다 같은 백엔드(세션/프로젝트/도구)를 공유하므로, 상황에 맞게 클라이언트를 바꿔 붙이실 수 있습니다.

serve가 뭐예요?

opencode serve는 화면(TUI) 없이 돌아가는 headless HTTP 서버입니다.1 OpenCode 기능을 OpenAPI 엔드포인트로 노출해서, 터미널 TUI(클라이언트)나 다른 클라이언트가 서버에 접속해 세션을 만들고, 메시지를 보내고, 파일/명령을 실행할 수 있게 해줍니다.2

서버가 제공하는 API는 /doc에서 확인하실 수 있습니다(예: http://localhost:4096/doc). 서버 상태는 GET /global/health로 확인하시면 됩니다(예: http://localhost:4096/global/health).

핵심은 구조입니다. TUI가 곧 서버라기보다, 서버가 있고 TUI/웹은 붙는 클라이언트에 가깝습니다. 그래서 서버를 한 번 띄워 두면 여러 클라이언트가 동시에 붙을 수도 있고, 자동화/외부 연동도 쉬워집니다.

아래 이미지는 서버/클라이언트 구조를 한 장으로 정리해 둔 것입니다.

OpenCode 서버-클라이언트 구조

(캡션: OpenCode 백엔드 서버(serve/web)에 여러 클라이언트(TUI, 브라우저 등)가 접속해 같은 작업 컨텍스트를 공유하는 흐름을 보여드립니다.)

빠른 시작(로컬)

가장 기본 실행은 아래와 같습니다.

opencode serve

기본값은 127.0.0.1:4096에서 대기합니다. 호스트/포트를 명시하고 싶으시면 아래처럼 지정하시면 됩니다.

opencode serve --hostname 127.0.0.1 --port 4096

상태 확인은 아래처럼 하시면 됩니다.

curl http://127.0.0.1:4096/global/health

스펙 문서는 아래처럼 보시면 됩니다.

# 브라우저로 열어도 됩니다
open http://127.0.0.1:4096/doc

(환경에 따라 open 대신 주소를 브라우저에 직접 붙여 넣으셔도 됩니다.)

이미 떠 있는 서버에 TUI로 붙으시려면 opencode attach를 사용하시면 됩니다.

opencode attach http://127.0.0.1:4096

원격에서 이어서 하기(attach/web)

이 방식의 진짜 장점은 “원격에서 이어서 하기”입니다. 집/회사 개발 머신에서 serve나 web을 켜 두시면, 밖에서는 노트북/휴대폰/태블릿이 그 서버로 접속해서 같은 세션과 작업을 그대로 이어가실 수 있습니다. 느낌은 원격 조종(remote control)에 가깝습니다. 무거운 연산과 레포 접근은 서버 머신이 맡고, 손에 든 기기는 컨트롤러가 됩니다.

흐름을 단순화하면 아래처럼 보시면 됩니다.

[원격 기기(브라우저/TUI)] -> (네트워크) -> [opencode web/serve 실행 중인 머신] -> [레포/쉘/LLM]

여기서 serve와 web의 차이는 이렇게 잡아두시면 좋습니다.

opencode serve는 API 중심(headless)입니다. 기본 전제는 “클라이언트(TUI/IDE 플러그인/자동화)가 API로 서버에 요청한다”는 구조입니다.

opencode web은 API에 더해 웹 UI까지 같이 제공합니다. 그래서 SSH로 터미널에 들어가 TUI를 쓰는 것보다 쉬운 경우가 많고, 특히 모바일에서는 브라우저가 훨씬 편합니다(키 조합, 화면 가독성, 복붙 측면에서 유리합니다).

웹 UI로 사용하시려면 서버 머신에서 아래처럼 실행하시면 됩니다.

opencode web --hostname 0.0.0.0 --port 4096

그리고 같은 서버에 터미널 TUI도 함께 붙이실 수 있습니다.

opencode attach http://<server-ip>:4096

여기까지는 “연결만 되면 끝”에 가깝고, 실제 운영에서는 다음 섹션의 보안 설정이 거의 필수에 가깝습니다.

보안(Tailscale + Password)

원격 접속을 “인터넷에 포트 열기”로 해결하실 수도 있지만, 그 순간부터는 방어를 제대로 해두시는 게 좋습니다. 제가 권장드리는 기본 조합은 두 겹입니다.

첫째, OpenCode 자체에 비밀번호를 설정해 주세요. OPENCODE_SERVER_PASSWORD를 설정하면 HTTP Basic Auth가 켜집니다. 기본 사용자명은 opencode이며, 바꾸고 싶으시면 OPENCODE_SERVER_USERNAME를 사용하시면 됩니다. 이 설정은 opencode serve와 opencode web 모두에 적용됩니다.

export OPENCODE_SERVER_USERNAME=opencode
export OPENCODE_SERVER_PASSWORD='<your-password>'

둘째, 네트워크는 Tailscale로 감싸시는 걸 권장드립니다. 요지는 “포트를 인터넷에 직접 공개하지 말고, tailnet 내부에서만 접속”하는 것입니다. Tailscale은 WireGuard 기반으로 기기 간 통신을 암호화하고, tailnet 정책으로 접근을 통제할 수 있어서 원격 개발용으로 궁합이 좋습니다.

아래 이미지는 Tailscale/WireGuard 터널 개념을 떠올리기 좋은 참고용이다.

Tailscale/WireGuard 개념 참고 이미지

이미지 출처: How Tailscale Makes Managing Wireguard Easy - YouTube

제가 가장 선호하는 패턴은 아래입니다.

“OpenCode 서버는 localhost(127.0.0.1)에만 바인딩하고, 외부에서 들어오는 길은 Tailscale serve가 HTTPS로 프록시한다.”

이렇게 하시면 OpenCode가 LAN/WAN에 직접 노출되지 않습니다. 오픈 포트 스캐닝 같은 노이즈를 한 겹 피하고 시작하시는 셈입니다.

OpenCode를 로컬에만 묶어두시고:

opencode web --hostname 127.0.0.1 --port 4096

그리고 Tailscale 쪽에서 HTTPS로 내보내시면 됩니다(개념 예시입니다).

sudo tailscale serve --bg --yes --https 443 http://127.0.0.1:4096

이 패턴을 쓰시면 “내 서버는 항상 localhost만 듣는다”는 단순한 보안 기준을 유지하기가 훨씬 쉬워집니다.

WSL에서 막힐 때 체크리스트

  • WSL2 기본 네트워킹은 NAT라서, 다른 기기(폰/태블릿)에서 WSL 안의 opencode web/serve로 바로 접근이 번거로울 수 있습니다.

  • Windows 11 22H2+라면 .wslconfig에 mirrored 모드를 켜는 것이 도움이 될 때가 있습니다.3

[wsl2]
networkingMode=mirrored
  • mirrored 모드에서도 방화벽/Hyper-V 쪽에서 막힐 수 있습니다. 안내된 참고 명령(관리자 PowerShell)은 아래처럼 생겼습니다.

Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
  • 지금 OpenCode가 어디에 바인딩되어 있는지부터 확인해 주세요. WSL/LAN 접속을 기대하시면서 127.0.0.1만 듣고 있으면 밖에서 들어올 수 없습니다(다만 보안 관점에서는 “localhost + Tailscale 프록시”가 더 권장되는 편입니다).

  • WSL2 NAT 환경에서 “WSL의 서버를 LAN에 열어야 하는 상황”이면, WSL 문서에 나온 것처럼 Windows 쪽 netsh interface portproxy로 포트 포워딩을 잡아야 할 때가 있습니다.3 설정이 복잡해지기 쉬우니, 가능하면 Tailscale로 우회하시는 편이 보통 덜 고생하십니다.

serve를 쓰는 장점(체크리스트)

  • 세션이 서버에 남습니다: 클라이언트를 껐다 켜도 작업 맥락을 이어가기 쉽습니다.

  • 여러 클라이언트 동시 접속이 가능합니다: 터미널(TUI)로 붙어 있다가, 브라우저로도 같은 백엔드를 보면서 작업하실 수 있습니다.

  • serve는 API 중심이라 자동화/연동에 유리합니다: /doc 스펙을 보고 필요한 요청을 만들어 붙이기 좋습니다.

  • 원격 작업이 SSH보다 단순해질 때가 많습니다: 특히 opencode web은 브라우저만 되어서 모바일에서 체감이 큽니다.

  • 보안을 구성하기 쉬운 편입니다: Basic Auth + “localhost 바인딩 + Tailscale로만 접근” 조합이 깔끔합니다.

참고

1OpenCode 서버 문서

2OpenCode CLI 문서

3Accessing network applications with WSL

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기