VS Code Server でスマホからコマンド実行

外出先で急に PC を使いたくなったのに PC を持っていない！ ということはありませんか？

サーバーに接続したいけれど、信頼できるターミナル アプリがないということは？

`code tunnel` コマンドで VS Code Server を起動すれば、スマホから好きなコマンドを実行できます。


## マシンの用意

パブリック IP は不要なので、自宅で PC をつけっぱなしにするだけでも OK です。

Linux がほしいことが多いので、以下に Google Cloud の Free Tier の Compute Engine を使った例を示します。

https://cloud.google.com/free/docs/free-cloud-features#compute

<details><summary>Oracle Cloud を試したかった話</summary>

本当は、[24GB RAM + 4CPU + 200GBストレージのLinuxサーバーを無料で手にいれる方法](https://qiita.com/shota0616/items/d0dfa1f70af073aa9554)である反面、[【OCI】Oracle Cloudアカウントが停止された話](https://qiita.com/shota0616/items/d0dfa1f70af073aa9554)のような深刻なリスクもある Oracle Cloud を試してみたかったのですが、サインアップできませんでした。

</details>

### Compute Engine の構成

以下の構成で課金されないはずです。未確認 (作ったばかりで請求されていない) なので、請求されちゃったらすみません。

- リージョン: us-west1 (Free Tier で使える中では地理的に日本から近い)
- Series: E2
- マシン タイプ: e2-micro (Free Tier のため)
- オペレーティング システム: Ubuntu
- バージョン: Ubuntu 24.04 LTS (x86/64)
- ブート ディスクの種類: 標準永続ディスク (Free Tier のため)
- サイズ (GB): 30 (Free Tier での最大値)
- データ保護: バックアップなし
- ネットワーキング
    - ネットワーク インターフェース
        - 外部 IPv4 アドレス: エフェメラル または 静的外部 IP アドレス
            - "Compute Engine free tier does not charge for an external IP address" とあるので、課金されないはず
        - [ネットワーク サービス ティア](https://cloud.google.com/network-tiers/pricing?hl=ja): スタンダード
            - "0-200 GiB/month" が無料
            - Premium でも "1 GB of outbound data transfer from North America to all region destinations (excluding China and Australia) per month" は無料
- オブザーバビリティ
    - モニタリングとロギング用の Ops エージェントをインストールする: チェックを外す (課金対象)
- セキュリティ
    - セキュアブートをオンにします: チェック (どちらでも課金されない)
    - アクセスを管理する
        - 手動で作成した SSH 認証鍵の追加が可能
            - *.pub ファイルの内容をコピペする
- 詳細
    - メタデータ
        - enable-guest-attributes: TRUE
            - 中間者攻撃を防ぐために[ゲスト属性を有効にしてホストキーを保存する](https://cloud.google.com/solutions/connecting-securely?hl=ja#storing_host_keys_by_enabling_guest_attributes)場合
            - 他社より確認が大変という印象


## VS Code のインストール

デスクトップであれば、普通に VS Code をインストールします。

デスクトップ画面のないサーバーであれば、以下でインストールします。ARM64 の場合は x64 のところを arm64 に書き換えてください。

```console
$ curl -Lk 'https://code.visualstudio.com/sha/download?build=stable&os=cli-alpine-x64' --output vscode_cli.tar.gz
$ tar -xf vscode_cli.tar.gz
```

https://code.visualstudio.com/docs/remote/tunnels#_alternative-downloads


## サービスの登録

`code tunnel` コマンドでフォアグラウンドで起動しても良いのですが、サービスとしてバックグラウンドで起動することにします (2025-03-18 時点では Preview)。

```console
$ code tunnel user login --provider github # または microsoft
$ code tunnel service install
```

- Linux の場合は、ログインせず使うために `sudo loginctl enable-linger $USER` も実行してください
- Windows ではスタートアップに code-tunnel.exe が追加されます
    - ログイン時しか使えません
- macOS では launchctl に com.visualstudio.code.tunnel が追加されるようですが、`$HOME` 直下に plist ファイルが作成されるので、ログインし直すと実行されません
    - バグだと思うけど報告するほどでもないかな…
    - mv ~/com.visualstudio.code.tunnel ~/Library/LaunchAgents/ でログイン時に実行されるようになります
    - 他の場所に配置すると他のタイミングで起動できるようです ([Macの「ターミナル」でのlaunchdを使ったスクリプトの管理](https://support.apple.com/ja-jp/guide/terminal/apdc6c1077b-5d5d-4d35-9c19-60f2397b2369/mac))


## スマホから接続

https://vscode.dev にアクセスし「リモート トンネルに接続」または、左端のリモート エクスプローラーからトンネルに接続することができます。

メニューからターミナルを開けば、コマンド実行ができます。

![screenshot](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232368/1d80ef68-ee54-406d-9c6a-9f2a92cde9c0.png)

https://vscode.dev は PWA に対応しているため、iOS の Safari からホーム画面に追加し、全画面で使うことができるのですが、それでも iPhone では上の画面のような狭さでちょっとつらいです。iPad なら実用的です！


## 注意

トンネルの有効期限は 30 日ですので、30 日後に再度設定が必要になると思います。

実装がどうなっているのかは知りませんが、Microsoft から自由にアクセスできてしまうかもしれないので、仕事で使いたい場合などにはご注意ください。


## 参考

下記記事を参考にさせていただきました。

https://qiita.com/920oj/items/c7d26eb95bc5e556807d