Termal Desktop

왜 SSH 위에 데스크톱인가.

원격 서버에 그래픽 환경이라니, 문제를 찾아다니는 해결책처럼 들립니다. 여기에 그 정직한 변론을 적습니다. 이 페이지를 닫고 쓰시던 터미널로 돌아가시는 편이 나은 경우까지 포함해서요.

「그런 건 ssh와 vim으로 벌써 다 되는데」

됩니다. 이 페이지에 적힌 것은 하나도 빠짐없이 SSH 세션과 셸, 그리고 이미 손에 익은 편집기로 할 수 있습니다. 서버를 한 대만 관리하시고, vim을 자유롭게 다루시고, 일이 터미널 안에 다 들어간다면 — 이건 당신을 위한 것이 아닙니다. 지금 쓰시는 환경을 그대로 두시는 편이 낫다고, 저희도 생각합니다.

그래픽 계층이 있는 건 터미널이 모자라서가 아닙니다. 터미널이 차례대로 가는 인터페이스인데, 어떤 일은 차례대로가 아니기 때문입니다. 전송을 지켜보면서 로그를 읽고, 동시에 설정 파일을 고치는 일. 데스크톱이라면 창 세 개, 터미널이라면 tmux 패널 세 개에 상당한 자제력이 더 필요합니다.

주장은 일부러 좁게 잡았습니다. 「터미널보다 낫다」가 아니라 「특정한 종류의 일에서는 터미널보다 빠르다」입니다. Termal OS가 진짜 PTY 셸을 품고 있는 건, 바로 터미널이 대개의 경우에 여전히 맞는 도구이기 때문입니다.

그래픽 계층이 정말로 값을 하는 자리

네 가지 상황을, 가장 자주 듣는 순서로.

  • 파일을 옮기며, 그 과정을 본다.scp로 디렉터리를 복사하면 손에 남는 건 깜빡이는 커서와 기대뿐입니다. 탐색기는 작업 대기열과 전송별 실시간 진행률을 보여 주고, 받는 쪽에 같은 이름이 이미 있으면 조용히 덮어쓰는 대신 이름을 바꿉니다. 느린 회선으로 4 GB짜리 폴더를 보내는 중이라면 「아직 도는 건가」는 정말로 절실한 물음입니다.
  • 내가 쓰지 않은 코드를 읽는다. 아는 파일을 고치는 건 vim의 일입니다. 낯선 코드베이스를 이해하는 일 — 파일 사이를 건너뛰고, include를 따라가고, 트리 전체를 뒤지는 일 — 은 파일 트리와 탭의 일입니다. 로컬에 아무것도 받아 오지 않고 원격 파일 시스템 위에서 그것을 해 주는 것이 Monaco 편집기입니다.
  • 처음 보는 서버에 내려앉는다. 이게 가장 강한 이유입니다. Termal은 그 컴퓨터에서 무엇이 돌고 있는지 알아봅니다. Plesk, cPanel, 그냥 nginx나 Apache. 서비스 중인 사이트를 각자 실제로 쓰는 PHP 버전과 함께 늘어놓고, 돌아가는 서비스와 컨테이너를 보여 주고, 로그 파일을 찾아냅니다. 같은 그림을 손으로 맞추려면 열 개 남짓한 명령과, 배포판마다 무엇을 어디에 숨기는지에 대한 지식이 필요합니다.
  • 서버 자신의 네트워크 위치에서 시험한다. 그 서버 위에서만 응답하는 내부 경로는 터미널에서 들여다보기가 껄끄럽습니다. HTTP 클라이언트는 curl서버 위에서 실행하고 헤더와 본문을 읽을 수 있게 늘어놓습니다. 브라우저는 한 걸음 더 갑니다. 기본으로는 내 컴퓨터에서 통신하지만, 나가는 길을 서버 쪽으로 바꿀 수 있습니다. 바꾸면 이미 갖고 계신 SSH 연결 위에 세운 SOCKS5 터널로 트래픽이 흐르고, 지금 어느 쪽인지가 도구 모음의 표시로 드러납니다. 탭마다 개발자 도구가 붙어 있으니, 안쪽에서만 보이는 페이지가 짐작하는 대상이 아니라 눈으로 보는 대상이 됩니다.
