Termal Desktop

なぜ SSH の上にデスクトップなのか。

リモートのサーバーにグラフィカルな環境。問題を探している解決策のように聞こえます。ここでは、その正直な言い分を書きます。このページを閉じてターミナルを使い続けるべき場合も含めて。

「そんなの ssh と vim でとっくにできる」

できます。このページに書いてあることは、一つ残らず、SSH のセッションとシェルと、すでに手に馴染んだエディターでできます。管理するサーバーが 1 台で、vim を自在に扱えて、仕事がターミナルの中に収まっているのなら——これはあなたのためのものではありません。いまの環境を続けていただくほうがよいと、こちらも思います。

グラフィカルな層があるのは、ターミナルが力不足だからではありません。ターミナルが順番に進むインターフェースであり、そうでない仕事があるからです。転送を見守りながらログを読み、同時に設定ファイルを直す。デスクトップならウィンドウ 3 つ。ターミナルなら tmux のペイン 3 つと、かなりの自制心が要ります。

主張は意図して狭く取っています。「ターミナルより優れている」ではなく、「特定の種類の仕事についてはターミナルより速い」。Termal OS が本物の PTY シェルを積んでいるのは、まさにターミナルがたいていの場面で正しい道具のままだからです。

グラフィカルな層が本当に割に合う場面

4 つの状況を、よく耳にする順に。

  • ファイルを動かして、その様子を見る。scp でディレクトリーをコピーすると、手元に残るのは点滅するカーソルと祈りです。エクスプローラーなら、ジョブの待ち行列と、転送ごとのリアルタイムの進捗率があり、同じ名前が先にあるときは黙って上書きするのではなく名前を変えます。遅い回線で 4 GB のフォルダーを送っているとき、「まだ動いているのか」は本当に切実な問いです。
  • 自分が書いていないコードを読む。知っているファイルを直すのは vim の仕事です。見知らぬコードベースを理解する——ファイルのあいだを飛び、include をたどり、ツリー全体を検索する——のは、ファイルツリーとタブの仕事です。それを、ローカルに何もチェックアウトせずに、リモートのファイルシステムの上で与えてくれるのが Monaco エディターです。
  • 見たこともないサーバーに降り立つ。これがいちばん強い理由です。Termal はそのマシンで何が動いているのかを見分けます。Plesk、cPanel、素の nginx や Apache。配信しているサイトを、それぞれが実際に使っている PHP のバージョンつきで並べ、動いているサービスとコンテナーを見せ、ログのファイルを見つけ出します。同じ絵を手作業でそろえるには、10 個あまりのコマンドと、どのディストリビューションが何をどこに隠すのかという知識が要ります。
  • サーバー自身のネットワーク位置から試す。そのサーバーの上でだけ応答する内部の経路は、ターミナルからでは調べにくいものです。HTTP クライアントは curlサーバーの上で実行し、ヘッダーと本文を読める形に並べます。ブラウザーはさらに先へ行きます。既定ではお使いのパソコンから通信しますが、出口をサーバー側に切り替えられます。切り替えると、すでにお持ちの SSH 接続の上に張った SOCKS5 トンネルを通信が通り、いまどちらなのかがツールバーの表示で分かります。タブごとに開発者ツールが付いているので、内側からしか見えないページが、推し量るものではなく、目で見るものになります。
サーバーにホスティングされているサイトを並べた Termal OS の画面。各サイトに、実際に動作している PHP のバージョンと、統計・アクセスログ・エラー・git pull のボタンが付いている
3 番目の場面が、1 画面に収まったところ。サーバーが抱えるサイトのすべてと、それぞれが実際に動いている PHP のバージョン、そして更新が待っているかどうか。ここに手作業でたどり着くには 10 個あまりのコマンドと、そのディストリビューションが何をどこに隠すのかという知識が要ります。ドメイン名はぼかしてあります。
「サーバー間の転送」と題された Termal OS のダイアログ。ファイルのコピー中で進捗バーが 41 パーセントを示し、左右にファイルエクスプローラーが並んでいる
1 番目の場面。2 台のサーバーのあいだで進むコピーが、点滅するカーソルではなく進捗バーとともに。
Termal OS のブラウザー設定。ネットワークの出口が 2 つ示され、ひとつはこのパソコンからの直接接続、もうひとつは SSH サーバーを通す SOCKS トンネルで、それぞれのカードに接続元が表示されている
4 番目の場面は、ひとつの設定です。同じブラウザーに、外へ出る道が 2 本。お使いのパソコンから直接か、SSH トンネルでサーバーを経由するか。ここではグローバル IP アドレスも所在地もモザイクをかけています。

そのすべてが、接続 1 本の上で

ここが設計として肝心なところで、このデスクトップが SSH 呼び出しの寄せ集めに皮をかぶせたものではない理由でもあります。

Termal OS は使い回される SSH 接続のプール(サーバーごとに 1 本)を keepalive 付きで保ち、すべてがその上を通ります。指標も、ファイルエクスプローラーも、ターミナルも、エディターも、ログの追尾も。ファイルマネージャーを開いても、2 本目のセッションは開きません。追加のポートも、エージェントも、2 度目の認証もなく、マシンに入るものもありません。サーバーから見れば、あなたはふつうのことをしている 1 つの SSH ログインです。

この制約は同時に、root もなく何かを入れる権限もないホスティングでこのデスクトップが動く理由でもあります。共用サーバー、マネージドホスティング、お客さまのマシン。デーモンを要求する管理画面では、そういう場所では何の役にも立ちません。

