GCP VM で Cursor Server のインストールが失敗したときの対処まとめ

# GCP VM で Cursor Server のインストールが失敗したときの対処まとめ

> **TL;DR**: 外部 IP が変わったのに SSH コンフィグの `HostName` が古いままだと、Cursor は古い IP へ接続し続けて `Failed to install the Cursor Server` と表示される。`~/.ssh/config` を最新 IP に更新 + keep‑alive を入れるだけで解決。

---

## 環境

| 項目         | 値                                                              |
| ---------- | -------------------------------------------------------------- |
| Remote IDE | Cursor (anysphere.remote‑ssh v1.0.11)                          |
| リモート OS    | Ubuntu 22.04 LTS on GCP n1‑standard‑1                          |
| OpenSSH    | client 9.4p1 @ macOS (LibreSSL 3.3.6)<br>server 8.9p1 @ Ubuntu |
| 接続方式       | 外部 IP 直 SSH (IAP なし)                                           |

## 発生したエラー

```text
Error resolving SSH authority Failed to install the Cursor Server.
ssh: connect to host 104.198.XXX.XXX port 22: Operation timed out
exit: code=255
```

Cursor のデバッグログには、**`Connecting to 104.198.XXX.XXX`** が繰り返し表示。実際の外部 IP は **35.200.XXX.XXX** になっていた。

## 原因

* GCP の **ephemeral external IP** は、VM を再起動すると変わる。
* `~/.ssh/config` の `HostName` に旧 IP (104.\*) が残っており、Cursor はそこへ接続 → タイムアウト → 255 で終了。
* 普通の `ssh user@<新IP>` は成功するので、原因に気付きにくい。

## 解決手順

### 1. 現在の外部 IP を確認

```bash
gcloud compute instances describe wp-auto-vm-01 \
  --zone asia-northeast1-a \
  --format='get(networkInterfaces[0].accessConfigs[0].natIP)'
```

### 2. `~/.ssh/config` を更新

```sshconfig
Host wp-auto-vm-01.asia-northeast1-a.wp-auto-vm
  HostName 35.200.XXX.XXX      # ← 新しい IP
  User morimotodaiki
  IdentityFile ~/.ssh/google_compute_engine
  ServerAliveInterval 30      # 切断防止 (任意)
  ServerAliveCountMax 8
```

**ポイント**

* `HostName` を更新したら、古い IP を known\_hosts から削除しておくと安全。

  ```bash
  ssh-keygen -R 104.198.XXX.XXX
  ```

### 3. Cursor で再接続

`Remote‑SSH: Connect to Host…` から同ホストを選択。`~/.cursor-server` が無い場合は自動でクリーンインストールされる。

## 補足: IP を固定したい場合

GCP で **静的外部 IP** を予約し、VM に割り当てる。以後 VM の再起動・再作成でも IP が変わらないので、SSH 設定を頻繁に修正せずに済む。

---

## バイナリ欠損（nls.keys.json が無い）に遭遇したら

Cursor Server 展開後に `ENOENT: no such file or directory, open '.../out/nls.keys.json'` が出るケースは **ダウンロードや解凍が途中で失敗してバイナリが壊れている** ことが原因です。

### 原因

* `tar` / `xz` / `curl` が入っておらず、インストールスクリプトが途中で止まる
* VM の空きディスク不足／メモリ不足 (OOM Killer)
* 企業プロキシ・FW が [https://storage.anysphere.dev/](https://storage.anysphere.dev/) へのダウンロードを途中で切断

### 対処フロー

```bash
# 1) 依存ライブラリを入れる (Ubuntu)
sudo apt update
sudo apt install -y tar xz-utils curl \
  libnss3 libxkbcommon0 libatk1.0-0 libatk-bridge2.0-0 \
  libcairo2 libgbm1 libgtk-3-0 libasound2

# 2) 壊れたフォルダを削除
pkill -f cursor-server || true
rm -rf ~/.cursor-server

# 3) 再接続 (Cursor の自動インストールを実行)
```

`~/.cursor-server/*.install.log` に `curl: (22)` / `tar: command not found` などが出ていないか確認すると、失敗理由が分かりやすい。

---

## まとめ

* Cursor の "Failed to install the Cursor Server" は **SSH 到達不可** が原因なことも多い。
* まず普通の `ssh -v` で接続できるかを確認し、**IP ズレ** や **FW** を潰す。
* GCP の ephemeral IP には要注意。開発用途なら静的 IP を割り当てるとトラブルが減る。

---

### 参考リンク

* [GCP ドキュメント: 静的外部 IP の予約](https://cloud.google.com/compute/docs/ip-addresses/reserve-static-external-ip-address)
* [Cursor Docs: Remote‑SSH Extension](https://docs.cursor.sh/remote-ssh)

*(この記事は 2025‑06‑15 時点の情報です。環境やバージョンによって挙動が異なる場合があります。)*