서버에 호스팅된 사이트를 나열한 Termal OS 화면. 사이트마다 실제로 돌아가는 PHP 버전과 통계·접근 로그·오류·git pull 버튼이 붙어 있다
세 번째 경우가 한 화면에 담긴 모습. 서버가 안고 있는 사이트 전부와, 각자 실제로 돌아가는 PHP 버전, 그리고 기다리는 업데이트가 있는지까지. 손으로 여기까지 오려면 열 개 남짓한 명령과, 그 배포판이 무엇을 어디에 숨기는지에 대한 지식이 필요합니다. 도메인 이름은 흐려 놓았습니다.
「서버 사이 전송」이라는 제목이 붙은 Termal OS 대화 상자. 파일을 복사하는 중이며 진행률 막대가 41퍼센트를 가리키고, 좌우에 파일 탐색기가 하나씩 있다
첫 번째 경우. 서버 두 대 사이에서 진행되는 복사가, 깜빡이는 커서가 아니라 진행률 막대와 함께.
Termal OS 브라우저 설정. 네트워크 출구가 두 개 제시되어 있고, 하나는 이 컴퓨터에서의 직접 연결, 다른 하나는 SSH 서버를 지나는 SOCKS 터널이며, 카드마다 접속 경로가 표시되어 있다
네 번째 경우는 설정 하나입니다. 같은 브라우저에 바깥으로 나가는 길이 두 갈래. 내 컴퓨터에서 곧장 가거나, SSH 터널로 서버를 지나가거나. 여기서는 공인 IP 주소와 위치를 모두 모자이크 처리했습니다.

그 모두가 연결 하나 위에서

여기가 설계로서 중요한 대목이고, 이 데스크톱이 SSH 호출을 잔뜩 모아 껍데기를 씌운 것이 아닌 이유이기도 합니다.

Termal OS는 재사용되는 SSH 연결 풀(서버마다 하나)을 keepalive와 함께 유지하고, 모든 것이 그 위로 지나갑니다. 지표도, 파일 탐색기도, 터미널도, 편집기도, 로그 추적도요. 파일 관리자를 열어도 두 번째 세션이 열리지 않습니다. 추가 포트도, 에이전트도, 두 번째 인증도 없고, 서버에 들어가는 것도 없습니다. 서버에서 보면 여러분은 평범한 일을 하는 SSH 로그인 하나입니다.

이 제약은 동시에, root도 없고 무언가를 설치할 권한도 없는 호스팅에서 이 데스크톱이 돌아가는 이유이기도 합니다. 공유 호스팅, 관리형 호스팅, 고객사의 서버. 데몬을 요구하는 그래픽 관리 도구라면 그런 곳에서는 아무 쓸모가 없습니다.

데스크톱에 실제로 들어 있는 것

작업 표시줄, 시작 메뉴, 바탕화면 아이콘을 갖춘 창 관리자와 23개의 앱. 일을 하는 건 이쯤입니다.

  • 탐색기 — SFTP 탐색기. 복사, 이동, 업로드, 폴더를 압축 파일로 내려받기, 권한, 끌어다 놓기, 진행률이 붙은 전송 대기열.
  • 터미널 — 진짜 PTY 셸. 명령을 던져 넣는 상자가 아닙니다.
  • Termal Code — Monaco(VS Code의 편집기). 파일 트리와 탭이 있고, 원격 파일 시스템을 바로 고칩니다.
  • 브라우저 — 여러 탭, 북마크, 내려받기, 소스 보기, 그리고 탭마다 도킹된 개발자 도구.
  • 모니터, 프로세스, 로그 — 실시간 지표, 거기서 바로 종료할 수 있는 프로세스 목록, 그리고 Apache·nginx·PHP·MySQL·syslog의 흔한 파일을 알아서 찾아 주는 로그 추적.
  • 웹 요청, Zip, Git, FTP, 휴지통 — 없으면 일하다 말고 셸로 돌아가게 만드는 작은 도구들.
  • 코파일럿 — 평범한 말로 던진 물음에 명령과 설명으로 답합니다. 누르기 전에는 아무것도 돌지 않고, 본인의 API 키로 동작합니다.

그 밖에 메일 클라이언트, 메모, 계산기, 단위 변환기, 색 선택기, 그리고 게임 몇 개도 있습니다. 스물세 개 가운데 열세 개는 기본으로 꺼져 있습니다 — 늘 나와 있는 건 앱 스토어, 설정, 탐색기, 휴지통뿐입니다 — 처음 실행했을 때 파일 탐색기가 게임 메뉴 밑에 파묻혀 있다면, 그 자체가 이 구상에 대한 반박이 될 테니까요. 쓰시는 것만 켜세요.

