サーバを別のマシンで動かす

MulmoTerminal は、1 つのサーバ(Express、ターミナル、tmux、各エージェントの CLI)と、そのサーバが配る Web ページでできています。サーバは、ブラウザと同じマシンで動いている必要はありません。Linux のマシンや VPS、コンテナに置き、手元のノート PC から SSH トンネルでつなげます。エージェントはそちらで動き、 ノート PC を閉じても動き続けます。

これは最初の版です。通しで動かしたのは 1 回(Linux のコンテナに ssh -L でつないだ)だけで、まだ 誰も試していない部分は下にそう書いてあります。使ってみたら、結果を issue #2669 に書いてください。次の版はそれで 決めます。

ポートを開けずにトンネルを使う理由

サーバにはログインがありません。127.0.0.1 でしか待ち受けないので、マシンの外からは届きません。 SSH トンネルなら、その状態のまま使えます。ノート PC の localhost:34567 が、SSH を通ってサーバの 127.0.0.1:34567 につながり、サーバからは自分自身からの接続に見えます。ファイアウォールに穴を開ける 必要も、サーバの設定を変える必要もありません。

サーバ側

必要なものは手元に入れるときと同じです(はじめに)。Node.js 22.12 以上、git、 gh、使うエージェントの CLI(claude・codex など)。tmux は任意ですが、あると、サーバの再起動や ノート PC の切断があってもターミナルが残ります。

SSH でログインして起動します:

ssh you@server
npx mulmoterminal@latest

SSH 経由で起動すると、サーバ側ではブラウザを開かず、手元で実行するトンネルのコマンドを表示します:

[mulmoterminal] Started over SSH, so no browser is opened here. On your own machine, run:
[mulmoterminal]   ssh -N -L 34567:127.0.0.1:34567 you@<this-host>
[mulmoterminal] then open http://localhost:34567 there.

ログアウトしても動かし続けるには、tmux(または screen やサービス管理)の中で起動します。止めるときは npx mulmoterminal stop です。

ノート PC 側

ssh -N -L 34567:127.0.0.1:34567 you@server

ブラウザで http://localhost:34567 を開きます。トンネルは切ってつなぎ直してかまいません。ターミナルは サーバで動き続け、ページはそこに戻ります。

  • ノート PC の 34567 が使われているとき(手元でも MulmoTerminal を動かしているなど)は、別のポートを 転送します: ssh -N -L 34599:127.0.0.1:34567 you@server、開くのは http://localhost:34599。
  • -A を付けると(ssh -A -N -L …)、エージェントがノート PC の鍵で git push でき、鍵をサーバに 置かずに済みます。信頼できるサーバでだけ使ってください。つないでいる間は、そのサーバの root(とその サーバ上のあなたのアカウント)が、ノート PC の鍵を使って、その鍵が通るところへ認証できてしまいます。 共有のマシンや信頼できないマシンでは、代わりにサーバ専用のデプロイキーを用意してください。

サーバでエージェントにログインする

エージェントはサーバで動くので、ログインもサーバで要ります。どれもサーバにブラウザは要りません。

何 やり方
Claude Code Shell のセルか SSH で、claude を 1 回起動します。サーバにブラウザが無いと、サインイン用の URL を表示し(”Browser didn’t open? Use the url below to sign in”)、コードの入力を待ちます。その URL をノート PC で開いてサインインし、表示されたコードを貼ります。Linux ではログイン情報が ~/.claude の下のファイルに残るので、次からは要りません。
GitHub(gh) gh auth login でブラウザを選び、表示された 1 回限りのコードを、ノート PC で github.com/login/device に入れます。MulmoTerminal 自身の PR・Issue の画面もこのログインを使います。
git push ノート PC から ssh -A(上記。信頼できるサーバでだけ)か、サーバに鍵や認証ヘルパーを用意します。
Codex サーバで codex を起動し、そのログインを使います。まだ試していません。

