VSCode Server (コード開発サーバー) のセットアップ


[以前の記事](https://qiita.com/shigeyf/items/301c3f38b2aa8c6efad7)で VSCode Server を使った開発サーバーについて触れましたが、この記事では、具体的なセットアップ方法について触れます。

## セットアップ

Visual Studio Code のサーバー機能([VSCode Server リモートトンネル](https://code.visualstudio.com/docs/remote/tunnels))を使って、コード開発サーバーを構築します。

このコード開発サーバーでは、リモート環境の VSCode デスクトップアプリ版またはウェブ版からリモート開発を行うことができます。これによって、iPad などのモバイルデバイスのようにVSCode アプリをインストールできない環境でもリモート開発ができるようになります。

![vscode-server-arch.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620513/7fd2e11f-48a4-395d-414d-ca8fae0e63d7.jpeg)

### VSCode のインストール

自宅に余っている Windows コンピューター (8GBメモリ, 256GB SSD) があったので、このコンピューターを使ってコード開発サーバーをセットアップすることにしました。コード開発サーバーは、[Ubuntu Server 22.04 LTS](https://jp.ubuntu.com/download) を使うことにます。

現在は VSCode Server 機能は VSCode バイナリに含まれてるため、VSCodeをインストールすることにします。

```bash
# Add a GnuPG trusted key for Microsoft package repositories
curl -sLS https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/microsoft.gpg
# Add VSCode repository
sudo add-apt-repository "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main"
# Install VSCode (stable)
sudo apt install code
# Install VSCode (insiders)
sudo apt install code-insiders
```

VSCode の Webサイトからバイナリを[直接ダウンロード](https://code.visualstudio.com/download)してインストールすることも可能です。

### VSCode Server トンネルの接続確立とテスト

VSCode のインストールが完了したら、以下のコマンドを実行します。
初回の起動時には、Server License に同意する必要があるため、以下のようなメッセージが表示されます。

```bash
# VSCode (stable) を利用する場合
code tunnel
# VSCode (insiders) を利用する場合
code-insiders tunnel
```

出力結果:

```bash
*
* Visual Studio Code Server
*
* By using the software, you agree to
* the Visual Studio Code Server License Terms (https://aka.ms/vscode-server-license) and
* the Microsoft Privacy Statement (https://privacy.microsoft.com/en-US/privacystatement).
*
[2023-03-11 02:25:51] error Run this command again with --accept-server-license-terms to indicate your agreement.
```

`--accept-server-license-terms` オプションを付けて実行します。

```bash
# VSCode (stable) を利用する場合
code tunnel --accept-server-license-terms
# VSCode (insiders) を利用する場合
code-insiders tunnel --accept-server-license-terms
```

出力結果:

```bash
*
* Visual Studio Code Server
*
* By using the software, you agree to
* the Visual Studio Code Server License Terms (https://aka.ms/vscode-server-license) and
* the Microsoft Privacy Statement (https://privacy.microsoft.com/en-US/privacystatement).
*
To grant access to the server, please log into https://github.com/login/device and use code XXXX-XXXX
```

<br/>

GitHub Codespaces と連携しているアーキテクチャーのためか (定かではありませんが)、起動する VSCode Server は GitHub アカウントに紐づけする必要があります。ブラウザで[https://github.com/login/device](https://github.com/login/device)の URL を開き、GitHub アカウントでログインした後に、表示されたコードを入力します。

![vscode-server-screenshot-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620513/abaa199a-c700-f5b3-a811-69eead218c7b.jpeg)

入力が完了したら、"**Authorize Visual-Studio-Code**" ボタンを押して、表示された権限の GitHub アクセスを承認します。[^1]

![vscode-server-screenshot-02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620513/e55c2400-d30d-4a0f-6db0-c2e5bdc6fe89.jpeg)

[^1]: GitHub Codespaces と連携されたアーキテクチャーのために必要とされているものと思われます。

トンネル接続が確立すると、以下のようなメッセージが表示されるので、[vscode.dev](https://vscode.dev/) の URL をブラウザーで開いてみましょう。接続する URL は以下のような形式になっています。

* Stable 版: <https://vscode.dev/tunnel/**[マシン名]**>
* Insiders 版: <https://insiders.vscode.dev/tunnel/**[マシン名]**>

**[マシン名]** の後にアクセスするファイルシステム上のパスを直接指定することも可能です。

この例では、Insider 版を使っていて、コード開発サーバーのホスト名は `ubuntu1` となっているため、以下のような URL が `tunnel` コマンドで出力されています。

```bash
[2023-03-11 02:27:21] info Creating tunnel with the name: ubuntu1

Open this link in your browser https://vscode.dev/tunnel/ubuntu1
```

> リモートトンネル接続は GitHub アカウントに紐づけられ、GitHub アカウントでサインインして利用するため、他のユーザーアカウントと同じマシン名となっても問題はありません。

コマンド実行を停止するとトンネル接続が切断されます。

### VSCode for Web からコード開発サーバーへのアクセス

VSCode for Web ([vscode.dev](https://vscode.dev) または [insiders.vscode.dev](https://insiders.vscode.dev)) をブラウザで開いたら、[Remote Expolorer 拡張](https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-explorer) にアクセスして、リモートトンネル機能の利用のために GitHub アカウントでサインインします。

接続が完了すると、(Insiders 版の場合) 以下のスクリーンショットのように、"Remote" の "Tunnels" の項目に、**[マシン名]** が _running_ と表示されます。

![vscode-server-screenshot-03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620513/2fee1e5f-1d2e-869d-f8f0-ccfa729d0648.jpeg)

これで、コード開発サーバーのファイルシステムにアクセスしたり、コード開発サーバーのターミナルセッションにアクセスしたりすることができるようになり、ブラウザーや VSCode アプリを使って、リモート開発ができるようになります。

<br/>

### VSCode Server サービスを自動起動にする

VSCode には、VSCode Server をユーザーユニットの systemd サービスとして登録することが可能なコマンドが用意されています。以下の `tunnel service` コマンドを使用します。`install` サブコマンドでサービス登録を行い、`uninstall` サブコマンドでサービス登録の解除を行うことができます。

トンネル接続のためのメタデータ (マシン名やセキュリティトークンに関するデータ等) は、既定では `~/.vscode-cli/` フォルダ以下に保存されます。先ほどトンネル接続を確立した際にメタデータが準備されています。

```bash
code tunnel service --help
```

出力結果:

```bash
code-tunnel-tunnel-service
(Preview) Manages the tunnel when installed as a system service,

USAGE:
    code-tunnel tunnel service [OPTIONS] <SUBCOMMAND>

OPTIONS:
    -h, --help    Print help information

GLOBAL OPTIONS:
        --cli-data-dir <CLI_DATA_DIR>
            Directory where CLI metadata should be stored [env: VSCODE_CLI_DATA_DIR=]

        --log <level>
            Log level to use [possible values: trace, debug, info, warn, error, critical, off]

        --verbose
            Print verbose output (implies --wait)

SUBCOMMANDS:
    help         Print this message or the help of the given subcommand(s)
    install      Installs or re-installs the tunnel service on the machine
    log          Shows logs for the running service
    uninstall    Uninstalls and stops the tunnel service
```

VSCode Server サービスの登録のために、以下のコマンドを実行します。
サービスが自動起動となるように登録されるため、コンピューターを再起動しても自動的に VSCode Server が起動するようになっています。

```bash
code tunnel service install
```

出力結果:

```bash
*
* Visual Studio Code Server
*
* By using the software, you agree to
* the Visual Studio Code Server License Terms (https://aka.ms/vscode-server-license) and
* the Microsoft Privacy Statement (https://privacy.microsoft.com/en-US/privacystatement).
*
[2023-03-11 02:40:23] info Successfully registered service...
[2023-03-11 02:40:23] info Successfully enabled unit files...
[2023-03-11 02:40:23] info Tunnel service successfully started
Service successfully installed! You can use `code tunnel service log` to monitor it, and `code tunnel service uninstall` to remove it.
```

VSCoe Server サービスの登録状況と動作状況は、以下のコマンドを実行すること確認することができます。

```bash
systemctl --user status code-tunnel
```

> 登録したユーザーユニットの systemd サービスは、`~/.config/systemd/user/` ディレクトリで管理されています。

## VSCode Server の導入のメリット

自宅ではデスクトップパソコン、外出先ではノートパソコンなどの複数ののデバイスで開発をしていると、作業中のソースコードがそれぞれのローカルディスク上に分散されることが多々あります。

コードごとの作業が一段落した状態でGitHubなどのリモートリポジトリにコミットできる状態であれば作業するコンピューターを切り替えても問題はないのですが、中途半端な書きかけのコードがある状態ではリポジトリにコミットできないため、切り替えはできません。

一番の大きなメリットは、そのような作業中コードの分散を避けることができる、ということが大きな点かと思われます。

他のメリットも含めて纏めると、考えられるメリットは以下の通りではないでしょうか:

1. 複数のデバイスにまたがるローカルの作業中ソースコードの分散をさけることができる

2. VSCode for Web を利用することで iPad などのモバイルデバイスや低消費電力のデバイスでの開発が容易になる

3. コード開発サーバーをコンテナ環境内で動作させることで、プレーンな開発環境を用意することができ、インストールされるツールのバージョンの整合性の問題などを回避することができます。

## 実運用に向けて

### デバッグサーバーへのアクセスについて

VSCode には、Web アプリケーションの各フレームワークが用意するデバッグ用のローカルサービス (サーバー) を VSCode のターミナルからコマンドを起動することで、サービスが開くポートを自動的に認識してポート転送をしてくれる機能があります。

リモート環境から開発サーバー内のサービスプロセスに直接アクセスすることはできないため、この機能は非常に便利です。

VSCode トンネル機能によって、以下のスクリーンショットのように、エンドポイントの公開とポート転送を行ってくれます。

以下の例では、`hugo server` コマンドを実行した例になります。
Hugo の例では、静的ページ内の `localhost` へのリンクを公開エンドポイントへ正しく書き換えるために、エンドポイント ホスト名を渡してあげる必要がありました。

![vscode-server-screenshot-04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620513/43c1f6b3-97c2-7756-1b99-aeec3c4fa6f4.jpeg)

```text
656tfhzl-1313.asse.devtunnels.ms:80 -> localhost:1313
```

エンドポイント名は、トンネル接続のメタデータ (CLI data) のデータを利用しており、`~/.vscode-cli/code_tunnel.json` に含まれています。

> エンドポイント名 = <https://**[id]**-**[port_num]**.**[cluster]**.devtunnels.ms/>

となります。

### セキュリティについて

VSCode Server の導入により、どんなデバイスからも VSCode for Web (vscode.dev) を経由して 開発サーバー (のターミナル) にアクセスすることができるようになります。GitHub アカウントがサーバーセキュリティの要となりますが、サーバーコンピューター全体にリスクが波及しないよう VSCode Server はコンテナー内で動作させるのが望ましいといえます。

### マルチサーバーホスティングについて

1台のコンピューターで複数の VSCode Server を起動することが可能です。

メタデータ (CLI Data = `--cli-data-dir` オプションで指定する) とマシン名 (`--name` オプションで指定する) を切り替えることで、同一ユーザーでも同一ホスト上に複数の VSCode Server を起動できることを確認しました。

これによって、開発プロジェクトと利用するツール群に合わせてコンテナー化を行い、複数のコンテナーで起動させることも可能でしょう。コンテナー化については、また別の記事で触れたいと思います。

## おわりに

VSCode の新機能 VSCode Server を使って、古いコンピューターに Ubuntu 22.04 LTS を導入して、ブラウザやデスクトップアプリの VSCode からリモート開発を行う環境を構築してみました。
いつでもどのデバイスからでもコーディングがテストが行えるのは、とても魅力的な環境です。

「自宅でコンピューターを常時運転するとして実際に電気代がどのくらいかかるのか」という点は、クラウド型のサービスの価格と比較して気になるところですが、クラウド型のコード開発環境よりも柔軟に活用できそうです。