Termal OS 데스크톱. 커밋 이력과 diff를 보여 주는 Termal Git이 열려 있고, 그 옆에 PHP 파일을 연 Monaco 편집기인 Termal Code가 있다
Git 이력과 diff, 그리고 Monaco 편집기가 한꺼번에 열린 모습. 차례대로 가는 인터페이스라는 문제를, 가장 심심한 방법으로 푼 것입니다.
Termal OS에서 원격 파일을 오른쪽 클릭했을 때의 메뉴. 열기, 연결 프로그램으로 열기, 내려받기, 내 컴퓨터로 내려받기, 바탕화면에 바로가기 만들기, 압축, 복사, 잘라내기, 이름 바꾸기, 권한, 휴지통으로 이동, 완전히 삭제
원격 파일에 오른쪽 클릭. 연결 프로그램으로 열기, 내 컴퓨터로 내려받기, 압축, 권한, 휴지통으로. 데스크톱처럼 움직이는 건, 이것이 데스크톱이기 때문입니다.

개발자가 눈여겨볼 대목

이 데스크톱은 확장할 수 있습니다. 그리고 그 확장 방식이야말로 코드베이스에서 가장 흥미로운 부분입니다.

서드파티 앱은 격리된 iframe 안에서 돕니다. 파일 시스템에도 네트워크에도 클립보드에도 직접 손대지 못합니다. 권한이 필요한 호출은 전부 메시지로 호스트에 건네지고, 호스트가 그것을 앱이 매니페스트에 선언한 권한과 맞춰 봅니다. 그 권한은 여섯 개뿐입니다. fs.read, fs.write, net, storage, clipboard, webview. 설치할 때 보여 드립니다. 런타임 자체의 머리말 주석에 적힌 원칙은 에두르지 않습니다. iframe은 절대 믿지 않는다. 호스트가 전부 검증한다.

이건 대부분의 플러그인 구조보다 무게가 다릅니다. 여기서 도는 앱들은 여러분이 SSH 접근을 내준 서버를 상대하니까요. 플러그인이 조용히 키를 읽을 수 있는 앱 스토어라면, 변명의 여지가 없습니다.

그리고 SDK는 바깥사람을 위해 덧붙인 별개의, 격 낮은 API가 아닙니다. 기본으로 들어 있는 계산기도 Termal.app()으로 등록됩니다. 서드파티 앱이 쓰는 것과 똑같은 공개 진입점입니다. SDK에는 메모 앱부터 webview 호스트, 서버 위젯까지 완성된 예제 앱 여덟 개가 함께 들어 있습니다.

샌드박스 안에서 도는 서드파티 Termal 앱. 로그에는 매니페스트 권한이 clipboard와 storage라는 것, 클립보드 쓰기, setTitle, 그리고 storage set이 재시작 뒤에도 남는다는 내용이 표시되어 있다
위의 이야기가 실제로 도는 모습. 이건 샌드박스 안의 서드파티 앱이고, 자기 로그의 첫 줄이 그 앱이 선언한 권한 그 자체입니다. 그 아래 늘어선 호출은 전부 매니페스트가 허락한 것들입니다.

전체 레퍼런스 — 매니페스트, 런타임, 대화 상자, 파일 선택, 저장소, 네트워크, webview, 클립보드, 창 제어, 번역, 패키징 — 는 Termal App Studio 페이지에 있습니다.

이건 아닙니다

  • 터미널의 대체품이 아닙니다. 안에 터미널이 들어 있고, 여러분은 그것을 쓰게 됩니다. 일이 이미 셸 안에 다 들어간다면, 이 데스크톱이 보태 줄 것은 없습니다.
  • 원격 데스크톱 프로토콜이 아닙니다. X11도 VNC도 RDP도 없고, 회선 이쪽에 디스플레이 서버도 없습니다. 창 관리자는 앱 안에서 로컬로 돌고, SSH 연결을 건너는 건 파일과 셸과 지표 트래픽뿐입니다.
  • 계속 켜져 있는 물건이 아닙니다. 창을 닫아도 수집은 이어지지만, 앱이 깨어 있는 컴퓨터에서 돌고 있어야 합니다. 노트북을 덮으면 멈춥니다. 이 점이 가장 크게 걸리는 Netdata와의 비교도 보세요.
  • 천 대를 위한 물건이 아닙니다. 몇 대에서 몇십 대까지. SSH 너머의 Linux뿐이고, SNMP도 Windows도 네트워크 자동 탐색도 없습니다.