試した範囲で確認できたのは、Claude Code のサインイン用 URL が表示されるところまでです(サインインは最後まで していません)。

Docker で動かす

サーバをコンテナで動かし、自分のマシンの 127.0.0.1 にだけ公開します:

docker run -p 127.0.0.1:34567:34567 -e MULMOTERMINAL_HOST=0.0.0.0 \
  -v "$HOME/work:/home/dev/work" <Node・git・gh・エージェント入りのイメージ> \
  npx mulmoterminal@latest --no-open
  • MULMOTERMINAL_HOST=0.0.0.0 は、公開したポートがコンテナの中のサーバに届くために必要です。 [security] の警告が出ますが、想定どおりです。ポートは 127.0.0.1 にだけ公開しているので、届くのは 自分のマシンからだけです。この設定の意味は設定を見てください。
  • エージェントのログイン情報は、イメージに焼き込まずボリュームで渡します。~/.claude・ ~/.claude.json・~/.codex・~/.config/gh・~/.gitconfig、MulmoTerminal 自身の状態は ~/.mulmoterminal です。
  • 別のマシンの Docker なら、両方を組み合わせます。そのマシンの 127.0.0.1 に公開し、そのマシンへ ssh -L でトンネルを張ります。

公式のイメージはまだありません。

手元と違うところ

グリッドの機能はすべて使えます。ターミナル、tmux での再接続、worktree、PR・Issue の画面、クリップボード、 通知音、スクリーンショットの貼り付け、Chrome でのファイルのドロップ(ファイルはサーバへアップロードされ ます)。ただし、いくつかの操作は、あなたのマシンではなくサーバのマシンで動きます:

操作 画面の無い Linux のサーバ リモートの Mac
ファイルマネージャで開く・OS のアプリで開く エラーになります リモートの画面で開きます
ファイルを選ぶダイアログ(「ファイルのパスを挿入」) インストールの案内が出て失敗します リモートの画面に出ます
音声入力 出ません(Mac 専用の文字起こしを使うため) サーバで文字起こしします
Safari・Firefox でのファイルのドロップ ノート PC のパスが入ります(サーバには無いパスです) 同左
worktree の env チップの localhost:<port> のリンク ノート PC で開きます。そのポートも転送してください 同左
Google カレンダーの連携 サインインの戻り先が、サーバではなくノート PC になります 同左

実験機能: サーバが別のマシンだと宣言する

ブラウザが別のマシンにあることは、サーバからは分かりません。トンネル越しの接続は、サーバ自身からの接続に 見えるためです。そこで、サーバの ~/.mulmoterminal/config.json に書いて宣言します:

{ "remoteServer": true }

宣言すると、上の表のうちサーバの画面で動いてしまう操作を止めます。パスメニューの「ファイルのパスを挿入」 「ファイルマネージャで開く」と、起動フォームのフォルダのボタンは出なくなります。同じ操作をヘッダーボタン・ キー・Files ペインから呼ぶと、代わりに理由が出ます。ドロップしたファイルは、ノート PC のパスを入れずに、 常にアップロードします。SSH を使わずに起動した場合(サービスとして動かすなど)も、サーバ側でブラウザを開き ません。設定画面の Google のサインインは、代わりにサーバで npx mulmoterminal google login を実行するよう 案内します。ファイルを書き換えたら、サーバを再起動してください。実験機能なので、使ってみたら issue #2669 に結果を書いてください。

リモートのサーバを相手に MulmoTerminal を開発する

サーバとページは別々にも起動できます。サーバで yarn dev:server(Express だけ)、ノート PC で yarn dev:client(Vite だけ)を起動し、34567 のトンネルを張っておきます。Vite は /api と /ws を localhost:34567 に転送し、トンネルがそれをサーバへ運びます。まだ試していません。


This site uses Just the Docs, a documentation theme for Jekyll.