rc — 브라우저에서 실행하는 터미널, 하나의 바이너리로
CLI 명령을 PTY로 감싸 WebSocket으로 브라우저에 실시간 스트리밍하는 경량 서버. Go 단일 바이너리, 멀티탭, 분할 패널, 에이전트 모드, 파일 업로드, 모바일 지원까지.
🎯 Why I Built This
서버 관리를 하다 보면 SSH 클라이언트가 없는 환경에서 급하게 터미널에 접근해야 할 때가 있습니다. 또는 여러 서버의 터미널을 한 화면에서 모니터링하고 싶을 때, 모바일에서 빠르게 명령 하나만 실행하고 싶을 때.
기존에도 웹 터미널 솔루션은 있지만, 대부분 무겁거나 설정이 복잡하거나, Node.js 생태계에 의존합니다:
- ❌ ttyd: C 기반이지만 단일 명령만 실행 가능, 멀티탭 없음
- ❌ Wetty: Node.js 의존성, SSH 터널링 방식
- ❌ GoTTY: 유지보수 중단, 읽기 전용이 기본
- ❌ code-server: 훌륭하지만 터미널만 필요할 때는 오버스펙
그래서 만들었습니다. 단일 Go 바이너리로 설치 없이 실행하고, 브라우저만 열면 끝나는 터미널 서버.
🔗 rc.huny.dev 에서 자세한 내용을 확인하세요!
✨ Key Features
1. 🖥️ 단일 바이너리, 제로 의존성
Go로 작성되어 크로스 컴파일된 단일 바이너리입니다. Linux, macOS, Windows 모두 지원하며, 다운로드 받아 실행하면 끝입니다.
Node.js도, Python도, Docker도 필요 없습니다. 바이너리 하나면 충분합니다.
2. 📑 멀티탭 & 분할 패널
여러 명령을 동시에 실행하고 브라우저 탭처럼 관리할 수 있습니다.
- 🏷️ 드래그 앤 드롭으로 탭 순서 변경
- ✏️ 더블클릭으로 탭 이름 변경
- ⧉ 분할 패널로 여러 터미널을 동시에 보기
- ⌨️ Alt+1~9, Alt+←/→ 키보드 단축키
- 📌 새로고침해도 보던 탭 유지 (localStorage)
- 🔗 ?tab=N 쿼리 파라미터로 특정 탭 딥링크
3. 🌐 에이전트 모드 — 분산 터미널
가장 강력한 기능입니다. 여러 서버의 터미널을 하나의 허브에 모을 수 있습니다.
브라우저에서 hub:8000에 접속하면 허브의 로컬 탭과 에이전트들의 원격 탭이 모두 보입니다.
💡 에이전트 IP가 탭 hover 시 표시되어 어떤 서버인지 바로 확인 가능합니다.
4. 🔑 토큰 기반 Attach
에이전트를 붙일 때 허브 비밀번호를 직접 알려주기 어려울 때, Attach Token 기능을 사용합니다.
- 허브 웹 UI의 탭 메뉴에서 'Attach token' 클릭
- 5분간 유효한 일회용 토큰이 생성됨
- 해당 토큰을 --password 값으로 사용하여 에이전트 attach
- 토큰으로 인증되면 허브가 실제 Bearer 토큰을 발급
토큰 모달에는 OS별 rc 설치 명령도 포함되어 있습니다.
5. 🔒 보안
웹 터미널은 보안이 생명입니다. rc는 다음을 지원합니다:
- ✅ Bearer 토큰 인증 (--password)
- ✅ URL route prefix (--route /secret-path)
- ✅ CORS origin 체크
- ✅ 보안 헤더 및 역방향 프록시 지원
6. 📤 파일 업로드 & 📱 모바일 지원
--upload 플래그로 브라우저 파일 업로드. 모바일에서는 플로팅 키보드 패널로 Ctrl+C, 방향키 등 입력 가능.
7. 🔄 자동 업데이트 (Safe Restart)
웹 UI에서 원클릭 업데이트. 새 바이너리 검증 → 포트 해제 → 새 프로세스 시작 → 실패 시 자동 복구.
💡 업데이트에 실패해도 서버가 죽지 않습니다. 자동으로 복구합니다.
🚀 Technical Stack
Why Go?
- ⚡ 단일 바이너리 크로스 컴파일:
GOOS=linux GOARCH=arm64 go build
- 🔧 PTY 핸들링:
creack/pty라이브러리
- 🌐 내장 HTTP/WebSocket 서버: Go 표준 라이브러리만으로
- 📦
//go:embed로 프론트엔드를 바이너리에 내장
Frontend
- 🖥️ 순수 HTML/CSS/JS — 빌드 도구 없음, 프레임워크 없음
- 📟 xterm.js: 실제 터미널 에뮬레이션
- 🎨 Catppuccin Mocha 테마
Architecture
모든 통신은 WebSocket으로 이루어지며, 에이전트는 허브에 자동 재연결됩니다.
💡 Use Cases
Scenario 1: 서버 모니터링
⏱️ 세팅 시간: 서버당 30초
Scenario 2: 모바일에서 긴급 대응
노트북 없이도 핸드폰 브라우저로 터미널 접속 가능
Scenario 3: 팀원에게 서버 접근 공유
Attach Token으로 5분간 유효한 일회용 토큰 전달
🆚 다른 웹 터미널과 비교
- vs ttyd: rc는 멀티탭, 에이전트 모드, 파일 업로드 지원
- vs Wetty: Node.js 불필요, SSH 의존 없음
- vs code-server: ~10MB 바이너리, 터미널에 특화
- vs Teleport: 설치 30초, 설정 파일 없음
⚡ Quick Start
🔗 Links
- 📖 Docs
- 💻 GitHub
💡 서버에 터미널 접근이 필요할 때, SSH 클라이언트가 없을 때, 모바일에서 긴급 대응해야 할 때 — rc 하나면 충분합니다!