Termal Desktop

Зачем рабочий стол поверх SSH.

Графическая среда на удалённом сервере звучит как решение в поисках задачи. Вот честный разбор — включая случаи, когда эту страницу стоит закрыть и остаться при своём терминале.

«Всё это я и так умею через ssh и vim»

Умеете. Абсолютно всё, что есть на этой странице, делается сеансом SSH, оболочкой и редактором, который вы и так знаете. Если вы администрируете один сервер, свободно владеете vim и ваша работа укладывается в терминал — это не для вас, и пусть лучше у вас останется то, к чему вы привыкли.

Графическая надстройка появилась не потому, что терминала не хватает. Она появилась потому, что терминал — последовательный интерфейс, а часть задач последовательными не бывает. Следить за передачей, одновременно читая журнал и правя конфиг, — это три окна в любом рабочем столе и три панели tmux плюс изрядная дисциплина в терминале.

Утверждение намеренно узкое: не «лучше терминала», а «быстрее терминала на определённом наборе задач». В Termal OS есть настоящая PTY-оболочка именно потому, что терминал остаётся правильным инструментом большую часть времени.

Где графическая надстройка действительно себя оправдывает

Четыре ситуации, начиная с тех, о которых нам рассказывают чаще всего.

  • Переносить файлы и видеть, как это идёт. Копирование каталога между двумя местами через scp даёт мигающий курсор и надежду. Проводник делает это с очередью задач, живым процентом по каждой передаче и переименованием вместо тихой перезаписи, когда в приёмнике уже есть файл с таким именем. Для папки на 4 ГБ по медленному каналу «оно ещё идёт?» — вполне реальный вопрос.
  • Читать код, который писали не вы. Править знакомый файл — работа для vim. Разобраться в незнакомой кодовой базе (прыгать между файлами, идти по include, искать по всему дереву) — работа для дерева файлов и вкладок. Это и даёт редактор Monaco поверх удалённой файловой системы, без выгрузки чего-либо на локальную машину.
  • Попасть на сервер, который видишь впервые. Это самый сильный довод. Termal определяет, что на машине работает — Plesk, cPanel, просто nginx или Apache, — перечисляет обслуживаемые сайты с той версией PHP, на которой каждый действительно работает, показывает запущенные службы и контейнеры и находит файлы журналов. Собрать ту же картину руками — это десяток команд и знание того, где каждый дистрибутив что прячет.
  • Проверять из сетевой позиции самого сервера. Внутренний маршрут, который отвечает на сервере и больше нигде, неудобно разбирать из терминала. HTTP-клиент выполняет curlна сервере и раскладывает заголовки и тело ответа. Браузер идёт дальше: по умолчанию он ходит в сеть с вашей машины, но выход можно переключить на сервер — тогда трафик идёт по туннелю SOCKS5, поднятому поверх того же SSH-соединения, а значок на панели показывает, какой из двух вариантов сейчас активен. Со встроенными инструментами разработчика в каждой вкладке страница, доступная только изнутри, становится тем, на что вы смотрите, а не тем, о чём догадываетесь.
Termal OS со списком сайтов, размещённых на сервере: у каждого указана версия PHP, на которой он действительно работает, и кнопки статистики, журналов доступа, ошибок и git pull
Третий случай на одном экране: все сайты, которые держит сервер, версия PHP, на которой каждый из них реально работает, и есть ли ожидающее обновление. Дойти до этого руками — десяток команд и знание того, где ваш дистрибутив что прячет. Доменные имена размыты.
Диалог Termal OS с заголовком «передача между серверами»: индикатор прогресса на 41 проценте во время копирования файла, по файловому проводнику с каждой стороны
Первый случай: копирование, которое идёт между двумя серверами, с индикатором прогресса вместо мигающего курсора.
Настройки браузера Termal OS с двумя вариантами выхода в сеть: прямое соединение с этой машины или туннель SOCKS через SSH-сервер, на каждой карточке указан свой провайдер
Четвёртый случай — это настройка: один и тот же браузер, два выхода наружу — напрямую с вашей машины или через сервер по 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: открыт Termal Git с историей коммитов и diff, рядом Termal Code — редактор Monaco с открытым PHP-файлом
История 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, где это важнее всего.
  • Не для тысячи серверов. От нескольких до нескольких десятков. Только Linux по SSH: ни SNMP, ни Windows, ни обнаружения устройств в сети.