デスクトップに実際に入っているもの

タスクバー、スタートメニュー、デスクトップのアイコンを備えたウィンドウマネージャーと、23 個のアプリ。仕事をするのはこのあたりです。

  • エクスプローラー — SFTP のエクスプローラー。コピー、移動、アップロード、フォルダーを書庫としてダウンロード、権限、ドラッグ&ドロップ、進捗つきの転送待ち行列。
  • ターミナル — 本物の PTY シェル。コマンドを打ち込むだけの箱ではありません。
  • Termal Code — Monaco(VS Code のエディター)。ファイルツリーとタブつきで、リモートのファイルシステムを直接編集します。
  • ブラウザー — 複数タブ、ブックマーク、ダウンロード、ソースの表示、そしてタブごとにドッキングした開発者ツール。
  • モニター、プロセス、ログ — リアルタイムの指標、そこから終了もできるプロセス一覧、そして Apache・nginx・PHP・MySQL・syslog のよくあるファイルを自動で見つけるログの追尾。
  • ウェブリクエスト、Zip、Git、FTP、ごみ箱 — なければ作業の途中でシェルに戻される、小さな道具たち。
  • コパイロット — ふつうの言葉での問いに、コマンドと説明で答えます。クリックするまで何も動かず、ご自身の API キーで動きます。

ほかにメールクライアント、メモ、電卓、単位の変換、カラーピッカー、そしていくつかのゲームもあります。23 個のうち 13 個は既定で無効です。常に出ているのはアプリストア、設定、エクスプローラー、ごみ箱だけ。初回起動でファイルエクスプローラーがゲームのメニューの下に埋もれていたら、それ自体がこの構想への反論になってしまうからです。使うものだけ有効にしてください。

Termal OS のデスクトップ。コミット履歴と差分を表示した Termal Git と、PHP ファイルを開いた Monaco エディターの Termal Code が並んでいる
Git の履歴と差分、そして Monaco エディターが同時に開いた状態。順番に進むインターフェースという問題を、いちばん退屈なやり方で解いたところです。
Termal OS でリモートのファイルを右クリックしたときのメニュー。開く、アプリを選んで開く、ダウンロード、自分のパソコンへダウンロード、デスクトップにショートカットを作成、圧縮、コピー、切り取り、名前の変更、権限、ごみ箱へ移動、完全に削除
リモートのファイルを右クリック。アプリを選んで開く、自分のパソコンへダウンロード、圧縮、権限、ごみ箱へ。デスクトップのようにふるまうのは、これがデスクトップだからです。

開発者に見てほしいところ

このデスクトップは拡張できます。そして、その拡張の仕組みこそがコードベースでいちばん面白い部分です。

サードパーティーのアプリは、隔離された iframe の中で動きます。ファイルシステムにもネットワークにもクリップボードにも、直接は触れません。権限の要る呼び出しはすべてメッセージとしてホストへ渡り、ホストがそれを、アプリがマニフェストで宣言した権限と突き合わせます。その権限は 6 つしかありません。fs.readfs.writenetstorageclipboardwebview。インストールのときに表示されます。ランタイム自身の冒頭のコメントにある方針は、身も蓋もありません。iframe は決して信用しない。ホストがすべてを検証する。

これは、たいていのプラグインの仕組みよりも重い意味を持ちます。ここで動くアプリは、あなたが SSH アクセスを与えたサーバーを相手にするからです。プラグインが黙って鍵を読めてしまうアプリストアなど、弁解のしようがありません。

そして SDK は、外部の人のために後付けした別物の、劣った API ではありません。内蔵の電卓は Termal.app() で登録されています。サードパーティーのアプリが使うのと同じ、公開の入り口です。SDK には、メモアプリから webview のホスト、サーバーのウィジェットまで、完全なサンプルアプリが 8 つ付いています。

サンドボックスの中で動くサードパーティーの Termal アプリ。ログには、マニフェストの権限が clipboard と storage であること、クリップボードへの書き込み、setTitle、そして storage set が再起動をまたいで残ることが表示されている
上の話が、実際に動いているところ。これはサンドボックスの中のサードパーティーのアプリで、自身のログの 1 行目が、そのアプリが宣言した権限そのものです。その下に並ぶ呼び出しは、どれもマニフェストが許したものです。

完全なリファレンス——マニフェスト、ランタイム、ダイアログ、ファイル選択、ストレージ、ネットワーク、webview、クリップボード、ウィンドウ制御、翻訳、パッケージング——は Termal App Studio のページにあります。

これではないもの

  • ターミナルの代わりではありません。中にターミナルが入っていますし、あなたはそれを使うことになります。仕事がすでにシェルに収まっているなら、このデスクトップが足すものはありません。
  • リモートデスクトップのプロトコルではありません。X11 も VNC も RDP もなく、回線のこちら側にディスプレイサーバーもありません。ウィンドウマネージャーはアプリの中でローカルに動き、SSH 接続を渡るのはファイルとシェルと指標の通信だけです。
  • ずっと動き続けるものではありません。ウィンドウを閉じても収集は続きますが、アプリが、起きているマシンの上で動いている必要があります。ノートパソコンを閉じれば止まります。これがいちばん効いてくる Netdata との比較もご覧ください。
  • 1000 台のためのものではありません。数台から数十台まで。SSH 越しの Linux だけで、SNMP も Windows もネットワークの自動探索もありません。