왜 SSH 위에 데스크톱인가.
원격 서버에 그래픽 환경이라니, 문제를 찾아다니는 해결책처럼 들립니다. 여기에 그 정직한 변론을 적습니다. 이 페이지를 닫고 쓰시던 터미널로 돌아가시는 편이 나은 경우까지 포함해서요.
「그런 건 ssh와 vim으로 벌써 다 되는데」
됩니다. 이 페이지에 적힌 것은 하나도 빠짐없이 SSH 세션과 셸, 그리고 이미 손에 익은 편집기로 할 수 있습니다. 서버를 한 대만 관리하시고, vim을 자유롭게 다루시고, 일이 터미널 안에 다 들어간다면 — 이건 당신을 위한 것이 아닙니다. 지금 쓰시는 환경을 그대로 두시는 편이 낫다고, 저희도 생각합니다.
그래픽 계층이 있는 건 터미널이 모자라서가 아닙니다. 터미널이 차례대로 가는 인터페이스인데, 어떤 일은 차례대로가 아니기 때문입니다. 전송을 지켜보면서 로그를 읽고, 동시에 설정 파일을 고치는 일. 데스크톱이라면 창 세 개, 터미널이라면 tmux 패널 세 개에 상당한 자제력이 더 필요합니다.
그래픽 계층이 정말로 값을 하는 자리
네 가지 상황을, 가장 자주 듣는 순서로.
- 파일을 옮기며, 그 과정을 본다.scp로 디렉터리를 복사하면 손에 남는 건 깜빡이는 커서와 기대뿐입니다. 탐색기는 작업 대기열과 전송별 실시간 진행률을 보여 주고, 받는 쪽에 같은 이름이 이미 있으면 조용히 덮어쓰는 대신 이름을 바꿉니다. 느린 회선으로 4 GB짜리 폴더를 보내는 중이라면 「아직 도는 건가」는 정말로 절실한 물음입니다.
- 내가 쓰지 않은 코드를 읽는다. 아는 파일을 고치는 건 vim의 일입니다. 낯선 코드베이스를 이해하는 일 — 파일 사이를 건너뛰고, include를 따라가고, 트리 전체를 뒤지는 일 — 은 파일 트리와 탭의 일입니다. 로컬에 아무것도 받아 오지 않고 원격 파일 시스템 위에서 그것을 해 주는 것이 Monaco 편집기입니다.
- 처음 보는 서버에 내려앉는다. 이게 가장 강한 이유입니다. Termal은 그 컴퓨터에서 무엇이 돌고 있는지 알아봅니다. Plesk, cPanel, 그냥 nginx나 Apache. 서비스 중인 사이트를 각자 실제로 쓰는 PHP 버전과 함께 늘어놓고, 돌아가는 서비스와 컨테이너를 보여 주고, 로그 파일을 찾아냅니다. 같은 그림을 손으로 맞추려면 열 개 남짓한 명령과, 배포판마다 무엇을 어디에 숨기는지에 대한 지식이 필요합니다.
- 서버 자신의 네트워크 위치에서 시험한다. 그 서버 위에서만 응답하는 내부 경로는 터미널에서 들여다보기가 껄끄럽습니다. HTTP 클라이언트는 curl을 서버 위에서 실행하고 헤더와 본문을 읽을 수 있게 늘어놓습니다. 브라우저는 한 걸음 더 갑니다. 기본으로는 내 컴퓨터에서 통신하지만, 나가는 길을 서버 쪽으로 바꿀 수 있습니다. 바꾸면 이미 갖고 계신 SSH 연결 위에 세운 SOCKS5 터널로 트래픽이 흐르고, 지금 어느 쪽인지가 도구 모음의 표시로 드러납니다. 탭마다 개발자 도구가 붙어 있으니, 안쪽에서만 보이는 페이지가 짐작하는 대상이 아니라 눈으로 보는 대상이 됩니다.
그 모두가 연결 하나 위에서
여기가 설계로서 중요한 대목이고, 이 데스크톱이 SSH 호출을 잔뜩 모아 껍데기를 씌운 것이 아닌 이유이기도 합니다.
Termal OS는 재사용되는 SSH 연결 풀(서버마다 하나)을 keepalive와 함께 유지하고, 모든 것이 그 위로 지나갑니다. 지표도, 파일 탐색기도, 터미널도, 편집기도, 로그 추적도요. 파일 관리자를 열어도 두 번째 세션이 열리지 않습니다. 추가 포트도, 에이전트도, 두 번째 인증도 없고, 서버에 들어가는 것도 없습니다. 서버에서 보면 여러분은 평범한 일을 하는 SSH 로그인 하나입니다.
이 제약은 동시에, root도 없고 무언가를 설치할 권한도 없는 호스팅에서 이 데스크톱이 돌아가는 이유이기도 합니다. 공유 호스팅, 관리형 호스팅, 고객사의 서버. 데몬을 요구하는 그래픽 관리 도구라면 그런 곳에서는 아무 쓸모가 없습니다.
데스크톱에 실제로 들어 있는 것
작업 표시줄, 시작 메뉴, 바탕화면 아이콘을 갖춘 창 관리자와 23개의 앱. 일을 하는 건 이쯤입니다.
- 탐색기 — SFTP 탐색기. 복사, 이동, 업로드, 폴더를 압축 파일로 내려받기, 권한, 끌어다 놓기, 진행률이 붙은 전송 대기열.
- 터미널 — 진짜 PTY 셸. 명령을 던져 넣는 상자가 아닙니다.
- Termal Code — Monaco(VS Code의 편집기). 파일 트리와 탭이 있고, 원격 파일 시스템을 바로 고칩니다.
- 브라우저 — 여러 탭, 북마크, 내려받기, 소스 보기, 그리고 탭마다 도킹된 개발자 도구.
- 모니터, 프로세스, 로그 — 실시간 지표, 거기서 바로 종료할 수 있는 프로세스 목록, 그리고 Apache·nginx·PHP·MySQL·syslog의 흔한 파일을 알아서 찾아 주는 로그 추적.
- 웹 요청, Zip, Git, FTP, 휴지통 — 없으면 일하다 말고 셸로 돌아가게 만드는 작은 도구들.
- 코파일럿 — 평범한 말로 던진 물음에 명령과 설명으로 답합니다. 누르기 전에는 아무것도 돌지 않고, 본인의 API 키로 동작합니다.
그 밖에 메일 클라이언트, 메모, 계산기, 단위 변환기, 색 선택기, 그리고 게임 몇 개도 있습니다. 스물세 개 가운데 열세 개는 기본으로 꺼져 있습니다 — 늘 나와 있는 건 앱 스토어, 설정, 탐색기, 휴지통뿐입니다 — 처음 실행했을 때 파일 탐색기가 게임 메뉴 밑에 파묻혀 있다면, 그 자체가 이 구상에 대한 반박이 될 테니까요. 쓰시는 것만 켜세요.
개발자가 눈여겨볼 대목
이 데스크톱은 확장할 수 있습니다. 그리고 그 확장 방식이야말로 코드베이스에서 가장 흥미로운 부분입니다.
서드파티 앱은 격리된 iframe 안에서 돕니다. 파일 시스템에도 네트워크에도 클립보드에도 직접 손대지 못합니다. 권한이 필요한 호출은 전부 메시지로 호스트에 건네지고, 호스트가 그것을 앱이 매니페스트에 선언한 권한과 맞춰 봅니다. 그 권한은 여섯 개뿐입니다. fs.read, fs.write, net, storage, clipboard, webview. 설치할 때 보여 드립니다. 런타임 자체의 머리말 주석에 적힌 원칙은 에두르지 않습니다. iframe은 절대 믿지 않는다. 호스트가 전부 검증한다.
이건 대부분의 플러그인 구조보다 무게가 다릅니다. 여기서 도는 앱들은 여러분이 SSH 접근을 내준 서버를 상대하니까요. 플러그인이 조용히 키를 읽을 수 있는 앱 스토어라면, 변명의 여지가 없습니다.
그리고 SDK는 바깥사람을 위해 덧붙인 별개의, 격 낮은 API가 아닙니다. 기본으로 들어 있는 계산기도 Termal.app()으로 등록됩니다. 서드파티 앱이 쓰는 것과 똑같은 공개 진입점입니다. SDK에는 메모 앱부터 webview 호스트, 서버 위젯까지 완성된 예제 앱 여덟 개가 함께 들어 있습니다.
전체 레퍼런스 — 매니페스트, 런타임, 대화 상자, 파일 선택, 저장소, 네트워크, webview, 클립보드, 창 제어, 번역, 패키징 — 는 Termal App Studio 페이지에 있습니다.
이건 아닙니다
- 터미널의 대체품이 아닙니다. 안에 터미널이 들어 있고, 여러분은 그것을 쓰게 됩니다. 일이 이미 셸 안에 다 들어간다면, 이 데스크톱이 보태 줄 것은 없습니다.
- 원격 데스크톱 프로토콜이 아닙니다. X11도 VNC도 RDP도 없고, 회선 이쪽에 디스플레이 서버도 없습니다. 창 관리자는 앱 안에서 로컬로 돌고, SSH 연결을 건너는 건 파일과 셸과 지표 트래픽뿐입니다.
- 계속 켜져 있는 물건이 아닙니다. 창을 닫아도 수집은 이어지지만, 앱이 깨어 있는 컴퓨터에서 돌고 있어야 합니다. 노트북을 덮으면 멈춥니다. 이 점이 가장 크게 걸리는 Netdata와의 비교도 보세요.
- 천 대를 위한 물건이 아닙니다. 몇 대에서 몇십 대까지. SSH 너머의 Linux뿐이고, SNMP도 Windows도 네트워크 자동 탐색도 없습니다.





